wlzboy
2025-11-07 2aebbc9601ab439707f69b08e467808df9f7549c
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DepartmentSyncServiceImpl.java
@@ -10,9 +10,11 @@
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.DepartmentSyncDTO;
import com.ruoyi.system.domain.OrderClassDTO;
import com.ruoyi.system.mapper.SysDeptMapper;
import com.ruoyi.system.service.IDepartmentSyncService;
import com.ruoyi.system.service.IDepartmentSyncDataService;
import com.ruoyi.system.service.IOrderClassDataService;
/**
 * 部门同步Service业务层处理
@@ -30,10 +32,11 @@
{
    private static final Logger log = LoggerFactory.getLogger(DepartmentSyncServiceImpl.class);
    @Autowired
    private SysDeptMapper sysDeptMapper;
    @Autowired
    private IOrderClassDataService orderClassDataService;
    
@@ -49,7 +52,7 @@
     */
    @Override
    @Transactional
    public AjaxResult syncBranchDepartments(List<DepartmentSyncDTO> branchDepts)
    public AjaxResult syncBranchDepartments(List<DepartmentSyncDTO> branchDepts,List<OrderClassDTO> serviceOrderList,List<OrderClassDTO> dispatchOrderList)
    {
        try
        {
@@ -59,6 +62,9 @@
            }
            
            log.info("开始同步 {} 条分公司数据到 MySQL 数据库...", branchDepts.size());
            // 一次性从SQL Server查询所有编码数据,避免在循环中重复查询
            
            // 使用Map来跟踪已创建的分公司,key为分公司名称,value为部门ID
            Map<String, Long> branchMap = new HashMap<>();
@@ -95,10 +101,16 @@
                    SysDept existingBranch = sysDeptMapper.checkDeptNameUnique(branchName, 100L);
                    if (existingBranch != null)
                    {
                        // 分公司已存在,更新department_id
                        // 分公司已存在,更新编码
                        branchDeptId = existingBranch.getDeptId();
                        branchMap.put(branchName, branchDeptId);
                        log.info("分公司已存在: {}, ID: {}", branchName, branchDeptId);
                        // 检查并更新编码
                        syncOrderClassCodes(existingBranch, parts[0].trim(), serviceOrderList, dispatchOrderList);
//                        existingBranch.setDepartmentId(dto.getDepartmentId());
                        sysDeptMapper.updateDept(existingBranch);
                        log.info("更新分公司编码: {}, 服务单编码: {}, 调度单编码: {}",
                            branchName, existingBranch.getServiceOrderClass(), existingBranch.getDispatchOrderClass());
                    }
                    else
                    {
@@ -110,12 +122,17 @@
                        newBranch.setOrderNum(branchMap.size() + 1);  // 排序
                        newBranch.setStatus("0");  // 正常状态
                        newBranch.setCreateBy("sync");
//                        newBranch.setDepartmentId(dto.getDepartmentId());
                        // 自动匹配并设置服务单和调度单编码
                        syncOrderClassCodes(newBranch, parts[0].trim(), serviceOrderList, dispatchOrderList);
                        sysDeptMapper.insertDept(newBranch);
                        branchDeptId = newBranch.getDeptId();
                        branchMap.put(branchName, branchDeptId);
                        createdBranch++;
                        log.info("创建新分公司: {}, ID: {}", branchName, branchDeptId);
                        log.info("创建新分公司: {}, ID: {}, 服务单编码: {}, 调度单编码: {}",
                            branchName, branchDeptId, newBranch.getServiceOrderClass(), newBranch.getDispatchOrderClass());
                    }
                }
@@ -129,6 +146,7 @@
                    // 部门已存在,更新信息
                    existingDept.setDeptName(deptName);
                    existingDept.setUpdateBy("sync");
//                    existingDept.setDepartmentId(dto.getDepartmentId());
                    sysDeptMapper.updateDept(existingDept);
                    updatedDept++;
                    log.info("更新部门: {} -> {}", branchName, deptName);
@@ -270,6 +288,7 @@
                    // 部门已存在,更新信息
                    existingDept.setDeptName(deptName);
                    existingDept.setUpdateBy("sync");
                    existingDept.setDepartmentId(dto.getDepartmentId());
                    sysDeptMapper.updateDept(existingDept);
                    updatedDept++;
                    log.info("更新转运部子部门: {}", deptName);
@@ -327,4 +346,87 @@
            return AjaxResult.error("同步失败: " + e.getMessage());
        }
    }
    /**
     * 同步订单编码(服务单和调度单编码)
     *
     * 根据分公司名称中的地名,自动匹配SQL Server中的编码并更新到部门对象
     *
     * @param dept 部门对象(分公司)
     * @param cityName 城市名称(如:中山、广州、湛江)
     * @param serviceOrderList 服务单编码列表(从SQL Server查询)
     * @param dispatchOrderList 调度单编码列表(从SQL Server查询)
     */
    private void syncOrderClassCodes(SysDept dept, String cityName,
                                    List<OrderClassDTO> serviceOrderList,
                                    List<OrderClassDTO> dispatchOrderList)
    {
        if (serviceOrderList == null || dispatchOrderList == null)
        {
            log.warn("编码列表为空,跳过编码同步 - 城市: {}", cityName);
            return;
        }
        try
        {
            // 匹配服务单编码
            String serviceOrderClass = matchCityNameToCode(cityName, serviceOrderList);
            if (serviceOrderClass != null)
            {
                dept.setServiceOrderClass(serviceOrderClass);
                log.info("匹配到服务单编码 - 城市: {}, 编码: {}", cityName, serviceOrderClass);
            }
            else
            {
                log.warn("未找到匹配的服务单编码 - 城市: {}", cityName);
            }
            // 匹配调度单编码
            String dispatchOrderClass = matchCityNameToCode(cityName, dispatchOrderList);
            if (dispatchOrderClass != null)
            {
                dept.setDispatchOrderClass(dispatchOrderClass);
                log.info("匹配到调度单编码 - 城市: {}, 编码: {}", cityName, dispatchOrderClass);
            }
            else
            {
                log.warn("未找到匹配的调度单编码 - 城市: {}", cityName);
            }
        }
        catch (Exception e)
        {
            log.error("同步订单编码失败 - 城市: {}", cityName, e);
        }
    }
    /**
     * 根据城市名称匹配编码
     *
     * 匹配规则:如果vtext中包含城市名称,则返回对应的vOrder2编码
     * 例如:cityName="中山", vtext="中山服务单", vOrder2="JA" -> 返回"JA"
     *
     * @param cityName 城市名称(如:中山、广州)
     * @param orderClassList 编码列表
     * @return 匹配的编码值(vOrder2),未匹配返回null
     */
    private String matchCityNameToCode(String cityName, List<OrderClassDTO> orderClassList)
    {
        if (StringUtils.isEmpty(cityName) || orderClassList == null || orderClassList.isEmpty())
        {
            return null;
        }
        // 遍历编码列表,查找包含城市名称的项
        for (OrderClassDTO dto : orderClassList)
        {
            if (dto.getVtext() != null && dto.getVtext().contains(cityName))
            {
                log.debug("城市名称匹配成功 - 城市: {}, vtext: {}, vOrder2: {}",
                    cityName, dto.getVtext(), dto.getVOrder2());
                return dto.getVOrder2();
            }
        }
        return null;
    }
}