From 17a7a0c0df3dbc3e6225dddb55f6332deccdb201 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期三, 03 六月 2026 11:38:30 +0800
Subject: [PATCH] 浪潮部署

---
 src/main/resources/application-lc-pro.yml                                   |    3 
 src/main/java/com/ruoyi/project/system/service/ISysDeptService.java         |   38 +-
 src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java |   41 +-
 src/main/java/com/ruoyi/tide/controller/TideController.java                 |  122 ++++++++++
 src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java            |    2 
 src/main/java/com/ruoyi/tide/pojo/TidePojo.java                             |   31 ++
 src/main/java/com/ruoyi/project/system/domain/SysDept.java                  |   14 +
 src/main/resources/mapper/system/SysDeptMapper.xml                          |    5 
 src/main/java/com/ruoyi/tide/utils/TideUtils.java                           |  191 +++++++++++++++
 src/main/resources/application-lc-khgxglxt.yml                              |  271 ++++++++++++++++++++++
 src/main/resources/application.yml                                          |    2 
 11 files changed, 684 insertions(+), 36 deletions(-)

diff --git a/src/main/java/com/ruoyi/project/system/domain/SysDept.java b/src/main/java/com/ruoyi/project/system/domain/SysDept.java
index 2c3056a..767e90d 100644
--- a/src/main/java/com/ruoyi/project/system/domain/SysDept.java
+++ b/src/main/java/com/ruoyi/project/system/domain/SysDept.java
@@ -14,7 +14,7 @@
 
 /**
  * 閮ㄩ棬琛� sys_dept
- * 
+ *
  * @author ruoyi
  */
 public class SysDept extends BaseEntity
@@ -61,7 +61,17 @@
     /** 鍛樺伐鏁伴噺 */
     @TableField(exist = false)
     private Integer staffCount;
-    
+
+    private Long tenantId;
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
     /** 瀛愰儴闂� */
     @TableField(exist = false)
     private List<SysDept> children = new ArrayList<SysDept>();
diff --git a/src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java b/src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java
index c564959..07c93d6 100644
--- a/src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java
+++ b/src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java
@@ -126,4 +126,6 @@
      * @return
      */
     Long maxLevelDeptId(Long deptId);
+
+    SysDept selectDeptByDeptName(@Param("deptName") String deptName);
 }
diff --git a/src/main/java/com/ruoyi/project/system/service/ISysDeptService.java b/src/main/java/com/ruoyi/project/system/service/ISysDeptService.java
index 77eda76..cc14c7a 100644
--- a/src/main/java/com/ruoyi/project/system/service/ISysDeptService.java
+++ b/src/main/java/com/ruoyi/project/system/service/ISysDeptService.java
@@ -6,14 +6,14 @@
 
 /**
  * 閮ㄩ棬绠$悊 鏈嶅姟灞�
- * 
+ *
  * @author ruoyi
  */
 public interface ISysDeptService
 {
     /**
      * 鏌ヨ閮ㄩ棬绠$悊鏁版嵁
-     * 
+     *
      * @param dept 閮ㄩ棬淇℃伅
      * @return 閮ㄩ棬淇℃伅闆嗗悎
      */
@@ -21,7 +21,7 @@
 
     /**
      * 鏌ヨ閮ㄩ棬鏍戠粨鏋勪俊鎭�
-     * 
+     *
      * @param dept 閮ㄩ棬淇℃伅
      * @return 閮ㄩ棬鏍戜俊鎭泦鍚�
      */
@@ -29,7 +29,7 @@
 
     /**
      * 鏋勫缓鍓嶇鎵�闇�瑕佹爲缁撴瀯
-     * 
+     *
      * @param depts 閮ㄩ棬鍒楄〃
      * @return 鏍戠粨鏋勫垪琛�
      */
@@ -37,7 +37,7 @@
 
     /**
      * 鏋勫缓鍓嶇鎵�闇�瑕佷笅鎷夋爲缁撴瀯
-     * 
+     *
      * @param depts 閮ㄩ棬鍒楄〃
      * @return 涓嬫媺鏍戠粨鏋勫垪琛�
      */
@@ -45,7 +45,7 @@
 
     /**
      * 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戜俊鎭�
-     * 
+     *
      * @param roleId 瑙掕壊ID
      * @return 閫変腑閮ㄩ棬鍒楄〃
      */
@@ -53,7 +53,7 @@
 
     /**
      * 鏍规嵁閮ㄩ棬ID鏌ヨ淇℃伅
-     * 
+     *
      * @param deptId 閮ㄩ棬ID
      * @return 閮ㄩ棬淇℃伅
      */
@@ -61,7 +61,7 @@
 
     /**
      * 鏍规嵁ID鏌ヨ鎵�鏈夊瓙閮ㄩ棬锛堟甯哥姸鎬侊級
-     * 
+     *
      * @param deptId 閮ㄩ棬ID
      * @return 瀛愰儴闂ㄦ暟
      */
@@ -69,7 +69,7 @@
 
     /**
      * 鏄惁瀛樺湪閮ㄩ棬瀛愯妭鐐�
-     * 
+     *
      * @param deptId 閮ㄩ棬ID
      * @return 缁撴灉
      */
@@ -77,7 +77,7 @@
 
     /**
      * 鏌ヨ閮ㄩ棬鏄惁瀛樺湪鐢ㄦ埛
-     * 
+     *
      * @param deptId 閮ㄩ棬ID
      * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦�
      */
@@ -85,7 +85,7 @@
 
     /**
      * 鏍¢獙閮ㄩ棬鍚嶇О鏄惁鍞竴
-     * 
+     *
      * @param dept 閮ㄩ棬淇℃伅
      * @return 缁撴灉
      */
@@ -93,14 +93,14 @@
 
     /**
      * 鏍¢獙閮ㄩ棬鏄惁鏈夋暟鎹潈闄�
-     * 
+     *
      * @param deptId 閮ㄩ棬id
      */
     public void checkDeptDataScope(Long deptId);
 
     /**
      * 鏂板淇濆瓨閮ㄩ棬淇℃伅
-     * 
+     *
      * @param dept 閮ㄩ棬淇℃伅
      * @return 缁撴灉
      */
@@ -108,7 +108,7 @@
 
     /**
      * 淇敼淇濆瓨閮ㄩ棬淇℃伅
-     * 
+     *
      * @param dept 閮ㄩ棬淇℃伅
      * @return 缁撴灉
      */
@@ -116,7 +116,7 @@
 
     /**
      * 鍒犻櫎閮ㄩ棬绠$悊淇℃伅
-     * 
+     *
      * @param deptId 閮ㄩ棬ID
      * @return 缁撴灉
      */
@@ -128,4 +128,12 @@
      * @return
      */
     Long maxLevelDeptId(Long deptId);
+
+    /**
+     * 鏍规嵁閮ㄩ棬鍚嶇О鏌ヨ閮ㄩ棬淇℃伅
+     *
+     * @param deptName 閮ㄩ棬鍚嶇О
+     * @return 閮ㄩ棬淇℃伅闆嗗悎
+     */
+    public SysDept selectDeptByDeptName(String deptName);
 }
diff --git a/src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java b/src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java
index 65f4705..fe1324b 100644
--- a/src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java
+++ b/src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java
@@ -24,7 +24,7 @@
 
 /**
  * 閮ㄩ棬绠$悊 鏈嶅姟瀹炵幇
- * 
+ *
  * @author ruoyi
  */
 @Service
@@ -36,7 +36,7 @@
 
     /**
      * 鏌ヨ閮ㄩ棬绠$悊鏁版嵁
-     * 
+     *
      * @param dept 閮ㄩ棬淇℃伅
      * @return 閮ㄩ棬淇℃伅闆嗗悎
      */
@@ -46,10 +46,10 @@
     {
         return deptMapper.selectDeptList(dept);
     }
-    
+
     /**
      * 鏌ヨ閮ㄩ棬鏍戠粨鏋勪俊鎭�
-     * 
+     *
      * @param dept 閮ㄩ棬淇℃伅
      * @return 閮ㄩ棬鏍戜俊鎭泦鍚�
      */
@@ -62,7 +62,7 @@
 
     /**
      * 鏋勫缓鍓嶇鎵�闇�瑕佹爲缁撴瀯
-     * 
+     *
      * @param depts 閮ㄩ棬鍒楄〃
      * @return 鏍戠粨鏋勫垪琛�
      */
@@ -89,7 +89,7 @@
 
     /**
      * 鏋勫缓鍓嶇鎵�闇�瑕佷笅鎷夋爲缁撴瀯
-     * 
+     *
      * @param depts 閮ㄩ棬鍒楄〃
      * @return 涓嬫媺鏍戠粨鏋勫垪琛�
      */
@@ -102,7 +102,7 @@
 
     /**
      * 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戜俊鎭�
-     * 
+     *
      * @param roleId 瑙掕壊ID
      * @return 閫変腑閮ㄩ棬鍒楄〃
      */
@@ -115,7 +115,7 @@
 
     /**
      * 鏍规嵁閮ㄩ棬ID鏌ヨ淇℃伅
-     * 
+     *
      * @param deptId 閮ㄩ棬ID
      * @return 閮ㄩ棬淇℃伅
      */
@@ -127,7 +127,7 @@
 
     /**
      * 鏍规嵁ID鏌ヨ鎵�鏈夊瓙閮ㄩ棬锛堟甯哥姸鎬侊級
-     * 
+     *
      * @param deptId 閮ㄩ棬ID
      * @return 瀛愰儴闂ㄦ暟
      */
@@ -139,7 +139,7 @@
 
     /**
      * 鏄惁瀛樺湪瀛愯妭鐐�
-     * 
+     *
      * @param deptId 閮ㄩ棬ID
      * @return 缁撴灉
      */
@@ -152,7 +152,7 @@
 
     /**
      * 鏌ヨ閮ㄩ棬鏄惁瀛樺湪鐢ㄦ埛
-     * 
+     *
      * @param deptId 閮ㄩ棬ID
      * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦�
      */
@@ -165,7 +165,7 @@
 
     /**
      * 鏍¢獙閮ㄩ棬鍚嶇О鏄惁鍞竴
-     * 
+     *
      * @param dept 閮ㄩ棬淇℃伅
      * @return 缁撴灉
      */
@@ -183,7 +183,7 @@
 
     /**
      * 鏍¢獙閮ㄩ棬鏄惁鏈夋暟鎹潈闄�
-     * 
+     *
      * @param deptId 閮ㄩ棬id
      */
     @Override
@@ -203,7 +203,7 @@
 
     /**
      * 鏂板淇濆瓨閮ㄩ棬淇℃伅
-     * 
+     *
      * @param dept 閮ㄩ棬淇℃伅
      * @return 缁撴灉
      */
@@ -222,7 +222,7 @@
 
     /**
      * 淇敼淇濆瓨閮ㄩ棬淇℃伅
-     * 
+     *
      * @param dept 閮ㄩ棬淇℃伅
      * @return 缁撴灉
      */
@@ -250,7 +250,7 @@
 
     /**
      * 淇敼璇ラ儴闂ㄧ殑鐖剁骇閮ㄩ棬鐘舵��
-     * 
+     *
      * @param dept 褰撳墠閮ㄩ棬
      */
     private void updateParentDeptStatusNormal(SysDept dept)
@@ -262,7 +262,7 @@
 
     /**
      * 淇敼瀛愬厓绱犲叧绯�
-     * 
+     *
      * @param deptId 琚慨鏀圭殑閮ㄩ棬ID
      * @param newAncestors 鏂扮殑鐖禝D闆嗗悎
      * @param oldAncestors 鏃х殑鐖禝D闆嗗悎
@@ -282,7 +282,7 @@
 
     /**
      * 鍒犻櫎閮ㄩ棬绠$悊淇℃伅
-     * 
+     *
      * @param deptId 閮ㄩ棬ID
      * @return 缁撴灉
      */
@@ -319,6 +319,11 @@
         }
     }
 
+    @Override
+    public SysDept selectDeptByDeptName(String deptName) {
+        return deptMapper.selectDeptByDeptName(deptName);
+    }
+
     /**
      * 寰楀埌瀛愯妭鐐瑰垪琛�
      */
diff --git a/src/main/java/com/ruoyi/tide/controller/TideController.java b/src/main/java/com/ruoyi/tide/controller/TideController.java
new file mode 100644
index 0000000..a530152
--- /dev/null
+++ b/src/main/java/com/ruoyi/tide/controller/TideController.java
@@ -0,0 +1,122 @@
+package com.ruoyi.tide.controller;
+
+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 java.util.HashMap;
+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) {
+        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;
+    }
+
+    @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);//鐖跺叕鍙竔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(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);
+    }
+}
diff --git a/src/main/java/com/ruoyi/tide/pojo/TidePojo.java b/src/main/java/com/ruoyi/tide/pojo/TidePojo.java
new file mode 100644
index 0000000..45e5eab
--- /dev/null
+++ b/src/main/java/com/ruoyi/tide/pojo/TidePojo.java
@@ -0,0 +1,31 @@
+package com.ruoyi.tide.pojo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class TidePojo {
+    @ApiModelProperty("浼佷笟鍚嶇О")
+    private String enterpriseName;
+
+    @ApiModelProperty("骞冲彴鐢ㄦ埛")
+    private String pltUserCn;
+
+    @ApiModelProperty("骞冲彴璐﹀彿")
+    private String pltAccountLogin;
+
+    @ApiModelProperty("璁㈣喘鏃堕暱")
+    private Integer purchaseDuration;
+
+    @ApiModelProperty("璁㈠崟鏃堕暱鍗曚綅")
+    private String purchaseUnit;
+
+    @ApiModelProperty("appKey")
+    private String appKey;
+
+    @ApiModelProperty("appSecret")
+    private String appSecret;
+
+    @ApiModelProperty("code")
+    private String code;
+}
diff --git a/src/main/java/com/ruoyi/tide/utils/TideUtils.java b/src/main/java/com/ruoyi/tide/utils/TideUtils.java
new file mode 100644
index 0000000..10f84ab
--- /dev/null
+++ b/src/main/java/com/ruoyi/tide/utils/TideUtils.java
@@ -0,0 +1,191 @@
+package com.ruoyi.tide.utils;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.crypto.digest.HMac;
+import cn.hutool.crypto.digest.HmacAlgorithm;
+import cn.hutool.http.HttpRequest;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.HashMap;
+
+@Data
+@Component
+@Slf4j
+public class TideUtils {
+
+    public static String APP_ID;
+    public static String APP_SECRET;
+
+
+    @Value("${inspur.appId}")
+    private String appId;
+
+    @Value("${inspur.appSecret}")
+    private String appSecret;
+
+    @Value("${inspur.appId}")
+    public void setAppId(String appId) {
+        TideUtils.APP_ID = appId;
+    }
+
+    @Value("${inspur.appSecret}")
+    public void setAppSecret(String appSecret) {
+        TideUtils.APP_SECRET = appSecret;
+    }
+
+    // 鍐呯綉鍦板潃
+    private final static String ip = "http://10.136.0.8:8083";
+
+    // MD5鍔犲瘑骞惰浆鎹负16杩涘埗
+    public static String md5Encryption(String input) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] digest = md.digest(input.getBytes());
+            StringBuilder sb = new StringBuilder();
+            for (byte b : digest) {
+                sb.append(String.format("%02x", b & 0xff));
+            }
+            return sb.toString();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    // get璇锋眰
+    public static HashMap<String, String> getGetHeader(String parameter) {
+        // 鏃堕棿鎴�
+        String xTime = String.valueOf(DateUtil.current());
+        // 鑾峰彇闅忔満16浣嶅瓧绗︿覆
+        String xRandom = RandomUtil.randomString(16);
+        String xSignSplicingTogether;
+        // 鏈夊弬鏁�
+        if (ObjectUtils.isNotEmpty(parameter)) {
+            // 鍔犲瘑寰楀嚭x-body
+            String xBody = md5Encryption(parameter);
+            // 涓簒-sign鍔犲瘑鍋氭嫾鎺�
+            xSignSplicingTogether = "x-body=" + xBody + "&x-random=" + xRandom + "&x-time=" + xTime;
+        // 鏃犲弬鏁�
+        } else {
+            xSignSplicingTogether = "x-random=" + xRandom + "&x-time=" + xTime;
+        }
+        // 閰嶇疆鍔犲瘑鏂瑰紡涓庡瘑閽�
+        HMac hMac = new HMac(HmacAlgorithm.HmacSHA256, APP_SECRET.getBytes());
+        // 寰楀嚭x-sign
+        String xSign = hMac.digestHex(xSignSplicingTogether);
+        HashMap<String, String> result = new HashMap<>();
+        result.put("x-time", xTime);
+        result.put("x-random", xRandom);
+        result.put("x-sign", xSign);
+        result.put("appKey", APP_ID);
+        return result;
+    }
+
+    // post璇锋眰
+    public static HashMap<String, String> getPostHeader(String parameter) {
+        // 鏃堕棿鎴�
+        String xTime = String.valueOf(DateUtil.current());
+        // 鑾峰彇闅忔満16浣嶅瓧绗︿覆
+        String xRandom = RandomUtil.randomString(16);
+        String xSignSplicingTogether;
+        // 鏈夊弬鏁�
+        if (ObjectUtils.isNotEmpty(parameter)) {
+            // 鍔犲瘑寰楀嚭x-body
+            String xBody = md5Encryption(parameter);
+            // 涓簒-sign鍔犲瘑鍋氭嫾鎺�
+            xSignSplicingTogether = "x-body=" + xBody + "&x-random=" + xRandom + "&x-time=" + xTime;
+            // 鏃犲弬鏁�
+        } else {
+            xSignSplicingTogether = "x-random=" + xRandom + "&x-time=" + xTime;
+        }
+        // x-sign 鍔犲瘑
+        HMac hMac = new HMac(HmacAlgorithm.HmacSHA256, APP_SECRET.getBytes());
+        String xSign = hMac.digestHex(xSignSplicingTogether);
+        HashMap<String, String> result = new HashMap<>();
+        result.put("x-time", xTime);
+        result.put("x-random", xRandom);
+        result.put("x-sign", xSign);
+        result.put("appKey", APP_ID);
+        return result;
+    }
+
+    /**
+     * 浜斿垎閽熶竴娆$殑蹇冭烦
+     */
+    @Scheduled(cron = "0 0/5 * * * ?")
+    public static void heartbeat(){
+        HashMap<String, String> header = getGetHeader(null);
+        String url = ip + "/cpn/api/extra/v1/application/heartbeat";
+        String body = HttpRequest.get(url).headerMap(header, false).execute().body();
+        System.out.println(body + "搴旂敤蹇冭烦鎵ц鎴愬姛锛�");
+    }
+
+    // 鑾峰彇token
+    public static String getToken(String code) {
+        String url = ip + "/cpn/extral/applicationCode/appAuthCheck";
+        JSONObject json = new JSONObject();
+        json.put("code", code);
+        json.put("appID", APP_ID);
+        json.put("appSecret", APP_SECRET);
+        HashMap<String, String> header = getPostHeader(json.toString());
+        String body = HttpRequest.post(url)
+                .headerMap(header, false)
+                .body(json.toString())
+                .execute().body();
+        JSONObject jsonObject = JSONObject.parseObject(body);
+        return jsonObject.get("data").toString();
+    }
+
+    // 鑾峰彇鐢ㄦ埛淇℃伅
+    public static JSONObject getUserInfo(String token) {
+        String url = ip + "/cpn/api/extral/applicationCode/getUserInfoByToken";
+        JSONObject json = new JSONObject();
+        json.put("appID", APP_ID);
+        HashMap<String, String> header = getPostHeader(json.toString());
+        header.put("Authorization", token);
+        String body = HttpRequest.post(url)
+                .headerMap(header, false)
+                .body(json.toString())
+                .execute().body();
+        JSONObject jsonObject = JSONObject.parseObject(body);
+        return JSONObject.parseObject(jsonObject.get("data").toString());
+    }
+
+    public static JSONObject getResult(Integer code, String msg, Object data) {
+        JSONObject json = new JSONObject();
+        json.put("code", code);
+        json.put("msg", msg);
+        json.put("data", data);
+        String xRandom = RandomUtil.randomString(16);
+        json.put("traceId", xRandom);
+        return json;
+    }
+
+    public static String getRandomString(int length) {
+        SecureRandom random = new SecureRandom();
+        String uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+        String lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
+        String numbers = "0123456789";
+        String specialCharacters = "!@$%^&*()_+-=.";
+        String characterSet = uppercaseLetters + lowercaseLetters + numbers + specialCharacters;
+        StringBuilder passwordBuilder = new StringBuilder();
+
+        for (int i = 0; i < length; i++) {
+            int randomIndex = random.nextInt(characterSet.length());
+            char randomChar = characterSet.charAt(randomIndex);
+            passwordBuilder.append(randomChar);
+        }
+
+        return passwordBuilder.toString();
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/application-lc-khgxglxt.yml b/src/main/resources/application-lc-khgxglxt.yml
new file mode 100644
index 0000000..ca41689
--- /dev/null
+++ b/src/main/resources/application-lc-khgxglxt.yml
@@ -0,0 +1,271 @@
+# 椤圭洰鐩稿叧閰嶇疆
+inspur:
+  appId: 1259507573191606272
+  appSecret: 2cbpMDMwNjIwMjYxMTE0MzE2MDA2FD
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9055
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: jxc
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-lc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  data:
+    mongodb:
+      uri: mongodb://114.132.189.42:9028/chat_memory_db
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+#      host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+# 鏂囦欢涓婁紶閰嶇疆
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads   # 涓存椂鐩綍
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://1.15.17.182:9054 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-lc-pro.yml b/src/main/resources/application-lc-pro.yml
index c3958ee..4534d88 100644
--- a/src/main/resources/application-lc-pro.yml
+++ b/src/main/resources/application-lc-pro.yml
@@ -1,4 +1,7 @@
 # 椤圭洰鐩稿叧閰嶇疆
+inspur:
+  appId: 1205971611543404544
+  appSecret: VkyDMDYwMTIwMjYxNzQxNDM2OTItrv
 ruoyi:
   # 鍚嶇О
   name: RuoYi
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 70324c6..f57eec0 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -3,7 +3,7 @@
   main:
     allow-circular-references: true
   profiles:
-    active: dev
+    active: lc-khgxglxt
 langchain4j:
   mcp:
     # MCP 鏈嶅姟绔湴鍧�锛堟牴鎹疄闄呴儴缃茬殑 MCP 鏈嶅姟璋冩暣锛�
diff --git a/src/main/resources/mapper/system/SysDeptMapper.xml b/src/main/resources/mapper/system/SysDeptMapper.xml
index ec25839..ec42e7f 100644
--- a/src/main/resources/mapper/system/SysDeptMapper.xml
+++ b/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -184,4 +184,9 @@
 		WHERE parent_id = 100;
 	</select>
 
+    <select id="selectDeptByDeptName" resultType="com.ruoyi.project.system.domain.SysDept">
+        <include refid="selectDeptVo"/>
+        WHERE d.dept_name = #{deptName}
+        LIMIT 1
+    </select>
 </mapper>

--
Gitblit v1.9.3