package com.iailab.module.data.channel.opcda.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.util.object.BeanUtils; import com.iailab.framework.common.util.object.ConvertUtils; import com.iailab.module.data.channel.opcda.dao.ChannelOPCDATagDao; import com.iailab.module.data.channel.opcda.dto.ChannelOPCDATagDTO; import com.iailab.module.data.channel.opcda.entity.ChannelOPCDATagEntity; import com.iailab.module.data.channel.opcda.service.ChannelOPCDATagService; import com.iailab.module.data.channel.opcda.vo.OpcDaTagImportExcelVO; import com.iailab.module.data.channel.opcda.vo.OpcDaTagPageReqVO; import com.iailab.module.data.channel.tag.vo.TagImportRespVO; import com.iailab.module.data.common.enums.CommonConstant; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.File; import java.io.FileInputStream; import java.util.*; import static com.iailab.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.iailab.module.data.enums.ErrorCodeConstants.*; /** * @author lirm * @Description * @createTime 2024年08月26日 */ @Slf4j @Service public class ChannelOPCDATagServiceImpl extends ServiceImpl implements ChannelOPCDATagService { @Resource private ChannelOPCDATagDao channelOPCDATagDao; @Value("${iems.upload-dir}") private String uploadDir; @Override public PageResult queryPage(OpcDaTagPageReqVO reqVO) { return channelOPCDATagDao.selectPage(reqVO); } @Override public ChannelOPCDATagEntity info(String id) { return channelOPCDATagDao.selectById(id); } @Override public void add(ChannelOPCDATagEntity channelOPCDATagEntity) { channelOPCDATagDao.insert(channelOPCDATagEntity); } @Override public void update(ChannelOPCDATagEntity channelOPCDATagEntity) { channelOPCDATagDao.updateById(channelOPCDATagEntity); } @Override public void delete(String id) { channelOPCDATagDao.deleteById(id); } @Override public List selectAll() { List entityList = channelOPCDATagDao.selectList(null); return ConvertUtils.sourceToTarget(entityList, ChannelOPCDATagDTO.class); } @Override public List listByIds(List ids) { return channelOPCDATagDao.selectList(new QueryWrapper().in("id", ids)); } @Override public void deleteByServerId(String serverId) { channelOPCDATagDao.delete(new QueryWrapper().eq("server_id",serverId)); } @Override public List getByserverId(String serverId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("server_id", serverId).orderByDesc ("create_time"); return channelOPCDATagDao.selectList(queryWrapper); } @Override @DSTransactional(rollbackFor = Exception.class) public void importTag(String serverId, MultipartFile file) throws Exception { try { String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); String fileName = UUID.randomUUID().toString() + suffix; String path = uploadDir + fileName; file.transferTo(new File(path)); XSSFWorkbook hssfWorkbook = new XSSFWorkbook(new FileInputStream(path)); XSSFSheet sheet = hssfWorkbook.getSheetAt(0); int lastRowNum = sheet.getLastRowNum(); log.info("最后一行:" + lastRowNum); int lastCellNum = 4; List dangerList = new ArrayList<>(); for (int i = 2; i <= lastRowNum; i++) { XSSFRow row = sheet.getRow(i); for (int j = row.getFirstCellNum(); j < lastCellNum; j++) { row.getCell(j).setCellType(CellType.STRING); } ChannelOPCDATagEntity tagEntity = new ChannelOPCDATagEntity(); tagEntity.setId(UUID.randomUUID().toString()); tagEntity.setTagName(row.getCell(1).getStringCellValue()); tagEntity.setDataType(row.getCell(2).getStringCellValue()); tagEntity.setItemId(row.getCell(3).getStringCellValue()); tagEntity.setEnabled(CommonConstant.IS_ENABLE); tagEntity.setServerId(serverId); dangerList.add(tagEntity); } if (CollectionUtils.isEmpty(dangerList)) { return; } //getBaseMapper().insertList(dangerList); dangerList.forEach(item -> { try { channelOPCDATagDao.insert(item); } catch (Exception ex) { log.warn("插入异常:" + item.getTagName()); } }); } catch (Exception ex) { ex.printStackTrace(); log.warn("导入失败!"); throw ex; } } @Override public TagImportRespVO importOpcDaTagList(List importTags, boolean isUpdateSupport, String serverId) { // 1.1 参数校验 if (CollUtil.isEmpty(importTags)) { throw exception(TAG_IMPORT_LIST_IS_EMPTY); } // 2. 遍历,逐个创建 or 更新 TagImportRespVO respVO = TagImportRespVO.builder().createTagNames(new ArrayList<>()) .updateTagNames(new ArrayList<>()).failureTagNames(new LinkedHashMap<>()).build(); importTags.forEach(importTag -> { // 判断如果不存在,再进行插入 ChannelOPCDATagEntity existTag = channelOPCDATagDao.selectOne(new QueryWrapper() .eq("server_id", serverId) .eq("tag_name",importTag.getTagName())); if (existTag == null) { ChannelOPCDATagEntity channelOPCDATagEntity = ConvertUtils.sourceToTarget(importTag, ChannelOPCDATagEntity.class); channelOPCDATagEntity.setId(UUID.randomUUID().toString()); channelOPCDATagEntity.setEnabled(CommonConstant.IS_ENABLE); channelOPCDATagEntity.setServerId(serverId); channelOPCDATagEntity.setCreateTime(new Date()); channelOPCDATagDao.insert(channelOPCDATagEntity); respVO.getCreateTagNames().add(channelOPCDATagEntity.getTagName()); return; } // 如果存在,判断是否允许更新 if (!isUpdateSupport) { respVO.getFailureTagNames().put(importTag.getTagName(), TAG_EXISTS.getMsg()); return; } ChannelOPCDATagEntity updateTag = BeanUtils.toBean(importTag, ChannelOPCDATagEntity.class); updateTag.setId(existTag.getId()); baseMapper.updateById(updateTag); respVO.getUpdateTagNames().add(importTag.getTagName()); }); return respVO; } }