“mitao”
2026-01-16 016b2f31b672f3bb1943ce3c2214bee6cba5306b
feat(management):管理后台数据权限
7个文件已修改
644 ■■■■■ 已修改文件
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_edit.html 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_add.html 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_edit.html 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_info.js 364 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java
@@ -243,7 +243,8 @@
        //系统用户对象
        User user = userService.selectOne(new EntityWrapper<User>().eq("roleType", 3).eq("objectId", tCompanyId));
        model.addAttribute("user", user);
        // 传递当前用户角色类型,用于控制非平台账号禁用经营业务和经营区域编辑
        model.addAttribute("roleType", shiroExtUtil.getUser().getRoleType());
        return PREFIX + "tCompany_updateFranchisee.html";
    }
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java
@@ -66,6 +66,9 @@
    private ITCompanyService tCompanyService;
    @Autowired
    private ITCompanyCityService tCompanyCityService;
    @Autowired
    private ITDriverServiceService tDriverServiceService;
    @Autowired
@@ -172,7 +175,7 @@
    public String tDriverAdd(Model model) {
        List<TCompany> companyList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 2).eq("state", 0).ne("flag", 3));
        model.addAttribute("companyList", companyList);
        Integer roleType = shiroExtUtil.getUser().getRoleType();
        model.addAttribute("roleType", roleType);
        if (2 == roleType) {
@@ -185,7 +188,13 @@
            model.addAttribute("franchiseeList", null);
        }
        //查询当前用户所属分公司/加盟商
        model.addAttribute("objectName", tCompanyService.selectById(shiroExtUtil.getUser().getObjectId()).getName());
        TCompany currentCompany = tCompanyService.selectById(shiroExtUtil.getUser().getObjectId());
        model.addAttribute("objectName", currentCompany.getName());
        // 分公司/加盟商账号传入公司经营业务信息和经营区域
        if (2 == roleType || 3 == roleType) {
            model.addAttribute("companyData", currentCompany);
            model.addAttribute("companyId", currentCompany.getId());
        }
        //查询线路列表
        if(1 != roleType){
@@ -276,6 +285,12 @@
        } else if (2 == roleType) {
            List<TCompany> franchiseeList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 3).eq("state", 0).ne("flag", 3).eq("superiorId", shiroExtUtil.getUser().getObjectId()));
            model.addAttribute("franchiseeList", franchiseeList);
            // 分公司账号传入公司ID用于加载经营区域
            model.addAttribute("currentCompanyId", shiroExtUtil.getUser().getObjectId());
        } else if (3 == roleType) {
            // 加盟商账号传入上级分公司ID用于加载经营区域
            TCompany franchisee = tCompanyService.selectById(shiroExtUtil.getUser().getObjectId());
            model.addAttribute("currentCompanyId", franchisee.getSuperiorId());
        }
        //查询平台ID
@@ -641,7 +656,42 @@
        map.put("list", list);
        TCompany company = tCompanyService.selectById(oneId);
        map.put("company", company);
        // 获取公司经营区域
        List<TCompanyCity> companyCityList = tCompanyCityService.selectList(
                new EntityWrapper<TCompanyCity>().eq("companyId", oneId).eq("state", 1));
        map.put("companyCityList", companyCityList);
        return map;
    }
    /**
     * 根据公司ID获取经营区域列表(省市区联动)
     */
    @RequestMapping(value = "/getCompanyCityList")
    @ResponseBody
    public Object getCompanyCityList(@RequestParam Integer companyId) {
        List<TCompanyCity> list = tCompanyCityService.selectList(
                new EntityWrapper<TCompanyCity>().eq("companyId", companyId).eq("state", 1));
        // 获取区域详细信息
        List<Map<String, Object>> result = new ArrayList<>();
        for (TCompanyCity city : list) {
            Map<String, Object> item = new HashMap<>();
            item.put("id", city.getId());
            item.put("provinceCode", city.getProvinceCode());
            item.put("cityCode", city.getCityCode());
            item.put("areaCode", city.getAreaCode());
            // 获取省市区名称
            TRegion province = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", city.getProvinceCode()));
            TRegion cityRegion = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", city.getCityCode()));
            TRegion area = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", city.getAreaCode()));
            item.put("provinceName", province != null ? province.getName() : "");
            item.put("cityName", cityRegion != null ? cityRegion.getName() : "");
            item.put("areaName", area != null ? area.getName() : "");
            item.put("provinceId", province != null ? province.getId() : "");
            item.put("cityId", cityRegion != null ? cityRegion.getId() : "");
            item.put("areaId", area != null ? area.getId() : "");
            result.add(item);
        }
        return result;
    }
@@ -2038,6 +2088,19 @@
                            }
                        }
                        // 校验经营业务是否在公司经营范围内
                        TCompany company = itCompanyService.selectById(companyId);
                        String serviceError = validateDriverService(company, "是".equals(nine), "是".equals(ten), "是".equals(eleven));
                        if (serviceError != null) {
                            return new ErrorTip(500, serviceError);
                        }
                        // 校验从业地是否在公司经营区域内
                        String placeError = validatePlaceOfEmployment(companyId, cell1701);
                        if (placeError != null) {
                            return new ErrorTip(500, placeError);
                        }
                        TDriver driver = new TDriver();
                        driver.setAccount(fifteen);
                        driver.setJobNumber(eight);
@@ -2350,7 +2413,20 @@
                        if (companyId == 0 && franchiseeId == 0) {
                            return new ErrorTip(500, "当前登录账户上级分公司不能为空");
                        }
                        // 校验经营业务是否在公司经营范围内
                        TCompany company = itCompanyService.selectById(companyId);
                        String serviceError = validateDriverService(company, "是".equals(eight), "是".equals(nine), "是".equals(ten));
                        if (serviceError != null) {
                            return new ErrorTip(500, serviceError);
                        }
                        // 校验从业地是否在公司经营区域内
                        String placeError = validatePlaceOfEmployment(companyId, cell1701);
                        if (placeError != null) {
                            return new ErrorTip(500, placeError);
                        }
                        TDriver driver = new TDriver();
                        driver.setAccount(fourteen);
                        driver.setJobNumber(seven);
@@ -2463,6 +2539,77 @@
    }
    /**
     * 校验经营业务是否在公司经营范围内
     * @param company 公司
     * @param isSpe 是否快车
     * @param isTaxi 是否出租车
     * @param isCross 是否跨城
     * @return 错误信息,null表示校验通过
     */
    private String validateDriverService(TCompany company, boolean isSpe, boolean isTaxi, boolean isCross) {
        if (company == null) {
            return null;
        }
        if (isSpe && (company.getIsSpe() == null || company.getIsSpe() != 1)) {
            return "公司未开通快车业务";
        }
        if (isTaxi && (company.getIsTaxi() == null || company.getIsTaxi() != 1)) {
            return "公司未开通出租车业务";
        }
        if (isCross && (company.getIsCross() == null || company.getIsCross() != 1)) {
            return "公司未开通跨城出行业务";
        }
        return null;
    }
    /**
     * 校验从业地是否在公司经营区域内
     * @param companyId 公司ID
     * @param placeOfEmployment 从业地行政编号
     * @return 错误信息,null表示校验通过
     */
    private String validatePlaceOfEmployment(Integer companyId, String placeOfEmployment) {
        if (companyId == null || SinataUtil.isEmpty(placeOfEmployment)) {
            return null;
        }
        List<TCompanyCity> companyCityList = tCompanyCityService.selectList(
                new EntityWrapper<TCompanyCity>().eq("companyId", companyId).eq("state", 1));
        if (companyCityList == null || companyCityList.isEmpty()) {
            return null; // 公司没有设置经营区域,不做限制
        }
        // 检查从业地是否在公司经营区域内
        for (TCompanyCity city : companyCityList) {
            if (city.getAreaCode() != null && placeOfEmployment.equals(String.valueOf(city.getAreaCode()))) {
                return null; // 匹配区级
            }
            if (city.getCityCode() != null && placeOfEmployment.startsWith(String.valueOf(city.getCityCode()).substring(0, 4))) {
                return null; // 匹配市级
            }
        }
        return "从业地不在公司经营区域内";
    }
    /**
     * 获取公司经营区域的默认从业地
     * @param companyId 公司ID
     * @return 默认从业地行政编号
     */
    private String getDefaultPlaceOfEmployment(Integer companyId) {
        if (companyId == null) {
            return null;
        }
        List<TCompanyCity> companyCityList = tCompanyCityService.selectList(
                new EntityWrapper<TCompanyCity>().eq("companyId", companyId).eq("state", 1).last(" limit 1"));
        if (companyCityList != null && !companyCityList.isEmpty()) {
            TCompanyCity city = companyCityList.get(0);
            if (city.getAreaCode() != null) {
                return String.valueOf(city.getAreaCode());
            }
        }
        return null;
    }
    /**
     *  导出司机信息
     */
    @RequestMapping(value = "/outDriver")
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
@@ -16,9 +16,11 @@
import com.stylefeng.guns.core.util.KaptchaUtil;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.system.dao.UserMapper;
import com.stylefeng.guns.modular.system.dao.TCompanyMapper;
import com.stylefeng.guns.modular.system.model.Menu;
import com.stylefeng.guns.modular.system.model.Relation;
import com.stylefeng.guns.modular.system.model.User;
import com.stylefeng.guns.modular.system.model.TCompany;
import com.stylefeng.guns.modular.system.service.IMenuService;
import com.stylefeng.guns.modular.system.service.IRelationService;
import com.stylefeng.guns.modular.system.service.IUserService;
@@ -42,6 +44,8 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -60,7 +64,25 @@
@Slf4j
@Controller
public class LoginController extends BaseController {
    // 快车相关菜单(isSpe=2时过滤)
    private static final List<String> SPE_MENUS = Arrays.asList(
        "快车订单", "快车改派管理", "快车车型设置"
    );
    // 出租车相关菜单(isTaxi=2时过滤)
    private static final List<String> TAXI_MENUS = Arrays.asList(
        "出租车订单", "出租车改派管理"
    );
    // 跨城相关菜单(isCross=2时过滤)
    private static final List<String> CROSS_MENUS = Arrays.asList(
        "跨城出行订单", "跨城改派管理", "跨城线路管理", "开通城市管理"
    );
    // 顺风车相关菜单(isHitchRide=2时过滤)
    private static final List<String> HITCH_RIDE_MENUS = Arrays.asList(
        "顺风车订单", "顺风车设置", "顺风车司机审核列表",
        "顺风车司机", "顺风车投诉", "顺风车评价"
    );
    @Autowired
    private IMenuService menuService;
    
@@ -75,8 +97,11 @@
    
    @Autowired
    private UserMapper userMapper;
    @Resource
    private TCompanyMapper companyMapper;
    private Map<String, Long> loginTime = new HashMap<>();
    
    private Map<String, Integer> loginFailures = new HashMap<>();
@@ -111,6 +136,11 @@
        Set<Long> collect = relations.stream().map(Relation::getMenuid).collect(Collectors.toSet());
        List<Menu> menuList = menuService.selectBatchIds(collect);
        List<MenuNode> menus = menuService.getMenusByRoleIds(roleList);
        // 根据企业经营范围过滤菜单(在构建树之前过滤)
        TCompany tCompany = companyMapper.selectById(shiroUser.getObjectId());
        if (tCompany != null && (tCompany.getType() == 2 || tCompany.getType() == 3)) {
            menus = filterMenusByBusinessScope(menus, tCompany);
        }
        List<MenuNode> titles = MenuNode.buildTitle(menus);
        titles = ApiMenuFilter.build(titles);
        shiroUser.setMenuIds(menuList.stream().map(Menu::getUrl).collect(Collectors.toList()));
@@ -246,6 +276,30 @@
        }
        return ResultUtil.error(jsonObject.getString("msg"));
    }
    /**
     * 根据企业经营范围过滤菜单
     */
    private List<MenuNode> filterMenusByBusinessScope(List<MenuNode> menuList, TCompany company) {
        List<String> excludeMenuNames = new ArrayList<>();
        if (company.getIsSpe() != null && company.getIsSpe() == 2) {
            excludeMenuNames.addAll(SPE_MENUS);
        }
        if (company.getIsTaxi() != null && company.getIsTaxi() == 2) {
            excludeMenuNames.addAll(TAXI_MENUS);
        }
        if (company.getIsCross() != null && company.getIsCross() == 2) {
            excludeMenuNames.addAll(CROSS_MENUS);
        }
        if (company.getIsHitchRide() != null && company.getIsHitchRide() == 2) {
            excludeMenuNames.addAll(HITCH_RIDE_MENUS);
        }
        if (excludeMenuNames.isEmpty()) {
            return menuList;
        }
        menuList.removeIf(node -> excludeMenuNames.contains(node.getName()));
        return menuList;
    }
}
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_edit.html
@@ -52,8 +52,8 @@
                            <fieldset>
                                <div class="checkbox checkbox-success">
                                    <input name="checkbox" id="checkbox1" type="checkbox" value="1" ${1== item.isSpe ?
                                    'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox1()" ${roleType != 1 ? 'disabled' : ''}>
                                    <label for="checkbox1" ${roleType != 1 ? 'style="color:#999"' : ''}>
                                    'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox1()">
                                    <label for="checkbox1">
                                        快车
                                    </label>
                                    <fieldset>
@@ -67,8 +67,8 @@
                                </div>
                                <div class="checkbox checkbox-primary">
                                    <input name="checkbox" id="checkbox2" type="checkbox" value="2" ${1== item.isTaxi ?
                                    'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox2()" ${roleType != 1 ? 'disabled' : ''}>
                                    <label for="checkbox2" ${roleType != 1 ? 'style="color:#999"' : ''}>
                                    'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox2()">
                                    <label for="checkbox2">
                                        出租车
                                    </label>
                                    <fieldset>
@@ -81,8 +81,8 @@
                                </div>
                                <div class="checkbox checkbox-success">
                                    <input name="checkbox" id="checkbox3" type="checkbox" value="3" ${1== item.isCross ?
                                    'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox3()" ${roleType != 1 ? 'disabled' : ''}>
                                    <label for="checkbox3" ${roleType != 1 ? 'style="color:#999"' : ''}>
                                    'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox3()">
                                    <label for="checkbox3">
                                        跨城出行
                                    </label>
                                </div>
@@ -128,15 +128,15 @@
                                <!--                                        </div>-->
                                <div class="checkbox checkbox-success">
                                    <input id="checkbox8" name="checkbox" onclick="TCompanyInfoDlg.checkbox8()"
                                           type="checkbox" value="8"  ${1 == item.isHitchRide ? 'checked=checked' : ''} ${roleType != 1 ? 'disabled' : ''}>
                                    <label for="checkbox8" ${roleType != 1 ? 'style="color:#999"' : ''}>
                                           type="checkbox" value="8"  ${1 == item.isHitchRide ? 'checked=checked' : ''}>
                                    <label for="checkbox8">
                                        顺风车
                                    </label>
                                </div>
                                <div class="checkbox checkbox-success">
                                    <input id="checkbox9" name="checkbox" onclick="TCompanyInfoDlg.checkbox9()"
                                           type="checkbox" value="9" ${1 == item.isSubstituteDriving ? 'checked=checked' : ''} ${roleType != 1 ? 'disabled' : ''}>
                                    <label for="checkbox9" ${roleType != 1 ? 'style="color:#999"' : ''}>
                                           type="checkbox" value="9" ${1 == item.isSubstituteDriving ? 'checked=checked' : ''}>
                                    <label for="checkbox9">
                                        代驾
                                    </label>
                                </div>
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_add.html
@@ -3,6 +3,12 @@
    <div class="ibox-content">
        <div class="form-horizontal" id="yesDriverInfoForm">
            <input type="hidden" id="roleType" name="roleType" value="${roleType}">
            @if(roleType == 2 || roleType == 3){
            <input type="hidden" id="check1_" value="${companyData.isSpe}">
            <input type="hidden" id="check2_" value="${companyData.isTaxi}">
            <input type="hidden" id="check3_" value="${companyData.isCross}">
            <input type="hidden" id="currentCompanyId" value="${companyId}">
            @}
            <div class="row">
                <div class="col-sm-10">
                    <#input id="name" name="司机姓名" />
@@ -282,5 +288,29 @@
    laydate.render({
        elem: '#registerDate'
    });
    // 分公司/加盟商账号初始化经营业务显示
    $(function() {
        var roleType = $('#roleType').val();
        if (roleType == 2 || roleType == 3) {
            if ($('#check1_').val() != 1) {
                $("#check1").hide();
                $("#serverBox1").val('');
            }
            if ($('#check2_').val() != 1) {
                $("#check2").hide();
                $("#serverBox2").val('');
            }
            if ($('#check3_').val() != 1) {
                $("#check3").hide();
                $("#serverBox3").val('');
            }
            // 加载公司经营区域作为从业地选项
            var companyId = $('#currentCompanyId').val();
            if (companyId) {
                YesDriverInfoDlg.loadCompanyCityForAdd(companyId);
            }
        }
    });
</script>
@}
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_edit.html
@@ -7,6 +7,9 @@
            <input type="hidden" id="check1_" name="roleType" value="${companyData.isSpe}">
            <input type="hidden" id="check2_" name="roleType" value="${companyData.isTaxi}">
            <input type="hidden" id="check3_" name="roleType" value="${companyData.isCross}">
            @if(roleType == 2 || roleType == 3){
            <input type="hidden" id="currentCompanyId" value="${currentCompanyId}">
            @}
            <div class="row">
                <div class="col-sm-11">
                    <#input id="name" name="司机姓名" value="${item.name}"/>
@@ -336,6 +339,13 @@
        YesDriverInfoDlg.listLine()
        // 分公司/加盟商账号加载公司经营区域
        var roleType = $('#roleType').val();
        var companyId = $('#currentCompanyId').val();
        if ((roleType == 2 || roleType == 3) && companyId) {
            YesDriverInfoDlg.loadCompanyCityForEdit(companyId);
        }
    });
</script>
@}
ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_info.js
@@ -628,6 +628,11 @@
 * 省改变时执行
 */
YesDriverInfoDlg.provinceChange = function () {
    // 如果有公司经营区域限制,使用限制版
    if (window.companyCityDetailList && window.companyCityDetailList.length > 0) {
        YesDriverInfoDlg.provinceChangeByCompany();
        return;
    }
    var provinceId = $("#provinceId").val();
    var ajax = new $ax(Feng.ctxPath + "/tOpenCity/change", function(data){
        if(data!=null){
@@ -646,6 +651,11 @@
 * 市改变时执行
 */
YesDriverInfoDlg.cityChange = function () {
    // 如果有公司经营区域限制,使用限制版
    if (window.companyCityDetailList && window.companyCityDetailList.length > 0) {
        YesDriverInfoDlg.cityChangeByCompany();
        return;
    }
    var cityId = $("#cityId").val();
    var ajax = new $ax(Feng.ctxPath + "/tOpenCity/change", function(data){
        if(data!=null){
@@ -825,10 +835,144 @@
            YesDriverInfoDlg.listLine()
            // 更新从业地选择(限制为公司经营区域)
            YesDriverInfoDlg.updatePlaceOfEmployment(data1.companyCityList)
        }
    });
    ajax.set("oneId",oneId);
    ajax.start();
}
/**
 * 更新从业地选择(限制为公司经营区域)
 */
YesDriverInfoDlg.updatePlaceOfEmployment = function(companyCityList) {
    // 清空现有选项
    $("#provinceId").empty().append('<option value="">选择省</option>');
    $("#cityId").empty().append('<option value="">选择市</option>');
    $("#areaId").empty().append('<option value="">选择区</option>');
    if (!companyCityList || companyCityList.length == 0) {
        return;
    }
    // 存储公司经营区域数据供后续使用
    window.companyCityList = companyCityList;
    // 获取公司经营区域的详细信息
    var companyId = $("#oneId").val();
    if (!companyId || companyId == '') {
        return;
    }
    var ajax = new $ax(Feng.ctxPath + "/tDriver/getCompanyCityList", function(data) {
        if (data && data.length > 0) {
            window.companyCityDetailList = data;
            // 提取唯一的省份
            var provinces = {};
            $.each(data, function(k, v) {
                if (v.provinceCode && !provinces[v.provinceCode]) {
                    provinces[v.provinceCode] = {
                        id: v.provinceId,
                        code: v.provinceCode,
                        name: v.provinceName
                    };
                }
            });
            // 填充省份下拉框
            var content = '<option value="">选择省</option>';
            $.each(provinces, function(k, v) {
                content += "<option value='" + v.id + "' tag='" + v.code + "'>" + v.name + "</option>";
            });
            $("#provinceId").empty().append(content);
            // 如果只有一个经营区域,自动选中并设为默认值
            if (data.length == 1) {
                $("#provinceId").val(data[0].provinceId);
                YesDriverInfoDlg.provinceChangeByCompany();
            }
        }
    });
    ajax.set("companyId", companyId);
    ajax.start();
}
/**
 * 省改变时执行(公司经营区域限制版)
 */
YesDriverInfoDlg.provinceChangeByCompany = function() {
    var provinceId = $("#provinceId").val();
    var provinceCode = $("#provinceId option:selected").attr("tag");
    $("#cityId").empty().append('<option value="">选择市</option>');
    $("#areaId").empty().append('<option value="">选择区</option>');
    if (!provinceId || !window.companyCityDetailList) {
        return;
    }
    // 从公司经营区域中筛选该省份下的市
    var cities = {};
    $.each(window.companyCityDetailList, function(k, v) {
        if (v.provinceCode == provinceCode && v.cityCode && !cities[v.cityCode]) {
            cities[v.cityCode] = {
                id: v.cityId,
                code: v.cityCode,
                name: v.cityName
            };
        }
    });
    var content = '<option value="">选择市</option>';
    $.each(cities, function(k, v) {
        content += "<option value='" + v.id + "' tag='" + v.code + "'>" + v.name + "</option>";
    });
    $("#cityId").empty().append(content);
    // 如果只有一个市,自动选中
    var cityKeys = Object.keys(cities);
    if (cityKeys.length == 1) {
        $("#cityId").val(cities[cityKeys[0]].id);
        YesDriverInfoDlg.cityChangeByCompany();
    }
}
/**
 * 市改变时执行(公司经营区域限制版)
 */
YesDriverInfoDlg.cityChangeByCompany = function() {
    var cityId = $("#cityId").val();
    var cityCode = $("#cityId option:selected").attr("tag");
    $("#areaId").empty().append('<option value="">选择区</option>');
    if (!cityId || !window.companyCityDetailList) {
        return;
    }
    // 从公司经营区域中筛选该市下的区
    var areas = {};
    $.each(window.companyCityDetailList, function(k, v) {
        if (v.cityCode == cityCode && v.areaCode && !areas[v.areaCode]) {
            areas[v.areaCode] = {
                id: v.areaId,
                code: v.areaCode,
                name: v.areaName
            };
        }
    });
    var content = '<option value="">选择区</option>';
    $.each(areas, function(k, v) {
        content += "<option value='" + v.id + "' tag='" + v.code + "'>" + v.name + "</option>";
    });
    $("#areaId").empty().append(content);
    // 如果只有一个区,自动选中
    var areaKeys = Object.keys(areas);
    if (areaKeys.length == 1) {
        $("#areaId").val(areas[areaKeys[0]].id);
    }
}
/**
@@ -869,6 +1013,10 @@
        $("#check1").show()
        $("#check2").show()
        $("#check3").show()
        // 平台司机:清除公司经营区域限制,恢复全国选择
        window.companyCityDetailList = null;
        window.companyCityList = null;
        YesDriverInfoDlg.loadAllProvinces();
    } else if (2 == e){
        $(".companyDiv").show();
        if($("#oneId").val() !=null && $("#oneId").val() !=''){
@@ -899,6 +1047,8 @@
                        $("#serverBox3").val("")
                    }
                    // 更新从业地选择(限制为公司经营区域)
                    YesDriverInfoDlg.updatePlaceOfEmployment(data1.companyCityList)
                }
                YesDriverInfoDlg.listLine()
@@ -913,3 +1063,217 @@
    }
}
/**
 * 加载全国所有省份(平台司机使用)
 */
YesDriverInfoDlg.loadAllProvinces = function() {
    var ajax = new $ax(Feng.ctxPath + "/tOpenCity/change", function(data){
        if(data!=null){
            var content='<option value="">选择省</option>';
            $.each(data, function(k,v) {
                content += "<option value='"+v.id+"' tag='" + v.code + "'>"+v.name+"</option>";
            });
            $("#provinceId").empty().append(content);
            $("#cityId").empty().append('<option value="">选择市</option>');
            $("#areaId").empty().append('<option value="">选择区</option>');
        }
    });
    ajax.set("id", 0);
    ajax.start();
}
/**
 * 分公司/加盟商新增司机时加载公司经营区域(默认选中第一个)
 */
YesDriverInfoDlg.loadCompanyCityForAdd = function(companyId) {
    var ajax = new $ax(Feng.ctxPath + "/tDriver/getCompanyCityList", function(data) {
        if (data && data.length > 0) {
            window.companyCityDetailList = data;
            // 提取唯一的省份
            var provinces = {};
            $.each(data, function(k, v) {
                if (v.provinceCode && !provinces[v.provinceCode]) {
                    provinces[v.provinceCode] = {
                        id: v.provinceId,
                        code: v.provinceCode,
                        name: v.provinceName
                    };
                }
            });
            // 填充省份下拉框
            var content = '<option value="">选择省</option>';
            var firstProvinceId = null;
            $.each(provinces, function(k, v) {
                if (!firstProvinceId) firstProvinceId = v.id;
                content += "<option value='" + v.id + "' tag='" + v.code + "'>" + v.name + "</option>";
            });
            $("#provinceId").empty().append(content);
            // 默认选中第一个省份并联动
            if (firstProvinceId) {
                $("#provinceId").val(firstProvinceId);
                YesDriverInfoDlg.provinceChangeByCompanyWithDefault();
            }
        }
    });
    ajax.set("companyId", companyId);
    ajax.start();
}
/**
 * 省改变时执行(公司经营区域限制版,带默认选中)
 */
YesDriverInfoDlg.provinceChangeByCompanyWithDefault = function() {
    var provinceId = $("#provinceId").val();
    var provinceCode = $("#provinceId option:selected").attr("tag");
    $("#cityId").empty().append('<option value="">选择市</option>');
    $("#areaId").empty().append('<option value="">选择区</option>');
    if (!provinceId || !window.companyCityDetailList) {
        return;
    }
    var cities = {};
    $.each(window.companyCityDetailList, function(k, v) {
        if (v.provinceCode == provinceCode && v.cityCode && !cities[v.cityCode]) {
            cities[v.cityCode] = { id: v.cityId, code: v.cityCode, name: v.cityName };
        }
    });
    var content = '<option value="">选择市</option>';
    var firstCityId = null;
    $.each(cities, function(k, v) {
        if (!firstCityId) firstCityId = v.id;
        content += "<option value='" + v.id + "' tag='" + v.code + "'>" + v.name + "</option>";
    });
    $("#cityId").empty().append(content);
    if (firstCityId) {
        $("#cityId").val(firstCityId);
        YesDriverInfoDlg.cityChangeByCompanyWithDefault();
    }
}
/**
 * 市改变时执行(公司经营区域限制版,带默认选中)
 */
YesDriverInfoDlg.cityChangeByCompanyWithDefault = function() {
    var cityId = $("#cityId").val();
    var cityCode = $("#cityId option:selected").attr("tag");
    $("#areaId").empty().append('<option value="">选择区</option>');
    if (!cityId || !window.companyCityDetailList) {
        return;
    }
    var areas = {};
    $.each(window.companyCityDetailList, function(k, v) {
        if (v.cityCode == cityCode && v.areaCode && !areas[v.areaCode]) {
            areas[v.areaCode] = { id: v.areaId, code: v.areaCode, name: v.areaName };
        }
    });
    var content = '<option value="">选择区</option>';
    var firstAreaId = null;
    $.each(areas, function(k, v) {
        if (!firstAreaId) firstAreaId = v.id;
        content += "<option value='" + v.id + "' tag='" + v.code + "'>" + v.name + "</option>";
    });
    $("#areaId").empty().append(content);
    if (firstAreaId) {
        $("#areaId").val(firstAreaId);
    }
}
/**
 * 分公司/加盟商编辑司机时加载公司经营区域(保留当前选中值)
 */
YesDriverInfoDlg.loadCompanyCityForEdit = function(companyId) {
    var currentProvinceId = $("#provinceId").val();
    var currentCityId = $("#cityId").val();
    var currentAreaId = $("#areaId").val();
    var ajax = new $ax(Feng.ctxPath + "/tDriver/getCompanyCityList", function(data) {
        if (data && data.length > 0) {
            window.companyCityDetailList = data;
            // 提取唯一的省份
            var provinces = {};
            $.each(data, function(k, v) {
                if (v.provinceCode && !provinces[v.provinceCode]) {
                    provinces[v.provinceCode] = {
                        id: v.provinceId,
                        code: v.provinceCode,
                        name: v.provinceName
                    };
                }
            });
            // 填充省份下拉框
            var content = '<option value="">选择省</option>';
            $.each(provinces, function(k, v) {
                var selected = (v.id == currentProvinceId) ? ' selected' : '';
                content += "<option value='" + v.id + "' tag='" + v.code + "'" + selected + ">" + v.name + "</option>";
            });
            $("#provinceId").empty().append(content);
            // 如果有当前选中的省份,联动加载市
            if (currentProvinceId) {
                YesDriverInfoDlg.loadCityForEdit(currentProvinceId, currentCityId, currentAreaId);
            }
        }
    });
    ajax.set("companyId", companyId);
    ajax.start();
}
/**
 * 编辑时加载市(保留当前选中值)
 */
YesDriverInfoDlg.loadCityForEdit = function(provinceId, currentCityId, currentAreaId) {
    var provinceCode = $("#provinceId option:selected").attr("tag");
    if (!provinceCode || !window.companyCityDetailList) return;
    var cities = {};
    $.each(window.companyCityDetailList, function(k, v) {
        if (v.provinceCode == provinceCode && v.cityCode && !cities[v.cityCode]) {
            cities[v.cityCode] = { id: v.cityId, code: v.cityCode, name: v.cityName };
        }
    });
    var content = '<option value="">选择市</option>';
    $.each(cities, function(k, v) {
        var selected = (v.id == currentCityId) ? ' selected' : '';
        content += "<option value='" + v.id + "' tag='" + v.code + "'" + selected + ">" + v.name + "</option>";
    });
    $("#cityId").empty().append(content);
    // 如果有当前选中的市,联动加载区
    if (currentCityId) {
        YesDriverInfoDlg.loadAreaForEdit(currentCityId, currentAreaId);
    }
}
/**
 * 编辑时加载区(保留当前选中值)
 */
YesDriverInfoDlg.loadAreaForEdit = function(cityId, currentAreaId) {
    var cityCode = $("#cityId option:selected").attr("tag");
    if (!cityCode || !window.companyCityDetailList) return;
    var areas = {};
    $.each(window.companyCityDetailList, function(k, v) {
        if (v.cityCode == cityCode && v.areaCode && !areas[v.areaCode]) {
            areas[v.areaCode] = { id: v.areaId, code: v.areaCode, name: v.areaName };
        }
    });
    var content = '<option value="">选择区</option>';
    $.each(areas, function(k, v) {
        var selected = (v.id == currentAreaId) ? ' selected' : '';
        content += "<option value='" + v.id + "' tag='" + v.code + "'" + selected + ">" + v.name + "</option>";
    });
    $("#areaId").empty().append(content);
}