package com.vincent.rsf.server.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.controller.params.DeviceSiteParame; import com.vincent.rsf.server.manager.controller.params.DeviceSiteRowParam; import com.vincent.rsf.server.manager.entity.BasStation; import com.vincent.rsf.server.manager.mapper.DeviceSiteMapper; import com.vincent.rsf.server.manager.entity.DeviceSite; import com.vincent.rsf.server.manager.service.BasStationService; import com.vincent.rsf.server.manager.service.DeviceSiteService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; @Service("deviceSiteService") public class DeviceSiteServiceImpl extends ServiceImpl implements DeviceSiteService { /** 与表 man_device_site.target 列长度一致,超长截断避免 Data too long */ private static final int TARGET_MAX_LENGTH = 255; @Autowired private BasStationService basStationService; /** * 初始化站点:多行(设备站点、作业站点、目标站点为一组),巷道英文逗号分隔,每组×巷道×作业类型生成多条记录 */ @Override @Transactional(rollbackFor = Exception.class) public boolean initSites(DeviceSiteParame param) { if (param.getFlagInit() != null && param.getFlagInit() == 1) { List list = this.list(new LambdaQueryWrapper().select(DeviceSite::getId).last("limit 1")); if (!list.isEmpty()) { if (!this.remove(new LambdaQueryWrapper<>())) { throw new CoolException("初始化失败: 删除站点失败!!"); } } } if (Objects.isNull(param.getTypeIds()) || param.getTypeIds().isEmpty()) { throw new CoolException("初始化失败: 作业类型不能为空!!"); } if (StringUtils.isBlank(param.getChannel())) { throw new CoolException("初始化失败: 巷道不能为空!!"); } List channels = parseChannels(param.getChannel()); if (channels.isEmpty()) { throw new CoolException("初始化失败: 巷道格式错误,请用英文逗号分隔,如 1,2,3!!"); } List rows = param.getRows(); if (Objects.isNull(rows) || rows.isEmpty()) { throw new CoolException("初始化失败: 请至少添加一行(设备站点、作业站点、目标站点)!!"); } List deviceSites = new ArrayList<>(); for (DeviceSiteRowParam row : rows) { if (StringUtils.isBlank(row.getDeviceSite()) || StringUtils.isBlank(row.getSite()) || StringUtils.isBlank(row.getTarget())) { throw new CoolException("初始化失败: 每行的设备站点、作业站点、目标站点均不能为空!!"); } BasStation siteStation = basStationService.getById(Long.parseLong(row.getSite().trim())); if (siteStation == null) { throw new CoolException("初始化失败: 作业站点未找到!!"); } BasStation deviceStation = basStationService.getById(Long.parseLong(row.getDeviceSite().trim())); if (deviceStation == null) { throw new CoolException("初始化失败: 设备站点未找到!!"); } for (Long typeId : param.getTypeIds()) { for (Integer ch : channels) { DeviceSite ds = new DeviceSite(); String siteName = siteStation.getStationName(); String deviceSiteName = deviceStation.getStationName(); String targetVal = truncate(row.getTarget().trim(), TARGET_MAX_LENGTH); String commonName = StringUtils.isNotBlank(param.getName()) ? param.getName().trim() : null; String commonLabel = StringUtils.isNotBlank(param.getLabel()) ? param.getLabel().trim() : null; ds.setType(String.valueOf(typeId)) .setSite(siteName) .setDevice(param.getDeviceType()) .setDeviceSite(deviceSiteName) .setTarget(targetVal) .setDeviceCode(param.getDeviceCode()) .setAreaIdStart(param.getAreaIdStart()) .setAreaIdEnd(param.getAreaIdEnd()) .setChannel(ch) .setName(commonName != null ? commonName : (deviceSiteName + "-" + siteName + "-" + targetVal + "-" + ch)) .setLabel(commonLabel); deviceSites.add(ds); } } } if (!this.saveBatch(deviceSites)) { throw new CoolException("初始化失败: 数据保存失败!!"); } return true; } private static String truncate(String s, int maxLen) { if (s == null) return null; return s.length() <= maxLen ? s : s.substring(0, maxLen); } /** 巷道英文逗号分割,解析为整数列表 */ private List parseChannels(String channelStr) { if (StringUtils.isBlank(channelStr)) { return Collections.emptyList(); } String[] parts = channelStr.split(","); List list = new ArrayList<>(); for (String p : parts) { String t = (p == null) ? "" : p.trim(); if (t.isEmpty()) continue; try { list.add(Integer.parseInt(t)); } catch (NumberFormatException e) { return Collections.emptyList(); } } return list; } }