| package com.ruoyi.system.service.impl; | 
|   | 
| import cn.hutool.core.bean.BeanUtil; | 
| import cn.hutool.core.collection.CollUtil; | 
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
| import com.baomidou.mybatisplus.core.metadata.IPage; | 
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
| import com.ruoyi.common.utils.SecurityUtils; | 
| import com.ruoyi.system.constants.AssetDeptConstant; | 
| import com.ruoyi.system.dto.asset.AssetAdDTO; | 
| import com.ruoyi.system.mapper.AssetAdMapper; | 
| import com.ruoyi.system.mapper.AssetAdRentalRecordMapper; | 
| import com.ruoyi.system.model.AssetAd; | 
| import com.ruoyi.system.model.AssetAdRentalRecord; | 
| import com.ruoyi.system.query.AssetAdQuery; | 
| import com.ruoyi.system.service.AssetAdService; | 
| import com.ruoyi.system.service.AssetTypeService; | 
| import com.ruoyi.system.service.ISysUserService; | 
| import com.ruoyi.system.vo.asset.AssetAdDetailVO; | 
| import com.ruoyi.system.vo.asset.AssetAdRentalRecordVO; | 
| import com.ruoyi.system.vo.asset.AssetAdVO; | 
| import lombok.RequiredArgsConstructor; | 
| import org.springframework.context.annotation.Lazy; | 
| import org.springframework.stereotype.Service; | 
|   | 
| import java.time.LocalDate; | 
| import java.time.format.DateTimeFormatter; | 
| import java.time.temporal.ChronoUnit; | 
| import java.util.List; | 
| import java.util.Map; | 
| import java.util.function.Function; | 
| import java.util.stream.Collectors; | 
|   | 
| /** | 
|  * <p> | 
|  * 广告无形资产表 服务实现类 | 
|  * </p> | 
|  * | 
|  * @author WuGuanFengYue | 
|  * @since 2025-09-15 | 
|  */ | 
| @Service | 
| @RequiredArgsConstructor(onConstructor_ = {@Lazy}) | 
| public class AssetAdServiceImpl extends ServiceImpl<AssetAdMapper, AssetAd> implements AssetAdService { | 
|     private final AssetTypeService assetTypeService; | 
|     private final AssetAdRentalRecordMapper rentalRecordMapper; | 
|     private final ISysUserService sysUserService; | 
|   | 
|     @Override | 
|     public void addAssetAd(AssetAdDTO dto) { | 
|         AssetAd assetAd = BeanUtil.copyProperties(dto, AssetAd.class); | 
|         assetAd.setAssetTypeId(2); | 
|         assetAd.setAssetCode(generateCode()); | 
|         assetAd.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName()); | 
|         assetAd.setDeptId(Integer.parseInt(SecurityUtils.getLoginUser().getUser().getDeptId())); | 
|         save(assetAd); | 
|     } | 
|   | 
|     private String generateCode() { | 
|         // 根据资产类型ID获取资产编码前缀 | 
|         String typeCodePrefix = assetTypeService.getAssetCodePrefix(2); | 
|         LocalDate today = LocalDate.now(); | 
|         String dateStr = today.format(DateTimeFormatter.ofPattern("yyyyMMdd")); | 
|         String prefix = typeCodePrefix + dateStr + "-"; | 
|   | 
|         // 查询当天该类型资产的数量 | 
|         Long count = this.lambdaQuery() | 
|                 .like(AssetAd::getAssetCode, prefix) | 
|                 .ge(AssetAd::getCreateTime, today.atStartOfDay()) | 
|                 .lt(AssetAd::getCreateTime, today.plusDays(1).atStartOfDay()) | 
|                 .count(); | 
|   | 
|         int sequence = (count != null ? count.intValue() : 0) + 1; | 
|         String sequenceStr = String.format("%04d", sequence); | 
|   | 
|         return prefix + sequenceStr; | 
|     } | 
|   | 
|     @Override | 
|     public void editAssetAd(AssetAdDTO dto) { | 
|         AssetAd assetAd = BeanUtil.copyProperties(dto, AssetAd.class); | 
|         assetAd.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName()); | 
|         updateById(assetAd); | 
|     } | 
|   | 
|     @Override | 
|     public IPage<AssetAdVO> getPageList(AssetAdQuery query) { | 
|         // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据 | 
|         Long userId = SecurityUtils.getUserId(); | 
|         boolean isAdmin = SecurityUtils.isAdmin(userId); | 
|   | 
|         if (!isAdmin) { | 
|             try { | 
|                 // 获取当前用户的部门名称 | 
|                 String deptName = sysUserService.selectUserById(userId).getDeptName(); | 
|   | 
|                 // 非超级管理员且非资产管理部,设置部门权限 | 
|                 if (!AssetDeptConstant.ASSET_INVENTORY_DEPT_NAMES.contains(deptName)) { | 
|                     query.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId())); | 
|                 } | 
|             } catch (Exception e) { | 
|                 // 如果获取部门信息失败,默认设置部门权限 | 
|                 try { | 
|                     query.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId())); | 
|                 } catch (Exception ex) { | 
|                     // ignore parse, leave null if cannot parse | 
|                 } | 
|             } | 
|         } | 
|         // 1. 分页查询 AssetAd | 
|         Page<AssetAdVO> assetPage = this.baseMapper.getPageList(new Page<>(query.getPageNum(), query.getPageSize()), query); | 
|   | 
|         // 2. 如果没有数据,返回空分页 | 
|         if (assetPage.getRecords().isEmpty()) { | 
|             return new Page<>(query.getPageNum(), query.getPageSize()); | 
|         } | 
|   | 
|         // 3. 获取所有资产ID | 
|         List<Integer> assetAdIds = assetPage.getRecords().stream() | 
|             .map(AssetAdVO::getId) | 
|             .collect(Collectors.toList()); | 
|   | 
|         // 4. 查询相关租赁记录 | 
|         LocalDate today = LocalDate.now(); | 
|         List<AssetAdRentalRecord> allRentalRecords = rentalRecordMapper.selectList( | 
|             new LambdaQueryWrapper<AssetAdRentalRecord>() | 
|                 .in(AssetAdRentalRecord::getAssetAdId, assetAdIds) | 
|                     .ge(AssetAdRentalRecord::getStartDate, today) | 
|                     .le(AssetAdRentalRecord::getEndDate,today) | 
|                 .orderByDesc(AssetAdRentalRecord::getCreateTime) | 
|         ); | 
|   | 
|         // 5. 转换为Map | 
|         Map<Integer, AssetAdRentalRecord> currentRentalMap = allRentalRecords.stream() | 
|                 .collect(Collectors.toMap(AssetAdRentalRecord::getAssetAdId, Function.identity())); | 
|   | 
|         // 6. 组装VO数据 | 
|         for (AssetAdVO vo : assetPage.getRecords()) { | 
|             // 设置租赁相关信息 | 
|             AssetAdRentalRecord currentRental = currentRentalMap.get(vo.getId()); | 
|             if (currentRental != null) { | 
|                 vo.setCurrentUseBy(currentRental.getUseBy()); | 
|                 vo.setRentalPrice(currentRental.getRentalPrice()); | 
|                 vo.setUseDuration(calculateUseDuration(currentRental.getStartDate(), currentRental.getEndDate())); | 
|             } | 
|         } | 
|   | 
|         // 7. 返回分页结果 | 
|         return assetPage; | 
|     } | 
|   | 
|     /** | 
|      * 计算使用期限(月) | 
|      */ | 
|     private Integer calculateUseDuration(LocalDate startDate, LocalDate endDate) { | 
|         if (startDate == null || endDate == null) { | 
|             return null; | 
|         } | 
|         // 计算月份差值 | 
|         long months = ChronoUnit.MONTHS.between(startDate, endDate); | 
|         return (int) months; | 
|     } | 
|   | 
|     @Override | 
|     public AssetAdDetailVO getDetail(Integer id) { | 
|         // 1. 查询资产基础信息 | 
|         AssetAd assetAd = getById(id); | 
|         if (assetAd == null) { | 
|             return null; | 
|         } | 
|   | 
|         // 2. 查询租赁记录 | 
|         List<AssetAdRentalRecord> rentalRecords = rentalRecordMapper.selectList( | 
|             new LambdaQueryWrapper<AssetAdRentalRecord>() | 
|                 .eq(AssetAdRentalRecord::getAssetAdId, id) | 
|                 .orderByDesc(AssetAdRentalRecord::getStartDate) | 
|         ); | 
|   | 
|         // 3. 转换为AssetAdDetailVO | 
|         AssetAdDetailVO detailVO = BeanUtil.copyProperties(assetAd, AssetAdDetailVO.class); | 
|   | 
|         // 4. 转换租赁记录为VO列表 | 
|         List<AssetAdRentalRecordVO> rentalRecordVOList = BeanUtil.copyToList(rentalRecords, AssetAdRentalRecordVO.class); | 
|          | 
|         detailVO.setRentalRecordVOList(rentalRecordVOList); | 
|   | 
|         return detailVO; | 
|     } | 
|   | 
|     @Override | 
|     public void importAssetAd(List<AssetAdDTO> list) { | 
|         if (CollUtil.isNotEmpty(list)) { | 
|             List<AssetAd> collect = list.stream().map(item -> { | 
|                 AssetAd assetAd = BeanUtil.copyProperties(item, AssetAd.class); | 
|                 assetAd.setAssetTypeId(2); | 
|                 assetAd.setAssetCode(generateCode()); | 
|                 assetAd.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName()); | 
|                 return assetAd; | 
|             }).collect(Collectors.toList()); | 
|             saveBatch(collect); | 
|         } | 
|     } | 
| } |