package com.ruoyi.account.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.account.api.dto.VinManagementAllocateDTO; import com.ruoyi.account.api.dto.VinManagementExcelDTO; import com.ruoyi.account.api.dto.VinManagementQueryDTO; import com.ruoyi.account.api.dto.VinManagementSaveDTO; import com.ruoyi.account.api.model.TVinManagement; import com.ruoyi.account.api.vo.VinManagementAllocateVO; import java.math.BigDecimal; import java.util.List; public interface TVinManagementService extends IService { IPage selectPageList(VinManagementQueryDTO query); boolean saveVin(VinManagementSaveDTO dto); boolean updateVin(VinManagementSaveDTO dto); boolean deleteVins(List ids); /** * 批量解绑车队:仅清空车队归属(fleet_id 置空),公司、初始分配额度、状态等不受影响 * * @return 实际解绑的VIN数量(未绑定车队的记录不计入) */ int unbindFleet(List ids); boolean updateStatus(Long id, Integer status); List selectExportList(VinManagementQueryDTO query); String importVins(List items); List selectAppletVehicleList(Long appUserId); boolean bindAppletVehicle(Long appUserId, String keyword); boolean unbindAppletVehicle(Long id, Long appUserId); List getVinIdsByAppUserId(Long appUserId); /** * 统计某车队下未删除的VIN车辆数(车队管理-列表"VIN码车辆数"使用,null 返回 0) */ long countByFleet(Integer fleetId); /** * 根据VIN码查询未删除的VIN记录(含禁用状态,由调用方判断) */ TVinManagement getByVin(String vin); /** * 按公司查询未删除的VIN码列表(公司详情-充电用户信息聚合使用) */ List listByCompany(Integer companyId); /** * 额度分配概览:公司可分配余额与总账户余额 */ VinManagementAllocateVO getAllocateOverview(Integer companyId); /** * VIN码额度分配:公司可用余额划入VIN初始分配额度(累加后返回最新概览) */ VinManagementAllocateVO allocateQuota(VinManagementAllocateDTO dto); /** * 锁定VIN账户余额(VIN码充电申请,分配模式实扣冻结:余额立即扣减并计入锁定金额) * * @param vinId VIN记录ID * @param amount 锁定金额(大于0) * @return 锁定后剩余可用余额 */ BigDecimal lockBalance(Long vinId, BigDecimal amount); /** * 结算VIN账户余额(解锁锁定额并按实际消费扣减,允许扣成负数) *

订单号非空时按订单号幂等:余额变更与消费流水同事务写入,重复结算直接返回当前余额。

* * @param vinId VIN记录ID * @param lockedAmount 申请时锁定额(用于释放) * @param actualAmount 实际消费金额 * @param orderCode 充电订单号(幂等键,可为空) * @param userInfo 分配对象(VIN码,可为空则取账户VIN) * @param userName 分配对象名称(车牌号,可为空则取账户车牌) * @param remark 备注 * @return 结算后可用余额 */ BigDecimal settleBalance(Long vinId, BigDecimal lockedAmount, BigDecimal actualAmount, String orderCode, String userInfo, String userName, String remark); /** * 释放VIN锁定金额(未产生消费时使用) * * @param vinId VIN记录ID * @param amount 释放金额(大于0) * @return 释放后可用余额 */ BigDecimal unlockBalance(Long vinId, BigDecimal amount); }