| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.trafficaudit.common.util.RegionUtil; |
| | | import com.trafficaudit.dataimport.entity.CityTaxiMonthly; |
| | | import com.trafficaudit.dataimport.entity.WycOrderMonthly; |
| | | import com.trafficaudit.dataimport.entity.WycTotalMonthly; |
| | | import com.trafficaudit.dataimport.mapper.CityTaxiMonthlyMapper; |
| | | import com.trafficaudit.dataimport.mapper.WycOrderMonthlyMapper; |
| | | import com.trafficaudit.dataimport.mapper.WycTotalMonthlyMapper; |
| | | import org.apache.poi.ss.usermodel.Cell; |
| | | import org.apache.poi.ss.usermodel.CellType; |
| | | import org.apache.poi.ss.usermodel.DataFormatter; |
| | |
| | | |
| | | @Resource |
| | | private CityTaxiMonthlyMapper cityTaxiMapper; |
| | | @Resource |
| | | private WycOrderMonthlyMapper wycOrderMapper; |
| | | @Resource |
| | | private WycTotalMonthlyMapper wycTotalMapper; |
| | | @Value("${city-passenger.template-dir:docs/城市客运}") |
| | | private String templateDir; |
| | | |
| | |
| | | if (r.getAvgDistanceCity() != null && r.getAvgDistanceCity() > 0) a[5] = r.getAvgDistanceCity(); |
| | | } |
| | | for (double[] a : map.values()) { |
| | | if (a[4] <= 0 && a[0] > 0) a[4] = round(a[1] / a[0], 2); |
| | | if (a[5] <= 0 && a[2] > 0) a[5] = round(a[3] / a[2], 2); |
| | | // 平均运距兜底:全精度保留,展示位数交给单元格格式 |
| | | if (a[4] <= 0 && a[0] > 0) a[4] = a[1] / a[0]; |
| | | if (a[5] <= 0 && a[2] > 0) a[5] = a[3] / a[2]; |
| | | } |
| | | return map; |
| | | } |
| | | |
| | | /** 读取 docs/城市客运/《网约车订单及全省总量.xlsx》:按 period(yyyy-MM) 行取 pin(B-E) 与 17 市州订单(G-W) */ |
| | | private Map<String, Object> loadMonthlyInput(String period) throws Exception { |
| | | Map<String, Object> db = loadMonthlyInputFromDb(period); |
| | | if (db != null) return db; |
| | | File f = findInput(); |
| | | try (InputStream in = new FileInputStream(f); |
| | | Workbook wb = WorkbookFactory.create(in)) { |
| | |
| | | } |
| | | } |
| | | |
| | | /** 优先从库取数(wyc_order_monthly);库里无该期或订单全空时返回 null,回退读母版文件 */ |
| | | private Map<String, Object> loadMonthlyInputFromDb(String period) { |
| | | WycOrderMonthly row = wycOrderMapper.selectOne(new LambdaQueryWrapper<WycOrderMonthly>() |
| | | .eq(WycOrderMonthly::getReportPeriod, period).last("LIMIT 1")); |
| | | if (row == null) return null; |
| | | List<String> cities = RegionUtil.cityList(); |
| | | Double[] vals = { |
| | | row.getOrderWuhan(), row.getOrderHuangshi(), row.getOrderShiyan(), row.getOrderYichang(), |
| | | row.getOrderXiangyang(), row.getOrderEzhou(), row.getOrderJingmen(), row.getOrderXiaogan(), |
| | | row.getOrderJingzhou(), row.getOrderHuanggang(), row.getOrderXianning(), row.getOrderSuizhou(), |
| | | row.getOrderEnshi(), row.getOrderXiantao(), row.getOrderQianjiang(), row.getOrderTianmen(), |
| | | row.getOrderShennong() |
| | | }; |
| | | double[] orders = new double[cities.size()]; |
| | | double sum = 0.0; |
| | | for (int i = 0; i < orders.length && i < vals.length; i++) { |
| | | orders[i] = vals[i] == null ? 0.0 : vals[i]; |
| | | sum += orders[i]; |
| | | } |
| | | if (sum <= 0) return null; |
| | | double orderSum = sum; |
| | | if (row.getOrderSum() != null && row.getOrderSum() > 0) orderSum = row.getOrderSum(); |
| | | double pinK = row.getPinK() == null ? 0.0 : row.getPinK(); |
| | | double pinCK = row.getPinCK() == null ? 0.0 : row.getPinCK(); |
| | | double pinZ = row.getPinZ() == null ? 0.0 : row.getPinZ(); |
| | | double pinCZ = row.getPinCZ() == null ? 0.0 : row.getPinCZ(); |
| | | boolean pinFix = false; |
| | | // pin 兜底:订单表 pin 列为空/为 0 时回落 wyc_total_monthly(pin 专表) |
| | | if (pinK <= 0 || pinCK <= 0 || pinZ <= 0 || pinCZ <= 0) { |
| | | WycTotalMonthly tot = wycTotalMapper.selectOne(new LambdaQueryWrapper<WycTotalMonthly>() |
| | | .eq(WycTotalMonthly::getReportPeriod, period).last("LIMIT 1")); |
| | | if (tot != null) { |
| | | if (pinK <= 0 && tot.getPinK() != null && tot.getPinK() > 0) { pinK = tot.getPinK(); pinFix = true; } |
| | | if (pinCK <= 0 && tot.getPinCK() != null && tot.getPinCK() > 0) { pinCK = tot.getPinCK(); pinFix = true; } |
| | | if (pinZ <= 0 && tot.getPinZ() != null && tot.getPinZ() > 0) { pinZ = tot.getPinZ(); pinFix = true; } |
| | | if (pinCZ <= 0 && tot.getPinCZ() != null && tot.getPinCZ() > 0) { pinCZ = tot.getPinCZ(); pinFix = true; } |
| | | } |
| | | } |
| | | Map<String, Object> map = new LinkedHashMap<>(); |
| | | map.put("pinK", pinK); |
| | | map.put("pinCK", pinCK); |
| | | map.put("pinZ", pinZ); |
| | | map.put("pinCZ", pinCZ); |
| | | map.put("orders", orders); |
| | | map.put("orderSum", orderSum); |
| | | map.put("source", pinFix ? "db+wyc_total" : "db"); |
| | | return map; |
| | | } |
| | | private File findInput() throws Exception { |
| | | String rel = templateDir; |
| | | while (rel.startsWith("./")) rel = rel.substring(2); |
| | |
| | | |
| | | private double nz(Double v) { return v == null ? 0.0 : v; } |
| | | |
| | | private double round(double v, int scale) { |
| | | double factor = Math.pow(10, scale); |
| | | return Math.round(v * factor) / factor; |
| | | } |
| | | } |