Files
CampusNotice/src/main/java/com/yunhai/campusnotice/service/impl/SmsService.java
T
wanghu 3016a97f1b
build / build-push (push) Failing after 1m18s
通知
2026-09-10 15:39:41 +08:00

285 lines
12 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<Map<String, Object>> getModuleList() {
List<SmsModule> modules = smsModuleRepository.findAllByOrderByIdAsc();
return modules.stream().map(m -> {
Map<String, Object> item = new LinkedHashMap<>();
item.put("ID", m.getId());
item.put("Name", m.getModuleName());
return item;
}).collect(Collectors.toList());
}
// ============================ getgroup ============================
@Override
public List<Map<String, Object>> getSchParentGroup() {
// C# 从外部BLL获取学校组数据。Java版暂不接入用户中心API。
// 返回空列表,前端可按需处理。
log.info("[getSchParentGroup] 暂未接入用户中心API,返回空列表");
return Collections.emptyList();
}
// ============================ getschsms ============================
@Override
public Map<String, Object> 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<SmsSchoolConfig> 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<SmsModule> modules = smsModuleRepository.findAllByOrderByIdAsc();
// 按 schoolId 分组配置
Map<Integer, List<SmsSchoolConfig>> configBySchool = page.getContent().stream()
.collect(Collectors.groupingBy(SmsSchoolConfig::getSchoolId));
// 构建返回数据:每个学校一行,包含各模块的开关状态
List<Map<String, Object>> listData = page.getContent().stream()
.collect(Collectors.groupingBy(SmsSchoolConfig::getSchoolId))
.entrySet().stream()
.map(entry -> {
Integer schoolId = entry.getKey();
List<SmsSchoolConfig> configs = entry.getValue();
String schoolName = configs.get(0).getSchoolName();
// 构建模块开关矩阵
List<Map<String, Object>> moduleList = new ArrayList<>();
boolean isAll = true;
for (SmsModule module : modules) {
Map<String, Object> 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<String, Object> 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<String, Object> result = new LinkedHashMap<>();
result.put("list", listData);
result.put("total", page.getTotalElements());
return result;
}
// ============================ getsch ============================
@Override
public List<Map<String, Object>> getSchList() {
// C# 从外部BLL获取学校列表。Java版从 sms_school_config 表提取已配置学校。
// 获取所有不重复的学校
List<SmsSchoolConfig> allConfigs = smsSchoolConfigRepository.findAll();
Map<Integer, String> schoolMap = new LinkedHashMap<>();
for (SmsSchoolConfig config : allConfigs) {
schoolMap.putIfAbsent(config.getSchoolId(), config.getSchoolName());
}
return schoolMap.entrySet().stream().map(entry -> {
Map<String, Object> 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<SmsSchoolConfig> 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<SmsModule> 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<SmsSchoolConfig> 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<Integer> schoolIds = Arrays.stream(schSerIDs.split(","))
.map(String::trim)
.filter(s -> !s.isEmpty())
.map(Integer::parseInt)
.collect(Collectors.toList());
List<Integer> 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<SmsSchoolConfig> 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;
}
}