| New file |
| | |
| | | package com.trafficaudit.holiday.service; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.trafficaudit.holiday.HolidayConstants; |
| | | import com.trafficaudit.holiday.HolidayNumberUtils; |
| | | import com.trafficaudit.holiday.entity.HolidayVehicleAdjustment; |
| | | import com.trafficaudit.holiday.entity.HolidayVehicleFlow; |
| | | import com.trafficaudit.holiday.mapper.HolidayVehicleFlowMapper; |
| | | import com.trafficaudit.holiday.mapper.HolidayVehicleAdjustmentMapper; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.HashMap; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | |
| | | @Service |
| | | public class HolidayVehicleAdjustmentService { |
| | | |
| | | private static final int REASON_MAX_LENGTH = 500; |
| | | |
| | | @Resource |
| | | private HolidayVehicleAdjustmentMapper adjustmentMapper; |
| | | @Resource |
| | | private HolidayVehicleFlowMapper vehicleFlowMapper; |
| | | |
| | | public List<HolidayVehicleAdjustment> list(Integer year) { |
| | | List<HolidayVehicleAdjustment> rows = adjustmentMapper.selectList( |
| | | new LambdaQueryWrapper<HolidayVehicleAdjustment>() |
| | | .eq(year != null, HolidayVehicleAdjustment::getYear, year) |
| | | .orderByDesc(HolidayVehicleAdjustment::getYear) |
| | | .orderByAsc(HolidayVehicleAdjustment::getFlowDate)); |
| | | if (rows.isEmpty()) return rows; |
| | | |
| | | Set<Integer> years = new HashSet<>(); |
| | | for (HolidayVehicleAdjustment row : rows) { |
| | | if (row.getYear() != null) years.add(row.getYear()); |
| | | } |
| | | if (years.isEmpty()) return rows; |
| | | |
| | | List<HolidayVehicleFlow> sourceRows = vehicleFlowMapper.selectList( |
| | | new LambdaQueryWrapper<HolidayVehicleFlow>() |
| | | .eq(HolidayVehicleFlow::getRoadCategory, HolidayConstants.ROAD_NATIONAL_PROVINCIAL) |
| | | .eq(HolidayVehicleFlow::getVehicleType, HolidayConstants.VEHICLE_MEDIUM_SMALL_PASSENGER) |
| | | .in(HolidayVehicleFlow::getYear, years)); |
| | | Map<String, BigDecimal> originalValues = new HashMap<>(); |
| | | for (HolidayVehicleFlow sourceRow : sourceRows) { |
| | | if (sourceRow.getYear() == null || sourceRow.getFlowDate() == null || sourceRow.getVehicleCount() == null) { |
| | | continue; |
| | | } |
| | | originalValues.put(sourceKey(sourceRow.getYear(), sourceRow.getFlowDate()), sourceRow.getVehicleCount()); |
| | | } |
| | | for (HolidayVehicleAdjustment row : rows) { |
| | | if (row.getYear() != null && row.getFlowDate() != null) { |
| | | row.setOriginalValue(originalValues.get(sourceKey(row.getYear(), row.getFlowDate()))); |
| | | } |
| | | } |
| | | return rows; |
| | | } |
| | | |
| | | public BigDecimal findOriginalValue(Integer year, LocalDate flowDate) { |
| | | if (year == null || flowDate == null || flowDate.getYear() != year) { |
| | | throw new IllegalArgumentException("年份和日期不正确"); |
| | | } |
| | | HolidayVehicleFlow sourceRow = vehicleFlowMapper.selectOne( |
| | | new LambdaQueryWrapper<HolidayVehicleFlow>() |
| | | .eq(HolidayVehicleFlow::getYear, year) |
| | | .eq(HolidayVehicleFlow::getFlowDate, flowDate) |
| | | .eq(HolidayVehicleFlow::getRoadCategory, HolidayConstants.ROAD_NATIONAL_PROVINCIAL) |
| | | .eq(HolidayVehicleFlow::getVehicleType, HolidayConstants.VEHICLE_MEDIUM_SMALL_PASSENGER) |
| | | .last("limit 1")); |
| | | return sourceRow == null ? null : sourceRow.getVehicleCount(); |
| | | } |
| | | |
| | | @Transactional |
| | | public HolidayVehicleAdjustment save(Map<String, Object> params) { |
| | | Long id = longValue(params.get("id")); |
| | | Integer year = intValue(params.get("year")); |
| | | LocalDate flowDate = dateValue(params.get("flowDate")); |
| | | BigDecimal adjustedValue = decimalValue(params.get("adjustedValue")); |
| | | String reason = textValue(params.get("reason")); |
| | | |
| | | if (year == null || year < 2000 || year > 2100) { |
| | | throw new IllegalArgumentException("年份不正确"); |
| | | } |
| | | if (year >= LocalDate.now().getYear()) { |
| | | throw new IllegalArgumentException("往年国省道数据调整仅维护历史年份"); |
| | | } |
| | | if (flowDate == null || flowDate.getYear() != year) { |
| | | throw new IllegalArgumentException("日期必须属于所选年份"); |
| | | } |
| | | if (adjustedValue == null || adjustedValue.compareTo(BigDecimal.ZERO) < 0) { |
| | | throw new IllegalArgumentException("调整后的国省道车流量不能小于 0"); |
| | | } |
| | | if (reason.isEmpty()) { |
| | | throw new IllegalArgumentException("调整原因不能为空"); |
| | | } |
| | | if (reason.length() > REASON_MAX_LENGTH) { |
| | | throw new IllegalArgumentException("调整原因不能超过 " + REASON_MAX_LENGTH + " 个字符"); |
| | | } |
| | | |
| | | HolidayVehicleAdjustment sameKey = adjustmentMapper.selectOne( |
| | | new LambdaQueryWrapper<HolidayVehicleAdjustment>() |
| | | .eq(HolidayVehicleAdjustment::getYear, year) |
| | | .eq(HolidayVehicleAdjustment::getFlowDate, flowDate) |
| | | .last("limit 1")); |
| | | HolidayVehicleAdjustment entity; |
| | | if (id == null) { |
| | | entity = sameKey == null ? new HolidayVehicleAdjustment() : sameKey; |
| | | } else { |
| | | entity = adjustmentMapper.selectById(id); |
| | | if (entity == null) { |
| | | throw new IllegalArgumentException("调整记录不存在"); |
| | | } |
| | | if (sameKey != null && !sameKey.getId().equals(id)) { |
| | | throw new IllegalArgumentException("该年份和日期已存在调整记录"); |
| | | } |
| | | } |
| | | |
| | | if (entity.getId() == null) { |
| | | entity.setCreatedAt(LocalDateTime.now()); |
| | | } |
| | | entity.setYear(year); |
| | | entity.setFlowDate(flowDate); |
| | | entity.setAdjustedValue(HolidayNumberUtils.normalize(adjustedValue)); |
| | | entity.setReason(reason); |
| | | entity.setUpdatedAt(LocalDateTime.now()); |
| | | if (entity.getId() == null) { |
| | | adjustmentMapper.insert(entity); |
| | | } else { |
| | | adjustmentMapper.updateById(entity); |
| | | } |
| | | return entity; |
| | | } |
| | | |
| | | @Transactional |
| | | public void delete(Long id) { |
| | | if (id == null) { |
| | | throw new IllegalArgumentException("缺少记录 id"); |
| | | } |
| | | adjustmentMapper.deleteById(id); |
| | | } |
| | | |
| | | private String sourceKey(Integer year, LocalDate flowDate) { |
| | | return year + "|" + flowDate; |
| | | } |
| | | |
| | | private Long longValue(Object value) { |
| | | if (value == null || value.toString().trim().isEmpty()) return null; |
| | | return Long.valueOf(value.toString().trim()); |
| | | } |
| | | |
| | | private Integer intValue(Object value) { |
| | | if (value == null || value.toString().trim().isEmpty()) return null; |
| | | return Integer.valueOf(value.toString().trim()); |
| | | } |
| | | |
| | | private BigDecimal decimalValue(Object value) { |
| | | if (value == null || value.toString().trim().isEmpty()) return null; |
| | | return HolidayNumberUtils.decimalValue(value); |
| | | } |
| | | |
| | | private LocalDate dateValue(Object value) { |
| | | if (value == null || value.toString().trim().isEmpty()) return null; |
| | | return LocalDate.parse(value.toString().trim()); |
| | | } |
| | | |
| | | private String textValue(Object value) { |
| | | return value == null ? "" : value.toString().trim(); |
| | | } |
| | | } |