Browse Source

用户服务-完善第三方对接接口(获取用户列表、添加用户、更新用户、更新用户积分、更新用户贡献值)

sunxbiao 1 year ago
parent
commit
019ee49c4a
21 changed files with 594 additions and 50 deletions
  1. 10 10
      gateWay_server/src/main/java/com/bjtdba/gateWay/filter/ApiAuthFilter.java
  2. 5 0
      userCenter_service/pom.xml
  3. 13 0
      userCenter_service/src/main/java/com/bjtdba/userCenter/advice/GlobalExceptionHandler.java
  4. 14 9
      userCenter_service/src/main/java/com/bjtdba/userCenter/controller/UserController.java
  5. 9 0
      userCenter_service/src/main/java/com/bjtdba/userCenter/dao/UserDao.java
  6. 14 0
      userCenter_service/src/main/java/com/bjtdba/userCenter/dao/UserSignGongxianDao.java
  7. 32 0
      userCenter_service/src/main/java/com/bjtdba/userCenter/dto/request/CreateUserInfoRequest.java
  8. 6 0
      userCenter_service/src/main/java/com/bjtdba/userCenter/dto/request/GetUserListRequest.java
  9. 6 16
      userCenter_service/src/main/java/com/bjtdba/userCenter/dto/request/UpdateUserInfoRequest.java
  10. 47 0
      userCenter_service/src/main/java/com/bjtdba/userCenter/dto/request/UserContributeModifyRequest.java
  11. 6 0
      userCenter_service/src/main/java/com/bjtdba/userCenter/dto/request/UserScoreModifyRequest.java
  12. 14 0
      userCenter_service/src/main/java/com/bjtdba/userCenter/dto/response/UserContributeModifyResponse.java
  13. 2 1
      userCenter_service/src/main/java/com/bjtdba/userCenter/dto/response/UserDTO.java
  14. 1 1
      userCenter_service/src/main/java/com/bjtdba/userCenter/entity/UserEntity.java
  15. 79 0
      userCenter_service/src/main/java/com/bjtdba/userCenter/entity/UserSignGongxianEntity.java
  16. 29 1
      userCenter_service/src/main/java/com/bjtdba/userCenter/exception/BusinessException.java
  17. 6 3
      userCenter_service/src/main/java/com/bjtdba/userCenter/service/UserService.java
  18. 157 9
      userCenter_service/src/main/java/com/bjtdba/userCenter/service/impl/UserServiceImpl.java
  19. 18 0
      userCenter_service/src/main/java/com/bjtdba/userCenter/util/PasswordUtil.java
  20. 77 0
      userCenter_service/src/main/resources/mapper/UserExternalMapper.xml
  21. 49 0
      userCenter_service/src/main/resources/mapper/UserSignGongxianMapper.xml

+ 10 - 10
gateWay_server/src/main/java/com/bjtdba/gateWay/filter/ApiAuthFilter.java

@@ -40,16 +40,16 @@ public class ApiAuthFilter extends AbstractGatewayFilterFactory<ApiAuthFilter.Co
40 40
             }
41 41
 
42 42
             // 3. 验证时间戳有效性
43
-            try {
44
-                long requestTime = Long.parseLong(timestamp);
45
-                long currentTime = System.currentTimeMillis();
46
-
47
-                if (Math.abs(currentTime - requestTime) > TIMESTAMP_THRESHOLD) {
48
-                    return unauthorized(exchange, "Timestamp expired");
49
-                }
50
-            } catch (NumberFormatException e) {
51
-                return unauthorized(exchange, "Invalid timestamp format");
52
-            }
43
+//            try {
44
+//                long requestTime = Long.parseLong(timestamp);
45
+//                long currentTime = System.currentTimeMillis();
46
+//
47
+//                if (Math.abs(currentTime - requestTime) > TIMESTAMP_THRESHOLD) {
48
+//                    return unauthorized(exchange, "Timestamp expired");
49
+//                }
50
+//            } catch (NumberFormatException e) {
51
+//                return unauthorized(exchange, "Invalid timestamp format");
52
+//            }
53 53
 
54 54
             // 4. 生成并验证签名
55 55
 //            String expectedSignature = generateSignature(apiKey, timestamp);

+ 5 - 0
userCenter_service/pom.xml

@@ -102,6 +102,11 @@
102 102
             <groupId>org.aspectj</groupId>
103 103
             <artifactId>aspectjweaver</artifactId>
104 104
         </dependency>
105
+        <dependency>
106
+            <groupId>org.springframework.security</groupId>
107
+            <artifactId>spring-security-core</artifactId>
108
+            <version>5.7.1</version>
109
+        </dependency>
105 110
     </dependencies>
106 111
     <build>
107 112
         <plugins>

+ 13 - 0
userCenter_service/src/main/java/com/bjtdba/userCenter/advice/GlobalExceptionHandler.java

@@ -5,6 +5,7 @@ import com.bjtdba.userCenter.dto.response.common.ApiResponse;
5 5
 import com.bjtdba.userCenter.exception.BusinessException;
6 6
 import org.springframework.http.HttpStatus;
7 7
 import org.springframework.validation.BindException;
8
+import org.springframework.web.bind.MethodArgumentNotValidException;
8 9
 import org.springframework.web.bind.annotation.ExceptionHandler;
9 10
 import org.springframework.web.bind.annotation.ResponseStatus;
10 11
 import org.springframework.web.bind.annotation.RestControllerAdvice;
@@ -41,6 +42,18 @@ public class GlobalExceptionHandler {
41 42
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
42 43
     public ApiResponse<Void> handleException(Exception e) {
43 44
         // 生产环境应记录日志而不是返回详细错误信息
45
+        e.printStackTrace();
44 46
         return ApiResponse.error(500, "系统繁忙,请稍后再试");
45 47
     }
48
+
49
+    @ExceptionHandler(MethodArgumentNotValidException.class)
50
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
51
+    public ApiResponse<Void> handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {
52
+        String errorMsg = ex.getBindingResult().getFieldErrors().stream()
53
+                .map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage())
54
+                .findFirst()
55
+                .orElse("参数验证失败");
56
+
57
+        return ApiResponse.error(400, errorMsg);
58
+    }
46 59
 }

+ 14 - 9
userCenter_service/src/main/java/com/bjtdba/userCenter/controller/UserController.java

@@ -5,9 +5,8 @@ import com.bjtdba.entity.order.User;
5 5
 import com.bjtdba.entity.userCenter.UserAddress;
6 6
 import com.bjtdba.entity.userCenter.UserBill;
7 7
 import com.bjtdba.entity.userCenter.UserCertification;
8
-import com.bjtdba.userCenter.dto.request.GetUserListRequest;
9
-import com.bjtdba.userCenter.dto.request.UpdateUserInfoRequest;
10
-import com.bjtdba.userCenter.dto.request.UserScoreModifyRequest;
8
+import com.bjtdba.userCenter.dto.request.*;
9
+import com.bjtdba.userCenter.dto.response.UserContributeModifyResponse;
11 10
 import com.bjtdba.userCenter.dto.response.UserScoreModifyResponse;
12 11
 import com.bjtdba.userCenter.dto.response.common.ApiResponse;
13 12
 import com.bjtdba.userCenter.dto.response.common.PageResult;
@@ -609,17 +608,23 @@ public class UserController {
609 608
         return ResponseEntity.ok(userService.getUserList(request));
610 609
     }
611 610
 
611
+    @PostMapping("/createUserInfo")
612
+    public ApiResponse<UserDTO> createUserInfo(@Validated @RequestBody CreateUserInfoRequest request) {
613
+        return ApiResponse.success(userService.createUserInfo(request));
614
+    }
615
+
612 616
     @PostMapping("/updateUserInfo")
613 617
     public ApiResponse<UserDTO> updateUserInfo(@Validated @RequestBody UpdateUserInfoRequest request) {
614
-
615 618
         return ApiResponse.success(userService.updateUserInfo(request));
616 619
     }
617 620
 
618
-    @PostMapping("/{uid}/score")
619
-    public ApiResponse<UserScoreModifyResponse> modifyUserScore(
620
-            @PathVariable Integer uid,
621
-            @Validated @RequestBody UserScoreModifyRequest request) {
622
-        request.setUid(uid); // 确保路径参数和body一致
621
+    @PostMapping("/modifyUserScore")
622
+    public ApiResponse<UserScoreModifyResponse> modifyUserScore(@Validated @RequestBody UserScoreModifyRequest request) {
623 623
         return ApiResponse.success(userService.modifyUserScore(request));
624 624
     }
625
+
626
+    @PostMapping("/modifyUserContribute")
627
+    public ApiResponse<UserContributeModifyResponse> modifyUserContribute(@Validated @RequestBody UserContributeModifyRequest request) {
628
+        return ApiResponse.success(userService.modifyUserContribute(request));
629
+    }
625 630
 }

+ 9 - 0
userCenter_service/src/main/java/com/bjtdba/userCenter/dao/UserDao.java

@@ -55,8 +55,17 @@ public interface UserDao {
55 55
             @Param("status") Integer status
56 56
     );
57 57
 
58
+    UserEntity getUserInfoByAccount(@Param("account") String account);
59
+
58 60
     UserEntity getUserInfoByUidForUpdate(@Param("uid") Integer uid);
59 61
 
60 62
     int updateUserScore(@Param("uid") Integer uid,
61 63
                         @Param("newScore") BigDecimal newScore);
64
+
65
+    int updateUserContribute(@Param("uid") Integer uid,
66
+                        @Param("newContribute") BigDecimal newContribute);
67
+
68
+    int updateUserByUid(UserEntity userEntity);
69
+
70
+    int insertUserByUserEntity(@Param("userEntity") UserEntity userEntity);
62 71
 }

+ 14 - 0
userCenter_service/src/main/java/com/bjtdba/userCenter/dao/UserSignGongxianDao.java

@@ -0,0 +1,14 @@
1
+package com.bjtdba.userCenter.dao;
2
+
3
+import com.bjtdba.userCenter.entity.UserSignGongxianEntity;
4
+import org.apache.ibatis.annotations.Mapper;
5
+import org.apache.ibatis.annotations.Param;
6
+import org.springframework.stereotype.Repository;
7
+
8
+@Repository
9
+@Mapper
10
+public interface UserSignGongxianDao {
11
+
12
+    int insertByEntity(@Param("userSignGongxianEntity") UserSignGongxianEntity userSignGongxianEntity);
13
+
14
+}

+ 32 - 0
userCenter_service/src/main/java/com/bjtdba/userCenter/dto/request/CreateUserInfoRequest.java

@@ -0,0 +1,32 @@
1
+package com.bjtdba.userCenter.dto.request;
2
+
3
+import lombok.Data;
4
+
5
+import javax.validation.Valid;
6
+import javax.validation.constraints.NotNull;
7
+import javax.validation.constraints.Pattern;
8
+
9
+@Data
10
+public class CreateUserInfoRequest {
11
+    @Valid
12
+    @NotNull(message = "账号不能为空")
13
+    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "账号格式错误")
14
+    private String account;
15
+    private String realName;
16
+    private String nickname;
17
+    private Integer sex;
18
+    private Long spreadUid;
19
+    private String avatar;
20
+    @Valid
21
+    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式错误")
22
+    private String phone;
23
+    private Integer status;
24
+    private Integer external;
25
+    private Integer externalId;
26
+    private Integer levelId;
27
+    @Valid
28
+    @NotNull(message = "登录IP地址不能为空")
29
+    private String lastIp;
30
+    private String userType;
31
+}
32
+

+ 6 - 0
userCenter_service/src/main/java/com/bjtdba/userCenter/dto/request/GetUserListRequest.java

@@ -3,26 +3,32 @@ package com.bjtdba.userCenter.dto.request;
3 3
 import lombok.Getter;
4 4
 import lombok.Setter;
5 5
 
6
+import javax.validation.Valid;
6 7
 import javax.validation.constraints.Pattern;
7 8
 import javax.validation.constraints.Positive;
8 9
 
9 10
 @Getter
10 11
 @Setter
11 12
 public class GetUserListRequest {
13
+    @Valid
12 14
     @Pattern(regexp = "^1[3-9]\\d{9}$", message = "账号格式错误")
13 15
     private String account;
14 16
 
15 17
     private String nickname;
16 18
 
19
+    @Valid
17 20
     @Positive(message = "用户ID必须为正数")
18 21
     private Long uid;
19 22
 
23
+    @Valid
20 24
     @Positive(message = "状态值必须为正数")
21 25
     private Integer status;
22 26
 
27
+    @Valid
23 28
     @Positive(message = "页码必须为正数")
24 29
     private Integer pageNum = 1;
25 30
 
31
+    @Valid
26 32
     @Positive(message = "每页数量必须为正数")
27 33
     private Integer pageSize = 10;
28 34
 

+ 6 - 16
userCenter_service/src/main/java/com/bjtdba/userCenter/dto/request/UpdateUserInfoRequest.java

@@ -2,40 +2,30 @@ package com.bjtdba.userCenter.dto.request;
2 2
 
3 3
 import lombok.Data;
4 4
 
5
+import javax.validation.Valid;
5 6
 import javax.validation.constraints.*;
6 7
 
7 8
 import java.math.BigDecimal;
8 9
 
9 10
 @Data
10 11
 public class UpdateUserInfoRequest {
11
-    @NotEmpty(message = "用户ID不能为空")
12
+    @Valid
13
+    @NotNull(message = "用户ID不能为空")
12 14
     private Integer uid;
15
+    @Valid
13 16
     @Pattern(regexp = "^1[3-9]\\d{9}$", message = "账号格式错误")
14 17
     private String account;
15 18
     private String realName;
16 19
     private String nickname;
20
+    private Integer sex;
17 21
     private Long spreadUid;
18 22
     private String avatar;
23
+    @Valid
19 24
     @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式错误")
20 25
     private String phone;
21
-    @Positive(message = "积分必须为正数")
22
-    private BigDecimal score;
23
-    @Positive(message = "佣金必须为正数")
24
-    private BigDecimal brokeragePrice;
25
-    @Positive(message = "复购金必须为正数")
26
-    private BigDecimal repurchasePrice;
27 26
     private Integer status;
28 27
     private Integer external;
29 28
     private Integer externalId;
30 29
     private Integer levelId;
31
-    private Integer userGroup;
32
-    @Positive(message = "贡献值必须为正数")
33
-    private BigDecimal contribute;
34
-    @Positive(message = "京豆必须为正数")
35
-    private BigDecimal jingdou;
36
-    @Positive(message = "VR必须为正数")
37
-    private BigDecimal vr;
38
-    @Positive(message = "PV必须为正数")
39
-    private BigDecimal pv;
40 30
 }
41 31
 

+ 47 - 0
userCenter_service/src/main/java/com/bjtdba/userCenter/dto/request/UserContributeModifyRequest.java

@@ -0,0 +1,47 @@
1
+
2
+package com.bjtdba.userCenter.dto.request;
3
+
4
+import lombok.Data;
5
+
6
+import javax.validation.Valid;
7
+import javax.validation.constraints.*;
8
+import java.math.BigDecimal;
9
+
10
+@Data
11
+public class UserContributeModifyRequest {
12
+    @Valid
13
+    @NotNull(message = "用户ID不能为空")
14
+    private Integer uid;
15
+
16
+    private Integer merId;
17
+
18
+    @Valid
19
+    @NotNull(message = "贡献值不能为空")
20
+    @DecimalMin(value = "0.01", message = "贡献值必须大于0")
21
+    private BigDecimal number;
22
+
23
+    @Valid
24
+    @NotNull(message = "贡献值状态不能为空")
25
+    @Min(value = -1, message = "贡献值状态取值错误")
26
+    @Max(value = 1, message = "贡献值状态取值错误")
27
+    private Integer status; // '贡献值状态1-有效 0-失效 -1待确认'
28
+
29
+    private String mark;
30
+    private String desc;
31
+
32
+    @Valid
33
+    @NotBlank(message = "订单ID不能为空")
34
+    @Size(max = 255, message = "订单ID长度超限")
35
+    private String orderId;
36
+
37
+    @Valid
38
+    @NotBlank(message = "订单类型不能为空")
39
+    private String orderType;
40
+
41
+    @Valid
42
+    @NotNull(message = "贡献值类型不能为空")
43
+    @Min(value = 1, message = "贡献值类型取值错误")
44
+    @Max(value = 2, message = "贡献值类型取值错误")
45
+    private Integer type; // '贡献值状态1-有效 0-失效 -1待确认'
46
+}
47
+

+ 6 - 0
userCenter_service/src/main/java/com/bjtdba/userCenter/dto/request/UserScoreModifyRequest.java

@@ -1,6 +1,8 @@
1 1
 package com.bjtdba.userCenter.dto.request;
2 2
 
3 3
 import lombok.Data;
4
+
5
+import javax.validation.Valid;
4 6
 import javax.validation.constraints.*;
5 7
 import java.math.BigDecimal;
6 8
 
@@ -8,19 +10,23 @@ import java.math.BigDecimal;
8 10
 public class UserScoreModifyRequest {
9 11
     private Integer uid;
10 12
 
13
+    @Valid
11 14
     @NotNull(message = "积分类型不能为空")
12 15
     @Min(value = 1, message = "积分类型取值错误")
13 16
     @Max(value = 2, message = "积分类型取值错误")
14 17
     private Integer pm; // 1-收入 2-支出
15 18
 
19
+    @Valid
16 20
     @NotNull(message = "积分值不能为空")
17 21
     @DecimalMin(value = "0.01", message = "积分值必须大于0")
18 22
     private BigDecimal rewardScore;
19 23
 
24
+    @Valid
20 25
     @NotBlank(message = "订单ID不能为空")
21 26
     @Size(max = 255, message = "订单ID长度超限")
22 27
     private String orderId;
23 28
 
29
+    @Valid
24 30
     @NotBlank(message = "订单类型不能为空")
25 31
     private String orderType;
26 32
 }

+ 14 - 0
userCenter_service/src/main/java/com/bjtdba/userCenter/dto/response/UserContributeModifyResponse.java

@@ -0,0 +1,14 @@
1
+package com.bjtdba.userCenter.dto.response;
2
+
3
+import lombok.Builder;
4
+import lombok.Data;
5
+
6
+import java.math.BigDecimal;
7
+
8
+@Builder
9
+@Data
10
+public class UserContributeModifyResponse {
11
+    private Integer uid;
12
+    private BigDecimal currentContribute;
13
+    private String transactionId;
14
+}

+ 2 - 1
userCenter_service/src/main/java/com/bjtdba/userCenter/dto/response/UserDTO.java

@@ -9,10 +9,11 @@ import java.sql.Timestamp;
9 9
 @Getter
10 10
 @Setter
11 11
 public class UserDTO {
12
-    private Long uid;
12
+    private Integer uid;
13 13
     private String account;
14 14
     private String realName;
15 15
     private String nickname;
16
+    private Integer sex;
16 17
     private Long spreadUid;
17 18
     private String avatar;
18 19
     private String phone;

+ 1 - 1
userCenter_service/src/main/java/com/bjtdba/userCenter/entity/UserEntity.java

@@ -8,7 +8,7 @@ import java.util.Date;
8 8
 @Getter
9 9
 @Setter
10 10
 public class UserEntity {
11
-    private Long uid;
11
+    private Integer uid;
12 12
     private String wechatUserId;
13 13
     private String aliUserId;
14 14
     private String account;

+ 79 - 0
userCenter_service/src/main/java/com/bjtdba/userCenter/entity/UserSignGongxianEntity.java

@@ -0,0 +1,79 @@
1
+package com.bjtdba.userCenter.entity;
2
+
3
+import lombok.Data;
4
+
5
+import java.math.BigDecimal;
6
+import java.sql.Timestamp;
7
+
8
+@Data
9
+public class UserSignGongxianEntity {
10
+    /**
11
+     * 自增id
12
+     */
13
+    private Integer id;
14
+
15
+    /**
16
+     * 会员id
17
+     */
18
+    private int uid;
19
+
20
+    /**
21
+     * 商户id
22
+     */
23
+    private int merId;
24
+
25
+    /**
26
+     * 赠送数量
27
+     */
28
+    private BigDecimal number;
29
+
30
+    /**
31
+     * 贡献值状态: 1-有效, 0-失效, -1待确认
32
+     */
33
+    private Integer status;
34
+
35
+    /**
36
+     * 备注
37
+     */
38
+    private String mark;
39
+
40
+    /**
41
+     * 描述
42
+     */
43
+    private String desc;
44
+
45
+    /**
46
+     * 订单id
47
+     */
48
+    private String orderId;
49
+
50
+    /**
51
+     * 剩余
52
+     */
53
+    private BigDecimal surplus;
54
+
55
+    /**
56
+     * 订单类型
57
+     */
58
+    private String orderType;
59
+
60
+    /**
61
+     * 贡献值类型: 1赠送, 2消耗
62
+     */
63
+    private Integer type;
64
+
65
+    /**
66
+     * 结算时间
67
+     */
68
+    private Timestamp settlementTime;
69
+
70
+    /**
71
+     * 添加时间
72
+     */
73
+    private Long addtime;
74
+
75
+    /**
76
+     * pv值
77
+     */
78
+    private BigDecimal pv;
79
+}

+ 29 - 1
userCenter_service/src/main/java/com/bjtdba/userCenter/exception/BusinessException.java

@@ -26,14 +26,42 @@ public class BusinessException extends RuntimeException {
26 26
         return new BusinessException(404, "用户不存在");
27 27
     }
28 28
 
29
+    public static BusinessException userIsExist() {
30
+        return new BusinessException(500, "用户已存在");
31
+    }
32
+
33
+    public static BusinessException userAccountIsExist() {
34
+        return new BusinessException(500, "用户账号已存在");
35
+    }
36
+
29 37
     public static BusinessException insufficientScore() {
30 38
         return new BusinessException(403, "用户积分不足");
31 39
     }
32 40
 
33
-    public static BusinessException updateFailed() {
41
+    public static BusinessException updateScoreFailed() {
34 42
         return new BusinessException(500, "积分更新失败,请重试");
35 43
     }
36 44
 
45
+    public static BusinessException insufficientContribute() {
46
+        return new BusinessException(403, "用户贡献值不足");
47
+    }
48
+
49
+    public static BusinessException createContributeFailed() {
50
+        return new BusinessException(500, "贡献值记录创建失败,请重试");
51
+    }
52
+
53
+    public static BusinessException updateContributeFailed() {
54
+        return new BusinessException(500, "贡献值更新失败,请重试");
55
+    }
56
+
57
+    public static BusinessException createUserFailed() {
58
+        return new BusinessException(500, "创建用户信息失败");
59
+    }
60
+
61
+    public static BusinessException updateUserFailed() {
62
+        return new BusinessException(500, "更新用户信息失败");
63
+    }
64
+
37 65
     @Override
38 66
     public String getMessage() {
39 67
         return message;

+ 6 - 3
userCenter_service/src/main/java/com/bjtdba/userCenter/service/UserService.java

@@ -2,9 +2,8 @@ package com.bjtdba.userCenter.service;
2 2
 
3 3
 import com.bjtdba.entity.order.User;
4 4
 import com.bjtdba.entity.userCenter.UserBill;
5
-import com.bjtdba.userCenter.dto.request.GetUserListRequest;
6
-import com.bjtdba.userCenter.dto.request.UpdateUserInfoRequest;
7
-import com.bjtdba.userCenter.dto.request.UserScoreModifyRequest;
5
+import com.bjtdba.userCenter.dto.request.*;
6
+import com.bjtdba.userCenter.dto.response.UserContributeModifyResponse;
8 7
 import com.bjtdba.userCenter.dto.response.UserScoreModifyResponse;
9 8
 import com.bjtdba.userCenter.dto.response.common.PageResult;
10 9
 import com.bjtdba.userCenter.dto.response.UserDTO;
@@ -46,5 +45,9 @@ public interface UserService {
46 45
 
47 46
     UserScoreModifyResponse modifyUserScore(UserScoreModifyRequest request);
48 47
 
48
+    UserContributeModifyResponse modifyUserContribute(UserContributeModifyRequest request);
49
+
50
+    UserDTO createUserInfo(CreateUserInfoRequest request);
51
+
49 52
     UserDTO updateUserInfo(UpdateUserInfoRequest request);
50 53
 }

+ 157 - 9
userCenter_service/src/main/java/com/bjtdba/userCenter/service/impl/UserServiceImpl.java

@@ -3,23 +3,26 @@ package com.bjtdba.userCenter.service.impl;
3 3
 import com.bjtdba.entity.order.User;
4 4
 import com.bjtdba.entity.userCenter.UserBill;
5 5
 import com.bjtdba.userCenter.dao.*;
6
-import com.bjtdba.userCenter.dto.request.GetUserListRequest;
7
-import com.bjtdba.userCenter.dto.request.UpdateUserInfoRequest;
8
-import com.bjtdba.userCenter.dto.request.UserScoreModifyRequest;
6
+import com.bjtdba.userCenter.dto.request.*;
7
+import com.bjtdba.userCenter.dto.response.UserContributeModifyResponse;
9 8
 import com.bjtdba.userCenter.dto.response.UserScoreModifyResponse;
10 9
 import com.bjtdba.userCenter.dto.response.common.PageResult;
11 10
 import com.bjtdba.userCenter.dto.response.UserDTO;
12 11
 import com.bjtdba.userCenter.entity.UserEntity;
12
+import com.bjtdba.userCenter.entity.UserSignGongxianEntity;
13 13
 import com.bjtdba.userCenter.entity.UserSignScoreEntity;
14 14
 import com.bjtdba.userCenter.exception.BusinessException;
15 15
 import com.bjtdba.userCenter.service.UserService;
16
+import com.bjtdba.userCenter.util.PasswordUtil;
16 17
 import lombok.RequiredArgsConstructor;
17 18
 import org.springframework.beans.factory.annotation.Autowired;
18 19
 import org.springframework.stereotype.Service;
19 20
 import org.springframework.transaction.annotation.Transactional;
20 21
 import org.springframework.util.CollectionUtils;
21 22
 
23
+import javax.servlet.http.HttpServletRequest;
22 24
 import java.math.BigDecimal;
25
+import java.sql.Timestamp;
23 26
 import java.time.LocalDateTime;
24 27
 import java.time.ZoneOffset;
25 28
 import java.util.Collections;
@@ -39,6 +42,10 @@ public class UserServiceImpl  implements UserService {
39 42
     private UserDao userDao;
40 43
     @Autowired
41 44
     private UserSignScoreDao userSignScoreDao;
45
+    @Autowired
46
+    private UserSignGongxianDao userSignGongxianDao;
47
+    @Autowired
48
+    private HttpServletRequest httpServletRequest;
42 49
 
43 50
 
44 51
     public User queryByid(Integer uid){
@@ -108,16 +115,17 @@ public class UserServiceImpl  implements UserService {
108 115
             return Collections.emptyList();
109 116
         }
110 117
         return userEntityList.stream()
111
-                .map(this::convertToBasicDTO)
118
+                .map(this::convertToUserDTO)
112 119
                 .collect(Collectors.toList());
113 120
     }
114 121
 
115
-    private UserDTO convertToBasicDTO(UserEntity userEntity) {
122
+    private UserDTO convertToUserDTO(UserEntity userEntity) {
116 123
         UserDTO dto = new UserDTO();
117 124
         dto.setUid(userEntity.getUid());
118 125
         dto.setAccount(userEntity.getAccount());
119 126
         dto.setRealName(userEntity.getRealName());
120 127
         dto.setNickname(userEntity.getNickname());
128
+        dto.setSex(userEntity.getSex());
121 129
         dto.setSpreadUid(userEntity.getSpreadUid());
122 130
         dto.setAvatar(userEntity.getAvatar());
123 131
         dto.setPhone(userEntity.getPhone());
@@ -163,7 +171,7 @@ public class UserServiceImpl  implements UserService {
163 171
                 newScore
164 172
         );
165 173
         if (updateCount == 0) {
166
-            throw BusinessException.updateFailed();
174
+            throw BusinessException.updateScoreFailed();
167 175
         }
168 176
 
169 177
         // 4. 创建积分记录
@@ -178,6 +186,7 @@ public class UserServiceImpl  implements UserService {
178 186
                 .build();
179 187
     }
180 188
 
189
+
181 190
     private UserSignScoreEntity buildScoreRecord(UserScoreModifyRequest request, BigDecimal currentScore) {
182 191
         UserSignScoreEntity record = new UserSignScoreEntity();
183 192
         record.setUid(request.getUid());
@@ -200,16 +209,155 @@ public class UserServiceImpl  implements UserService {
200 209
 
201 210
     @Override
202 211
     @Transactional(rollbackFor = Exception.class)
203
-    public UserDTO updateUserInfo(UpdateUserInfoRequest request) {
212
+    public UserContributeModifyResponse modifyUserContribute(UserContributeModifyRequest request) {
204 213
         // 1. 获取用户并加锁
205 214
         UserEntity userEntity = userDao.getUserInfoByUidForUpdate(request.getUid());
206 215
         if (userEntity == null) {
207 216
             throw BusinessException.userNotFound();
208 217
         }
209 218
 
210
-        // 2. 判断积分值是否有变动
219
+        // 2. 贡献值操作处理
220
+        BigDecimal newContribute;
221
+        if (request.getType() == 1) {  // 赠送
222
+            newContribute = userEntity.getContribute().add(request.getNumber());
223
+        } else {  // 消耗
224
+            if (userEntity.getContribute().compareTo(request.getNumber()) < 0) {
225
+                throw BusinessException.insufficientContribute();
226
+            }
227
+            newContribute = userEntity.getScore().subtract(request.getNumber());
228
+        }
229
+
230
+        // 3. 更新用户贡献值(带乐观锁)
231
+        int updateCount = userDao.updateUserContribute(
232
+                request.getUid(),
233
+                newContribute
234
+        );
235
+        if (updateCount == 0) {
236
+            throw BusinessException.updateContributeFailed();
237
+        }
238
+
239
+        // 4. 创建贡献值记录
240
+        UserSignGongxianEntity record = buildContributeRecord(request, newContribute);
241
+        int createResult = userSignGongxianDao.insertByEntity(record);
242
+        if (createResult == 0) {
243
+            throw BusinessException.createContributeFailed();
244
+        }
245
+
246
+        // 5. 构建响应
247
+        return UserContributeModifyResponse.builder()
248
+                .uid(request.getUid())
249
+                .currentContribute(newContribute)
250
+                .transactionId(record.getId().toString())
251
+                .build();
252
+    }
253
+
254
+    private UserSignGongxianEntity buildContributeRecord(UserContributeModifyRequest request, BigDecimal newContribute) {
255
+        UserSignGongxianEntity record = new UserSignGongxianEntity();
256
+        record.setUid(request.getUid());
257
+        record.setMerId(request.getMerId());
258
+        record.setNumber(request.getNumber());
259
+        record.setStatus(request.getStatus());
260
+        record.setMark(buildContributeMark(request));
261
+        record.setDesc(request.getDesc());
262
+        record.setOrderId(request.getOrderId());
263
+        record.setOrderType(request.getOrderType());
264
+        record.setSurplus(newContribute);
265
+        record.setType(request.getType());
266
+        if (request.getStatus() == 1) {
267
+            record.setSettlementTime(Timestamp.valueOf(LocalDateTime.now()));
268
+        }
269
+        record.setAddtime(LocalDateTime.now().toEpochSecond(ZoneOffset.UTC));
270
+        return record;
271
+    }
272
+
273
+    private String buildContributeMark(UserContributeModifyRequest request) {
274
+        return String.format("%s贡献值,订单号:%s",
275
+                request.getType() == 1 ? "收入" : "支出",
276
+                request.getOrderId());
277
+    }
278
+
279
+
280
+    @Override
281
+    @Transactional(rollbackFor = Exception.class)
282
+    public UserDTO createUserInfo(CreateUserInfoRequest request) {
283
+        // 1. 获取用户并加锁
284
+        UserEntity userEntity = userDao.getUserInfoByAccount(request.getAccount());
285
+        if (userEntity != null) {
286
+            throw BusinessException.userIsExist();
287
+        }
288
+        userEntity = new UserEntity();
289
+        userEntity.setAccount(request.getAccount());
290
+        userEntity.setPhone(request.getPhone());
291
+        userEntity.setPwd(PasswordUtil.hashPassword("123456"));
292
+        userEntity.setNickname(request.getNickname());
293
+        userEntity.setRealName(request.getRealName());
294
+        userEntity.setAvatar("https://cdn.bjtdba.com/vod/image/2025-01-20/20250120125206881.png");
295
+        userEntity.setSpreadUid(request.getSpreadUid());
296
+        userEntity.setSex(request.getSex());
297
+        userEntity.setExternal(request.getExternal());
298
+        userEntity.setExternalId(request.getExternalId());
299
+        userEntity.setLevelId(request.getLevelId());
300
+        // 设置系统默认值
301
+        userEntity.setCreateTime(new Timestamp(System.currentTimeMillis()));
302
+        userEntity.setLastTime(new Timestamp(System.currentTimeMillis()));
303
+        userEntity.setLastIp(request.getLastIp());
304
+        userEntity.setStatus(1); // 默认状态:正常
305
+        userEntity.setIsDel(0); // 未删除
306
+        userEntity.setScore(BigDecimal.ZERO); // 默认积分
307
+        userEntity.setUserType(httpServletRequest.getHeader("X-API-KEY"));
308
+        int uid = userDao.insertUserByUserEntity(userEntity);
309
+        if (uid <= 0) {
310
+            throw BusinessException.createUserFailed();
311
+        }
312
+        return convertToUserDTO(userEntity);
313
+    }
211 314
 
212 315
 
213
-        return null;
316
+    @Override
317
+    @Transactional(rollbackFor = Exception.class)
318
+    public UserDTO updateUserInfo(UpdateUserInfoRequest request) {
319
+        // 1. 获取用户并加锁
320
+        UserEntity userEntity = userDao.getUserInfoByUidForUpdate(request.getUid());
321
+        if (userEntity == null) {
322
+            // 如果用户不存在则创建
323
+            throw BusinessException.userNotFound();
324
+        }
325
+        UserEntity userEntityByAccount = userDao.getUserInfoByAccount(request.getAccount());
326
+        if (userEntityByAccount != null && !userEntityByAccount.getUid().equals(request.getUid())) {
327
+            throw BusinessException.userAccountIsExist();
328
+        }
329
+        // 只更新非空字段(根据业务需求调整)
330
+        if (request.getAccount() != null) {
331
+            userEntity.setAccount(request.getAccount());
332
+        }
333
+        if (request.getPhone() != null) {
334
+            userEntity.setPhone(request.getPhone());
335
+        }
336
+        if (request.getNickname() != null) {
337
+            userEntity.setNickname(request.getNickname());
338
+        }
339
+        if (request.getRealName() != null) {
340
+            userEntity.setRealName(request.getRealName());
341
+        }
342
+        if (request.getAvatar() != null) {
343
+            userEntity.setAvatar(request.getAvatar());
344
+        }
345
+        if (request.getSpreadUid() != null) {
346
+            userEntity.setSpreadUid(request.getSpreadUid());
347
+        }
348
+        if (request.getSex() != null) {
349
+            userEntity.setSex(request.getSex());
350
+        }
351
+        if (request.getLevelId() != null) {
352
+            userEntity.setLevelId(request.getLevelId());
353
+        }
354
+        // 更新最后活跃时间
355
+        userEntity.setLastTime(new Timestamp(System.currentTimeMillis()));
356
+        // 执行更新操作
357
+        int updateCount = userDao.updateUserByUid(userEntity);
358
+        if (updateCount <= 0) {
359
+            throw BusinessException.updateUserFailed();
360
+        }
361
+        return convertToUserDTO(userEntity);
214 362
     }
215 363
 }

+ 18 - 0
userCenter_service/src/main/java/com/bjtdba/userCenter/util/PasswordUtil.java

@@ -0,0 +1,18 @@
1
+package com.bjtdba.userCenter.util;
2
+
3
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
4
+
5
+public class PasswordUtil {
6
+
7
+    private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
8
+
9
+    // 生成密码哈希(对应PHP的password_hash)
10
+    public static String hashPassword(String password) {
11
+        return encoder.encode(password);
12
+    }
13
+
14
+    // 验证密码(对应PHP的password_verify)
15
+    public static boolean verifyPassword(String password, String hashedPassword) {
16
+        return encoder.matches(password, hashedPassword);
17
+    }
18
+}

+ 77 - 0
userCenter_service/src/main/resources/mapper/UserExternalMapper.xml

@@ -61,9 +61,86 @@
61 61
         WHERE is_del = 0 AND uid = #{uid} FOR UPDATE
62 62
     </select>
63 63
 
64
+    <select id="getUserInfoByAccount" resultMap="userResultMap">
65
+        SELECT <include refid="baseColumn"/>
66
+        FROM rrx_user
67
+        WHERE is_del = 0 AND account = #{account}
68
+    </select>
69
+
64 70
     <update id="updateUserScore">
65 71
         UPDATE rrx_user SET
66 72
                         score = #{newScore}
67 73
         WHERE uid = #{uid}
68 74
     </update>
75
+
76
+    <update id="updateUserContribute">
77
+        UPDATE rrx_user SET
78
+            contribute = #{newContribute}
79
+        WHERE uid = #{uid}
80
+    </update>
81
+
82
+    <insert id="insertUserByUserEntity" useGeneratedKeys="true" keyProperty="userEntity.uid" keyColumn="uid">
83
+        INSERT INTO rrx_user
84
+        <trim prefix="(" suffix=")" suffixOverrides=",">
85
+            <if test="userEntity.account != null">account,</if>
86
+            <if test="userEntity.phone != null">phone,</if>
87
+            <if test="userEntity.pwd != null">pwd,</if>
88
+            <if test="userEntity.nickname != null">nickname,</if>
89
+            <if test="userEntity.realName != null">real_name,</if>
90
+            <if test="userEntity.avatar != null">avatar,</if>
91
+            <if test="userEntity.spreadUid != null">spread_uid,</if>
92
+            <if test="userEntity.sex != null">sex,</if>
93
+            <if test="userEntity.external != null">external,</if>
94
+            <if test="userEntity.externalId != null">external_id,</if>
95
+            <if test="userEntity.birthday != null">birthday,</if>
96
+            <if test="userEntity.levelId != null">level_id,</if>
97
+            <if test="userEntity.mark != null">mark,</if>
98
+            <if test="userEntity.createTime != null">create_time,</if>
99
+            <if test="userEntity.lastTime != null">last_time,</if>
100
+            <if test="userEntity.lastIp != null">last_ip,</if>
101
+            <if test="userEntity.isDel != null">is_del,</if>
102
+            <if test="userEntity.identityUpTime != null">identity_up_time,</if>
103
+            <if test="userEntity.userType != null">user_type,</if>
104
+        </trim>
105
+        <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
106
+            <if test="userEntity.account != null">#{userEntity.account},</if>
107
+            <if test="userEntity.phone != null">#{userEntity.phone},</if>
108
+            <if test="userEntity.pwd != null">#{userEntity.pwd},</if>
109
+            <if test="userEntity.nickname != null">#{userEntity.nickname},</if>
110
+            <if test="userEntity.realName != null">#{userEntity.realName},</if>
111
+            <if test="userEntity.avatar != null">#{userEntity.avatar},</if>
112
+            <if test="userEntity.spreadUid != null">#{userEntity.spreadUid},</if>
113
+            <if test="userEntity.sex != null">#{userEntity.sex},</if>
114
+            <if test="userEntity.external != null">#{userEntity.external},</if>
115
+            <if test="userEntity.externalId != null">#{userEntity.externalId},</if>
116
+            <if test="userEntity.birthday != null">#{userEntity.birthday},</if>
117
+            <if test="userEntity.levelId != null">#{userEntity.levelId},</if>
118
+            <if test="userEntity.mark != null">#{userEntity.mark},</if>
119
+            <if test="userEntity.createTime != null">#{userEntity.createTime},</if>
120
+            <if test="userEntity.lastTime != null">#{userEntity.lastTime},</if>
121
+            <if test="userEntity.lastIp != null">#{userEntity.lastIp},</if>
122
+            <if test="userEntity.isDel != null">#{userEntity.isDel},</if>
123
+            <if test="userEntity.identityUpTime != null">#{userEntity.identityUpTime},</if>
124
+            <if test="userEntity.userType != null">#{userEntity.userType},</if>
125
+        </trim>
126
+    </insert>
127
+
128
+    <update id="updateUserByUid">
129
+        UPDATE rrx_user
130
+        <set>
131
+            <if test="account != null">account = #{account},</if>
132
+            <if test="phone != null">phone = #{phone},</if>
133
+            <if test="nickname != null">nickname = #{nickname},</if>
134
+            <if test="realName != null">real_name = #{realName},</if>
135
+            <if test="avatar != null">avatar = #{avatar},</if>
136
+            <if test="spreadUid != null">spread_uid = #{spreadUid},</if>
137
+            <if test="sex != null">sex = #{sex},</if>
138
+            <if test="external != null">external = #{external},</if>
139
+            <if test="externalId != null">external_id = #{externalId},</if>
140
+            <if test="levelId != null">level_id = #{levelId},</if>
141
+            <if test="lastTime != null">last_time = #{lastTime},</if>
142
+            <!-- 添加其他需要更新的字段 -->
143
+        </set>
144
+        WHERE uid = #{uid}
145
+    </update>
69 146
 </mapper>

+ 49 - 0
userCenter_service/src/main/resources/mapper/UserSignGongxianMapper.xml

@@ -0,0 +1,49 @@
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
3
+<mapper namespace="com.bjtdba.userCenter.dao.UserSignGongxianDao">
4
+
5
+    <!-- 使用 autoMapping 自动映射未显式声明的字段 -->
6
+    <resultMap id="userSignGongxianResultMap" type="com.bjtdba.userCenter.entity.UserSignGongxianEntity" autoMapping="true">
7
+        <id column="uid" property="uid" />
8
+        <!-- 显式声明需要下划线转驼峰的字段 -->
9
+        <result column="mer_id" property="merId" />
10
+        <result column="order_type" property="orderType" />
11
+        <result column="order_id" property="orderId" />
12
+        <result column="settlement_time" property="settlementTime" />
13
+    </resultMap>
14
+    
15
+    <insert id="insertByEntity" useGeneratedKeys="true" keyProperty="userSignGongxianEntity.id" keyColumn="id">
16
+        INSERT INTO rrx_user_sign_gongxian
17
+        <trim prefix="(" suffix=")" suffixOverrides=",">
18
+            <if test="userSignGongxianEntity.uid != null">uid,</if>
19
+            <if test="userSignGongxianEntity.merId != null">mer_id,</if>
20
+            <if test="userSignGongxianEntity.number != null">number,</if>
21
+            <if test="userSignGongxianEntity.status != null">status,</if>
22
+            <if test="userSignGongxianEntity.mark != null">mark,</if>
23
+            <if test="userSignGongxianEntity.desc != null">`desc`,</if>
24
+            <if test="userSignGongxianEntity.orderId != null">order_id,</if>
25
+            <if test="userSignGongxianEntity.surplus != null">surplus,</if>
26
+            <if test="userSignGongxianEntity.orderType != null">order_type,</if>
27
+            <if test="userSignGongxianEntity.type != null">type,</if>
28
+            <if test="userSignGongxianEntity.settlementTime != null">settlement_time,</if>
29
+            <if test="userSignGongxianEntity.addtime != null">addtime,</if>
30
+            <if test="userSignGongxianEntity.pv != null">pv,</if>
31
+        </trim>
32
+        <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
33
+            <if test="userSignGongxianEntity.uid != null">#{userSignGongxianEntity.uid},</if>
34
+            <if test="userSignGongxianEntity.merId != null">#{userSignGongxianEntity.merId},</if>
35
+            <if test="userSignGongxianEntity.number != null">#{userSignGongxianEntity.number},</if>
36
+            <if test="userSignGongxianEntity.status != null">#{userSignGongxianEntity.status},</if>
37
+            <if test="userSignGongxianEntity.mark != null">#{userSignGongxianEntity.mark},</if>
38
+            <if test="userSignGongxianEntity.desc != null">#{userSignGongxianEntity.desc},</if>
39
+            <if test="userSignGongxianEntity.orderId != null">#{userSignGongxianEntity.orderId},</if>
40
+            <if test="userSignGongxianEntity.surplus != null">#{userSignGongxianEntity.surplus},</if>
41
+            <if test="userSignGongxianEntity.orderType != null">#{userSignGongxianEntity.orderType},</if>
42
+            <if test="userSignGongxianEntity.type != null">#{userSignGongxianEntity.type},</if>
43
+            <if test="userSignGongxianEntity.settlementTime != null">#{userSignGongxianEntity.settlementTime},</if>
44
+            <if test="userSignGongxianEntity.addtime != null">#{userSignGongxianEntity.addtime},</if>
45
+            <if test="userSignGongxianEntity.pv != null">#{userSignGongxianEntity.pv},</if>
46
+        </trim>
47
+    </insert>
48
+    
49
+</mapper>