wlzboy
6 天以前 09e6dc3fb7266620fafb5e341808a8eb36e080a1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -2,6 +2,8 @@
import java.util.List;
import java.util.Set;
import com.ruoyi.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -9,6 +11,7 @@
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody;
@@ -17,7 +20,10 @@
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.framework.web.service.WechatLoginService;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.common.annotation.Anonymous;
/**
 * 登录验证
@@ -31,6 +37,8 @@
    private SysLoginService loginService;
    @Autowired
    private ISysUserService userService;
    @Autowired
    private ISysMenuService menuService;
    @Autowired
@@ -38,6 +46,90 @@
    @Autowired
    private TokenService tokenService;
    @Autowired
    private ISysDeptService deptService;
    @Autowired
    private WechatLoginService wechatLogin;
    /**
     * 微信一键登录 - 通过OpenID和UnionID登录
     * 使用WechatLoginService进行认证
     *
     * @param requestBody 包含openId和unionId的请求体
     * @return 结果
     */
    @Anonymous
    @PostMapping("/wechat/login/openid")
    public AjaxResult loginByOpenId(@RequestBody java.util.Map<String, Object> requestBody)
    {
        String openId = (String) requestBody.get("openId");
        String unionId = (String) requestBody.get("unionId");
        if (com.ruoyi.common.utils.StringUtils.isEmpty(openId))
        {
            return AjaxResult.error("缺少openId参数");
        }
        try
        {
            // 调用WechatLoginService进行认证
            String token = wechatLogin.loginByOpenId(openId, unionId);
            AjaxResult ajax = AjaxResult.success("登录成功");
            ajax.put(Constants.TOKEN, token);
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }
    /**
     * 微信手机号登录(推荐使用)
     *
     * @param requestBody 包含loginCode(微信登录code)和phoneCode(手机号授权code)
     * @return 结果
     */
    @Anonymous
    @PostMapping("/wechat/login/phone")
    public AjaxResult loginByWechatPhone(@RequestBody java.util.Map<String, Object> requestBody)
    {
        String loginCode = (String) requestBody.get("loginCode");
        String phoneCode = (String) requestBody.get("phoneCode");
        if (com.ruoyi.common.utils.StringUtils.isEmpty(loginCode))
        {
            return AjaxResult.error("缺少微信登录code");
        }
        if (com.ruoyi.common.utils.StringUtils.isEmpty(phoneCode))
        {
            return AjaxResult.error("缺少手机号授权code");
        }
        try
        {
            // 调用WechatLoginService进行认证
            java.util.Map<String, Object> loginResult = wechatLogin.loginByWechatPhone(loginCode, phoneCode);
            AjaxResult ajax = AjaxResult.success("登录成功");
            ajax.put(Constants.TOKEN, loginResult.get("token"));
            ajax.put("openId", loginResult.get("openId"));
            if (loginResult.containsKey("unionId"))
            {
                ajax.put("unionId", loginResult.get("unionId"));
            }
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }
    /**
     * 登录方法
@@ -66,6 +158,26 @@
    {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        SysUser user = loginUser.getUser();
        // 计算可管理分公司列表(基于 OA_OrderClass 与 sys_dept.service/dispatch_order_class)
        java.util.List<SysDept> branchCompanies = new java.util.ArrayList<>();
        java.util.Set<Long> seen = new java.util.HashSet<>();
        if (com.ruoyi.common.utils.StringUtils.isNotEmpty(user.getOaOrderClass())) {
            String[] codes = user.getOaOrderClass().split(",");
            for (String raw : codes) {
                String code = raw.trim();
                if (code.isEmpty()) continue;
                SysDept cond1 = new SysDept();
                cond1.setParentId(100L);
                cond1.setServiceOrderClass(code);
                java.util.List<SysDept> list1 = deptService.selectDeptList(cond1);
                for (SysDept d : list1) { if (seen.add(d.getDeptId())) branchCompanies.add(d); }
                SysDept cond2 = new SysDept();
                cond2.setParentId(100L);
                cond2.setDispatchOrderClass(code);
                java.util.List<SysDept> list2 = deptService.selectDeptList(cond2);
                for (SysDept d : list2) { if (seen.add(d.getDeptId())) branchCompanies.add(d); }
            }
        }
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(user);
        // 权限集合
@@ -75,10 +187,60 @@
            loginUser.setPermissions(permissions);
            tokenService.refreshToken(loginUser);
        }
        // 获取用户所在的分公司信息
        Long branchCompanyId = null;
        String branchCompanyName = null;
        if (user.getDeptId() != null)
        {
            SysDept dept = deptService.selectDeptById(user.getDeptId());
            if (dept != null)
            {
                // 判断当前部门是否就是分公司(parent_id = 100)
                if (dept.getParentId() != null && dept.getParentId() == 100)
                {
                    branchCompanyId = dept.getDeptId();
                    branchCompanyName = dept.getDeptName();
                }
                else if (dept.getAncestors() != null && !dept.getAncestors().isEmpty())
                {
                    // 从 ancestors 解析分公司ID
                    // ancestors 格式:"0,100,分公司ID,子部门ID"
                    String[] ancestorIds = dept.getAncestors().split(",");
                    // 找到100后面的那个ID就是分公司ID
                    for (int i = 0; i < ancestorIds.length; i++)
                    {
                        if ("100".equals(ancestorIds[i]) && i + 1 < ancestorIds.length)
                        {
                            try
                            {
                                Long companyId = Long.parseLong(ancestorIds[i + 1]);
                                SysDept branchCompany = deptService.selectDeptById(companyId);
                                if (branchCompany != null)
                                {
                                    branchCompanyId = branchCompany.getDeptId();
                                    branchCompanyName = branchCompany.getDeptName();
                                }
                            }
                            catch (NumberFormatException e)
                            {
                                // 解析失败,忽略
                            }
                            break;
                        }
                    }
                }
            }
        }
        AjaxResult ajax = AjaxResult.success();
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        ajax.put("branchCompanyId", branchCompanyId);
        ajax.put("branchCompanyName", branchCompanyName);
        ajax.put("branchCompanies", branchCompanies);
        ajax.put("oaUserId", user.getOaUserId());
        return ajax;
    }