package cn.besteam.modules.system.service.impl; import cn.besteam.common.constant.CacheConstant; import cn.besteam.common.constant.DepartmentEnum; import cn.besteam.common.constant.ErrorCode; import cn.besteam.common.exception.BusinessException; import cn.besteam.common.util.RedisUtil; import cn.besteam.common.util.oConvertUtils; import cn.besteam.modules.shiro.authc.util.EnvUtils; import cn.besteam.common.aspect.annotation.AutoLog; import cn.besteam.modules.system.biz.AliSmsService; import cn.besteam.modules.system.biz.SysDepartmentBiz; import cn.besteam.modules.system.dto.*; import cn.besteam.modules.system.entity.SysDepartment; import cn.besteam.modules.system.entity.SysDict; import cn.besteam.modules.system.entity.SysDictItem; import cn.besteam.modules.system.entity.SysUserDepartment; import cn.besteam.modules.system.mapper.SysDepartmentMapper; import cn.besteam.modules.system.service.ISysDepartmentService; import cn.besteam.modules.system.service.ISysDictItemService; import cn.besteam.modules.system.service.ISysDictService; import cn.besteam.modules.system.service.ISysUserDepartmentService; import cn.besteam.modules.system.vo.*; import org.springframework.transaction.annotation.Transactional; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.util.concurrent.CountDownLatch; import lombok.Data; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.Serializable; import java.math.BigDecimal; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * @Description: 组织架构表 * @author: besteam * @date: 2020-04-17 * @version: V1.0 */ @Service public class SysDepartmentServiceImpl extends ServiceImpl implements ISysDepartmentService { @Autowired private ISysUserDepartmentService sysUserDepartmentService; @Autowired private RedisTemplate redisTemplate; @Autowired private ISysDictService sysDictService; @Autowired private ISysDictItemService sysDictItemService; @Autowired private AliSmsService aliSmsService; @Autowired private SysDepartmentBiz sysDepartmentBiz; @Autowired private RedisUtil redisUtil; @Autowired private ISysDepartmentService sysDepartmentService; @Override public SysDepartment getById(Serializable id) { /*String key = CacheConstant.SYS_DEPARTMENT_CACHE + id; if (redisTemplate.hasKey(key)) { return (SysDepartment) redisTemplate.opsForValue().get(key); } else { SysDepartment sysDepartment = baseMapper.selectById(id); if (sysDepartment != null) { redisTemplate.opsForValue().set(key, sysDepartment); } return sysDepartment; }*/ SysDepartment sysDepartment = baseMapper.selectById(id); return sysDepartment; } /** * 获取部门、科室所在医院 * * @param id * @return */ @Override public SysDepartment getHospital(Integer id) { SysDepartment sysDepartment = getById(id); if (sysDepartment == null) { return null; } if (DepartmentEnum.OrgTypeEnum.HOSPITAL.getType().equals(sysDepartment.getOrgType())) { return sysDepartment; } return getHospital(sysDepartment.getParentId()); } @Override public List getParentIdList(Integer id) { List idList = new LinkedList<>(); SysDepartment department = getById(id); while (department != null) { idList.add(0, department.getId()); department = getById(department.getParentId()); } return idList; } @Override public SysDepartment getMyDepartment(Integer userId) { SysUserDepartment userDepartment = sysUserDepartmentService.getOne(new QueryWrapper().lambda().eq(SysUserDepartment::getUserId, userId)); if (userDepartment != null) { return getById(userDepartment.getDepartmentId()); } return null; } @Override public List listMyHospital(Integer userId) { List list = new ArrayList<>(); SysDepartment myDepartment = getMyDepartment(userId); if (myDepartment == null) { return list; } if (myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { SysDepartment hospital = getHospital(myDepartment.getParentId()); list.add(hospital); } else { list = list(new QueryWrapper().lambda()// .eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())// .likeRight(SysDepartment::getTreeCode, myDepartment.getTreeCode())); } return list; } private static final Map importHeaderAliasMap = new HashMap<>(); static { importHeaderAliasMap.put("区域", "area"); importHeaderAliasMap.put("单位;医院等级", "hospital"); importHeaderAliasMap.put("部门", "department"); importHeaderAliasMap.put("科室;是否暂存间", "office"); importHeaderAliasMap.put("科室分类", "officeType"); } @Transactional @Override public boolean importDepartment(ImportDTO dto) throws IOException { SysDepartment sysDepartment = getById(dto.getDepartmentId()); if (sysDepartment == null) { throw new BusinessException(ErrorCode.DEPARTMENT_NOT_FOUND); } if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { throw new BusinessException(ErrorCode.DEPARTMENT_OFFICE_CAN_NOT_BE_PARENT); } List hospitalLevelList = getHospitalLevelList(); ExcelReader reader = ExcelUtil.getReader(dto.getFile().getInputStream()); reader.setHeaderAlias(importHeaderAliasMap); List list = reader.read(0, 1, DepartmentImportEntity.class); if (CollectionUtils.isEmpty(list)) { throw new BusinessException(ErrorCode.ERR_500, "导入组织架构列表不能为空"); } int count = 0; List dictItems = sysDictItemService.list(new QueryWrapper() .eq("dict_id",5)); //System.out.println("科室分类DictList=====》:"+dictItems.size()); List sysDepartmentList = new ArrayList<>(); for (DepartmentImportEntity importEntity : list) { count++; // SysDepartment parent = sysDepartment; if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.AREA.getType())) { if (StringUtils.isNotEmpty(importEntity.getArea())) { if (!validateDepartName(importEntity.getArea())) { throw new BusinessException(ErrorCode.ERR_500, "第" + count + "行错误,区域名称格式错误"); } String[] areaArrays = importEntity.getArea().split(";"); for (int i = 0; i < areaArrays.length; i++) { String areaArray = areaArrays[i]; if (areaArray.equals(sysDepartment.getDepartName()) && i == 0) { continue; } String departName=areaArray; //去掉空格 departName= oConvertUtils.replaceBlank(departName); SysDepartment parentTemp = getOne(new QueryWrapper().lambda().eq(SysDepartment::getParentId, parent.getId()).eq(SysDepartment::getDepartName, departName)); if (parentTemp == null) { parentTemp = getOne(new QueryWrapper().lambda().eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.AREA.getType()).eq(SysDepartment::getDepartName, departName)); if (parentTemp != null) { throw new BusinessException(ErrorCode.ERR_500, "第" + count + "行错误,区域:" + areaArray + "父级组织错误"); } parent = saveImportDepartment(departName, parent.getId(), DepartmentEnum.OrgTypeEnum.AREA.getType(), null, 0); sysDepartmentList.add(parent); } else { parent = parentTemp; } } } if (StringUtils.isNotEmpty(importEntity.getHospital())) { if (!validateDepartName(importEntity.getHospital())) { throw new BusinessException(ErrorCode.ERR_500, "第" + count + "行错误,医院名称格式错误"); } String[] hospitalArray = importEntity.getHospital().split(";"); String departName=hospitalArray[0]; //去掉空格 departName=oConvertUtils.replaceBlank(departName); SysDepartment parentTemp = getOne(new QueryWrapper().lambda().eq(SysDepartment::getParentId, parent.getId()).eq(SysDepartment::getDepartName,departName)); if (parentTemp == null) { if (hospitalArray.length > 1) { Integer level = null; for (SysDictItem sysDictItem : hospitalLevelList) { if (hospitalArray[1].equals(sysDictItem.getItemValue())) { level = sysDictItem.getId(); } } parent = saveImportDepartment(departName, parent.getId(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType(), level, 0); sysDepartmentList.add(parent); } else { parent = saveImportDepartment(departName, parent.getId(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType(), null, 0); sysDepartmentList.add(parent); } } else { parent = parentTemp; } if (StringUtils.isNotEmpty(importEntity.getDepartment())) { if (!validateDepartName(importEntity.getDepartment())) { throw new BusinessException(ErrorCode.ERR_500, "第" + count + "行错误,部门名称格式错误"); } String[] departmentArrays = importEntity.getDepartment().split(";"); for (String departmentArray : departmentArrays) { String departName_=departmentArray; //去掉空格 departName_=oConvertUtils.replaceBlank(departName_); parentTemp = getOne(new QueryWrapper().lambda().eq(SysDepartment::getParentId, parent.getId()).eq(SysDepartment::getDepartName, departName_)); if (parentTemp == null) { parent = saveImportDepartment(departName_, parent.getId(), DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType(), null, 0); sysDepartmentList.add(parent); } else { parent = parentTemp; } } } if (StringUtils.isNotEmpty(importEntity.getOffice())) { if (!validateDepartName(importEntity.getOffice())) { throw new BusinessException(ErrorCode.ERR_500, "第" + count + "行错误,科室名称格式错误"); } Integer officeType=0; //判断科室分类名称是否输入正确 //System.out.println("excel分类名称=====》:"+importEntity.getOfficeType()); if (StringUtils.isNotEmpty(importEntity.getOfficeType())) { for(SysDictItem sysDictItem:dictItems){ if(sysDictItem.getItemText().equals(importEntity.getOfficeType().trim())){ officeType = sysDictItem.getId(); } } if(officeType==0) { throw new BusinessException(ErrorCode.ERR_500, "第" + count + "行错误,科室分类名称有误"); } } //System.out.println("科室分类ID=====》:"+officeType); String[] officeArray = importEntity.getOffice().split(";"); String departName_=officeArray[0]; //去掉空格 departName_=oConvertUtils.replaceBlank(departName_); parentTemp = getOne(new QueryWrapper().lambda().eq(SysDepartment::getParentId, parent.getId()).eq(SysDepartment::getDepartName, departName_)); if (parentTemp == null) { if (officeArray.length > 1) { SysDepartment sysDepartment1 = saveImportDepartment(departName_, parent.getId(), DepartmentEnum.OrgTypeEnum.OFFICE.getType(), null, officeArray[1].equals("是") ? 1 : 0,officeType); sysDepartmentList.add(sysDepartment1); } else { SysDepartment sysDepartment1 = saveImportDepartment(departName_, parent.getId(), DepartmentEnum.OrgTypeEnum.OFFICE.getType(), null, 0,officeType); sysDepartmentList.add(sysDepartment1); } } else { throw new BusinessException(ErrorCode.ERR_500, "第" + count + "行错误,科室:" + officeArray[0] + "已存在"); } } } } else { if (StringUtils.isNotEmpty(importEntity.getDepartment())) { if (!validateDepartName(importEntity.getDepartment())) { throw new BusinessException(ErrorCode.ERR_500, "第" + count + "行错误,部门名称格式错误"); } String[] departmentArrays = importEntity.getDepartment().split(";"); for (int i = 0; i < departmentArrays.length; i++) { String departmentArray = departmentArrays[i]; if (departmentArray.equals(sysDepartment.getDepartName()) && i == 0) { continue; } String departName=departmentArray; //去掉空格 departName=oConvertUtils.replaceBlank(departName); SysDepartment parentTemp = getOne(new QueryWrapper().lambda().eq(SysDepartment::getParentId, parent.getId()).eq(SysDepartment::getDepartName, departName)); if (parentTemp == null) { parent = saveImportDepartment(departName, parent.getId(), DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType(), null, 0); sysDepartmentList.add(parent); } else { parent = parentTemp; } } } if (StringUtils.isNotEmpty(importEntity.getOffice())) { if (!validateDepartName(importEntity.getOffice())) { throw new BusinessException(ErrorCode.ERR_500, "第" + count + "行错误,科室名称格式错误"); } Integer officeType=0; //判断科室分类名称是否输入正确 //System.out.println("excel分类名称=====》:"+importEntity.getOfficeType()); if (StringUtils.isNotEmpty(importEntity.getOfficeType())) { for(SysDictItem sysDictItem:dictItems){ if(sysDictItem.getItemText().equals(importEntity.getOfficeType().trim())){ officeType = sysDictItem.getId(); } } if(officeType==0) { throw new BusinessException(ErrorCode.ERR_500, "第" + count + "行错误,科室分类名称有误"); } } //System.out.println("科室分类ID=====》:"+officeType); String[] officeArray = importEntity.getOffice().split(";"); String departName=officeArray[0]; //去掉空格 departName=oConvertUtils.replaceBlank(departName); SysDepartment parentTemp = getOne(new QueryWrapper().lambda().eq(SysDepartment::getParentId, parent.getId()).eq(SysDepartment::getDepartName, departName)); if (parentTemp == null) { if (officeArray.length > 1) { SysDepartment sysDepartment1 = saveImportDepartment(departName, parent.getId(), DepartmentEnum.OrgTypeEnum.OFFICE.getType(), null, officeArray[1].equals("是") ? 1 : 0,officeType); sysDepartmentList.add(sysDepartment1); } else { SysDepartment sysDepartment1 = saveImportDepartment(departName, parent.getId(), DepartmentEnum.OrgTypeEnum.OFFICE.getType(), null, 0,officeType); sysDepartmentList.add(sysDepartment1); } } else { throw new BusinessException(ErrorCode.ERR_500, "第" + count + "行错误,科室:" + officeArray[0] + "已存在"); } } } } //todo 异步更新缓存 ExecutorService threadPool = Executors.newCachedThreadPool(); threadPool.submit(new Runnable() { @Override public void run() { // updateCache(sysDepartmentList); joinCache(); } }); return true; } private boolean validateDepartName(String departName) { // String regex = "^[A-Za-z0-9_\\-\\u4e00-\\u9fa5]{1,20}$"; // Pattern pattern = Pattern.compile(regex); // Matcher matcher = pattern.matcher(departName); // return matcher.matches(); return true; } @Data private static class DepartmentImportEntity { private String area; private String hospital; private String department; private String office; private String officeType; } /** * 导入更新缓存 * @param sysDepartmentList */ public void updateCache(List sysDepartmentList){ sysDepartmentBiz.updateCache(1,sysDepartmentList,null); } @Transactional(rollbackFor = Exception.class) public SysDepartment saveImportDepartment(String departName, Integer parentId, Integer orgType, Integer level, Integer isWarehouse) { SysDepartment sysDepartment = new SysDepartment(); //去掉空格 departName=oConvertUtils.replaceBlank(departName); sysDepartment.setDepartName(departName); sysDepartment.setOrgType(orgType); sysDepartment.setParentId(parentId); sysDepartment.setTreeCode(getTreeCode(parentId)); sysDepartment.setLevel(level); sysDepartment.setIsWarehouse(isWarehouse); sysDepartment.setOrgCode(getOrgCode(parentId, orgType)); this.baseMapper.insert(sysDepartment); return sysDepartment; } @Transactional(rollbackFor = Exception.class) public SysDepartment saveImportDepartment(String departName, Integer parentId, Integer orgType, Integer level, Integer isWarehouse,Integer officeType) { SysDepartment sysDepartment = new SysDepartment(); //去掉空格 departName=oConvertUtils.replaceBlank(departName); sysDepartment.setDepartName(departName); sysDepartment.setOrgType(orgType); sysDepartment.setParentId(parentId); sysDepartment.setTreeCode(getTreeCode(parentId)); sysDepartment.setLevel(level); sysDepartment.setIsWarehouse(isWarehouse); sysDepartment.setOrgCode(getOrgCode(parentId, orgType)); if(isWarehouse==0){ sysDepartment.setOfficeType(officeType); } this.baseMapper.insert(sysDepartment); return sysDepartment; } @Override public void downloadImportTemplate(HttpServletResponse response) throws IOException { XSSFWorkbook workbook = new XSSFWorkbook(this.getClass().getResourceAsStream("/excel/department_import_template.xlsx")); response.setContentType("application/octet-stream;charset=utf-8"); String fileName = "组织架构导入模板"; response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx"); ServletOutputStream out = null; try { out = response.getOutputStream(); workbook.write(out); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } if (workbook != null) { workbook.close(); } } } @Override public String getTreeCode(Integer parentId) { String treeId; String preTreeCode = ""; StringBuilder sb = new StringBuilder(); // SysDepartment sysDepartment = getById(parentId); if (sysDepartment != null) { preTreeCode = sysDepartment.getTreeCode(); } //设置key String key = CacheConstant.SYS_DEPARTS_CACHE + parentId; int count = 0; //判断是否存在key if (redisTemplate.hasKey(key)) { count = (int) redisTemplate.opsForValue().get(key); } do { count++; treeId = sb.append(preTreeCode).append(org.apache.commons.lang.StringUtils.leftPad(String.valueOf(count), 4, "0")).toString(); SysDepartment department = getOne(new QueryWrapper().lambda().eq(SysDepartment::getTreeCode, treeId)); if (department == null) { break; } sb = new StringBuilder(); } while (true); //设置缓存过期时间 redisTemplate.opsForValue().set(key, count, 365, TimeUnit.DAYS); return treeId; } /** * 生成组织编码 * 区域、医院、部门 4位 按组织类型不重复 * 科室 3位 按医院不重复 * * @param parentId * @param orgType * @return */ @Override public String getOrgCode(Integer parentId, Integer orgType) { String key = CacheConstant.SYS_DEPARTMENT_ORG_CODE + orgType; int length = 4; //医院 SysDepartment hospital = null; if (orgType.equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { hospital = getHospital(parentId); key = key + ":" + hospital.getId(); length = 3; } int count = 0; //判断是否存在key if (redisTemplate.hasKey(key)) { count = (int) redisTemplate.opsForValue().get(key); } //组织编码 String orgCode; do { count++; orgCode = org.apache.commons.lang.StringUtils.leftPad(String.valueOf(count), length, "0"); if (!orgType.equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { SysDepartment department = getOne(new QueryWrapper().lambda().eq(SysDepartment::getOrgCode, orgCode).eq(SysDepartment::getOrgType, orgType).last("limit 1")); if (department == null) { break; } } else { SysDepartment department = getOne(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, hospital.getTreeCode()).eq(SysDepartment::getOrgCode, orgCode).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.OFFICE.getType()).last("limit 1")); if (department == null) { break; } } } while (true); //设置缓存过期时间 redisTemplate.opsForValue().set(key, count, 365, TimeUnit.DAYS); return orgCode; } /** * 获取医院分级列表 * * @return */ private List getHospitalLevelList() { SysDict sysDict = sysDictService.getOne(new QueryWrapper().lambda().eq(SysDict::getDictCode, "DEPARTMENT_LEVEL")); if (sysDict == null) { return new ArrayList<>(); } return sysDictItemService.list(new QueryWrapper().lambda().eq(SysDictItem::getDictId, sysDict.getId()).eq(SysDictItem::getStatus, 1).orderByAsc(SysDictItem::getSortOrder)); } @Override public boolean deleteCache(Integer id) { String key = CacheConstant.SYS_DEPARTMENT_CACHE + id; return redisTemplate.delete(key); } @Override public SysDepartment getSysDepartmentById(Integer id) { return baseMapper.getSysDepartmentById(id); } @Override public IPage queryDepartmentPageList(Integer pageNo, Integer pageSize, SysDepartmentVO dto){ Page page = new Page<>(pageNo, pageSize); List hospitalIdList = getSearchHospitalIdList(dto.getHospitalId()); if (CollectionUtils.isEmpty(hospitalIdList)) { return page; } dto.setDepartmentIdList(hospitalIdList); IPage result = baseMapper.queryDepartmentPageList(page, dto); SysDepartment sysDepartment = null; if (dto.getHospitalId() == null) { sysDepartment = this.getMyDepartment(EnvUtils.getUser().getId()); if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { sysDepartment = this.getHospital(sysDepartment.getParentId()); } } else { sysDepartment = this.getById(dto.getHospitalId()); } //List sysDepartmentList = this.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode())); //Map sysDepartmentMap = sysDepartmentList.stream().collect(Collectors.toMap(SysDepartment::getId, e -> e)); List sysDepartmentList = this.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode())); Map sysDepartmentMap = sysDepartmentList.stream().collect(Collectors.toMap(SysDepartment::getId, e -> e)); for (SysDepartmentVO vo : result.getRecords()) { vo.setDepartmentIdList(new ArrayList<>()); fillDepartmentPath(sysDepartmentMap, vo, "/"); } return result; } /** * 填充用户列表中的区域、医院、部门、科室字段 * * @param vo */ private void fillDepartmentPath(Map sysDepartmentMap, SysDepartmentVO vo, String separateChar) { if (StringUtils.isEmpty(separateChar)) { separateChar = "/"; } if (vo.getHospitalId() != null) { SysDepartment sysDepartment = sysDepartmentMap.get(vo.getHospitalId()); if (sysDepartment == null) { sysDepartment = this.getById(vo.getHospitalId()); if (sysDepartment != null) { sysDepartmentMap.put(sysDepartment.getId(), sysDepartment); } } if (sysDepartment != null && sysDepartment.getId().equals(-1)) { vo.setArea(sysDepartment.getDepartName()); vo.getDepartmentIdList().add(0, sysDepartment.getId()); return; } while (sysDepartment != null && !sysDepartment.getId().equals(-1)) { //科室 if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { } //部门 else if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType())) { } //医院 else if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { vo.setHospitalName(sysDepartment.getDepartName()); } //区域 else { if (StringUtils.isNotEmpty(vo.getArea())) { vo.setArea(sysDepartment.getDepartName() + separateChar + vo.getArea()); } else { vo.setArea(sysDepartment.getDepartName()); } } vo.getDepartmentIdList().add(0, sysDepartment.getId()); if (sysDepartmentMap.get(sysDepartment.getParentId()) == null) { sysDepartment = this.getById(sysDepartment.getParentId()); if (sysDepartment != null) { sysDepartmentMap.put(sysDepartment.getId(), sysDepartment); } } else { sysDepartment = sysDepartmentMap.get(sysDepartment.getParentId()); } } } } @Override public List getSearchHospitalIdList(Integer hospitalId) { if (hospitalId == null) { return this.listMyHospital(EnvUtils.getUser().getId()).stream().map(SysDepartment::getId).collect(Collectors.toList()); } else { SysDepartment sysDepartment = this.getById(hospitalId); if (sysDepartment == null) { return new ArrayList<>(); } List childrenList = this.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())); if (CollectionUtils.isEmpty(childrenList)) { return new ArrayList<>(); } return childrenList.stream().map(SysDepartment::getId).collect(Collectors.toList()); } } @Override public IPage getCollectAppletAuthorization(CollectAppletAuthorizationVO vo, Integer pageNo, Integer pageSize) { pageNo = vo.getPageNo(); pageSize = vo.getPageSize(); List searchHospitalIdList = getSearchHospitalIdList(vo.getId()); Page pageParam = new Page<>(pageNo, pageSize); List collectAppletAuthorization = this.baseMapper.getCollectAppletAuthorization(pageParam, vo, searchHospitalIdList); return pageParam.setRecords(collectAppletAuthorization); } @Override public void batchEditCollectAppletAuthorization(List ids, Integer status, Integer userId) { this.baseMapper.batchEditCollectAppletAuthorization(ids, status, userId); } @Override public IPage getMonthlySmsAuthorization(MonthlySmsAuthorizationVO vo, Integer pageNo, Integer pageSize) { pageNo = vo.getPageNo(); pageSize = vo.getPageSize(); Page pageParam = new Page<>(pageNo, pageSize); return this.baseMapper.getMonthlySmsAuthorization(pageParam, vo); } @Override public void batchEditMonthlySmsAuthorization(List ids, Integer status, Integer userId) { this.baseMapper.batchEditMonthlySmsAuthorization(ids, status, userId); } @Override public void sendMonthlySMS() { List> monthlySMSHospitalData = this.baseMapper.getMonthlySMSHospitalData(); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - 1); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); String month = sdf.format(calendar.getTime()); for (Map map : monthlySMSHospitalData) { Integer id = Integer.valueOf(map.get("id").toString()); String hospital = map.get("hospital").toString(); String phone = map.get("phone").toString(); List> monthlySMSData = this.baseMapper.getMonthlySMSData(id, month, 1); if(monthlySMSData.size() > 0){ //1新增 2已入库 3已出库 //${hospitalName},您${month}月产废:感${wasteTypeA}kg;损${wasteTypeB}kg;药${wasteTypeC}kg;病${wasteTypeD}kg;化${wasteTypeE}kg;合计${total}kg。 Map map1 = new HashMap<>(); map1.put("hospitalName", hospital); map1.put("month", month); BigDecimal total = new BigDecimal("0"); for (Map datum : monthlySMSData) { String wasteType = datum.get("wasteType").toString(); Double weight = Double.valueOf(datum.get("weight").toString()); switch (wasteType){ case "1": map1.put("wasteTypeA", weight.toString()); break; case "2": map1.put("wasteTypeB", weight.toString()); break; case "3": map1.put("wasteTypeC", weight.toString()); break; case "4": map1.put("wasteTypeD", weight.toString()); break; case "5": map1.put("wasteTypeE", weight.toString()); break; } total = total.add(new BigDecimal(weight)); } map1.put("total", total.toString()); aliSmsService.sendMonthlySMS(phone, map1); } } } private Logger logger = LoggerFactory.getLogger(SysDepartmentServiceImpl.class); /** * 操作更新缓存 */ @Override public void joinCache(){ /* List myHospitalAndOfficeCascadeList = sysDepartmentBiz.getMyHospitalAndOfficeCascadeList(1); redisUtil.set("myHospitalAndOfficeCascadeList",myHospitalAndOfficeCascadeList); List myHospitalCascadeList= sysDepartmentBiz.getMyHospitalCascadeList(1); redisUtil.set("myHospitalCascadeList",myHospitalCascadeList); List myDepartmentTreeList= sysDepartmentBiz.getMyDepartmentTreeList(1); redisUtil.set("myDepartmentTreeList",myDepartmentTreeList); logger.debug("加入缓存结束"); ExecutorService executorService = Executors.newFixedThreadPool(1); executorService.execute(new Runnable() { public void run() { } });*/ // 创建CountDownLatch, 计数器初始值为4 CountDownLatch latch = new CountDownLatch(4); long startTime = System.currentTimeMillis(); ExecutorService executorService = Executors.newFixedThreadPool(4); // 启动并行任务 executorService.submit(() -> { try { long start = System.currentTimeMillis(); List sysDepartmentDTOS = sysDepartmentBiz.getMyRegionTreeList(1); redisUtil.set("myRegionTreeList", sysDepartmentDTOS); logger.debug("myRegionTreeList耗时:{}秒", (System.currentTimeMillis() - start) / 1000); } finally { latch.countDown(); } }); executorService.submit(() -> { try { long start = System.currentTimeMillis(); List myDepartmentTreeList = sysDepartmentBiz.getMyDepartmentTreeList(1); redisUtil.set("myDepartmentTreeList", myDepartmentTreeList); logger.debug("myDepartmentTreeList耗时:{}秒", (System.currentTimeMillis() - start) / 1000); } finally { latch.countDown(); } }); executorService.submit(() -> { try { long start = System.currentTimeMillis(); List myHospitalAndOfficeCascadeList = sysDepartmentBiz.getMyHospitalAndOfficeCascadeListV2(1); redisUtil.set("myHospitalAndOfficeCascadeList", myHospitalAndOfficeCascadeList); logger.debug("myHospitalAndOfficeCascadeList耗时:{}秒", (System.currentTimeMillis() - start) / 1000); } finally { latch.countDown(); } }); executorService.submit(() -> { try { long start = System.currentTimeMillis(); List myHospitalCascadeList = sysDepartmentBiz.getMyHospitalCascadeList(1); redisUtil.set("myHospitalCascadeList", myHospitalCascadeList); logger.debug("myHospitalCascadeList耗时:{}秒", (System.currentTimeMillis() - start) / 1000); } finally { latch.countDown(); } }); // 等待所有任务完成 try { latch.await(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); logger.error("任务执行被中断", e); } finally { executorService.shutdown(); logger.debug("总计耗时:{}秒", (System.currentTimeMillis() - startTime) / 1000); logger.debug("更新缓存结束"); } } @Override public List getDeptIdListByTreeCode(String treeCode) { return baseMapper.getDeptIdListByTreeCode(treeCode); } @Override public IPage queryOfficePageList(SysDepartmentOfficeQueryDTO queryVO) { Page page = new Page<>(queryVO.getPageNo(), queryVO.getPageSize()); // 获取当前用户权限范围内的部门ID列表 SysDepartment sysDepartment = sysDepartmentService.getById(queryVO.getHospitalId()); if (Objects.isNull(sysDepartment)) { return page; } IPage result = baseMapper.queryOfficePageList(page, queryVO, sysDepartment.getTreeCode()); // 修正医院名称:科室的父级可能是部门而非医院,需要递归向上查找真正的医院 for (SysDepartmentOfficeVO vo : result.getRecords()) { SysDepartment hospital = getHospital(vo.getParentId()); if (hospital != null) { vo.setHospitalName(hospital.getDepartName()); } } return result; } @Override @Transactional @AutoLog(value = "更新科室信息") public boolean updateOfficeInfo(SysDepartmentOfficeUpdateDTO updateVO) { SysDepartment department = getById(updateVO.getId()); if (department == null) { throw new BusinessException(ErrorCode.ERR_500, "科室不存在"); } if (!department.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { throw new BusinessException(ErrorCode.ERR_500, "只能修改科室信息"); } // 检查科室名称是否重复(同一医院下) SysDepartment existDepartment = getOne(new QueryWrapper().lambda() .eq(SysDepartment::getParentId, department.getParentId()) .eq(SysDepartment::getDepartName, updateVO.getDepartName()) .ne(SysDepartment::getId, updateVO.getId()) .eq(SysDepartment::getDelFlag, 0)); if (existDepartment != null) { throw new BusinessException(ErrorCode.ERR_500, "同一医院下科室名称不能重复"); } // 更新科室信息 department.setDepartName(updateVO.getDepartName()); department.setDepartmentLocation(updateVO.getDepartmentLocation()); department.setBedCount(updateVO.getBedCount()); department.setWasteThreshold(updateVO.getWasteThreshold()); department.setUpdateTime(new Date()); department.setUpdateBy(EnvUtils.getUser().getId()); return updateById(department); } }