From 8009db163dda5fe1e3f772e1e1bb808b5db8132a Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期四, 22 十月 2026 22:29:48 +0800
Subject: [PATCH] fix(浪潮SSO): 单点登录增加容错与日志(同步自 dev_tide_wrzs)

---
 src/main/java/com/ruoyi/tide/controller/TideController.java |  133 ++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 120 insertions(+), 13 deletions(-)

diff --git a/src/main/java/com/ruoyi/tide/controller/TideController.java b/src/main/java/com/ruoyi/tide/controller/TideController.java
index 335b174..0128b59 100644
--- a/src/main/java/com/ruoyi/tide/controller/TideController.java
+++ b/src/main/java/com/ruoyi/tide/controller/TideController.java
@@ -1,5 +1,6 @@
 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;
@@ -7,20 +8,28 @@
 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;
 
@@ -37,28 +46,123 @@
     @Autowired
     private ISysUserService userService;
 
+    @Autowired
+    private ISysDeptService deptService;
+
     @ApiOperation(value = "鐧诲綍")
     @PostMapping("/tideLogin")
     public AjaxResult login(@RequestBody TidePojo tidePojo) {
-        String token = TideUtils.getToken(tidePojo.getCode());
-        JSONObject userInfo = TideUtils.getUserInfo(token);
-        JSONObject tenant = JSONObject.parseObject(userInfo.get("tenant").toString());
-        AjaxResult ajax = AjaxResult.success();
-        // 鐢熸垚浠ょ墝
-        String generateToken = loginService.login(tenant.get("tenantAccount").toString(), tenant.get("tenantPassword").toString(), null,
-                IdWorker.get32UUID());
-        ajax.put(Constants.TOKEN, generateToken);
-        return ajax;
+        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 randomString = TideUtils.getRandomString(12);
+        String defaultPwd = "I73Kj+Mn$+SI";//榛樿寮�閫氬瘑鐮佸浐瀹氬啓姝�
+//        String randomString = TideUtils.getRandomString(12);
         //璐﹀彿涓嶅瓨鍦紝鎵ц鏂板鎿嶄綔
-        if(Objects.isNull(user)){
+        if(ObjectUtils.isEmpty(user)){
+            //1.鍏堟柊澧炵敤鎴峰搴旂殑鍏徃
+            SysDept dept = new SysDept();
+            dept.setParentId(100L);//鐖跺叕鍙竔d
+            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(randomString);
+            String password = SecurityUtils.encryptPassword(defaultPwd);
             user.setPassword(password);
             user.setUserName(tidePojo.getPltAccountLogin());
             user.setNickName(tidePojo.getEnterpriseName());
@@ -66,11 +170,14 @@
             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", randomString);
+        map.put("token", defaultPwd);
         map.put("tenantId", user.getUserId());
         return TideUtils.getResult(20000, "鎴愬姛", map);
     }

--
Gitblit v1.9.3