package com.ycl.platform.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.dataListener.CurrencyDataListener; import com.ycl.platform.base.AbsVo; import com.ycl.platform.domain.entity.*; import com.ycl.platform.domain.excel.PointExport; import com.ycl.platform.domain.form.BatchEditPointForm; import com.ycl.platform.domain.form.YwPointForm; import com.ycl.platform.domain.query.YwPointQuery; import com.ycl.platform.domain.result.BaseResult; import com.ycl.platform.domain.vo.CheckTagVO; import com.ycl.platform.domain.vo.DynamicColumnVO; import com.ycl.platform.domain.vo.ReportAuditingRecordVO; import com.ycl.platform.domain.vo.YwPointVO; import com.ycl.platform.mapper.DynamicColumnMapper; import com.ycl.platform.mapper.TMonitorMapper; import com.ycl.platform.mapper.YwPeopleMapper; import com.ycl.platform.mapper.YwPointMapper; import com.ycl.platform.service.DynamicColumnService; import com.ycl.platform.service.YwPointService; import com.ycl.platform.service.YwUnitService; import com.ycl.system.Result; import com.ycl.system.mapper.SysDeptMapper; import com.ycl.system.page.PageUtil; import com.ycl.thread.PointImportCallable; import com.ycl.utils.DateUtils; import com.ycl.utils.SecurityUtils; import com.ycl.utils.poi.EasyExcelImportUtils; import com.ycl.utils.uuid.IdUtils; import constant.PointHeaderConstant; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.*; import java.util.concurrent.*; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; /** * 运维点位 服务实现类 * * @author xp * @since 2024-03-05 */ @Service @RequiredArgsConstructor @Slf4j public class YwPointServiceImpl extends ServiceImpl implements YwPointService { private final SysDeptMapper sysDeptMapper; private final TMonitorMapper monitorMapper; private final DynamicColumnMapper dynamicColumnMapper; private final ApplicationContext context; /** * 添加 * * @param form * @return */ @Override public Result add(YwPointForm form) { YwPoint entity = YwPointForm.getEntityByForm(form, null); Date now = new Date(); entity.setCreateTime(now); entity.setUpdateTime(now); if (baseMapper.insert(entity) > 0) { return Result.ok("添加成功"); } return Result.error("添加失败"); } @Override @Transactional(rollbackFor = Exception.class) public Result batchAdd(List formList) { formList.stream() .forEach(form -> { YwPoint entity = YwPointForm.getEntityByForm(form, null); entity.setStatus("未开始"); Date now = new Date(); entity.setCreateTime(now); entity.setUpdateTime(now); baseMapper.insert(entity); }); return Result.ok("添加成功"); } @Override @Transactional(rollbackFor = Exception.class) public Result batchEdit(BatchEditPointForm form) { if (Objects.nonNull(form.getUnitId())) { new LambdaUpdateChainWrapper<>(baseMapper) .in(YwPoint::getId, form.getIds()) .set(YwPoint::getUnitId, form.getUnitId()) .set(YwPoint::getUpdateTime, new Date()) .update(); } else { new LambdaUpdateChainWrapper<>(baseMapper) .in(YwPoint::getId, form.getIds()) .set(YwPoint::getUnitId, form.getUnitId()) .set(YwPoint::getStartTime, null) .set(YwPoint::getEndTime, null) .set(YwPoint::getUpdateTime, new Date()) .update(); } return Result.ok("修改成功"); } /** * 修改 * * @param form * @return */ @Override public Result update(YwPointForm form) { YwPoint entity = baseMapper.selectById(form.getId()); Assert.notNull(entity, "记录不存在"); BeanUtils.copyProperties(form, entity); Date now = new Date(); entity.setUpdateTime(now); baseMapper.updateById(entity); return Result.ok("修改成功"); } /** * 批量删除 * * @param ids * @return */ @Override public Result remove(List ids) { if (baseMapper.deleteBatchIds(ids) > 0) { return Result.ok("删除成功"); } return Result.error("删除失败"); } /** * id删除 * * @param id * @return */ @Override public Result removeById(String id) { if (baseMapper.deleteById(id) > 0) { return Result.ok("删除成功"); } return Result.error("删除失败"); } /** * 分页查询 * * @param query * @return */ @Override public Result page(YwPointQuery query) { IPage page = PageUtil.getPage(query, YwPointVO.class); baseMapper.page(page, query); return Result.ok().data(page.getRecords()).total(page.getTotal()); } /** * 根据id查找 * * @param id * @return */ @Override public Result detail(String id) { YwPoint entity = baseMapper.selectById(id); Assert.notNull(entity, "记录不存在"); YwPointVO vo = YwPointVO.getVoByEntity(entity, null); if (Objects.nonNull(entity.getDeptId())) { vo.setDeptIds(sysDeptMapper.selectParents(entity.getDeptId())); } return Result.ok().data(vo); } /** * 列表 * * @return */ @Override public Result all() { List entities = baseMapper.selectList(null); List vos = entities.stream() .map( entity -> YwPointVO.getVoByEntity(entity, null) ) .collect(Collectors.toList()); return Result.ok().data(vos); } @Override public Result select(String keyword) { Integer unitId = SecurityUtils.getUnitId(); List list = baseMapper.select(keyword, unitId); List data = list.stream().map(item -> { Map map = new HashMap(); map.put("id", item.getSerialNumber()); map.put("value", item.getPointName()); return map; }).collect(Collectors.toList()); return Result.ok().data(data); } @Override public boolean updateRecovery(List serialNumberList, int recovery) { return new LambdaUpdateChainWrapper<>(baseMapper) .in(YwPoint::getSerialNumber, serialNumberList) .set(YwPoint::getRecovery, recovery) .set(YwPoint::getUpdateTime, new Date()) .set(recovery == 0, YwPoint::getRecoveryTime, DateUtils.getNowDate()) .update(); } @Override public List home() { return baseMapper.home(); } @Override public void export(YwPointQuery query, HttpServletResponse response) throws IOException { // 导出数据 List exportData = baseMapper.export(query); //获取动态列数据 List dynamicsHeaders = dynamicColumnMapper.getHeader("t_yw_point"); List dynamics = dynamicColumnMapper.getData(); Map> dynamicMap = new HashMap<>(); if (!CollectionUtils.isEmpty(dynamics)) { dynamicMap = dynamics.stream().filter(vo -> vo.getRefId() != null).collect(Collectors.groupingBy(DynamicColumnVO::getRefId)); } //定义表头列表 LinkedHashSet headers = new LinkedHashSet<>(); headers.add(PointHeaderConstant.ID); headers.add(PointHeaderConstant.Point_Name); headers.add(PointHeaderConstant.Serial_Number); headers.add(PointHeaderConstant.Area); headers.add(PointHeaderConstant.IP); headers.add(PointHeaderConstant.Province_Tag); headers.add(PointHeaderConstant.Impotrant_Command_Image); headers.add(PointHeaderConstant.Dept_Tag); List headersList = new LinkedList<>(); if (!CollectionUtils.isEmpty(dynamicsHeaders)) { //使用链表保证后续补充数据时获取数据顺序一致 headersList.addAll(dynamicsHeaders); headers.addAll(headersList); } // 定义数据 List> data = new ArrayList<>(); for (PointExport export : exportData) { List list = new ArrayList<>(); //需要保证顺序一致 list.add(export.getId()); list.add(export.getPointName()); list.add(export.getSerialNumber()); list.add(export.getArea()); list.add(export.getPointIP()); list.add(export.getProvinceTagString()); list.add(export.getImportantCommandImageTagString()); list.add(export.getDeptTagString()); for (String header : headersList) { //创建一个变量记录找没找到这个header boolean flag = false; List columnVOS = dynamicMap.get(export.getId()); if (!CollectionUtils.isEmpty(columnVOS)) { for (DynamicColumnVO columnVO : columnVOS) { if (header.equals(columnVO.getLabelValue())) { list.add(columnVO.getColumnValue()); flag = true; } } } //没找到用空串占位 if (!flag) list.add(""); } data.add(list); } List> headList = new ArrayList<>(); for (String header : headers) { headList.add(Collections.singletonList(header)); } EasyExcel.write(response.getOutputStream()) .head(headList) // 设置表头 .sheet("点位更换运维单位") // 设置sheet名称 .doWrite(data); // 写入数据 } @Override @Transactional(rollbackFor = Exception.class) public Result importData(MultipartFile file, Integer unitId, Date startTime, Date endTime, Boolean needUpdateUnit) throws IOException, ExecutionException, InterruptedException { List> list = EasyExcelImportUtils.makeData(file); List dataList = new ArrayList<>(); // Consumer> consumer = (dataList) -> { // try { // this.updatePoint(dataList, unitId, startTime, endTime, needUpdateUnit); // } catch (ExecutionException e) { // e.printStackTrace(); // } catch (InterruptedException e) { // e.printStackTrace(); // } // }; // EasyExcel.read(file.getInputStream(), PointExport.class, new CurrencyDataListener(consumer)).headRowNumber(1).doReadAll(); for (Map map : list) { PointExport pointExport = new PointExport(); pointExport.setId(Integer.valueOf(map.get(PointHeaderConstant.ID))); pointExport.setPointName(map.get(PointHeaderConstant.Point_Name)); pointExport.setPointIP(map.get(PointHeaderConstant.IP)); pointExport.setSerialNumber(map.get(PointHeaderConstant.Serial_Number)); pointExport.setProvinceTag("是".equals(map.get(PointHeaderConstant.Province_Tag))); pointExport.setImportantCommandImageTag("是".equals(map.get(PointHeaderConstant.Impotrant_Command_Image))); pointExport.setDeptTag("是".equals(map.get(PointHeaderConstant.Dept_Tag))); List dynamics = new ArrayList<>(); // 处理动态列 for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); if (!PointHeaderConstant.KNOWN_KEYS.contains(key)) { DynamicColumnVO dynamicColumnVO = new DynamicColumnVO(); dynamicColumnVO.setRefId(pointExport.getId()); dynamicColumnVO.setLabelValue(entry.getKey()); dynamicColumnVO.setColumnValue(entry.getValue()); dynamicColumnVO.setPropName(IdUtils.randomNO(new Date())); dynamicColumnVO.setTableName("t_yw_point"); dynamics.add(dynamicColumnVO); } } pointExport.setDynamicData(dynamics); dataList.add(pointExport); } YwPointServiceImpl self = context.getBean(YwPointServiceImpl.class); self.updatePoint(dataList, unitId, startTime, endTime, needUpdateUnit); self.updateDynamic(dataList); return Result.ok(); } @Override public ReportAuditingRecordVO getReportResult(String serialNumber, String reportType) { return baseMapper.getReportResult(serialNumber, reportType); } /** * 修改点位的运维单位 * * @param dataList * @param unitId */ public void updatePoint(List dataList, Integer unitId, Date startTime, Date endTime, Boolean needUpdateUnit) throws ExecutionException, InterruptedException { if (CollectionUtils.isEmpty(dataList)) { throw new RuntimeException("导入数据不能为空"); } List pointList = dataList.stream().map(item -> { YwPoint point = new YwPoint(); point.setImportantCommandImageTag(item.getImportantCommandImageTag()); point.setProvinceTag(item.getProvinceTag()); point.setDeptTag(item.getDeptTag()); if (needUpdateUnit) { if (Objects.nonNull(unitId)) { point.setUnitId(Long.valueOf(unitId)); } point.setStartTime(startTime); point.setEndTime(endTime); } else { point.setUnitId(null); point.setStartTime(null); point.setEndTime(null); } point.setPointName(item.getPointName()); point.setSerialNumber(item.getSerialNumber()); return point; }).collect(Collectors.toList()); this.waitAllFinishAndGetResult(pointList); } @Override public void updateDynamic(List dataList) { List insertList = new ArrayList<>(); List updateList = new ArrayList<>(); List deleteList = new ArrayList<>(); //查出所有种类动态列作为字典 Map dictionary = new LambdaQueryChainWrapper<>(dynamicColumnMapper) .list().stream().collect(Collectors.toMap(DynamicColumn::getLabelValue, DynamicColumn::getId)); //查出点位表的所有动态列 List dynamicVOList = dynamicColumnMapper.getData(); Map> dynamicVOMap = new HashMap<>(); if (!CollectionUtils.isEmpty(dynamicVOList)) { dynamicVOMap = dynamicVOList.stream().filter(vo -> vo.getRefId() != null).collect(Collectors.groupingBy(DynamicColumnVO::getRefId)); } //根据label_value和ref_id判断是否是同一数据 for (PointExport pointExport : dataList) { //得到excel中动态列名作为key的map Map exportMap = pointExport.getDynamicData().stream().collect(Collectors.toMap(DynamicColumnVO::getLabelValue, Function.identity())); //查出数据库中这个点位的动态列 List dynamicColumnVOS = dynamicVOMap.get(pointExport.getId()); if (!CollectionUtils.isEmpty(dynamicColumnVOS)) { //遍历数据库中这个点位的动态列,并根据动态列名找出excel中的值 for (DynamicColumnVO vo : dynamicColumnVOS) { DynamicColumnVO dynamicColumnVO = exportMap.get(vo.getLabelValue()); //存在说明excel有这个数据,将数据库这个数据的值改为excel的值 if (dynamicColumnVO.getColumnValue() != null) { DynamicColumnValue entity = new DynamicColumnValue(); entity.setColumnValue(dynamicColumnVO.getColumnValue()); entity.setDynamicColumnId(vo.getId()); entity.setRefId(vo.getRefId()); entity.setId(vo.getValueId()); updateList.add(entity); } else { //不存在则取消标签,删除 deleteList.add(vo.getValueId()); } } } else { //数据库里查不到excel里面的这个点位动态列,全为新增 List dynamicData = pointExport.getDynamicData(); for (DynamicColumnVO excelData : dynamicData) { if(excelData.getColumnValue()!=null) { Integer dynamicId = dictionary.get(excelData.getLabelValue()); DynamicColumnValue entity = new DynamicColumnValue(); entity.setColumnValue(excelData.getColumnValue()); entity.setDynamicColumnId(dynamicId); entity.setRefId(pointExport.getId()); insertList.add(entity); } } } } //mybaits方法 //插入 if(!CollectionUtils.isEmpty(insertList)) dynamicColumnMapper.saveBatch(insertList); //更新 if(!CollectionUtils.isEmpty(updateList)) dynamicColumnMapper.updateBatch(updateList); //删除 if(!CollectionUtils.isEmpty(deleteList)) dynamicColumnMapper.deleteBatch(deleteList); } /** * 根据设备编码查询点位信息 * * @param serialNumber 序列号 * @return {@link YwPoint } * @author */ @Override public YwPoint selectBySerialNumber(String serialNumber) { return baseMapper.selectOne(new LambdaQueryWrapper<>(YwPoint.class).eq(YwPoint::getSerialNumber, serialNumber).eq(YwPoint::getDeleted, "0")); } public void waitAllFinishAndGetResult(List dataList) { Date startTime = new Date(); this.baseMapper.updatePoint(dataList); Date endTime = new Date(); log.error("总共耗时:" + (endTime.getTime() - startTime.getTime())); } @Override public void setDeviceTagByGB(List dataList) { List gbList = dataList.stream().map(BaseResult::getNo).collect(Collectors.toList()); List pointList = baseMapper.getTagsByGB(gbList); Map pointMap = pointList.stream().collect(Collectors.toMap(CheckTagVO::getNo, item -> item)); for (BaseResult data : dataList) { CheckTagVO tag = pointMap.get(data.getNo()); if (Objects.nonNull(tag)) { BeanUtils.copyProperties(tag, data); } } } @Override public void setNew(List dataList) { List gbList = dataList.stream().map(BaseResult::getNo).collect(Collectors.toList()); Map pointMap = dataList.stream().collect(Collectors.toMap(BaseResult::getNo, item -> item)); List dbGBList = monitorMapper.getGBbyGB(gbList); for (String s : gbList) { BaseResult baseResult = pointMap.get(s); baseResult.setNewDevice(!dbGBList.contains(s)); } } }