shinnosuke
2026-07-02 2c03ed453fda44df3749da3e5abf0b45e2b99221
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -17,13 +17,18 @@
import com.ruoyi.chargingPile.dto.ChargingGunCountMonitoring;
import com.ruoyi.chargingPile.dto.ChargingGunMonitoring;
import com.ruoyi.chargingPile.dto.GetChargingGunMonitoring;
import com.ruoyi.chargingPile.dto.ChargingPileImportDTO;
import com.ruoyi.chargingPile.dto.ChargingPileImportErrorDTO;
import com.ruoyi.chargingPile.dto.ChargingPileImportResultDTO;
import com.ruoyi.chargingPile.mapper.TChargingPileMapper;
import com.ruoyi.chargingPile.service.*;
import com.ruoyi.chargingPile.util.mongodb.service.UploadRealTimeMonitoringDataService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.core.utils.poi.ExcelUtil;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
@@ -46,6 +51,8 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.math.BigDecimal;
@@ -182,6 +189,206 @@
    * @param chargingPile
    * @return
    */
   @Override
   public List<PageChargingPileListDTO> listChargingPileForExport(PageChargingPileList page) {
      if (page == null) {
         page = new PageChargingPileList();
      }
      page.setPageCurr(1);
      page.setPageSize(100000);
      return pageChargingPileList(page).getRecords();
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public ChargingPileImportResultDTO importChargingPile(MultipartFile file, Boolean cover) throws Exception {
      if (file == null || file.isEmpty()) {
         throw new ServiceException("????????");
      }
      ExcelUtil<ChargingPileImportDTO> util = new ExcelUtil<>(ChargingPileImportDTO.class);
      List<ChargingPileImportDTO> rows = util.importExcel(file.getInputStream(), 0);
      if (rows == null || rows.isEmpty()) {
         throw new ServiceException("????????");
      }
      SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
      Integer roleType = sysUser.getRoleType();
      Integer objectId = sysUser.getObjectId();
      Set<Integer> visibleSiteIds = getChargingPileVisibleSiteIds(sysUser);
      Map<String, Site> siteMap = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0)).stream()
            .filter(site -> StringUtils.isNotEmpty(site.getCode()))
            .collect(Collectors.toMap(site -> normalizeImportValue(site.getCode()), site -> site, (a, b) -> a));
      Map<String, Partner> partnerNameMap = partnerService.list(new LambdaQueryWrapper<Partner>().eq(Partner::getDelFlag, 0)).stream()
            .filter(partner -> StringUtils.isNotEmpty(partner.getName()))
            .collect(Collectors.toMap(partner -> normalizeImportValue(partner.getName()), partner -> partner, (a, b) -> a));
      ChargingPileImportResultDTO result = new ChargingPileImportResultDTO();
      List<TChargingPile> validRows = new ArrayList<>();
      Set<String> fileCodes = new HashSet<>();
      Set<String> duplicateCodes = new LinkedHashSet<>();
      for (int i = 0; i < rows.size(); i++) {
         ChargingPileImportDTO row = rows.get(i);
         int rowNum = i + 2;
         List<String> errors = validateImportRow(row, siteMap, partnerNameMap, roleType, objectId, visibleSiteIds, fileCodes);
         String code = row == null ? null : normalizeImportValue(row.getCode());
         if (!errors.isEmpty()) {
            result.getErrorMessage().add(new ChargingPileImportErrorDTO(rowNum, code, String.join("?", errors)));
            continue;
         }
         TChargingPile chargingPile = buildImportChargingPile(row, siteMap, partnerNameMap, roleType, objectId);
         TChargingPile exists = this.getOne(new LambdaQueryWrapper<TChargingPile>()
               .eq(TChargingPile::getCode, chargingPile.getCode())
               .eq(TChargingPile::getDelFlag, 0));
         if (exists != null) {
            duplicateCodes.add(chargingPile.getCode());
            chargingPile.setId(exists.getId());
            chargingPile.setStatus(exists.getStatus());
            chargingPile.setIotdDeviceId(exists.getIotdDeviceId());
         } else if (chargingPile.getStatus() == null) {
            chargingPile.setStatus(2);
         }
         validRows.add(chargingPile);
      }
      result.setErrorCount(result.getErrorMessage().size());
      if (result.getErrorCount() > 0) {
         return result;
      }
      if (!duplicateCodes.isEmpty() && !Boolean.TRUE.equals(cover)) {
         result.setNeedConfirm(true);
         result.setDuplicateCodes(new ArrayList<>(duplicateCodes));
         return result;
      }
      for (TChargingPile chargingPile : validRows) {
         chargingPile.setDelFlag(false);
         if (chargingPile.getId() == null) {
            this.save(chargingPile);
            result.setSuccessCount(result.getSuccessCount() + 1);
         } else {
            this.updateById(chargingPile);
            result.setUpdateCount(result.getUpdateCount() + 1);
         }
      }
      return result;
   }
   private List<String> validateImportRow(ChargingPileImportDTO row, Map<String, Site> siteMap,
         Map<String, Partner> partnerNameMap, Integer roleType, Integer objectId,
         Set<Integer> visibleSiteIds, Set<String> fileCodes) {
      List<String> errors = new ArrayList<>();
      if (row == null) {
         errors.add("??");
         return errors;
      }
      String siteCode = normalizeImportValue(row.getSiteCode());
      String code = normalizeImportValue(row.getCode());
      String name = normalizeImportValue(row.getName());
      String partnerName = normalizeImportValue(row.getPartnerName());
      if (StringUtils.isEmpty(siteCode)) {
         errors.add("????????");
      } else if (!siteMap.containsKey(siteCode)) {
         errors.add("???????");
      }
      if (StringUtils.isEmpty(code)) {
         errors.add("????????");
      } else if (!fileCodes.add(code)) {
         errors.add("???????????");
      }
      if (StringUtils.isEmpty(name)) {
         errors.add("??????????");
      }
      if (row.getNumber() == null) {
         errors.add("??????");
      }
      if (row.getType() == null) {
         errors.add("????????");
      }
      if (row.getRatedPower() == null) {
         errors.add("????????");
      }
      Site site = siteMap.get(siteCode);
      if (site != null) {
         if (visibleSiteIds != null && !visibleSiteIds.contains(site.getId())) {
            errors.add("??????????");
         }
         Integer partnerId = resolveImportPartnerId(partnerName, site, partnerNameMap, roleType, objectId);
         if (partnerId == null) {
            errors.add("????????");
         } else if (Objects.equals(roleType, 2) && !Objects.equals(partnerId, objectId)) {
            errors.add("???????????????");
         }
      }
      return errors;
   }
   private TChargingPile buildImportChargingPile(ChargingPileImportDTO row, Map<String, Site> siteMap,
         Map<String, Partner> partnerNameMap, Integer roleType, Integer objectId) {
      String partnerName = normalizeImportValue(row.getPartnerName());
      Site site = siteMap.get(normalizeImportValue(row.getSiteCode()));
      TChargingPile chargingPile = new TChargingPile();
      chargingPile.setSiteId(site.getId());
      chargingPile.setPartnerId(resolveImportPartnerId(partnerName, site, partnerNameMap, roleType, objectId));
      chargingPile.setCode(normalizeImportValue(row.getCode()));
      chargingPile.setName(normalizeImportValue(row.getName()));
      chargingPile.setNumber(row.getNumber());
      chargingPile.setType(row.getType());
      chargingPile.setManufacturerCode(normalizeImportValue(row.getManufacturerCode()));
      chargingPile.setManufacturer(normalizeImportValue(row.getManufacturer()));
      chargingPile.setEquipmentType(normalizeImportValue(row.getEquipmentType()));
      chargingPile.setProductionDate(row.getProductionDate());
      chargingPile.setRatedPower(row.getRatedPower());
      chargingPile.setChargingStationNumber(normalizeImportValue(row.getChargingStationNumber()));
      chargingPile.setEquipmentClassification(row.getEquipmentClassification());
      chargingPile.setEquipmentUniqueNumber(normalizeImportValue(row.getEquipmentUniqueNumber()));
      chargingPile.setEquipmentLng(normalizeImportValue(row.getEquipmentLng()));
      chargingPile.setEquipmentLat(normalizeImportValue(row.getEquipmentLat()));
      chargingPile.setEquipmentProductCode(normalizeImportValue(row.getEquipmentProductCode()));
      chargingPile.setEquipmentPurpose(row.getEquipmentPurpose());
      chargingPile.setNewNationalStandard(row.getNewNationalStandard());
      chargingPile.setVinFlag(row.getVinFlag());
      return chargingPile;
   }
   private Integer resolveImportPartnerId(String partnerName, Site site, Map<String, Partner> partnerNameMap, Integer roleType, Integer objectId) {
      if (Objects.equals(roleType, 2) && StringUtils.isEmpty(partnerName)) {
         return objectId;
      }
      if (StringUtils.isNotEmpty(partnerName)) {
         Partner partner = partnerNameMap.get(partnerName);
         return partner == null ? null : partner.getId();
      }
      return site == null ? null : site.getPartnerId();
   }
   private Set<Integer> getChargingPileVisibleSiteIds(SysUser sysUser) {
      Integer roleType = sysUser.getRoleType();
      Integer objectId = sysUser.getObjectId();
      if (Objects.equals(roleType, 2)) {
         return partnerService.authSite(objectId, SiteMenu.CHARGING_PILE);
      }
      if (!SecurityUtils.isAdmin(tokenService.getLoginUser().getUserid())) {
         List<Integer> data = userSiteClient.getSiteIds(sysUser.getUserId()).getData();
         List<SysUserRoleVo> data2 = sysUserRoleClient.getRoleByUserId(sysUser.getUserId()).getData();
         if (data == null) {
            data = new ArrayList<>();
         }
         if (data2 != null && !data2.isEmpty()) {
            List<Integer> roleSiteIds = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData();
            if (roleSiteIds != null) {
               data.addAll(roleSiteIds);
            }
         }
         return new HashSet<>(data);
      }
      return null;
   }
   private String normalizeImportValue(String value) {
      return value == null ? null : value.trim();
   }
   @Override
   public AjaxResult addChargingPile(TChargingPile chargingPile) {
      AjaxResult ajaxResult = addChargingPileVerify(chargingPile);
@@ -327,7 +534,8 @@
      for (TChargingGun chargingGun : list) {
         TChargingGun chargingGun1 = new TChargingGun();
         chargingGun1.setId(chargingGun.getId());
         chargingGun1.setFullNumber(chargingPile.getCode() + chargingGun.getCode());
         String stableFullNumber = StringUtils.isNotEmpty(chargingGun.getFullNumber()) ? chargingGun.getFullNumber() : chargingPile.getCode() + chargingGun.getCode();
         chargingGun1.setFullNumber(stableFullNumber);
         chargingGun1.setSiteId(chargingPile.getSiteId());
         chargingGunService.updateById(chargingGun1);
         
@@ -339,7 +547,7 @@
         qrCodeDelivery.setCode_format(1);
         qrCodeDelivery.setPrefix_length(code_prefix.length());
         qrCodeDelivery.setCode_prefix(code_prefix);
         qrCodeDelivery.setQr_code(code_prefix + chargingPile.getCode() + chargingGun.getCode());
         qrCodeDelivery.setQr_code(code_prefix + stableFullNumber);
         qrCodeDelivery.setCreate_time(new Date());
         qrCodeDelivery.setLast_time(new Date());
         sendMessageClient.qrCodeDelivery(qrCodeDelivery);