puzhibing
23 小时以前 63b68c39653208a1756640034c028789946d0e12
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -1912,6 +1912,18 @@
    })
    public AjaxResult stopCharging(@PathVariable String id) {
        log.info("小程序主动发起停止充电,订单ID:{}", id);
        // VIN 码充电订单路由:VD 订单存于 t_vin_charging_order,不在 t_charging_order;
        // VD 表存在该 ID 订单时优先走 VIN 停充(内部按状态返回准确的“不能重复操作/还未开始充电”),
        // 其余情况回落普通停充。雪花 ID 两表同源生成,撞号概率可忽略
        TVinChargingOrder vinOrder = null;
        try {
            vinOrder = vinChargingOrderService.getById(Long.valueOf(id));
        } catch (NumberFormatException ignored) {
            // 非数字订单ID,按普通停充处理
        }
        if (vinOrder != null) {
            return vinChargingOrderService.stopChargingByApplet(id);
        }
        return chargingOrderService.stopCharging(id);
    }
    
@@ -2367,22 +2379,19 @@
    @PostMapping("/updateHandshakeVin")
    public R<Boolean> updateHandshakeVin(@RequestParam("orderCode") String orderCode,
                                         @RequestParam("vin") String vin) {
        if (StringUtils.isEmpty(orderCode) || StringUtils.isEmpty(vin)) {
        if (StringUtils.isEmpty(orderCode)) {
            return R.ok(false);
        }
        boolean updated;
        if (orderCode.startsWith("CD")) {
            updated = chargingOrderService.update(Wrappers.<TChargingOrder>lambdaUpdate()
            updated = StringUtils.isNotEmpty(vin) && chargingOrderService.update(Wrappers.<TChargingOrder>lambdaUpdate()
                    .eq(TChargingOrder::getCode, orderCode)
                    .set(TChargingOrder::getActualVin, vin));
        } else if (orderCode.startsWith("SD")) {
            updated = cardChargingOrderService.update(Wrappers.<TCardChargingOrder>lambdaUpdate()
                    .eq(TCardChargingOrder::getCode, orderCode)
                    .set(TCardChargingOrder::getActualVin, vin));
            // SD/VD:VIN 为空也进入握手处理(状态推进必达);服务内部仅非空回写 VIN,且仅状态=启动中(2)才推进
            updated = cardChargingOrderService.handleHandshakeVin(orderCode, vin);
        } else if (orderCode.startsWith("VD")) {
            updated = vinChargingOrderService.update(Wrappers.<TVinChargingOrder>lambdaUpdate()
                    .eq(TVinChargingOrder::getCode, orderCode)
                    .set(TVinChargingOrder::getActualVin, vin));
            updated = vinChargingOrderService.handleHandshakeVin(orderCode, vin);
        } else {
            log.warn("握手VIN回写失败,未知订单类型:{}", orderCode);
            return R.ok(false);
@@ -2435,10 +2444,38 @@
        }
        return R.ok(result);
    }
    /**
     * 内部接口:统计公司名下进行中充电订单数(三表合计,状态 2=启动中/3=充电中/4=停止中,
     * 账户模式切换:分配→共享 前校验使用)
     */
    @PostMapping("/inner/count-active-by-company")
    public R<Integer> countActiveByCompany(@RequestParam("companyId") Integer companyId) {
        if (companyId == null) {
            return R.ok(0);
        }
        try {
            List<Integer> activeStatuses = Arrays.asList(2, 3, 4);
            long count = 0L;
            count += chargingOrderService.lambdaQuery()
                    .eq(TChargingOrder::getCompanyId, companyId)
                    .in(TChargingOrder::getStatus, activeStatuses)
                    .count();
            count += cardChargingOrderService.lambdaQuery()
                    .eq(TCardChargingOrder::getCompanyId, companyId)
                    .in(TCardChargingOrder::getStatus, activeStatuses)
                    .count();
            count += vinChargingOrderService.lambdaQuery()
                    .eq(TVinChargingOrder::getCompanyId, companyId)
                    .in(TVinChargingOrder::getStatus, activeStatuses)
                    .count();
            return R.ok((int) count);
        } catch (RuntimeException ex) {
            log.error("统计公司进行中充电订单失败:companyId={}", companyId, ex);
            return R.fail("统计公司进行中充电订单失败:" + ex.getMessage());
        }
    }
    @RequiresPermissions(value = {"/chargingOperationAnalysis"}, logical = Logical.OR)
    @ResponseBody
    @PostMapping(value = "/charging/statistics")