zhizhijie
6 小时以前 799ec6799ad9e994f7d369f059ca7682962f648f
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/ExplainController.java
@@ -3,10 +3,17 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.trafficaudit.common.Result;
import com.trafficaudit.dataimport.entity.CityBusMonthly;
import com.trafficaudit.dataimport.entity.CityTaxiMonthly;
import com.trafficaudit.dataimport.entity.H2032EnterpriseMonthly;
import com.trafficaudit.dataimport.entity.PassengerEnterpriseMonthly;
import com.trafficaudit.dataimport.mapper.CityBusMonthlyMapper;
import com.trafficaudit.dataimport.mapper.CityTaxiMonthlyMapper;
import com.trafficaudit.dataimport.mapper.H2032EnterpriseMonthlyMapper;
import com.trafficaudit.dataimport.mapper.PassengerEnterpriseMonthlyMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@@ -18,7 +25,8 @@
import java.util.Map;
/**
 * 企业解释:独立于审核结果的解释列表与 AI 分析入口
 * 企业解释:独立于审核结果的解释列表与 AI 分析入口。
 * 支持多报表类型:H2032 货运、H2031 公路旅客、CITY_BUS 城市公交、CITY_TAXI 巡游出租。
 */
@Slf4j
@RestController
@@ -27,47 +35,171 @@
    @Resource
    private H2032EnterpriseMonthlyMapper h2032Mapper;
    @Resource
    private PassengerEnterpriseMonthlyMapper passengerMapper;
    @Resource
    private CityBusMonthlyMapper cityBusMapper;
    @Resource
    private CityTaxiMonthlyMapper cityTaxiMapper;
    @GetMapping("/list")
    public Result<Map<String, Object>> list(@RequestParam(value = "period", required = false) String period,
    public Result<Map<String, Object>> list(@RequestParam(value = "reportType", defaultValue = "H2032") String reportType,
                                            @RequestParam(value = "period", required = false) String period,
                                            @RequestParam(value = "keyword", required = false) String keyword,
                                            @RequestParam(value = "hasExplanation", defaultValue = "false") boolean hasExplanation,
                                            @RequestParam(value = "page", defaultValue = "1") long page,
                                            @RequestParam(value = "size", defaultValue = "20") long size) {
        String kw = keyword == null ? "" : keyword.trim();
        boolean hasPeriod = period != null && !period.trim().isEmpty();
        LambdaQueryWrapper<H2032EnterpriseMonthly> w = new LambdaQueryWrapper<H2032EnterpriseMonthly>()
            .eq(hasPeriod, H2032EnterpriseMonthly::getReportPeriod, period)
            .isNotNull(H2032EnterpriseMonthly::getVerifyExplanation)
            .ne(H2032EnterpriseMonthly::getVerifyExplanation, "")
            .like(!kw.isEmpty(), H2032EnterpriseMonthly::getEnterpriseName, kw)
            .orderByDesc(H2032EnterpriseMonthly::getId);
        Page<H2032EnterpriseMonthly> p = new Page<>(Math.max(page, 1), Math.min(Math.max(size, 1), 200));
        Page<H2032EnterpriseMonthly> r = h2032Mapper.selectPage(p, w);
        long p = Math.max(page, 1);
        long s = Math.min(Math.max(size, 1), 200);
        List<Map<String, Object>> records = new ArrayList<>();
        for (H2032EnterpriseMonthly e : r.getRecords()) {
            Map<String, Object> row = new LinkedHashMap<>();
            row.put("id", e.getId());
            row.put("reportPeriod", e.getReportPeriod());
            row.put("regionCode", e.getRegionCode());
            row.put("enterpriseCode", e.getEnterpriseCode());
            row.put("enterpriseName", e.getEnterpriseName());
            row.put("vehicleTotal", e.getVehicleTotal());
            row.put("tonsTotal", e.getTonsTotal());
            row.put("freightTotal", e.getFreightTotal());
            row.put("turnoverTotal", e.getTurnoverTotal());
            row.put("avgDistance", e.getAvgDistance());
            row.put("verifyExplanation", e.getVerifyExplanation());
            records.add(row);
        long total = 0;
        if ("H2031".equals(reportType)) {
            LambdaQueryWrapper<PassengerEnterpriseMonthly> w = new LambdaQueryWrapper<PassengerEnterpriseMonthly>()
                .eq(hasPeriod, PassengerEnterpriseMonthly::getReportPeriod, period)
                .isNotNull(hasExplanation, PassengerEnterpriseMonthly::getVerifyExplanation)
                .ne(hasExplanation, PassengerEnterpriseMonthly::getVerifyExplanation, "")
                .like(!kw.isEmpty(), PassengerEnterpriseMonthly::getEnterpriseName, kw)
                .orderByDesc(PassengerEnterpriseMonthly::getId);
            Page<PassengerEnterpriseMonthly> r = passengerMapper.selectPage(new Page<>(p, s), w);
            for (PassengerEnterpriseMonthly e : r.getRecords()) {
                Map<String, Object> row = baseRow(e.getId(), e.getReportPeriod(), e.getRegionCode(),
                        e.getEnterpriseCode(), e.getEnterpriseName(), e.getVerifyExplanation());
                row.put("vehicleTotal", e.getVehicleTotal());
                row.put("seatTotal", e.getSeatTotal());
                row.put("passengerTotal", e.getPassengerTotal());
                row.put("turnoverTotal", e.getTurnoverTotal());
                row.put("avgDistance", e.getAvgDistanceTotal());
                records.add(row);
            }
            total = r.getTotal();
        } else if ("CITY_BUS".equals(reportType)) {
            LambdaQueryWrapper<CityBusMonthly> w = new LambdaQueryWrapper<CityBusMonthly>()
                .eq(hasPeriod, CityBusMonthly::getReportPeriod, period)
                .isNotNull(hasExplanation, CityBusMonthly::getVerifyExplanation)
                .ne(hasExplanation, CityBusMonthly::getVerifyExplanation, "")
                .like(!kw.isEmpty(), CityBusMonthly::getEnterpriseName, kw)
                .orderByDesc(CityBusMonthly::getId);
            Page<CityBusMonthly> r = cityBusMapper.selectPage(new Page<>(p, s), w);
            for (CityBusMonthly e : r.getRecords()) {
                Map<String, Object> row = baseRow(e.getId(), e.getReportPeriod(), e.getRegionCode(),
                        e.getEnterpriseCode(), e.getEnterpriseName(), e.getVerifyExplanation());
                row.put("city", e.getCity());
                row.put("opVehicles", e.getOpVehicles());
                row.put("passengerVolume", e.getPassengerVolume());
                row.put("turnover", e.getTurnover());
                row.put("avgDistance", e.getAvgDistance());
                records.add(row);
            }
            total = r.getTotal();
        } else if ("CITY_TAXI".equals(reportType)) {
            LambdaQueryWrapper<CityTaxiMonthly> w = new LambdaQueryWrapper<CityTaxiMonthly>()
                .eq(hasPeriod, CityTaxiMonthly::getReportPeriod, period)
                .isNotNull(hasExplanation, CityTaxiMonthly::getVerifyExplanation)
                .ne(hasExplanation, CityTaxiMonthly::getVerifyExplanation, "")
                .like(!kw.isEmpty(), CityTaxiMonthly::getCity, kw)
                .orderByDesc(CityTaxiMonthly::getId);
            Page<CityTaxiMonthly> r = cityTaxiMapper.selectPage(new Page<>(p, s), w);
            for (CityTaxiMonthly e : r.getRecords()) {
                Map<String, Object> row = baseRow(e.getId(), e.getReportPeriod(), e.getRegionCode(),
                        null, e.getCity(), e.getVerifyExplanation());
                row.put("city", e.getCity());
                row.put("opVehicles", e.getOpVehicles());
                row.put("tripTotal", e.getTripTotal());
                row.put("passengerVolume", e.getPassengerVolume());
                row.put("turnover", e.getTurnover());
                row.put("avgDistance", e.getAvgDistance());
                records.add(row);
            }
            total = r.getTotal();
        } else {
            LambdaQueryWrapper<H2032EnterpriseMonthly> w = new LambdaQueryWrapper<H2032EnterpriseMonthly>()
                .eq(hasPeriod, H2032EnterpriseMonthly::getReportPeriod, period)
                .isNotNull(hasExplanation, H2032EnterpriseMonthly::getVerifyExplanation)
                .ne(hasExplanation, H2032EnterpriseMonthly::getVerifyExplanation, "")
                .like(!kw.isEmpty(), H2032EnterpriseMonthly::getEnterpriseName, kw)
                .orderByDesc(H2032EnterpriseMonthly::getId);
            Page<H2032EnterpriseMonthly> r = h2032Mapper.selectPage(new Page<>(p, s), w);
            for (H2032EnterpriseMonthly e : r.getRecords()) {
                Map<String, Object> row = baseRow(e.getId(), e.getReportPeriod(), e.getRegionCode(),
                        e.getEnterpriseCode(), e.getEnterpriseName(), e.getVerifyExplanation());
                row.put("vehicleTotal", e.getVehicleTotal());
                row.put("tonsTotal", e.getTonsTotal());
                row.put("freightTotal", e.getFreightTotal());
                row.put("turnoverTotal", e.getTurnoverTotal());
                row.put("avgDistance", e.getAvgDistance());
                records.add(row);
            }
            total = r.getTotal();
        }
        Map<String, Object> result = new LinkedHashMap<>();
        result.put("reportType", reportType);
        result.put("records", records);
        result.put("total", r.getTotal());
        result.put("current", r.getCurrent());
        result.put("size", r.getSize());
        result.put("total", total);
        result.put("current", p);
        result.put("size", s);
        return Result.ok(result);
    }
}
    /**
     * 保存企业解释:更新对应来源表(H2032/H2031/CITY_BUS/CITY_TAXI)行的 verifyExplanation。
     * 审核结果页内嵌解释模块与「企业解释」页共用此接口。
     */
    @PostMapping("/save")
    public Result<String> save(@RequestParam("reportType") String reportType,
                               @RequestParam("reportId") Long reportId,
                               @RequestParam(value = "explanation", required = false) String explanation) {
        String exp = explanation == null ? "" : explanation.trim();
        boolean ok = false;
        String t = reportType == null ? "" : reportType;
        try {
            switch (t) {
                case "H2032": {
                    H2032EnterpriseMonthly e = h2032Mapper.selectById(reportId);
                    if (e != null) { e.setVerifyExplanation(exp); h2032Mapper.updateById(e); ok = true; }
                    break;
                }
                case "H2031": {
                    PassengerEnterpriseMonthly e = passengerMapper.selectById(reportId);
                    if (e != null) { e.setVerifyExplanation(exp); passengerMapper.updateById(e); ok = true; }
                    break;
                }
                case "CITY_BUS": {
                    CityBusMonthly e = cityBusMapper.selectById(reportId);
                    if (e != null) { e.setVerifyExplanation(exp); cityBusMapper.updateById(e); ok = true; }
                    break;
                }
                case "CITY_TAXI": {
                    CityTaxiMonthly e = cityTaxiMapper.selectById(reportId);
                    if (e != null) { e.setVerifyExplanation(exp); cityTaxiMapper.updateById(e); ok = true; }
                    break;
                }
                default:
                    throw new RuntimeException("不支持的报表类型:" + reportType);
            }
        } catch (Exception e) {
            log.error("explain save error", e);
            return Result.error("保存失败: " + e.getMessage());
        }
        if (!ok) {
            return Result.error("未找到对应的数据行(reportId=" + reportId + ")");
        }
        return Result.ok(exp);
    }
    private Map<String, Object> baseRow(Long id, String reportPeriod, String regionCode,
                                        String enterpriseCode, String enterpriseName, String verifyExplanation) {
        Map<String, Object> row = new LinkedHashMap<>();
        row.put("id", id);
        row.put("reportPeriod", reportPeriod);
        row.put("regionCode", regionCode);
        row.put("enterpriseCode", enterpriseCode);
        row.put("enterpriseName", enterpriseName);
        row.put("verifyExplanation", verifyExplanation);
        return row;
    }
}