traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java
@@ -6,14 +6,42 @@
import com.trafficaudit.common.Result;
import com.trafficaudit.dataimport.entity.FreightTurnoverImport;
import com.trafficaudit.dataimport.entity.H2032EnterpriseMonthly;
import com.trafficaudit.dataimport.entity.PassengerAuthVehicle;
import com.trafficaudit.dataimport.entity.CityBusMonthly;
import com.trafficaudit.dataimport.entity.CityTaxiAuth;
import com.trafficaudit.dataimport.entity.CityTaxiMonthly;
import com.trafficaudit.dataimport.entity.PassengerEnterpriseMonthly;
import com.trafficaudit.dataimport.entity.ScaleSplitTransport;
import com.trafficaudit.dataimport.entity.TransportAuthVehicle;
import com.trafficaudit.dataimport.entity.VehicleTrackMileage;
import com.trafficaudit.dataimport.entity.InvestmentMonthly;
import com.trafficaudit.dataimport.entity.InvestmentProject;
import com.trafficaudit.dataimport.entity.InvestmentSystem;
import com.trafficaudit.dataimport.entity.EnergyVehicleQuarterly;
import com.trafficaudit.dataimport.entity.EnergyAuthVehicle;
import com.trafficaudit.dataimport.entity.PassengerIndividualMonthly;
import com.trafficaudit.dataimport.entity.WycOrderMonthly;
import com.trafficaudit.dataimport.entity.WycTotalMonthly;
import com.trafficaudit.common.util.RegionUtil;
import com.trafficaudit.reportexport.calc.WycSplitCalc;
import com.trafficaudit.dataimport.mapper.FreightTurnoverImportMapper;
import com.trafficaudit.dataimport.mapper.H2032EnterpriseMonthlyMapper;
import com.trafficaudit.dataimport.mapper.PassengerAuthVehicleMapper;
import com.trafficaudit.dataimport.mapper.CityBusMonthlyMapper;
import com.trafficaudit.dataimport.mapper.CityTaxiAuthMapper;
import com.trafficaudit.dataimport.mapper.CityTaxiMonthlyMapper;
import com.trafficaudit.dataimport.mapper.PassengerEnterpriseMonthlyMapper;
import com.trafficaudit.dataimport.mapper.ScaleSplitTransportMapper;
import com.trafficaudit.dataimport.mapper.TransportAuthVehicleMapper;
import com.trafficaudit.dataimport.mapper.VehicleTrackMileageMapper;
import com.trafficaudit.dataimport.mapper.InvestmentMonthlyMapper;
import com.trafficaudit.dataimport.mapper.InvestmentProjectMapper;
import com.trafficaudit.dataimport.mapper.InvestmentSystemMapper;
import com.trafficaudit.dataimport.mapper.EnergyVehicleQuarterlyMapper;
import com.trafficaudit.dataimport.mapper.EnergyAuthVehicleMapper;
import com.trafficaudit.dataimport.mapper.PassengerIndividualMonthlyMapper;
import com.trafficaudit.dataimport.mapper.WycOrderMonthlyMapper;
import com.trafficaudit.dataimport.mapper.WycTotalMonthlyMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -44,6 +72,34 @@
    private ScaleSplitTransportMapper scaleSplitMapper;
    @Resource
    private FreightTurnoverImportMapper freightTurnoverMapper;
    @Resource
    private PassengerEnterpriseMonthlyMapper passengerMapper;
    @Resource
    private PassengerAuthVehicleMapper passengerAuthMapper;
    @Resource
    private CityBusMonthlyMapper cityBusMapper;
    @Resource
    private CityTaxiMonthlyMapper cityTaxiMapper;
    @Resource
    private CityTaxiAuthMapper cityTaxiAuthMapper;
    @Resource
    private InvestmentMonthlyMapper investmentMonthlyMapper;
    @Resource
    private InvestmentProjectMapper investmentProjectMapper;
    @Resource
    private InvestmentSystemMapper investmentSystemMapper;
    @Resource
    private EnergyVehicleQuarterlyMapper energyVehicleMapper;
    @Resource
    private EnergyAuthVehicleMapper energyAuthMapper;
    @Resource
    private PassengerIndividualMonthlyMapper passengerIndividualMapper;
    @Resource
    private WycOrderMonthlyMapper wycOrderMapper;
    @Resource
    private WycTotalMonthlyMapper wycTotalMapper;
    @Resource
    private WycSplitCalc wycSplitCalc;
    @GetMapping("/list")
    public Result<Map<String, Object>> list(@RequestParam("type") String type,
@@ -67,7 +123,9 @@
                        .orderByDesc(H2032EnterpriseMonthly::getId);
                Page<H2032EnterpriseMonthly> p = new Page<>(safePage, safeSize);
                Page<H2032EnterpriseMonthly> r = h2032Mapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(H2032_COLUMNS)));
                List<Map<String, Object>> rows = toMaps(r.getRecords(), propsOf(H2032_COLUMNS));
                fillCity(rows);
                result.put("records", rows);
                fillPage(result, r);
                break;
            }
@@ -113,6 +171,63 @@
                fillPage(result, r);
                break;
            }
            case "h2031": {
                LambdaQueryWrapper<PassengerEnterpriseMonthly> w = new LambdaQueryWrapper<PassengerEnterpriseMonthly>()
                        .eq(notEmpty(period), PassengerEnterpriseMonthly::getReportPeriod, period)
                        .like(!kw.isEmpty(), PassengerEnterpriseMonthly::getEnterpriseName, kw)
                        .orderByDesc(PassengerEnterpriseMonthly::getId);
                Page<PassengerEnterpriseMonthly> p = new Page<>(safePage, safeSize);
                Page<PassengerEnterpriseMonthly> r = passengerMapper.selectPage(p, w);
                List<Map<String, Object>> rows = toMaps(r.getRecords(), propsOf(H2031_COLUMNS));
                fillCity(rows);
                result.put("records", rows);
                fillPage(result, r);
                break;
            }
            case "cityBus": {
                LambdaQueryWrapper<CityBusMonthly> w = new LambdaQueryWrapper<CityBusMonthly>()
                        .eq(notEmpty(period), CityBusMonthly::getReportPeriod, period)
                        .like(!kw.isEmpty(), CityBusMonthly::getEnterpriseName, kw)
                        .orderByDesc(CityBusMonthly::getId);
                Page<CityBusMonthly> p = new Page<>(safePage, safeSize);
                Page<CityBusMonthly> r = cityBusMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(BUS_COLUMNS)));
                fillPage(result, r);
                break;
            }
            case "cityTaxi": {
                LambdaQueryWrapper<CityTaxiMonthly> w = new LambdaQueryWrapper<CityTaxiMonthly>()
                        .eq(notEmpty(period), CityTaxiMonthly::getReportPeriod, period)
                        .like(!kw.isEmpty(), CityTaxiMonthly::getCity, kw)
                        .orderByAsc(CityTaxiMonthly::getId);
                Page<CityTaxiMonthly> p = new Page<>(safePage, safeSize);
                Page<CityTaxiMonthly> r = cityTaxiMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(TAXI_COLUMNS)));
                fillPage(result, r);
                break;
            }
            case "cityTaxiAuth": {
                LambdaQueryWrapper<CityTaxiAuth> w = new LambdaQueryWrapper<CityTaxiAuth>()
                        .eq(notEmpty(period), CityTaxiAuth::getReportPeriod, period)
                        .like(!kw.isEmpty(), CityTaxiAuth::getCity, kw)
                        .orderByDesc(CityTaxiAuth::getId);
                Page<CityTaxiAuth> p = new Page<>(safePage, safeSize);
                Page<CityTaxiAuth> r = cityTaxiAuthMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(TAXI_AUTH_COLUMNS)));
                fillPage(result, r);
                break;
            }
            case "passengerAuth": {
                LambdaQueryWrapper<PassengerAuthVehicle> w = new LambdaQueryWrapper<PassengerAuthVehicle>()
                        .eq(notEmpty(period), PassengerAuthVehicle::getReportPeriod, period)
                        .like(!kw.isEmpty(), PassengerAuthVehicle::getEnterpriseName, kw)
                        .orderByDesc(PassengerAuthVehicle::getId);
                Page<PassengerAuthVehicle> p = new Page<>(safePage, safeSize);
                Page<PassengerAuthVehicle> r = passengerAuthMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(PAUTH_COLUMNS)));
                fillPage(result, r);
                break;
            }
            case "freightTurnover": {
                LambdaQueryWrapper<FreightTurnoverImport> w = new LambdaQueryWrapper<FreightTurnoverImport>()
                        .eq(notEmpty(period), FreightTurnoverImport::getReportPeriod, period)
@@ -124,6 +239,118 @@
                fillPage(result, r);
                break;
            }
            case "investmentMonthly": {
                java.util.List<Long> pids = new ArrayList<>();
                if (!kw.isEmpty()) {
                    for (InvestmentProject ip : investmentProjectMapper.selectList(
                            new LambdaQueryWrapper<InvestmentProject>().like(InvestmentProject::getProjectName, kw))) {
                        pids.add(ip.getId());
                    }
                    if (pids.isEmpty()) {
                        result.put("records", new ArrayList<>());
                        result.put("total", 0L);
                        result.put("current", safePage);
                        result.put("size", safeSize);
                        break;
                    }
                }
                LambdaQueryWrapper<InvestmentMonthly> w = new LambdaQueryWrapper<InvestmentMonthly>()
                        .eq(notEmpty(period), InvestmentMonthly::getReportPeriod, period)
                        .in(!pids.isEmpty(), InvestmentMonthly::getProjectId, pids)
                        .orderByAsc(InvestmentMonthly::getProjectId)
                        .orderByAsc(InvestmentMonthly::getId);
                Page<InvestmentMonthly> p = new Page<>(safePage, safeSize);
                Page<InvestmentMonthly> r = investmentMonthlyMapper.selectPage(p, w);
                List<Map<String, Object>> rows = toMaps(r.getRecords(), propsOf(INVEST_MONTHLY_COLUMNS));
                fillProjectInfo(rows);
                result.put("records", rows);
                fillPage(result, r);
                break;
            }
            case "investmentProject": {
                LambdaQueryWrapper<InvestmentProject> w = new LambdaQueryWrapper<InvestmentProject>()
                        .like(!kw.isEmpty(), InvestmentProject::getProjectName, kw)
                        .orderByAsc(InvestmentProject::getCity)
                        .orderByAsc(InvestmentProject::getId);
                Page<InvestmentProject> p = new Page<>(safePage, safeSize);
                Page<InvestmentProject> r = investmentProjectMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(INVEST_PROJECT_COLUMNS)));
                fillPage(result, r);
                break;
            }
            case "investmentSystem": {
                LambdaQueryWrapper<InvestmentSystem> w = new LambdaQueryWrapper<InvestmentSystem>()
                        .eq(notEmpty(period), InvestmentSystem::getReportPeriod, period)
                        .like(!kw.isEmpty(), InvestmentSystem::getProjectName, kw)
                        .orderByDesc(InvestmentSystem::getId);
                Page<InvestmentSystem> p = new Page<>(safePage, safeSize);
                Page<InvestmentSystem> r = investmentSystemMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(INVEST_SYSTEM_COLUMNS)));
                fillPage(result, r);
                break;
            }
            case "energyVehicle": {
                LambdaQueryWrapper<EnergyVehicleQuarterly> w = new LambdaQueryWrapper<EnergyVehicleQuarterly>()
                        .eq(notEmpty(period), EnergyVehicleQuarterly::getReportPeriod, period)
                        .like(!kw.isEmpty(), EnergyVehicleQuarterly::getEnterpriseName, kw)
                        .orderByDesc(EnergyVehicleQuarterly::getId);
                Page<EnergyVehicleQuarterly> p = new Page<>(safePage, safeSize);
                Page<EnergyVehicleQuarterly> r = energyVehicleMapper.selectPage(p, w);
                List<Map<String, Object>> rows = toMaps(r.getRecords(), propsOf(ENERGY_VEHICLE_COLUMNS));
                fillCity(rows);
                result.put("records", rows);
                fillPage(result, r);
                break;
            }
            case "energyAuth": {
                LambdaQueryWrapper<EnergyAuthVehicle> w = new LambdaQueryWrapper<EnergyAuthVehicle>()
                        .eq(notEmpty(period), EnergyAuthVehicle::getReportPeriod, period)
                        .like(!kw.isEmpty(), EnergyAuthVehicle::getPlateNo, kw)
                        .orderByDesc(EnergyAuthVehicle::getId);
                Page<EnergyAuthVehicle> p = new Page<>(safePage, safeSize);
                Page<EnergyAuthVehicle> r = energyAuthMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(ENERGY_AUTH_COLUMNS)));
                fillPage(result, r);
                break;
            }
            case "passengerIndividual": {
                LambdaQueryWrapper<PassengerIndividualMonthly> w = new LambdaQueryWrapper<PassengerIndividualMonthly>()
                        .eq(notEmpty(period), PassengerIndividualMonthly::getReportPeriod, period)
                        .like(!kw.isEmpty(), PassengerIndividualMonthly::getEnterpriseName, kw)
                        .orderByDesc(PassengerIndividualMonthly::getId);
                Page<PassengerIndividualMonthly> p = new Page<>(safePage, safeSize);
                Page<PassengerIndividualMonthly> r = passengerIndividualMapper.selectPage(p, w);
                List<Map<String, Object>> rows = toMaps(r.getRecords(), propsOf(PAX_INDIVIDUAL_COLUMNS));
                fillCity(rows);
                result.put("records", rows);
                fillPage(result, r);
                break;
            }
            case "wycTotal": {
                LambdaQueryWrapper<WycTotalMonthly> w = new LambdaQueryWrapper<WycTotalMonthly>()
                        .eq(notEmpty(period), WycTotalMonthly::getReportPeriod, period)
                        .orderByDesc(WycTotalMonthly::getId);
                Page<WycTotalMonthly> p = new Page<>(safePage, safeSize);
                Page<WycTotalMonthly> r = wycTotalMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(WYC_TOTAL_COLUMNS)));
                fillPage(result, r);
                break;
            }
            case "wycOrder": {
                LambdaQueryWrapper<WycOrderMonthly> w = new LambdaQueryWrapper<WycOrderMonthly>()
                        .eq(notEmpty(period), WycOrderMonthly::getReportPeriod, period)
                        .orderByDesc(WycOrderMonthly::getReportPeriod);
                List<WycOrderMonthly> list = wycOrderMapper.selectList(w);
                List<Map<String, Object>> rows = new ArrayList<>();
                for (WycOrderMonthly o : list) {
                    rows.addAll(wycOrderCityRows(o));
                }
                result.put("records", rows);
                result.put("total", (long) rows.size());
                result.put("current", 1L);
                result.put("size", (long) rows.size());
                break;
            }
            default:
                result.put("records", new ArrayList<>());
                result.put("total", 0L);
@@ -131,6 +358,95 @@
                result.put("size", safeSize);
        }
        return Result.ok(result);
    }
    /** 区划代码 -> 市州名(无法识别返回空串) */
    private String cityOf(String regionCode) {
        if (regionCode == null || regionCode.trim().isEmpty()) return "";
        String city = RegionUtil.cityByCode(regionCode.trim());
        return city == null ? "" : city;
    }
    /** 按 regionCode 派生"市州"列(企业类表通用) */
    private void fillCity(List<Map<String, Object>> rows) {
        for (Map<String, Object> row : rows) {
            Object rc = row.get("regionCode");
            row.put("city", cityOf(rc == null ? null : String.valueOf(rc)));
        }
    }
    /** 投资月报:补项目名称与市州(原表只有 projectId,页面无法辨识项目) */
    private void fillProjectInfo(List<Map<String, Object>> rows) {
        java.util.Set<Long> ids = new java.util.LinkedHashSet<>();
        for (Map<String, Object> row : rows) {
            Object pid = row.get("projectId");
            if (pid instanceof Number) ids.add(((Number) pid).longValue());
        }
        if (ids.isEmpty()) return;
        Map<Long, InvestmentProject> byId = new LinkedHashMap<>();
        for (InvestmentProject ip : investmentProjectMapper.selectBatchIds(ids)) {
            byId.put(ip.getId(), ip);
        }
        for (Map<String, Object> row : rows) {
            Object pid = row.get("projectId");
            InvestmentProject ip = pid instanceof Number ? byId.get(((Number) pid).longValue()) : null;
            row.put("projectName", ip == null ? null : ip.getProjectName());
            row.put("city", ip == null ? null : ip.getCity());
        }
    }
    private static double nz(Double v) {
        return v == null ? 0.0 : v;
    }
    /** 网约车订单台账 -> 按市州竖排:全省 + 17 市州 × 指标(客运量/周转量由 WycSplitCalc 拆分口径计算) */
    private List<Map<String, Object>> wycOrderCityRows(WycOrderMonthly o) {
        List<Map<String, Object>> rows = new ArrayList<>();
        List<String> cities = RegionUtil.cityList();
        double orderSum = nz(o.getOrderSum());
        double[] orders = { nz(o.getOrderWuhan()), nz(o.getOrderHuangshi()), nz(o.getOrderShiyan()),
                nz(o.getOrderYichang()), nz(o.getOrderXiangyang()), nz(o.getOrderEzhou()), nz(o.getOrderJingmen()),
                nz(o.getOrderXiaogan()), nz(o.getOrderJingzhou()), nz(o.getOrderHuanggang()), nz(o.getOrderXianning()),
                nz(o.getOrderSuizhou()), nz(o.getOrderEnshi()), nz(o.getOrderXiantao()), nz(o.getOrderQianjiang()),
                nz(o.getOrderTianmen()), nz(o.getOrderShennong()) };
        Map<String, Object> province = new LinkedHashMap<>();
        province.put("reportPeriod", o.getReportPeriod());
        province.put("period", o.getReportPeriod());
        province.put("region", "全省");
        province.put("orderCount", orderSum);
        province.put("orderShare", orderSum > 0 ? 1.0 : null);
        province.put("pax", o.getPinK());
        province.put("turnover", o.getPinZ());
        province.put("cityPax", o.getPinCK());
        province.put("cityTurnover", o.getPinCZ());
        province.put("note", "全省口径直接取台账 pin 值");
        rows.add(province);
        Map<String, WycSplitCalc.WycMetrics> byCity = null;
        String calcError = null;
        try {
            byCity = wycSplitCalc.calc(o.getReportPeriod()).getByCity();
        } catch (Exception e) {
            calcError = e.getMessage() == null ? "拆分计算失败" : e.getMessage();
        }
        for (int i = 0; i < cities.size() && i < orders.length; i++) {
            String city = cities.get(i);
            Map<String, Object> row = new LinkedHashMap<>();
            row.put("reportPeriod", o.getReportPeriod());
            row.put("period", o.getReportPeriod());
            row.put("region", city);
            row.put("orderCount", orders[i]);
            row.put("orderShare", orderSum > 0 ? orders[i] / orderSum : null);
            WycSplitCalc.WycMetrics m = byCity == null ? null : byCity.get(city);
            row.put("pax", m == null ? null : m.getTotalPax());
            row.put("turnover", m == null ? null : m.getTotalTurnover());
            row.put("cityPax", m == null ? null : m.getCityPax());
            row.put("cityTurnover", m == null ? null : m.getCityTurnover());
            row.put("note", m == null ? (calcError == null ? "拆分未计算" : calcError) : "");
            rows.add(row);
        }
        return rows;
    }
    private boolean notEmpty(String s) {
@@ -171,6 +487,19 @@
            case "trackMileage": return TRACK_COLUMNS;
            case "scaleSplit": return SPLIT_COLUMNS;
            case "freightTurnover": return FREIGHT_COLUMNS;
            case "h2031": return H2031_COLUMNS;
            case "cityBus": return BUS_COLUMNS;
            case "cityTaxi": return TAXI_COLUMNS;
            case "cityTaxiAuth": return TAXI_AUTH_COLUMNS;
            case "passengerAuth": return PAUTH_COLUMNS;
            case "investmentMonthly": return INVEST_MONTHLY_COLUMNS;
            case "investmentProject": return INVEST_PROJECT_COLUMNS;
            case "investmentSystem": return INVEST_SYSTEM_COLUMNS;
            case "energyVehicle": return ENERGY_VEHICLE_COLUMNS;
            case "energyAuth": return ENERGY_AUTH_COLUMNS;
            case "passengerIndividual": return PAX_INDIVIDUAL_COLUMNS;
            case "wycTotal": return WYC_TOTAL_COLUMNS;
            case "wycOrder": return WYC_ORDER_COLUMNS;
            default: return new ArrayList<>();
        }
    }
@@ -181,6 +510,7 @@
        m.put("label", label);
        m.put("width", width);
        return m;
    }
    private static final List<Map<String, Object>> H2032_COLUMNS = new ArrayList<>();
@@ -188,16 +518,30 @@
    private static final List<Map<String, Object>> TRACK_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> SPLIT_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> FREIGHT_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> H2031_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> PAUTH_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> BUS_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> TAXI_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> TAXI_AUTH_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> INVEST_MONTHLY_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> INVEST_PROJECT_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> INVEST_SYSTEM_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> ENERGY_VEHICLE_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> ENERGY_AUTH_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> PAX_INDIVIDUAL_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> WYC_TOTAL_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> WYC_ORDER_COLUMNS = new ArrayList<>();
    static {
        H2032_COLUMNS.add(col("reportPeriod", "报表期", 100));
        H2032_COLUMNS.add(col("regionCode", "所属地区", 100));
        H2032_COLUMNS.add(col("city", "市州", 110));
        H2032_COLUMNS.add(col("enterpriseCode", "企业代码", 130));
        H2032_COLUMNS.add(col("enterpriseName", "企业名称", 220));
        H2032_COLUMNS.add(col("unifiedCreditCode", "统一社会信用代码", 180));
        H2032_COLUMNS.add(col("reportUnit", "填报单位", 160));
        H2032_COLUMNS.add(col("vehicleTotal", "车辆数合计", 110));
        H2032_COLUMNS.add(col("tonsTotal", "标记吨位数合计", 130));
        H2032_COLUMNS.add(col("tonsTotal", "标记吨位数合计(吨)", 150));
        H2032_COLUMNS.add(col("vehicleTractor", "牵引车", 90));
        H2032_COLUMNS.add(col("vehicleTrailer", "挂车", 90));
        H2032_COLUMNS.add(col("tonsTrailer", "吨位-挂车", 110));
@@ -205,8 +549,8 @@
        H2032_COLUMNS.add(col("tonsContainer", "吨位-集装箱", 120));
        H2032_COLUMNS.add(col("vehicleWhole", "整车", 90));
        H2032_COLUMNS.add(col("tonsWhole", "吨位-整车", 110));
        H2032_COLUMNS.add(col("freightTotal", "货运量合计", 110));
        H2032_COLUMNS.add(col("turnoverTotal", "周转量合计", 110));
        H2032_COLUMNS.add(col("freightTotal", "货运量合计(吨)", 130));
        H2032_COLUMNS.add(col("turnoverTotal", "周转量合计(吨公里)", 150));
        H2032_COLUMNS.add(col("freightContainer", "货运量-集装箱", 130));
        H2032_COLUMNS.add(col("freightCoal", "货运量-煤炭", 120));
        H2032_COLUMNS.add(col("freightOilGas", "货运量-油气", 120));
@@ -216,7 +560,7 @@
        H2032_COLUMNS.add(col("freightBuilding", "货运量-建材", 120));
        H2032_COLUMNS.add(col("freightGrain", "货运量-粮食", 120));
        H2032_COLUMNS.add(col("avgTonnage", "平均吨位", 100));
        H2032_COLUMNS.add(col("avgDistance", "平均运距", 100));
        H2032_COLUMNS.add(col("avgDistance", "平均运距(公里)", 120));
        H2032_COLUMNS.add(col("unitLeader", "单位负责人", 110));
        H2032_COLUMNS.add(col("statsLeader", "统计负责人", 110));
        H2032_COLUMNS.add(col("contactPerson", "填表人", 100));
@@ -241,16 +585,16 @@
        SPLIT_COLUMNS.add(col("reportPeriod", "报表期", 100));
        SPLIT_COLUMNS.add(col("periodType", "口径", 90));
        SPLIT_COLUMNS.add(col("regionName", "市州", 130));
        SPLIT_COLUMNS.add(col("aboveScaleFreight", "规上货运量", 120));
        SPLIT_COLUMNS.add(col("aboveScaleTurnover", "规上周转量", 120));
        SPLIT_COLUMNS.add(col("aboveScaleFreight", "规上货运量(来源文件未提供该列)", 220));
        SPLIT_COLUMNS.add(col("aboveScaleTurnover", "规上周转量(万吨公里)", 170));
        SPLIT_COLUMNS.add(col("aboveScaleRank", "规上排名", 100));
        SPLIT_COLUMNS.add(col("aboveScaleYoy", "规上同比", 100));
        SPLIT_COLUMNS.add(col("belowScaleFreight", "规下货运量", 120));
        SPLIT_COLUMNS.add(col("belowScaleTurnover", "规下周转量", 120));
        SPLIT_COLUMNS.add(col("belowScaleFreight", "规下货运量(来源文件未提供该列)", 220));
        SPLIT_COLUMNS.add(col("belowScaleTurnover", "规下周转量(万吨公里)", 170));
        SPLIT_COLUMNS.add(col("belowScaleRank", "规下排名", 100));
        SPLIT_COLUMNS.add(col("belowScaleYoy", "规下同比", 100));
        SPLIT_COLUMNS.add(col("totalFreight", "合计货运量", 120));
        SPLIT_COLUMNS.add(col("totalTurnover", "合计周转量", 120));
        SPLIT_COLUMNS.add(col("totalFreight", "合计货运量(来源文件未提供该列)", 220));
        SPLIT_COLUMNS.add(col("totalTurnover", "合计周转量(万吨公里)", 170));
        SPLIT_COLUMNS.add(col("totalRank", "合计排名", 100));
        SPLIT_COLUMNS.add(col("totalYoy", "合计同比", 100));
@@ -268,5 +612,183 @@
        for (int m = 1; m <= 12; m++) {
            FREIGHT_COLUMNS.add(col(String.format("lastTurnoverM%02d", m), "去年周转量" + m + "月", 140));
        }
        H2031_COLUMNS.add(col("reportPeriod", "报表期", 100));
        H2031_COLUMNS.add(col("regionCode", "所属地区", 100));
        H2031_COLUMNS.add(col("city", "市州", 110));
        H2031_COLUMNS.add(col("enterpriseCode", "企业代码", 130));
        H2031_COLUMNS.add(col("enterpriseName", "企业名称", 220));
        H2031_COLUMNS.add(col("unifiedCreditCode", "统一社会信用代码", 180));
        H2031_COLUMNS.add(col("reportUnit", "填报单位", 160));
        H2031_COLUMNS.add(col("vehicleTotal", "客运车辆合计", 110));
        H2031_COLUMNS.add(col("seatTotal", "核定载客位合计", 130));
        H2031_COLUMNS.add(col("vehicleSchedule", "班线车辆数", 110));
        H2031_COLUMNS.add(col("seatSchedule", "班线载客位", 110));
        H2031_COLUMNS.add(col("vehicleCharter", "包车车辆数", 110));
        H2031_COLUMNS.add(col("seatCharter", "包车载客位", 110));
        H2031_COLUMNS.add(col("passengerTotal", "客运量合计(人)", 130));
        H2031_COLUMNS.add(col("turnoverTotal", "周转量合计", 110));
        H2031_COLUMNS.add(col("passengerClass1", "客运量一类", 110));
        H2031_COLUMNS.add(col("passengerClass2", "客运量二类", 110));
        H2031_COLUMNS.add(col("passengerClass3", "客运量三类", 110));
        H2031_COLUMNS.add(col("passengerClass4", "客运量四类", 110));
        H2031_COLUMNS.add(col("passengerCharter", "客运量包车", 110));
        H2031_COLUMNS.add(col("turnoverClass1", "周转量一类", 110));
        H2031_COLUMNS.add(col("turnoverClass2", "周转量二类", 110));
        H2031_COLUMNS.add(col("turnoverClass3", "周转量三类", 110));
        H2031_COLUMNS.add(col("turnoverClass4", "周转量四类", 110));
        H2031_COLUMNS.add(col("turnoverCharter", "周转量包车", 110));
        H2031_COLUMNS.add(col("avgDistanceTotal", "平均运距合计", 120));
        H2031_COLUMNS.add(col("avgDistanceClass1", "一类平均运距", 120));
        H2031_COLUMNS.add(col("avgDistanceClass2", "二类平均运距", 120));
        H2031_COLUMNS.add(col("avgDistanceClass3", "三类平均运距", 120));
        H2031_COLUMNS.add(col("avgDistanceClass4", "四类平均运距", 120));
        H2031_COLUMNS.add(col("avgDistanceCharter", "包车平均运距", 120));
        BUS_COLUMNS.add(col("reportPeriod", "报表期", 100));
        BUS_COLUMNS.add(col("regionCode", "所属地区", 100));
        BUS_COLUMNS.add(col("city", "市州", 110));
        BUS_COLUMNS.add(col("enterpriseName", "企业名称", 220));
        BUS_COLUMNS.add(col("opVehicles", "运营车数", 100));
        BUS_COLUMNS.add(col("stopTotal", "站点总个数", 110));
        BUS_COLUMNS.add(col("stopCity", "城市内站点", 110));
        BUS_COLUMNS.add(col("passengerVolume", "客运量(万人次)", 120));
        BUS_COLUMNS.add(col("passengerCity", "城市内客运量(万人次)", 150));
        BUS_COLUMNS.add(col("turnover", "旅客周转量(万人公里)", 170));
        BUS_COLUMNS.add(col("turnoverCity", "城市内周转量(万人公里)", 180));
        BUS_COLUMNS.add(col("avgDistance", "平均运距(公里)", 120));
        BUS_COLUMNS.add(col("avgDistanceCity", "城市内平均运距(公里)", 150));
        BUS_COLUMNS.add(col("passengerChengxiang", "城际城乡客运量(万人次)", 160));
        BUS_COLUMNS.add(col("turnoverChengxiang", "城际城乡周转量(万人公里)", 190));
        BUS_COLUMNS.add(col("avgDistanceChengxiang", "城际城乡平均运距(公里)", 160));
        BUS_COLUMNS.add(col("ratePassengerMom", "客运量环比", 100));
        BUS_COLUMNS.add(col("ratePassengerCityMom", "城市内环比", 100));
        BUS_COLUMNS.add(col("rateChengxiangMom", "城际城乡环比", 110));
        BUS_COLUMNS.add(col("ratePassengerYoy", "客运量同比", 100));
        BUS_COLUMNS.add(col("passengerCityRatio", "城市内占比", 100));
        BUS_COLUMNS.add(col("chengxiangRatio", "城际城乡占比", 110));
        BUS_COLUMNS.add(col("contactPerson", "填表人", 100));
        BUS_COLUMNS.add(col("reportDate", "报出日期", 110));
        BUS_COLUMNS.add(col("verifyExplanation", "核实解释", 220));
        TAXI_COLUMNS.add(col("reportPeriod", "报表期", 100));
        TAXI_COLUMNS.add(col("regionCode", "所属地区", 100));
        TAXI_COLUMNS.add(col("city", "市州", 110));
        TAXI_COLUMNS.add(col("tripTotal", "载客车次总数", 120));
        TAXI_COLUMNS.add(col("tripCity", "载客车次_城市内", 130));
        TAXI_COLUMNS.add(col("passengerVolume", "客运量(万人次)", 120));
        TAXI_COLUMNS.add(col("passengerCity", "城市内客运量(万人次)", 150));
        TAXI_COLUMNS.add(col("turnover", "旅客周转量(万人公里)", 170));
        TAXI_COLUMNS.add(col("turnoverCity", "城市内周转量(万人公里)", 180));
        TAXI_COLUMNS.add(col("opVehicles", "运营车辆数", 110));
        TAXI_COLUMNS.add(col("avgDistance", "平均运距(公里)", 120));
        TAXI_COLUMNS.add(col("avgDistanceCity", "城市内平均运距(公里)", 150));
        TAXI_COLUMNS.add(col("passengersPerTrip", "单车次载客人数", 130));
        TAXI_COLUMNS.add(col("rateTripMom", "载客车次环比", 110));
        TAXI_COLUMNS.add(col("rateTripYoy", "载客车次同比", 110));
        TAXI_COLUMNS.add(col("ratePassengerMom", "客运量环比", 100));
        TAXI_COLUMNS.add(col("ratePassengerYoy", "客运量同比", 100));
        TAXI_COLUMNS.add(col("passengerCityRatio", "城市内客运量占比", 140));
        TAXI_COLUMNS.add(col("avgDistanceChengxiang", "城际城乡平均运距(公里)", 160));
        TAXI_COLUMNS.add(col("verifyExplanation", "核实解释", 220));
        TAXI_AUTH_COLUMNS.add(col("reportPeriod", "报表期", 100));
        TAXI_AUTH_COLUMNS.add(col("city", "市州", 110));
        TAXI_AUTH_COLUMNS.add(col("plateNo", "车牌号码", 120));
        TAXI_AUTH_COLUMNS.add(col("vehicleType", "车辆类型", 110));
        TAXI_AUTH_COLUMNS.add(col("fuelType", "燃料类型", 100));
        TAXI_AUTH_COLUMNS.add(col("opStatus", "营运状态", 100));
        TAXI_AUTH_COLUMNS.add(col("certStatus", "证件状态", 100));
        TAXI_AUTH_COLUMNS.add(col("licenseNo", "经营权号", 130));
        TAXI_AUTH_COLUMNS.add(col("archiveNo", "档案号", 130));
        TAXI_AUTH_COLUMNS.add(col("roadCertNo", "道路运输证字号", 150));
        TAXI_AUTH_COLUMNS.add(col("operatorName", "业户名称", 240));
        TAXI_AUTH_COLUMNS.add(col("operatorAddr", "业户地址", 280));
        PAUTH_COLUMNS.add(col("reportPeriod", "报表期", 100));
        PAUTH_COLUMNS.add(col("enterpriseCode", "企业代码", 130));
        PAUTH_COLUMNS.add(col("enterpriseName", "企业名称", 240));
        PAUTH_COLUMNS.add(col("vehicleCount", "车辆数", 100));
        PAUTH_COLUMNS.add(col("seatCount", "载客位数", 100));
        INVEST_MONTHLY_COLUMNS.add(col("reportPeriod", "报表期", 100));
        INVEST_MONTHLY_COLUMNS.add(col("projectId", "项目ID", 80));
        INVEST_MONTHLY_COLUMNS.add(col("projectName", "项目名称", 280));
        INVEST_MONTHLY_COLUMNS.add(col("city", "市州", 90));
        INVEST_MONTHLY_COLUMNS.add(col("yearPlan", "本年计划投资(万元)", 140));
        INVEST_MONTHLY_COLUMNS.add(col("yearCum", "自年初累计完成(万元)", 160));
        INVEST_MONTHLY_COLUMNS.add(col("monthDone", "本月完成投资(万元)", 150));
        INVEST_MONTHLY_COLUMNS.add(col("startCum", "自开始建设累计完成(万元)", 180));
        INVEST_MONTHLY_COLUMNS.add(col("progressStage", "建设阶段", 120));
        INVEST_MONTHLY_COLUMNS.add(col("progressDesc", "形象进度", 320));
        INVEST_MONTHLY_COLUMNS.add(col("buildingArea", "建筑面积", 110));
        INVEST_PROJECT_COLUMNS.add(col("projectName", "项目名称", 260));
        INVEST_PROJECT_COLUMNS.add(col("category", "类别", 100));
        INVEST_PROJECT_COLUMNS.add(col("city", "市州", 90));
        INVEST_PROJECT_COLUMNS.add(col("county", "县(市、区)", 120));
        INVEST_PROJECT_COLUMNS.add(col("builderName", "建设单位", 200));
        INVEST_PROJECT_COLUMNS.add(col("constructNature", "建设性质", 100));
        INVEST_PROJECT_COLUMNS.add(col("startTime", "开工年", 90));
        INVEST_PROJECT_COLUMNS.add(col("endTime", "完工年", 90));
        INVEST_PROJECT_COLUMNS.add(col("totalInvestment", "总投资(万元)", 130));
        INVEST_PROJECT_COLUMNS.add(col("buildingArea", "建筑面积", 110));
        INVEST_PROJECT_COLUMNS.add(col("approvalGk", "工可或核准批复文号", 200));
        INVEST_PROJECT_COLUMNS.add(col("approvalCs", "初设或施工图批复文号", 200));
        INVEST_PROJECT_COLUMNS.add(col("source", "来源", 100));
        INVEST_SYSTEM_COLUMNS.add(col("reportPeriod", "报表期", 100));
        INVEST_SYSTEM_COLUMNS.add(col("projectName", "项目名称", 260));
        INVEST_SYSTEM_COLUMNS.add(col("totalInvestment", "总投资(万元)", 130));
        INVEST_SYSTEM_COLUMNS.add(col("startCum", "自开始建设累计完成(万元)", 180));
        INVEST_SYSTEM_COLUMNS.add(col("yearPlan", "本年计划投资(万元)", 140));
        INVEST_SYSTEM_COLUMNS.add(col("yearCum", "自年初累计完成(万元)", 160));
        INVEST_SYSTEM_COLUMNS.add(col("monthDone", "本月完成投资(万元)", 150));
        ENERGY_VEHICLE_COLUMNS.add(col("reportPeriod", "报表期", 100));
        ENERGY_VEHICLE_COLUMNS.add(col("regionCode", "所属地区", 100));
        ENERGY_VEHICLE_COLUMNS.add(col("city", "市州", 110));
        ENERGY_VEHICLE_COLUMNS.add(col("enterpriseName", "企业名称", 220));
        ENERGY_VEHICLE_COLUMNS.add(col("plateNo", "车牌号", 110));
        ENERGY_VEHICLE_COLUMNS.add(col("vehicleType", "车辆类型", 130));
        ENERGY_VEHICLE_COLUMNS.add(col("fuelType", "燃料类型", 110));
        ENERGY_VEHICLE_COLUMNS.add(col("manufactureYear", "出厂年份", 100));
        ENERGY_VEHICLE_COLUMNS.add(col("markedTonnage", "标记吨位", 100));
        ENERGY_VEHICLE_COLUMNS.add(col("totalMileage", "总行驶里程(公里)", 150));
        ENERGY_VEHICLE_COLUMNS.add(col("loadedMileage", "重载里程(公里)", 140));
        ENERGY_VEHICLE_COLUMNS.add(col("emptyMileage", "空载里程(公里)", 140));
        ENERGY_VEHICLE_COLUMNS.add(col("freight", "货运量(吨)", 120));
        ENERGY_VEHICLE_COLUMNS.add(col("turnover", "周转量(吨公里)", 140));
        ENERGY_VEHICLE_COLUMNS.add(col("tripCount", "车次", 90));
        ENERGY_VEHICLE_COLUMNS.add(col("fuelUnit", "燃料单位", 100));
        ENERGY_VEHICLE_COLUMNS.add(col("fuelConsumption", "燃料消耗量", 120));
        ENERGY_VEHICLE_COLUMNS.add(col("avgDistance", "平均运距", 110));
        ENERGY_VEHICLE_COLUMNS.add(col("avgLoadedTonnage", "平均载重吨位", 130));
        ENERGY_VEHICLE_COLUMNS.add(col("avgTripMileage", "平均车次里程", 130));
        ENERGY_VEHICLE_COLUMNS.add(col("fuelPer100km", "百公里油耗", 120));
        ENERGY_VEHICLE_COLUMNS.add(col("turnoverFuel", "周转量油耗", 120));
        ENERGY_AUTH_COLUMNS.add(col("reportPeriod", "报表期", 100));
        ENERGY_AUTH_COLUMNS.add(col("plateNo", "车牌号", 110));
        ENERGY_AUTH_COLUMNS.add(col("vehicleType", "车辆类型", 130));
        ENERGY_AUTH_COLUMNS.add(col("fuelType", "燃料类型", 110));
        ENERGY_AUTH_COLUMNS.add(col("markedTonnage", "标记吨位", 100));
        ENERGY_AUTH_COLUMNS.add(col("tractionQuality", "牵引质量", 110));
        PAX_INDIVIDUAL_COLUMNS.add(col("reportPeriod", "报表期", 100));
        PAX_INDIVIDUAL_COLUMNS.add(col("regionCode", "所属地区", 110));
        PAX_INDIVIDUAL_COLUMNS.add(col("city", "市州", 110));
        PAX_INDIVIDUAL_COLUMNS.add(col("enterpriseCode", "企业代码", 130));
        PAX_INDIVIDUAL_COLUMNS.add(col("enterpriseName", "企业名称", 220));
        PAX_INDIVIDUAL_COLUMNS.add(col("passengerCount", "个体客运量", 130));
        PAX_INDIVIDUAL_COLUMNS.add(col("turnover", "个体旅客周转量", 150));
        WYC_TOTAL_COLUMNS.add(col("reportPeriod", "报表期", 100));
        WYC_TOTAL_COLUMNS.add(col("pinK", "全省网约车客运量(万人次)", 210));
        WYC_TOTAL_COLUMNS.add(col("pinCK", "其中城市内客运量(万人次)", 210));
        WYC_TOTAL_COLUMNS.add(col("pinZ", "全省网约车周转量(万人公里)", 220));
        WYC_TOTAL_COLUMNS.add(col("pinCZ", "其中城市内周转量(万人公里)", 220));
        WYC_ORDER_COLUMNS.add(col("region", "地区", 110));
        WYC_ORDER_COLUMNS.add(col("period", "期间", 100));
        WYC_ORDER_COLUMNS.add(col("orderCount", "订单数(单)", 130));
        WYC_ORDER_COLUMNS.add(col("orderShare", "订单占比", 100));
        WYC_ORDER_COLUMNS.add(col("pax", "客运量(万人次)", 140));
        WYC_ORDER_COLUMNS.add(col("turnover", "旅客周转量(万人公里)", 180));
        WYC_ORDER_COLUMNS.add(col("cityPax", "其中城市内客运量(万人次)", 190));
        WYC_ORDER_COLUMNS.add(col("cityTurnover", "其中城市内旅客周转量(万人公里)", 230));
        WYC_ORDER_COLUMNS.add(col("note", "说明", 200));
    }
}