wlzboy
3 天以前 40a8157440e3b906da8f52e07d939d78c3f4c313
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleSyncController.java
@@ -1,37 +1,165 @@
package com.ruoyi.web.controller.system;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.VehicleInfo;
import com.ruoyi.system.domain.VehicleSyncDTO;
import com.ruoyi.system.domain.vo.VehicleSyncVO;
import com.ruoyi.system.mapper.VehicleInfoMapper;
import com.ruoyi.system.service.IVehicleInfoService;
import com.ruoyi.system.service.IVehicleSyncDataService;
import com.ruoyi.system.service.IVehicleSyncService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 车辆同步Controller
 *
 * 车辆同步管理Controller
 *
 * @author ruoyi
 * @date 2025-10-20
 */
@RestController
@RequestMapping("/system/vehicle/sync")
public class VehicleSyncController extends BaseController
{
    @Autowired
    private IVehicleSyncService vehicleSyncService;
@RequestMapping("/system/vehicleSync")
public class VehicleSyncController extends BaseController {
    private static final Logger log = LoggerFactory.getLogger(VehicleSyncController.class);
    @Autowired
    private IVehicleSyncDataService vehicleSyncDataService;
    @Autowired
    private VehicleInfoMapper vehicleInfoMapper;
    @Autowired
    private IVehicleInfoService vehicleInfoService;
    /**
     * 手动同步旧系统车辆数据
     * 查询车辆同步列表(显示旧系统车辆及同步状态)
     */
    @PreAuthorize("@ss.hasPermi('system:vehicle:sync')")
    @PostMapping("/legacy")
    public AjaxResult syncLegacyVehicles()
    {
        return vehicleSyncService.syncVehicles(this.vehicleSyncDataService.getVehiclesFromSqlServer());
    @PreAuthorize("@ss.hasPermi('system:vehicleSync:list')")
    @GetMapping("/list")
    public TableDataInfo list() {
        try {
            // 1. 从旧系统获取车辆列表
            List<VehicleSyncDTO> oldVehicles = vehicleSyncDataService.getVehiclesFromSqlServer();
            if (oldVehicles == null || oldVehicles.isEmpty()) {
                return getDataTable(new ArrayList<>());
            }
            // 2. 转换为VO并检查同步状态
            List<VehicleSyncVO> voList = new ArrayList<>();
            for (VehicleSyncDTO dto : oldVehicles) {
                VehicleSyncVO vo = convertToVO(dto);
                // 3. 检查该车辆是否已同步到新系统
                VehicleInfo existVehicle = vehicleInfoMapper.selectVehicleInfoByCarId(dto.getCarId());
                if (existVehicle != null) {
                    vo.setSynced(true);
                    vo.setVehicleId(existVehicle.getVehicleId());
                    vo.setDeptId(existVehicle.getDeptId());
                    if (existVehicle.getDeptName() != null) {
                        vo.setDeptName(existVehicle.getDeptName());
                    }
                } else {
                    vo.setSynced(false);
                }
                voList.add(vo);
            }
            return getDataTable(voList);
        } catch (Exception e) {
            log.error("查询车辆同步列表失败", e);
            return getDataTable(new ArrayList<>());
        }
    }
    /**
     * 手动同步单个车辆到新系统
     */
    @PreAuthorize("@ss.hasPermi('system:vehicleSync:sync')")
    @Log(title = "车辆同步", businessType = BusinessType.INSERT)
    @PostMapping("/syncVehicle")
    public AjaxResult syncVehicle(@RequestBody Map<String, Object> params) {
        try {
            Integer carId = (Integer) params.get("carId");
            String vehicleNo = (String) params.get("vehicleNo");
            Long deptId = params.get("deptId") != null ? Long.valueOf(params.get("deptId").toString()) : null;
            if (carId == null || vehicleNo == null || deptId == null) {
                return AjaxResult.error("参数不完整:carId、vehicleNo、deptId 不能为空");
            }
            // 1. 检查是否已存在
            VehicleInfo existVehicle = vehicleInfoMapper.selectVehicleInfoByCarId(carId);
            if (existVehicle != null) {
                return AjaxResult.error("该车辆已同步,车辆ID: " + existVehicle.getVehicleId());
            }
            // 2. 创建新车辆记录
            VehicleInfo newVehicle = new VehicleInfo();
            newVehicle.setCarId(carId);
            newVehicle.setVehicleNo(vehicleNo);
            newVehicle.setDeptId(deptId);
            newVehicle.setStatus("0"); // 默认正常状态
            newVehicle.setCreateBy(getUsername());
            // 3. 插入车辆信息
            int result = vehicleInfoMapper.insertVehicleInfo(newVehicle);
            if (result > 0) {
                log.info("手动同步车辆成功:carId={}, vehicleNo={}, vehicleId={}",
                        carId, vehicleNo, newVehicle.getVehicleId());
                return AjaxResult.success("同步成功", newVehicle.getVehicleId());
            } else {
                return AjaxResult.error("同步失败");
            }
        } catch (Exception e) {
            log.error("手动同步车辆失败", e);
            return AjaxResult.error("同步失败:" + e.getMessage());
        }
    }
    /**
     * 将 DTO 转换为 VO
     */
    private VehicleSyncVO convertToVO(VehicleSyncDTO dto) {
        VehicleSyncVO vo = new VehicleSyncVO();
        vo.setCarId(dto.getCarId());
        vo.setVehicleNo(dto.getCarLicense());
        vo.setCarOrdClass(dto.getCarOrdClass());
        // 根据carOrdClass映射分公司名称
        String deptName = mapCarOrdClassToDeptName(dto.getCarOrdClass());
        vo.setDeptName(deptName);
        return vo;
    }
    /**
     * 根据单据类型编码映射分公司名称
     * 可以从配置或数据库读取,这里简化处理
     */
    private String mapCarOrdClassToDeptName(String carOrdClass) {
        // TODO: 根据实际业务规则映射
        // 可以从 sys_config 或专门的映射表读取
        Map<String, String> mapping = new HashMap<>();
        mapping.put("01", "总公司");
        mapping.put("02", "分公司A");
        mapping.put("03", "分公司B");
        return mapping.getOrDefault(carOrdClass, "未知分公司");
    }
}