package com.ruoyi.tide.controller;
|
|
import cn.hutool.core.collection.CollectionUtil;
|
import com.alibaba.fastjson2.JSONObject;
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
import com.ruoyi.common.constant.Constants;
|
import com.ruoyi.common.utils.SecurityUtils;
|
import com.ruoyi.framework.aspectj.lang.annotation.Anonymous;
|
import com.ruoyi.framework.security.service.SysLoginService;
|
import com.ruoyi.framework.web.domain.AjaxResult;
|
import com.ruoyi.project.system.domain.SysDept;
|
import com.ruoyi.project.system.domain.SysUser;
|
import com.ruoyi.project.system.service.ISysDeptService;
|
import com.ruoyi.project.system.service.ISysUserService;
|
import com.ruoyi.tide.pojo.TidePojo;
|
import com.ruoyi.tide.utils.TideUtils;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.ObjectUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.transaction.annotation.Isolation;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import javax.annotation.PreDestroy;
|
import javax.annotation.security.PermitAll;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Objects;
|
|
@RequestMapping("/tide")
|
@RestController
|
@Api(tags = "对接浪潮系统")
|
@Anonymous
|
@Slf4j
|
public class TideController {
|
|
@Autowired
|
private SysLoginService loginService;
|
|
@Autowired
|
private ISysUserService userService;
|
|
@Autowired
|
private ISysDeptService deptService;
|
|
@ApiOperation(value = "登录")
|
@PostMapping("/tideLogin")
|
public AjaxResult login(@RequestBody TidePojo tidePojo) {
|
if (tidePojo == null || ObjectUtils.isEmpty(tidePojo.getCode())) {
|
return AjaxResult.error("缺少浪潮授权码(code),请从浪潮门户重新进入系统");
|
}
|
// 浪潮门户下发的授权码可能带固定后缀,做一次兼容处理
|
String code = String.valueOf(tidePojo.getCode()).trim();
|
if (code.endsWith("suanwangcode")) {
|
code = code.substring(0, code.length() - "suanwangcode".length());
|
}
|
String token;
|
try {
|
token = TideUtils.getToken(code);
|
} catch (Exception e) {
|
log.error("[浪潮SSO] 换取token异常, code={}", code, e);
|
return AjaxResult.error("浪潮授权失败:换取令牌异常,请从门户重新进入系统");
|
}
|
if (ObjectUtils.isEmpty(token)) {
|
return AjaxResult.error("浪潮授权失败:授权码校验未通过(可能已过期或已被使用),请从门户重新进入系统");
|
}
|
JSONObject userInfo;
|
try {
|
userInfo = TideUtils.getUserInfo(token);
|
} catch (Exception e) {
|
log.error("[浪潮SSO] 获取用户信息异常, token={}", token, e);
|
return AjaxResult.error("浪潮授权失败:获取用户信息异常,请联系管理员");
|
}
|
log.info("[浪潮SSO] 用户信息: {}", userInfo);
|
if (userInfo == null) {
|
return AjaxResult.error("浪潮未返回用户信息,请联系平台管理员");
|
}
|
// 兼容浪潮不同版本/不同平台的租户字段命名
|
JSONObject tenant = null;
|
for (String key : new String[]{"tenant", "tenantInfo", "enterprise", "company", "org"}) {
|
Object v = userInfo.get(key);
|
if (v instanceof JSONObject) {
|
tenant = (JSONObject) v;
|
break;
|
}
|
if (v instanceof String && ((String) v).trim().startsWith("{")) {
|
try {
|
tenant = JSONObject.parseObject((String) v);
|
break;
|
} catch (Exception ignored) {
|
}
|
}
|
}
|
String account = tenant == null ? null : firstText(tenant, "tenantAccount", "account", "userName", "loginName", "mobile", "phone", "name");
|
String password = tenant == null ? null : firstText(tenant, "tenantPassword", "password", "pwd", "passWord");
|
if (ObjectUtils.isEmpty(account)) {
|
account = firstText(userInfo, "tenantAccount", "account", "userName", "loginName", "mobile", "phone");
|
}
|
if (ObjectUtils.isEmpty(password)) {
|
password = firstText(userInfo, "tenantPassword", "password", "pwd");
|
}
|
if (ObjectUtils.isEmpty(account) || ObjectUtils.isEmpty(password)) {
|
log.error("[浪潮SSO] 未取到租户账号/密码, userInfo={}", userInfo);
|
return AjaxResult.error("浪潮未返回企业租户账号信息,请联系平台管理员检查该账号的企业绑定");
|
}
|
try {
|
String generateToken = loginService.login(account, password, null, IdWorker.get32UUID());
|
AjaxResult ajax = AjaxResult.success();
|
ajax.put(Constants.TOKEN, generateToken);
|
return ajax;
|
} catch (Exception e) {
|
log.error("[浪潮SSO] 租户账号登录失败, account={}", account, e);
|
return AjaxResult.error("浪潮单点登录失败:租户账号[" + account + "]在系统中登录失败(" + e.getMessage() + ")");
|
}
|
}
|
|
/** 依次尝试多个键,返回第一个非空字符串值 */
|
private String firstText(JSONObject obj, String... keys) {
|
if (obj == null || keys == null) {
|
return null;
|
}
|
for (String key : keys) {
|
Object v = obj.get(key);
|
if (v == null) {
|
continue;
|
}
|
String s = String.valueOf(v).trim();
|
if (!s.isEmpty() && !"null".equalsIgnoreCase(s)) {
|
return s;
|
}
|
}
|
return null;
|
}
|
|
@PostMapping("/applicationOrdering")
|
@Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
|
public JSONObject order (@RequestBody TidePojo tidePojo) {
|
SysUser user = userService.selectUserByUserName(tidePojo.getPltAccountLogin());
|
String defaultPwd = "I73Kj+Mn$+SI";//默认开通密码固定写死
|
// String randomString = TideUtils.getRandomString(12);
|
//账号不存在,执行新增操作
|
if(ObjectUtils.isEmpty(user)){
|
//1.先新增用户对应的公司
|
SysDept dept = new SysDept();
|
dept.setParentId(100L);//父公司id
|
dept.setDeptName(tidePojo.getEnterpriseName());
|
dept.setDeptNick(tidePojo.getEnterpriseName());
|
dept.setOrderNum(0);
|
boolean deptNameUnique = deptService.checkDeptNameUnique(dept);
|
if (deptNameUnique){
|
deptService.insertDept(dept);
|
}
|
//查询公司
|
SysDept newSysDept = deptService.selectDeptByDeptName(dept.getDeptName());
|
dept.setDeptId(ObjectUtils.isEmpty(newSysDept)?100L:newSysDept.getDeptId());
|
dept.setTenantId(dept.getDeptId());
|
deptService.updateDept(dept);
|
user = new SysUser();
|
String password = SecurityUtils.encryptPassword(defaultPwd);
|
user.setPassword(password);
|
user.setUserName(tidePojo.getPltAccountLogin());
|
user.setNickName(tidePojo.getEnterpriseName());
|
user.setStatus("0");
|
user.setDelFlag("0");
|
user.setPostIds(new Long[]{1L});
|
user.setRoleId(1L);
|
user.setRoleIds(new Long[]{2L});//默认普通角色
|
user.setDeptIds(new Long[]{dept.getDeptId()});//绑定公司
|
user.setTenantId(dept.getDeptId());
|
userService.insertUser(user);
|
}
|
Map<String, Object> map = new HashMap<>();
|
map.put("account", tidePojo.getPltAccountLogin());
|
map.put("token", defaultPwd);
|
map.put("tenantId", user.getUserId());
|
return TideUtils.getResult(20000, "成功", map);
|
}
|
|
@PostMapping("/cancellation")
|
public JSONObject cancellation (@RequestBody TidePojo tidePojo) {
|
log.info("执行了注销信息:" + tidePojo);
|
if(Objects.nonNull(tidePojo)){
|
SysUser sysUser = userService.selectUserByUserName(tidePojo.getPltAccountLogin());
|
if(Objects.nonNull(sysUser)){
|
userService.deleteUserById(sysUser.getUserId());
|
}
|
}
|
return TideUtils.getResult(20000, "成功", null);
|
}
|
|
public static void main(String[] args) {
|
String password = SecurityUtils.encryptPassword("c($Rb_@!n%U7");
|
System.out.println(password);
|
}
|
}
|