wlzboy
2025-12-04 4f2925f1974844b66225ac70ae35065b8262b315
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DepartmentSyncServiceImpl.java
@@ -1,5 +1,6 @@
package com.ruoyi.system.service.impl;
import java.math.BigDecimal;
import java.util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -52,7 +53,7 @@
     */
    @Override
    @Transactional
    public AjaxResult syncBranchDepartments(List<DepartmentSyncDTO> branchDepts,List<OrderClassDTO> serviceOrderList,List<OrderClassDTO> dispatchOrderList)
    public AjaxResult syncBranchDepartments(List<DepartmentSyncDTO> branchDepts,List<OrderClassDTO> serviceOrderList,List<OrderClassDTO> dispatchOrderList,List<Map<String, Object>> addressList)
    {
        try
        {
@@ -87,11 +88,32 @@
                if (parts.length != 2)
                {
                    log.warn("部门名称格式不正确,跳过: {}", fullName);
                    continue;
                   parts= fullName.split("-");
                   if(parts.length != 2) {
                       continue;
                   }
                }
                String part="";
                //只要发现有(新)或(新)就在branchName中加个新 字
                if(fullName.contains("(新)") || fullName.contains("(新)")) {
                    part="(新)";
                }
                String branchName = parts[0].trim() + "分公司";  // 湛江 -> 湛江分公司
                String deptName = parts[1].trim();              // 护士
                String cityName=parts[0].trim();
                String namePart=parts[0].trim();
                if(namePart.contains("(新)") || namePart.contains("(新)")) {
                    branchName=namePart+"分公司";
                    cityName=namePart;
                    deptName=parts[1].trim();
                }
                else{
                    branchName=namePart+part+"分公司";
                    cityName=namePart+ part;
                    deptName=parts[1].trim();
                }
                // 获取或创建分公司
                Long branchDeptId = branchMap.get(branchName);
@@ -106,7 +128,7 @@
                        branchMap.put(branchName, branchDeptId);
                        
                        // 检查并更新编码
                        syncOrderClassCodes(existingBranch, parts[0].trim(), serviceOrderList, dispatchOrderList);
                        syncOrderClassCodes(existingBranch, cityName, serviceOrderList, dispatchOrderList,addressList);
//                        existingBranch.setDepartmentId(dto.getDepartmentId());
                        sysDeptMapper.updateDept(existingBranch);
                        log.info("更新分公司编码: {}, 服务单编码: {}, 调度单编码: {}", 
@@ -125,7 +147,7 @@
//                        newBranch.setDepartmentId(dto.getDepartmentId());
                        // 自动匹配并设置服务单和调度单编码
                        syncOrderClassCodes(newBranch, parts[0].trim(), serviceOrderList, dispatchOrderList);
                        syncOrderClassCodes(newBranch, cityName, serviceOrderList, dispatchOrderList,addressList);
                        sysDeptMapper.insertDept(newBranch);
                        branchDeptId = newBranch.getDeptId();
@@ -204,6 +226,24 @@
            return AjaxResult.error("同步失败: " + e.getMessage());
        }
    }
    /**
     * 同步分公司的地址数据
     * @param departAddress
     */
    public void syncDeptAddress(List<Map<String,Object>> departAddress){
        List<SysDept> depts =sysDeptMapper.selectDeptListByParentId(100L);
        for(SysDept dept:depts){
            Map<String,Object> addressInfo = getDeptAddressInfo(departAddress,dept.getServiceOrderClass());
            if(addressInfo != null){
                dept.setDepartureAddress(getAddress(addressInfo));
                dept.setDepartureLongitude(getLongitude(addressInfo));
                dept.setDepartureLatitude(getLatitude(addressInfo));
            }
            sysDeptMapper.updateDept(dept);
        }
    }
    
    /**
     * 同步转运部和子部门数据(使用外部传入的数据源)
@@ -218,7 +258,7 @@
     */
    @Override
    @Transactional
    public AjaxResult syncTransportDepartments(List<DepartmentSyncDTO> transportDepts)
    public AjaxResult syncTransportDepartments(List<DepartmentSyncDTO> transportDepts, List<Map<String, Object>> addressList)
    {
        try
        {
@@ -347,6 +387,34 @@
        }
    }
    private Map<String,Object> getDeptAddressInfo(List<Map<String,Object>> departAddress,String ServiceBranch){
        return departAddress.stream()
            .filter(map -> map.get("ServiceBranch").equals(ServiceBranch))
            .findFirst()
            .orElse(null);
    }
    private String getAddress(Map<String, Object> addressInfo){
        if(addressInfo == null){
            return null;
        }
        return addressInfo.get("ServiceAddress").toString();
    }
    private BigDecimal getLongitude(Map<String, Object> addressInfo){
        if(addressInfo == null){
            return null;
        }
        return new BigDecimal(addressInfo.get("ServiceAddress_lng").toString());
    }
    private BigDecimal getLatitude(Map<String, Object> addressInfo){
        if(addressInfo == null){
            return null;
        }
        return new BigDecimal(addressInfo.get("ServiceAddress_lat").toString());
    }
    /**
     * 同步订单编码(服务单和调度单编码)
     * 
@@ -359,7 +427,7 @@
     */
    private void syncOrderClassCodes(SysDept dept, String cityName, 
                                    List<OrderClassDTO> serviceOrderList,
                                    List<OrderClassDTO> dispatchOrderList)
                                    List<OrderClassDTO> dispatchOrderList, List<Map<String, Object>> addressList)
    {
        if (serviceOrderList == null || dispatchOrderList == null)
        {
@@ -373,6 +441,19 @@
            String serviceOrderClass = matchCityNameToCode(cityName, serviceOrderList);
            if (serviceOrderClass != null)
            {
                Map<String, Object> addressInfo = this.getDeptAddressInfo(addressList, serviceOrderClass);
                String address=this.getAddress(addressInfo);
                if(address!=null){
                    dept.setDepartureAddress(address);
                }
                BigDecimal lon = this.getLongitude(addressInfo);
                if(lon!=null){
                    dept.setDepartureLongitude(lon);
                }
                BigDecimal lat = this.getLatitude(addressInfo);
                if(lat!=null){
                    dept.setDepartureLatitude(lat);
                }
                dept.setServiceOrderClass(serviceOrderClass);
                log.info("匹配到服务单编码 - 城市: {}, 编码: {}", cityName, serviceOrderClass);
            }
@@ -419,6 +500,7 @@
        // 遍历编码列表,查找包含城市名称的项
        for (OrderClassDTO dto : orderClassList)
        {
            //有些加了新 TODO
            if (dto.getVtext() != null && dto.getVtext().contains(cityName))
            {
                log.debug("城市名称匹配成功 - 城市: {}, vtext: {}, vOrder2: {}",