package com.sinata.appointment.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.sinata.appointment.constants.CacheNames; import com.sinata.appointment.dto.MiniFieldConfigVo; import com.sinata.appointment.dto.MiniLocalUnitVo; import com.sinata.appointment.constants.MiniUserType; import com.sinata.appointment.dto.MiniPassAccessAreaTreeVo; import com.sinata.appointment.dto.MiniVisitReasonVo; import com.sinata.appointment.dto.MiniVisitedUserVo; import com.sinata.appointment.entity.BizFieldConfig; import com.sinata.appointment.entity.MpPassAccessArea; import com.sinata.appointment.entity.BizVisitReason; import com.sinata.appointment.entity.MpPassLocalUnit; import com.sinata.appointment.entity.MpUser; import com.sinata.appointment.entity.SysDept; import com.sinata.appointment.mapper.BizFieldConfigMapper; import com.sinata.appointment.mapper.BizVisitReasonMapper; import com.sinata.appointment.mapper.MpPassAccessAreaMapper; import com.sinata.appointment.mapper.MpPassLocalUnitMapper; import com.sinata.appointment.mapper.MpUserMapper; import com.sinata.appointment.mapper.SysDeptMapper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class MiniLookupApplicationService { private final BizFieldConfigMapper bizFieldConfigMapper; private final BizVisitReasonMapper bizVisitReasonMapper; private final MpPassAccessAreaMapper mpPassAccessAreaMapper; private final MpPassLocalUnitMapper mpPassLocalUnitMapper; private final MpUserMapper mpUserMapper; private final SysDeptMapper sysDeptMapper; @Cacheable(cacheNames = CacheNames.MINI_LOOKUP, key = "'" + CacheNames.MINI_LOOKUP_FIELD_CONFIGS_KEY + "'") public List listFieldConfigs() { return bizFieldConfigMapper.selectList( new LambdaQueryWrapper() .eq(BizFieldConfig::getDelFlag, 0) .orderByAsc(BizFieldConfig::getSortOrder) .orderByAsc(BizFieldConfig::getId)) .stream() .map(this::toFieldConfigVo) .toList(); } @Cacheable(cacheNames = CacheNames.MINI_LOOKUP, key = "'" + CacheNames.MINI_LOOKUP_VISIT_REASONS_KEY + "'") public List listVisitReasons() { return bizVisitReasonMapper.selectList( new LambdaQueryWrapper() .eq(BizVisitReason::getDelFlag, 0) .eq(BizVisitReason::getEnabled, 1) .orderByAsc(BizVisitReason::getSortOrder) .orderByAsc(BizVisitReason::getId)) .stream() .map(this::toVisitReasonVo) .toList(); } @Cacheable(cacheNames = CacheNames.MINI_LOOKUP, key = "'" + CacheNames.MINI_LOOKUP_PASS_ACCESS_AREA_TREE_KEY + "'") public List listPassAccessAreaTree() { List rows = mpPassAccessAreaMapper.selectList( new LambdaQueryWrapper() .eq(MpPassAccessArea::getDelFlag, 0) .orderByAsc(MpPassAccessArea::getPid) .orderByAsc(MpPassAccessArea::getId)); if (rows.isEmpty()) { return List.of(); } Map nodeMap = new HashMap<>(); List roots = new ArrayList<>(); for (MpPassAccessArea row : rows) { MiniPassAccessAreaTreeVo node = new MiniPassAccessAreaTreeVo(); node.setId(row.getId()); node.setAreaName(row.getAreaName()); nodeMap.put(row.getId(), node); } for (MpPassAccessArea row : rows) { MiniPassAccessAreaTreeVo current = nodeMap.get(row.getId()); if (row.getPid() == null || row.getPid() == 0) { roots.add(current); continue; } MiniPassAccessAreaTreeVo parent = nodeMap.get(row.getPid()); if (parent == null) { roots.add(current); continue; } parent.getChildren().add(current); } return roots; } public List searchVisitedUsersByExactName(String realName) { String name = realName == null ? "" : realName.trim(); if (name.isEmpty()) { return List.of(); } List users = mpUserMapper.selectList( new LambdaQueryWrapper() .eq(MpUser::getDelFlag, 0) .eq(MpUser::getStatus, 1) .eq(MpUser::getUserType, MiniUserType.EMPLOYEE) .eq(MpUser::getNickName, name) .orderByAsc(MpUser::getId)); if (users.isEmpty()) { return List.of(); } List deptIds = users.stream().map(MpUser::getDeptId).filter(id -> id != null && id > 0).distinct().toList(); Map deptNameMap = new HashMap<>(); if (!deptIds.isEmpty()) { List depts = sysDeptMapper.selectList( new LambdaQueryWrapper() .eq(SysDept::getDelFlag, 0) .in(SysDept::getId, deptIds)); deptNameMap = depts.stream().collect(Collectors.toMap(SysDept::getId, d -> d.getDeptName() == null ? "" : d.getDeptName(), (a, b) -> a)); } final Map finalDeptNameMap = deptNameMap; return users.stream().map(u -> toVo(u, finalDeptNameMap)).collect(Collectors.toList()); } public List searchLocalUnitsByExactName(String unitName) { String name = unitName == null ? "" : unitName.trim(); if (name.isEmpty()) { return List.of(); } return mpPassLocalUnitMapper.selectList( new LambdaQueryWrapper() .eq(MpPassLocalUnit::getDelFlag, 0) .eq(MpPassLocalUnit::getUnitName, name) .orderByAsc(MpPassLocalUnit::getId)) .stream() .map(this::toLocalUnitVo) .toList(); } private MiniVisitedUserVo toVo(MpUser user, Map deptNameMap) { MiniVisitedUserVo vo = new MiniVisitedUserVo(); vo.setId(user.getId()); vo.setRealName(user.getNickName()); vo.setDeptName(user.getDeptId() == null ? "" : deptNameMap.getOrDefault(user.getDeptId(), "")); return vo; } private MiniVisitReasonVo toVisitReasonVo(BizVisitReason row) { MiniVisitReasonVo vo = new MiniVisitReasonVo(); vo.setId(row.getId()); vo.setReasonCode(row.getReasonCode()); vo.setReasonName(row.getReasonName()); return vo; } private MiniFieldConfigVo toFieldConfigVo(BizFieldConfig row) { MiniFieldConfigVo vo = new MiniFieldConfigVo(); vo.setFieldCode(row.getFieldCode()); vo.setFieldName(row.getFieldName()); vo.setVisible(row.getVisible()); vo.setRequiredFlag(row.getRequiredFlag()); vo.setSortOrder(row.getSortOrder()); return vo; } private MiniLocalUnitVo toLocalUnitVo(MpPassLocalUnit row) { MiniLocalUnitVo vo = new MiniLocalUnitVo(); vo.setId(row.getId()); vo.setUnitName(row.getUnitName()); return vo; } }