Prechádzať zdrojové kódy

提交个人账号开发

chenxiaofei 4 dní pred
rodič
commit
ef0d826884
24 zmenil súbory, kde vykonal 491 pridanie a 307 odobranie
  1. 45 34
      sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/forkliftapp/UsersController.java
  2. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/AppVersionsDao.java
  3. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/FeedbacksDao.java
  4. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/LoadingRecordsDao.java
  5. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/LoginLogsDao.java
  6. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/MaterialsDao.java
  7. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/SysArticlesDao.java
  8. 0 16
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/UsersDao.java
  9. 0 103
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/Users.java
  10. 30 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/LogoutReqVo.java
  11. 45 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/SwitchAccountReqVo.java
  12. 14 15
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/UpdatePasswordReqVo.java
  13. 28 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/UserInfoReqVo.java
  14. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/AppVersionsResVo.java
  15. 18 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/LoadingRecordsResVo.java
  16. 13 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/MaterialsResVo.java
  17. 70 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/SwitchAccountResVo.java
  18. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/SysArticlesResVo.java
  19. 71 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/UserInfoResVo.java
  20. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/UsersResVo.java
  21. 0 29
      sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/UsersService.java
  22. 0 38
      sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/impl/UsersServiceImpl.java
  23. 148 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java
  24. 0 72
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUsersService.java

+ 45 - 34
sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/forkliftapp/UsersController.java

@@ -1,13 +1,16 @@
 package com.sckw.system.controller.forkliftapp;
 
-
-import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.response.BaseResult;
-import com.sckw.system.model.vo.req.UsersReq;
-import com.sckw.system.model.vo.res.UsersResVo;
-import com.sckw.system.service.KwsUsersService;
+import com.sckw.system.model.vo.req.LogoutReqVo;
+import com.sckw.system.model.vo.req.SwitchAccountReqVo;
+import com.sckw.system.model.vo.req.UpdatePasswordReqVo;
+import com.sckw.system.model.vo.req.UserInfoReqVo;
+import com.sckw.system.model.vo.res.SwitchAccountResVo;
+import com.sckw.system.model.vo.res.UserInfoResVo;
+import com.sckw.system.service.KwsUserService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
@@ -22,47 +25,55 @@ import org.springframework.web.bind.annotation.*;
 @RequiredArgsConstructor
 public class UsersController {
 
-
-    private final KwsUsersService kwsUsersService;
+    private final KwsUserService kwsUserService;
 
     /**
-     * 获取用户信息
-     * @param id 用户ID
-     * @return BaseResult
+     * 根据用户ID查询用户信息
+     * @param reqVo 用户信息查询请求对象
+     * @return BaseResult<UserInfoResVo>
      */
-    @GetMapping("/userInfo")
-    @Operation(summary = "获取用户信息", description = "根据用户ID获取用户详细信息")
-    public BaseResult<UsersResVo> getUserInfo(@RequestParam Long id) {
-
-
-        return BaseResult.success(kwsUsersService.getUserInfo(id));
+    @PostMapping("/getUserInfo")
+    @Operation(summary = "查询用户信息", description = "根据用户ID查询头像、姓名、电话、角色、账号状态")
+    public BaseResult<UserInfoResVo> getUserInfo(@RequestBody UserInfoReqVo reqVo) {
+        return BaseResult.success(kwsUserService.getUserInfoById(reqVo.getUserId()));
     }
 
     /**
-     * 账户注销
-     * @param id 用户ID
-     * @return BaseResult
+     * 修改密码
+     * @param reqVo 修改密码请求对象
+     * @return BaseResult<String>
      */
-    @PostMapping("/deleteAccount")
-    @Operation(summary = "账户注销", description = "注销用户账户")
-    public BaseResult<String> deleteAccount(@RequestParam Long id, @RequestParam String reason) {
+    @PostMapping("/updatePassword")
+    @Operation(summary = "修改密码", description = "用户修改密码")
+    public BaseResult<String> updatePassword(@RequestBody @Valid UpdatePasswordReqVo reqVo) {
+        kwsUserService.updatePasswordForApp(reqVo.getUserId(), reqVo.getOldPassword(), reqVo.getNewPassword());
+        return BaseResult.success("密码修改成功");
+    }
 
-        return BaseResult.success(kwsUsersService.deleteAccount(id,reason));
+    /**
+     * 切换账号
+     * @param reqVo 切换账号请求对象
+     * @return BaseResult<SwitchAccountResVo>
+     */
+    @PostMapping("/switchAccount")
+    @Operation(summary = "切换账号", description = "切换到其他用户账号")
+    public BaseResult<SwitchAccountResVo> switchAccount(@RequestBody @Valid SwitchAccountReqVo reqVo) {
+        return BaseResult.success(kwsUserService.switchAccount(
+                reqVo.getAccount(),
+                reqVo.getPassword(),
+                reqVo.getSystemType()));
     }
 
     /**
-     * 更新用户信息
-     * @param req 用户信息
-     * @return BaseResult
+     * 退出登录
+     * @param reqVo 退出登录请求对象
+     * @return BaseResult<String>
      */
-    @PostMapping("/update")
-    @Operation(summary = "更新用户信息", description = "更新用户基本信息")
-    public BaseResult<String> update(@RequestBody UsersReq req) {
-        boolean success =  kwsUsersService.update(req);
-        if (success) {
-            return BaseResult.success(HttpStatus.MSG_005);
-        }
-        return BaseResult.failed(HttpStatus.CRUD_FAIL_CODE, HttpStatus.UPDATE_FAIL);
+    @PostMapping("/logout")
+    @Operation(summary = "退出登录", description = "用户退出登录,清除登录状态和Token")
+    public BaseResult<String> logout(@RequestBody @Valid LogoutReqVo reqVo) {
+        kwsUserService.logout(reqVo.getUserId());
+        return BaseResult.success("退出登录成功");
     }
 
 }

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/AppVersionsDao.java

@@ -14,3 +14,4 @@ public interface AppVersionsDao extends BaseMapper<AppVersions> {
 
 }
 
+

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/FeedbacksDao.java

@@ -14,3 +14,4 @@ public interface FeedbacksDao extends BaseMapper<Feedbacks> {
 
 }
 
+

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/LoadingRecordsDao.java

@@ -14,3 +14,4 @@ public interface LoadingRecordsDao extends BaseMapper<LoadingRecords> {
 
 }
 
+

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/LoginLogsDao.java

@@ -14,3 +14,4 @@ public interface LoginLogsDao extends BaseMapper<LoginLogs> {
 
 }
 
+

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/MaterialsDao.java

@@ -14,3 +14,4 @@ public interface MaterialsDao extends BaseMapper<Materials> {
 
 }
 
+

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/SysArticlesDao.java

@@ -14,3 +14,4 @@ public interface SysArticlesDao extends BaseMapper<SysArticles> {
 
 }
 
+

+ 0 - 16
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/UsersDao.java

@@ -1,16 +0,0 @@
-package com.sckw.system.dao;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.sckw.system.model.Users;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * 用户基础信息表
- * @author chenxiaofei
- * @date 2026-01-07
- */
-@Mapper
-public interface UsersDao extends BaseMapper<Users> {
-
-}
-

+ 0 - 103
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/Users.java

@@ -1,103 +0,0 @@
-package com.sckw.system.model;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * 用户基础信息表
- * @author chenxiaofei
- * @date 2026-01-07
- */
-@EqualsAndHashCode(callSuper = false)
-@Data
-@Accessors(chain = true)
-@TableName("users")
-public class Users implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 雪花ID
-     */
-    @TableId(type = IdType.ASSIGN_ID)
-    private Long id;
-    /**
-     * 企业ID
-     * */
-    @TableField("ent_id")
-    private Integer entId;
-
-    /**
-     * 登录账号
-     */
-    @TableField("username")
-    private String username;
-
-    /**
-     * 加密存储的密码
-     */
-    @TableField("password_hash")
-    private String passwordHash;
-
-    /**
-     * 用户姓名
-     */
-    @TableField("full_name")
-    private String fullName;
-
-    /**
-     * 头像URL地址
-     */
-    @TableField("avatar_url")
-    private String avatarUrl;
-
-    /**
-     * 联系电话
-     */
-    @TableField("phone")
-    private String phone;
-
-    /**
-     * 角色: 1-铲车司机(监管员), 2-门卫
-     */
-    @TableField("role_type")
-    private Integer roleType;
-
-    /**
-     * 状态: 0-注册, 1-启用 ,2-注销;
-     */
-    @TableField("status")
-    private Integer status;
-    /**
-     * 注销原因
-     */
-    @TableField("reason")
-    private String reason;
-
-    /**
-     * 注册时间
-     */
-    @TableField("created_at")
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdAt;
-
-    /**
-     * 更新时间
-     */
-    @TableField("updated_at")
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedAt;
-
-}
-

+ 30 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/LogoutReqVo.java

@@ -0,0 +1,30 @@
+package com.sckw.system.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 退出登录请求对象
+ * @author chenxiaofei
+ * @date 2026-01-08
+ */
+@Data
+@Schema(description = "退出登录请求对象")
+public class LogoutReqVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @NotNull(message = "用户ID不能为空")
+    @Schema(description = "用户ID", required = true, example = "1234567890")
+    private Long userId;
+
+}
+

+ 45 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/SwitchAccountReqVo.java

@@ -0,0 +1,45 @@
+package com.sckw.system.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 切换账号请求对象
+ * @author chenxiaofei
+ * @date 2026-01-08
+ */
+@Data
+@Schema(description = "切换账号请求对象")
+public class SwitchAccountReqVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 账号(手机号)
+     */
+    @NotBlank(message = "账号不能为空")
+    @Schema(description = "账号(手机号)", required = true, example = "13800138000")
+    private String account;
+
+    /**
+     * 密码
+     */
+    @NotBlank(message = "密码不能为空")
+    @Schema(description = "密码", required = true, example = "123456")
+    private String password;
+
+    /**
+     * 系统类型: 1-运营端, 2-企业端
+     */
+    @NotNull(message = "系统类型不能为空")
+    @Schema(description = "系统类型: 1-运营端, 2-企业端", required = true, example = "2")
+    private Integer systemType;
+
+}
+

+ 14 - 15
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/UpdatePasswordReqVo.java

@@ -1,5 +1,6 @@
 package com.sckw.system.model.vo.req;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
@@ -8,38 +9,36 @@ import java.io.Serial;
 import java.io.Serializable;
 
 /**
- * @desc: 修改密码入参
- * @author: czh
- * @date: 2023/6/21
+ * 修改密码请求对象
+ * @author chenxiaofei
+ * @date 2026-01-08
  */
 @Data
+@Schema(description = "修改密码请求对象")
 public class UpdatePasswordReqVo implements Serializable {
 
     @Serial
-    private static final long serialVersionUID = 4911945623876338313L;
+    private static final long serialVersionUID = 1L;
 
     /**
-     * 账号
+     * 用户ID
      */
-    @NotBlank(message = "账号不能为空")
-    private String account;
+    @NotNull(message = "用户ID不能为空")
+    @Schema(description = "用户ID", required = true, example = "1234567890")
+    private Long userId;
 
     /**
      * 旧密码
      */
-    @NotBlank(message = "密码不能为空")
-    private String password;
+    @NotBlank(message = "旧密码不能为空")
+    @Schema(description = "旧密码", required = true, example = "Old123456")
+    private String oldPassword;
 
     /**
      * 新密码
      */
     @NotBlank(message = "新密码不能为空")
+    @Schema(description = "新密码", required = true, example = "New123456")
     private String newPassword;
 
-    /**
-     * 系统类型(1运营端、2企业开户)
-     */
-    @NotNull(message = "系统类型不能为空")
-    private int systemType;
-
 }

+ 28 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/UserInfoReqVo.java

@@ -0,0 +1,28 @@
+package com.sckw.system.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 用户信息查询请求对象
+ * @author chenxiaofei
+ * @date 2026-01-08
+ */
+@Data
+@Schema(description = "用户信息查询请求对象")
+public class UserInfoReqVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @Schema(description = "用户ID", required = true, example = "1234567890")
+    private Long userId;
+
+}
+

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/AppVersionsResVo.java

@@ -74,3 +74,4 @@ public class AppVersionsResVo implements Serializable {
 
 }
 
+

+ 18 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/LoadingRecordsResVo.java

@@ -3,7 +3,11 @@ package com.sckw.system.model.vo.res;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.sckw.core.utils.LongToStringUtils;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -16,6 +20,10 @@ import java.util.Date;
  * @date 2026-01-07
  */
 @Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "装载作业记录返回对象")
 public class LoadingRecordsResVo implements Serializable {
 
     @Serial
@@ -25,51 +33,61 @@ public class LoadingRecordsResVo implements Serializable {
      * 雪花ID
      */
     @JsonSerialize(using = LongToStringUtils.class)
+    @Schema(description = "雪花ID")
     private Long id;
 
     /**
      * 操作员ID
      */
     @JsonSerialize(using = LongToStringUtils.class)
+    @Schema(description = "操作员ID")
     private Long operatorId;
 
     /**
      * 车牌号
      */
+    @Schema(description = "车牌号")
     private String licensePlate;
 
     /**
      * 客户名称
      */
+    @Schema(description = "客户名称")
     private String customerName;
 
     /**
      * 装载类型: 1-装载, 2-补货
      */
+    @Schema(description = "装载类型: 1-装载, 2-补货")
     private Integer loadType;
 
     /**
      * 物料ID
      */
     @JsonSerialize(using = LongToStringUtils.class)
+    @Schema(description = "物料ID")
     private Long materialId;
 
     /**
      * 装载数量/重量
      */
+    @Schema(description = "装载数量/重量")
     private BigDecimal quantity;
 
     /**
      * 作业日期
      */
     @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
+    @Schema(description = "作业日期")
     private Date workDate;
 
     /**
      * 记录创建时间
      */
     @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "记录创建时间")
     private Date createdAt;
 
 }
 
+

+ 13 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/MaterialsResVo.java

@@ -2,7 +2,11 @@ package com.sckw.system.model.vo.res;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.sckw.core.utils.LongToStringUtils;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -13,6 +17,10 @@ import java.io.Serializable;
  * @date 2026-01-07
  */
 @Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "物料信息返回对象")
 public class MaterialsResVo implements Serializable {
 
     @Serial
@@ -22,22 +30,27 @@ public class MaterialsResVo implements Serializable {
      * 雪花ID
      */
     @JsonSerialize(using = LongToStringUtils.class)
+    @Schema(description = "雪花ID")
     private Long id;
 
     /**
      * 物料名称
      */
+    @Schema(description = "物料名称")
     private String materialName;
 
     /**
      * 物料分类
      */
+    @Schema(description = "物料分类")
     private String category;
 
     /**
      * 计量单位
      */
+    @Schema(description = "计量单位")
     private String unit;
 
 }
 
+

+ 70 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/SwitchAccountResVo.java

@@ -0,0 +1,70 @@
+package com.sckw.system.model.vo.res;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 切换账号响应对象
+ * @author chenxiaofei
+ * @date 2026-01-08
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "切换账号响应对象")
+public class SwitchAccountResVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @Schema(description = "用户ID", example = "1234567890")
+    private Long userId;
+
+    /**
+     * 用户姓名
+     */
+    @Schema(description = "用户姓名", example = "张三")
+    private String name;
+
+    /**
+     * 账号
+     */
+    @Schema(description = "账号", example = "13800138000")
+    private String account;
+
+    /**
+     * 手机号
+     */
+    @Schema(description = "手机号", example = "13800138000")
+    private String phone;
+
+    /**
+     * 头像
+     */
+    @Schema(description = "头像URL", example = "https://example.com/avatar.jpg")
+    private String photo;
+
+    /**
+     * 角色名称
+     */
+    @Schema(description = "角色名称", example = "管理员")
+    private String roleName;
+
+    /**
+     * 系统类型
+     */
+    @Schema(description = "系统类型: 1-运营端, 2-企业端", example = "2")
+    private Integer systemType;
+
+}
+

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/SysArticlesResVo.java

@@ -59,3 +59,4 @@ public class SysArticlesResVo implements Serializable {
 
 }
 
+

+ 71 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/UserInfoResVo.java

@@ -0,0 +1,71 @@
+package com.sckw.system.model.vo.res;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 用户信息响应对象
+ * @author chenxiaofei
+ * @date 2026-01-08
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "用户信息响应对象")
+public class UserInfoResVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @Schema(description = "用户ID", example = "1234567890")
+    private Long userId;
+
+    /**
+     * 头像URL
+     */
+    @Schema(description = "头像URL", example = "https://example.com/avatar.jpg")
+    private String photo;
+
+    /**
+     * 用户姓名
+     */
+    @Schema(description = "用户姓名", example = "张三")
+    private String name;
+
+    /**
+     * 手机号
+     */
+    @Schema(description = "手机号", example = "13800138000")
+    private String phone;
+
+    /**
+     * 角色名称
+     */
+    @Schema(description = "角色名称", example = "管理员")
+    private String roleName;
+
+    /**
+     * 账号状态: 0-正常, 1-冻结
+     */
+    @Schema(description = "账号状态: 0-正常, 1-冻结", example = "0")
+    private Integer status;
+
+    /**
+     * 账号状态描述
+     */
+    @Schema(description = "账号状态描述", example = "正常")
+    private String statusDesc;
+
+}
+

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/UsersResVo.java

@@ -85,3 +85,4 @@ public class UsersResVo implements Serializable {
 
 }
 
+

+ 0 - 29
sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/UsersService.java

@@ -1,29 +0,0 @@
-package com.sckw.system.repository;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.sckw.system.model.Users;
-
-/**
- * 用户基础信息表Service接口
- * @author chenxiaofei
- * @date 2026-01-07
- */
-public interface UsersService extends IService<Users> {
-
-    /**
-     * 根据用户名查询用户
-     * @param username 用户名
-     * @return Users
-     */
-    Users getByUsername(String username);
-
-    /**
-     * 根据手机号查询用户
-     * @param phone 手机号
-     * @return Users
-     */
-    Users getByPhone(String phone);
-
-    Users queryById(Long id);
-}
-

+ 0 - 38
sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/impl/UsersServiceImpl.java

@@ -1,38 +0,0 @@
-package com.sckw.system.repository.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.sckw.system.dao.UsersDao;
-import com.sckw.system.model.Users;
-import com.sckw.system.repository.UsersService;
-import org.springframework.stereotype.Service;
-
-/**
- * 用户基础信息表Service实现类
- * @author chenxiaofei
- * @date 2026-01-07
- */
-@Service
-public class UsersServiceImpl extends ServiceImpl<UsersDao, Users> implements UsersService {
-
-    @Override
-    public Users getByUsername(String username) {
-        return this.getOne(new LambdaQueryWrapper<Users>()
-                .eq(Users::getUsername, username)
-                .eq(Users::getStatus, 1));
-    }
-
-    @Override
-    public Users getByPhone(String phone) {
-        return this.getOne(new LambdaQueryWrapper<Users>()
-                .eq(Users::getPhone, phone)
-                .eq(Users::getStatus, 1));
-    }
-
-    @Override
-    public Users queryById(Long id) {
-        return getById(id);
-    }
-
-}
-

+ 148 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java

@@ -31,6 +31,8 @@ import com.sckw.system.model.vo.req.*;
 import com.sckw.system.model.vo.res.KwsUserResVo;
 import com.sckw.system.model.vo.res.KwsUserSystemTypeVo;
 import com.sckw.system.model.vo.res.SalesResp;
+import com.sckw.system.model.vo.res.SwitchAccountResVo;
+import com.sckw.system.model.vo.res.UserInfoResVo;
 import com.sckw.system.repository.KwsRoleRepository;
 import com.sckw.system.repository.KwsUserRepository;
 import com.sckw.system.repository.KwsUserRoleRepository;
@@ -816,4 +818,150 @@ public class KwsUserService {
         return kwsUserResVo;
 
     }
+
+    /**
+     * 根据用户ID查询用户信息(头像、姓名、电话、角色、账号状态)
+     *
+     * @param userId 用户ID
+     * @return UserInfoResVo
+     */
+    public UserInfoResVo getUserInfoById(Long userId) {
+        log.info("查询用户信息,用户ID: {}", userId);
+        
+        // 1. 查询用户基本信息
+        KwsUser kwsUser = kwsUserRepository.getById(userId);
+        if (Objects.isNull(kwsUser) || kwsUser.getDelFlag() != Global.NO) {
+            throw new SystemException(HttpStatus.QUERY_FAIL_CODE, "用户不存在或已删除");
+        }
+
+        // 2. 查询用户角色信息
+        List<RoleInfoDto> roleInfoList = kwsUserRoleDao.queryRoleList(userId);
+        String roleName = "";
+        if (CollUtil.isNotEmpty(roleInfoList)) {
+            // 获取第一个角色名称,如有多个角色可用逗号分隔
+            roleName = roleInfoList.stream()
+                    .map(RoleInfoDto::getRoleName)
+                    .collect(Collectors.joining(","));
+        }
+
+        // 3. 组装返回结果
+        String statusDesc = kwsUser.getStatus() != null && kwsUser.getStatus() == Global.YES ? "锁定" : "正常";
+        
+        return UserInfoResVo.builder()
+                .userId(kwsUser.getId())
+                .photo(kwsUser.getPhoto())
+                .name(kwsUser.getName())
+                .phone(kwsUser.getPhone())
+                .roleName(roleName)
+                .status(kwsUser.getStatus())
+                .statusDesc(statusDesc)
+                .build();
+    }
+
+    /**
+     * 修改密码(叉车APP)
+     *
+     * @param userId 用户ID
+     * @param oldPassword 旧密码
+     * @param newPassword 新密码
+     */
+    public void updatePasswordForApp(Long userId, String oldPassword, String newPassword) {
+        log.info("修改密码,用户ID: {}", userId);
+        
+        // 1. 查询用户信息
+        KwsUser kwsUser = checkUserBase(userId);
+
+        // 2. 校验旧密码
+        String account = kwsUser.getAccount();
+        String currentPwd = kwsUser.getPassword();
+        String salt = kwsUser.getSalt();
+        checkPassword(account, oldPassword, currentPwd, salt);
+
+        // 3. 校验新密码是否与旧密码相同
+        if (PasswordUtils.validatePassword(kwsUser.getAccount() + newPassword, currentPwd, kwsUser.getSalt())) {
+            throw new SystemException(HttpStatus.CODE_10301, "新密码不能与旧密码相同");
+        }
+
+        // 4. 修改密码
+        updatePwd(newPassword, kwsUser);
+        
+        log.info("密码修改成功,用户ID: {}", userId);
+    }
+
+    /**
+     * 切换账号(叉车APP)
+     *
+     * @param account 账号
+     * @param password 密码
+     * @param systemType 系统类型
+     * @return SwitchAccountResVo
+     */
+    public SwitchAccountResVo switchAccount(String account, String password, Integer systemType) {
+        log.info("切换账号,账号: {}, 系统类型: {}", account, systemType);
+        
+        // 1. 查询用户信息
+        KwsUser kwsUser = getUserByAccount(account, systemType);
+        if (Objects.isNull(kwsUser)) {
+            throw new SystemException(HttpStatus.QUERY_FAIL_CODE, "账号不存在");
+        }
+
+        // 2. 检查用户状态
+        if (kwsUser.getDelFlag() != Global.NO) {
+            throw new SystemException(HttpStatus.QUERY_FAIL_CODE, "账号已删除");
+        }
+        if (kwsUser.getStatus() != null && kwsUser.getStatus() == Global.YES) {
+            throw new SystemException(HttpStatus.CODE_10301, "账号已被锁定");
+        }
+
+        // 3. 校验密码
+        checkPassword(account, password, kwsUser.getPassword(), kwsUser.getSalt());
+
+        // 4. 查询用户角色
+        List<RoleInfoDto> roleInfoList = kwsUserRoleDao.queryRoleList(kwsUser.getId());
+        String roleName = "";
+        if (CollUtil.isNotEmpty(roleInfoList)) {
+            roleName = roleInfoList.stream()
+                    .map(RoleInfoDto::getRoleName)
+                    .collect(Collectors.joining(","));
+        }
+
+        // 5. 组装返回结果
+        log.info("切换账号成功,用户ID: {}", kwsUser.getId());
+        return SwitchAccountResVo.builder()
+                .userId(kwsUser.getId())
+                .name(kwsUser.getName())
+                .account(kwsUser.getAccount())
+                .phone(kwsUser.getPhone())
+                .photo(kwsUser.getPhoto())
+                .roleName(roleName)
+                .systemType(kwsUser.getSystemType())
+                .build();
+    }
+
+    /**
+     * 退出登录(叉车APP)
+     *
+     * @param userId 用户ID
+     */
+    public void logout(Long userId) {
+        log.info("退出登录,用户ID: {}", userId);
+        
+        // 1. 校验用户是否存在
+        KwsUser kwsUser = kwsUserRepository.getById(userId);
+        if (Objects.isNull(kwsUser)) {
+            throw new SystemException(HttpStatus.QUERY_FAIL_CODE, "用户不存在");
+        }
+
+        // 2. 清除所有客户端类型的 Token
+        for (ClientTypeEnum value : ClientTypeEnum.values()) {
+            String fullUserTokenKey = Global.getFullUserTokenKey(value.getValue(), userId);
+            RedissonUtils.delete(fullUserTokenKey);
+        }
+
+        // 3. 清除用户登录信息
+        String fullUserLoginKey = Global.getFullUserLoginKey(kwsUser.getSystemType(), userId);
+        RedissonUtils.remove(fullUserLoginKey);
+
+        log.info("退出登录成功,用户ID: {}", userId);
+    }
 }

+ 0 - 72
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUsersService.java

@@ -1,72 +0,0 @@
-package com.sckw.system.service;
-
-import com.sckw.core.exception.BusinessException;
-import com.sckw.core.utils.BeanUtils;
-import com.sckw.core.web.constant.HttpStatus;
-import com.sckw.core.web.response.BaseResult;
-import com.sckw.system.model.Users;
-import com.sckw.system.model.vo.req.UsersReq;
-import com.sckw.system.model.vo.res.UsersResVo;
-import com.sckw.system.repository.UsersService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-/**
- * @author :chenXiaoFei
- * @version :1.0
- * @description : 用户信息相关接口
- * @create :2026-01-07 16:05:00
- */
-@Service
-@RequiredArgsConstructor
-@Slf4j
-public class KwsUsersService {
-    private final UsersService usersService;
-    public UsersResVo getUserInfo(Long id) {
-        log.info("获取用户信息,用户id:{}", id);
-        Users user = usersService.queryById(id);
-        if (user == null) {
-            throw new BusinessException("用户不存在");
-        }
-       return UsersResVo.builder()
-                .id(user.getId())
-                .username(user.getUsername())
-                .fullName(user.getFullName())
-                .avatarUrl(user.getAvatarUrl())
-                .phone(user.getPhone())
-                .roleType(user.getRoleType())
-                .status(user.getStatus())
-                .build();
-    }
-
-    public String deleteAccount(Long id,String reason) {
-        Users user = usersService.queryById(id);
-        if (user == null) {
-            throw new BusinessException("用户不存在");
-        }
-        // 更新状态为禁用
-        user.setStatus(0);
-        user.setReason(reason);
-        boolean b = usersService.updateById(user);
-        if (b) {
-            return"注销成功";
-        }
-
-        return  "注销失败";
-    }
-
-    public boolean update(UsersReq req) {
-        Users users = new Users();
-        users.setId(req.getId());
-        users.setUsername(req.getUsername());
-        users.setPasswordHash(req.getPasswordHash());
-        users.setFullName(req.getFullName());
-        users.setAvatarUrl(req.getAvatarUrl());
-        users.setPhone(req.getPhone());
-        users.setRoleType(req.getRoleType());
-        users.setStatus(req.getStatus());
-        return usersService.updateById(users);
-    }
-}