package com.yunhai.campusnotice.service.impl; import com.yunhai.campusnotice.entity.SmsModule; import com.yunhai.campusnotice.entity.SmsSchoolConfig; import com.yunhai.campusnotice.repository.SmsModuleRepository; import com.yunhai.campusnotice.repository.SmsSchoolConfigRepository; import com.yunhai.campusnotice.service.ISmsService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.*; import java.util.stream.Collectors; /** * 短信设置服务实现。 * 对应 C# SchModuleSmsController + SchModuleSms.cs。 * 注意:C# 原版依赖外部DLL(ISchIsSmsBLL/ISchoolBLL/ISchGroupBLL)获取学校和组数据, * Java版改为从本地 sms_module + sms_school_config 表管理。 */ @Service public class SmsService implements ISmsService { private static final Logger log = LoggerFactory.getLogger(SmsService.class); @Autowired private SmsModuleRepository smsModuleRepository; @Autowired private SmsSchoolConfigRepository smsSchoolConfigRepository; // ============================ getmodule ============================ @Override public List> getModuleList() { List modules = smsModuleRepository.findAllByOrderByIdAsc(); return modules.stream().map(m -> { Map item = new LinkedHashMap<>(); item.put("ID", m.getId()); item.put("Name", m.getModuleName()); return item; }).collect(Collectors.toList()); } // ============================ getgroup ============================ @Override public List> getSchParentGroup() { // C# 从外部BLL获取学校组数据。Java版暂不接入用户中心API。 // 返回空列表,前端可按需处理。 log.info("[getSchParentGroup] 暂未接入用户中心API,返回空列表"); return Collections.emptyList(); } // ============================ getschsms ============================ @Override public Map getSchIsSmsList(Integer pageSize, Integer pageIndex, String schName) { if (pageSize == null || pageSize <= 0) pageSize = 10; // 前端 PageIndex 从0开始(page-1),后端按0基处理 if (pageIndex == null || pageIndex < 0) pageIndex = 0; // 查询学校配置(按学校名模糊搜索或全部) Page page; int offset = pageIndex; // 0基 Sort sort = Sort.by(Sort.Direction.DESC, "schoolName"); if (StringUtils.hasText(schName)) { page = smsSchoolConfigRepository.findBySchoolNameContaining(schName, PageRequest.of(offset, pageSize, sort)); } else { page = smsSchoolConfigRepository.findAll(PageRequest.of(offset, pageSize, sort)); } // 加载全部模块列表 List modules = smsModuleRepository.findAllByOrderByIdAsc(); // 按 schoolId 分组配置 Map> configBySchool = page.getContent().stream() .collect(Collectors.groupingBy(SmsSchoolConfig::getSchoolId)); // 构建返回数据:每个学校一行,包含各模块的开关状态 List> listData = page.getContent().stream() .collect(Collectors.groupingBy(SmsSchoolConfig::getSchoolId)) .entrySet().stream() .map(entry -> { Integer schoolId = entry.getKey(); List configs = entry.getValue(); String schoolName = configs.get(0).getSchoolName(); // 构建模块开关矩阵 List> moduleList = new ArrayList<>(); boolean isAll = true; for (SmsModule module : modules) { Map modu = new LinkedHashMap<>(); SmsSchoolConfig config = configs.stream() .filter(c -> module.getId().equals(c.getModuleId())) .findFirst().orElse(null); modu.put("SerID", config != null ? config.getId() : -1); modu.put("ModuID", module.getId()); modu.put("IsSms", config != null && Boolean.TRUE.equals(config.getIsSms())); modu.put("SchSerID", schoolId); moduleList.add(modu); if (config == null || !Boolean.TRUE.equals(config.getIsSms())) { isAll = false; } } Map schoolItem = new LinkedHashMap<>(); schoolItem.put("SchSerID", schoolId); schoolItem.put("SchName", schoolName); schoolItem.put("IsAll", isAll); schoolItem.put("itemsModu", moduleList); return schoolItem; }) .collect(Collectors.toList()); // 如果没有配置数据,返回空列表(但保留total) if (listData.isEmpty() && page.hasContent()) { // 这种情况不应发生,但防御性处理 listData = Collections.emptyList(); } Map result = new LinkedHashMap<>(); result.put("list", listData); result.put("total", page.getTotalElements()); return result; } // ============================ getsch ============================ @Override public List> getSchList() { // C# 从外部BLL获取学校列表。Java版从 sms_school_config 表提取已配置学校。 // 获取所有不重复的学校 List allConfigs = smsSchoolConfigRepository.findAll(); Map schoolMap = new LinkedHashMap<>(); for (SmsSchoolConfig config : allConfigs) { schoolMap.putIfAbsent(config.getSchoolId(), config.getSchoolName()); } return schoolMap.entrySet().stream().map(entry -> { Map item = new LinkedHashMap<>(); item.put("ID", entry.getKey()); item.put("Name", entry.getValue()); return item; }).collect(Collectors.toList()); } // ============================ setschsms ============================ @Override @Transactional public void setSchSms(Integer schSerID, Integer moduleId, Boolean isSms) { if (schSerID == null || moduleId == null) { return; } SmsSchoolConfig config = smsSchoolConfigRepository.findBySchoolIdAndModuleId(schSerID, moduleId); if (config == null) { config = new SmsSchoolConfig(); config.setSchoolId(schSerID); config.setModuleId(moduleId); // 学校名称从已有配置中获取 List existing = smsSchoolConfigRepository.findBySchoolId(schSerID); if (!existing.isEmpty()) { config.setSchoolName(existing.get(0).getSchoolName()); } } config.setIsSms(isSms != null ? isSms : false); smsSchoolConfigRepository.save(config); } // ============================ setschallsms ============================ @Override @Transactional public void setSchSmsAll(Integer schSerID, Boolean isSms) { if (schSerID == null) { return; } List modules = smsModuleRepository.findAllByOrderByIdAsc(); boolean sms = Boolean.TRUE.equals(isSms); for (SmsModule module : modules) { SmsSchoolConfig config = smsSchoolConfigRepository.findBySchoolIdAndModuleId(schSerID, module.getId()); if (config == null) { config = new SmsSchoolConfig(); config.setSchoolId(schSerID); config.setModuleId(module.getId()); List existing = smsSchoolConfigRepository.findBySchoolId(schSerID); if (!existing.isEmpty()) { config.setSchoolName(existing.get(0).getSchoolName()); } } config.setIsSms(sms); smsSchoolConfigRepository.save(config); } } // ============================ setschmodulesms ============================ @Override @Transactional public void setSchModuleSms(String schSerIDs, String modules, Boolean isSms) { if (!StringUtils.hasText(schSerIDs) || !StringUtils.hasText(modules)) { return; } List schoolIds = Arrays.stream(schSerIDs.split(",")) .map(String::trim) .filter(s -> !s.isEmpty()) .map(Integer::parseInt) .collect(Collectors.toList()); List moduleIds = Arrays.stream(modules.split(",")) .map(String::trim) .filter(s -> !s.isEmpty()) .map(Integer::parseInt) .collect(Collectors.toList()); boolean sms = Boolean.TRUE.equals(isSms); for (Integer schoolId : schoolIds) { for (Integer moduleId : moduleIds) { SmsSchoolConfig config = smsSchoolConfigRepository.findBySchoolIdAndModuleId(schoolId, moduleId); if (config == null) { config = new SmsSchoolConfig(); config.setSchoolId(schoolId); config.setModuleId(moduleId); List existing = smsSchoolConfigRepository.findBySchoolId(schoolId); if (!existing.isEmpty()) { config.setSchoolName(existing.get(0).getSchoolName()); } } config.setIsSms(sms); smsSchoolConfigRepository.save(config); } } } // ============================ setschsms (JSON 解析) ============================ @Override @Transactional public void setSchSmsFromJson(String itemsModuJson) { Integer schSerID = extractJsonField(itemsModuJson, "SchSerID"); Integer moduID = extractJsonField(itemsModuJson, "ModuID"); Boolean isSms = extractJsonBool(itemsModuJson, "IsSms"); setSchSms(schSerID, moduID, isSms); } // ============================ 辅助方法 ============================ /** * 从 JSON 字符串中提取整数字段。 */ private Integer extractJsonField(String json, String field) { if (json == null) return null; String pattern = "\"" + field + "\"\\s*:\\s*\"?(-?\\d+)\"?"; java.util.regex.Pattern p = java.util.regex.Pattern.compile(pattern); java.util.regex.Matcher m = p.matcher(json); if (m.find()) { return Integer.parseInt(m.group(1)); } return null; } /** * 从 JSON 字符串中提取布尔字段。 */ private Boolean extractJsonBool(String json, String field) { if (json == null) return null; String pattern = "\"" + field + "\"\\s*:\\s*(true|false)"; java.util.regex.Pattern p = java.util.regex.Pattern.compile(pattern); java.util.regex.Matcher m = p.matcher(json); if (m.find()) { return Boolean.parseBoolean(m.group(1)); } return null; } }