Browse Source

feature: 系统管理->用户管理
1.增加新用户时根据系统参数是否自动开户逻辑处理
2.支付管理->账户管理增加了数据范围权限

luoyb 1 month ago
parent
commit
da3f4e8e00
29 changed files with 754 additions and 68 deletions
  1. 3 2
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteUserAccountService.java
  2. 9 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemoteUserAccountBo.java
  3. 4 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  4. 8 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java
  5. 90 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CardOpenEnum.java
  6. 98 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CardStatusEnum.java
  7. 90 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserAccountStatusEnum.java
  8. 1 0
      ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java
  9. 12 0
      ruoyi-common/ruoyi-common-sensitive/pom.xml
  10. 44 0
      ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveServiceImpl.java
  11. 9 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtParameterController.java
  12. 10 7
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtParameterServiceImpl.java
  13. 52 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/accouunt/UserAccountBusiness.java
  14. 97 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/card/CardBusiness.java
  15. 54 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/card/CardNoBusiness.java
  16. 0 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/bo/PtCardBo.java
  17. 6 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java
  18. 23 7
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java
  19. 16 10
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/dubbo/RemoteUserAccountServiceImpl.java
  20. 27 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/mapper/PtUserAccountMapper.java
  21. 3 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPtUserAccountService.java
  22. 13 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java
  23. 2 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java
  24. 7 10
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
  25. 1 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java
  26. 19 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java
  27. 5 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java
  28. 7 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java
  29. 44 20
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

+ 3 - 2
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteUserAccountService.java

@@ -1,6 +1,7 @@
1 1
 package org.dromara.backstage.api;
2 2
 
3 3
 import org.dromara.backstage.api.domain.bo.RemoteUserAccountBo;
4
+import org.dromara.common.core.domain.R;
4 5
 
5 6
 /**
6 7
  * name: RemoteUserAccountService
@@ -21,8 +22,8 @@ public interface RemoteUserAccountService {
21 22
      */
22 23
     Long queryCardTypeByUserId(Long userId);
23 24
 
24
-    //void insertByBo(RemoteUserAccountBo bo);
25
+    void insertByBo(RemoteUserAccountBo bo);
25 26
 
26
-    //void openAccount(RemoteUserAccountBo bo);
27
+    R<String> openAccount(RemoteUserAccountBo bo);
27 28
 
28 29
 }

+ 9 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemoteUserAccountBo.java

@@ -1,5 +1,6 @@
1 1
 package org.dromara.backstage.api.domain.bo;
2 2
 
3
+import com.alibaba.excel.annotation.ExcelProperty;
3 4
 import jakarta.validation.constraints.NotBlank;
4 5
 import jakarta.validation.constraints.NotNull;
5 6
 import lombok.Data;
@@ -38,6 +39,10 @@ public class RemoteUserAccountBo implements Serializable {
38 39
      */
39 40
     @NotNull(message = "部门Id不能为空", groups = { AddGroup.class, EditGroup.class })
40 41
     private Long deptId;
42
+    /**
43
+     * 账户名/登录账号
44
+     */
45
+    private String userName;
41 46
     /**
42 47
      * 学/工号
43 48
      */
@@ -54,6 +59,10 @@ public class RemoteUserAccountBo implements Serializable {
54 59
      */
55 60
     @NotBlank(message = "手机号码不能为空", groups = { AddGroup.class, EditGroup.class })
56 61
     private String phone;
62
+    /**
63
+     * 身份证号
64
+     */
65
+    private String idNumber;
57 66
     /**
58 67
      * 一卡通账户状态(0-未开户  1-已开户  -1已销户)
59 68
      */

+ 4 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -117,4 +117,8 @@ public interface CacheNames {
117 117
      * 房间信息
118 118
      */
119 119
     String PT_ROOM = "pt_room";
120
+    /**
121
+     * 卡流水号
122
+     */
123
+    String  CARD_NO = "card_no";
120 124
 }

+ 8 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java

@@ -77,6 +77,14 @@ public interface Constants {
77 77
      */
78 78
     Long TOP_PARENT_ID = 0L;
79 79
 
80
+    /**
81
+     * 收管理费
82
+     */
80 83
     String TAKE_COMMISSION = "1";
84
+
85
+    /**
86
+     * 自动创建一卡通账户
87
+     */
88
+    String AUTO_USER_ACCOUNT = "1";
81 89
 }
82 90
 

+ 90 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CardOpenEnum.java

@@ -0,0 +1,90 @@
1
+package org.dromara.common.core.enums;
2
+
3
+import java.util.ArrayList;
4
+import java.util.List;
5
+
6
+/**
7
+ * name: OpenCardEnum
8
+ * package: org.dromara.common.core.enums
9
+ * description: 一卡通账户开卡情况枚举
10
+ * date: 2024-09-14 09:29:23 09:29
11
+ *
12
+ * @author luoyibo
13
+ * @version 0.1
14
+ * @since JDK 1.8
15
+ */
16
+public enum CardOpenEnum {
17
+    /**
18
+     * 未开卡
19
+     */
20
+    NO(0, "未开卡"),
21
+    /**
22
+     * 实体卡
23
+     */
24
+    ENTITY(1, "实体卡"),
25
+    /**
26
+     * 虚拟卡
27
+     */
28
+    VIRTUAL(2, "虚拟卡");
29
+
30
+    private final Integer code;
31
+    private final String message;
32
+
33
+    CardOpenEnum(Integer code, String message) {
34
+        this.code = code;
35
+        this.message = message;
36
+    }
37
+
38
+    public Integer code() {
39
+        return this.code;
40
+    }
41
+
42
+    public String message() {
43
+        return this.message;
44
+    }
45
+
46
+    public static String getMessage(String name) {
47
+        for (CardOpenEnum item : CardOpenEnum.values()) {
48
+            if (item.name().equals(name)) {
49
+                return item.message;
50
+            }
51
+        }
52
+        return name;
53
+    }
54
+
55
+    public static String getMessage(int code) {
56
+        for (CardOpenEnum item : CardOpenEnum.values()) {
57
+            if (item.code().equals(code)) {
58
+                return item.message;
59
+            }
60
+        }
61
+        return "未知";
62
+    }
63
+
64
+    public static Integer getCode(String name) {
65
+        for (CardOpenEnum item : CardOpenEnum.values()) {
66
+            if (item.name().equals(name)) {
67
+                return item.code;
68
+            }
69
+        }
70
+        return null;
71
+    }
72
+
73
+    @Override
74
+    public String toString() {
75
+        return this.name();
76
+    }
77
+
78
+    /***
79
+     * 校验重复的code值
80
+     */
81
+    public static void main(String[] args) {
82
+        CardOpenEnum[] thisEnums = CardOpenEnum.values();
83
+        List<Integer> codeList = new ArrayList<>();
84
+        for (CardOpenEnum thisEnum : thisEnums) {
85
+            if (!codeList.contains(thisEnum.code)) {
86
+                codeList.add(thisEnum.code());
87
+            }
88
+        }
89
+    }
90
+}

+ 98 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CardStatusEnum.java

@@ -0,0 +1,98 @@
1
+package org.dromara.common.core.enums;
2
+
3
+import java.util.ArrayList;
4
+import java.util.List;
5
+
6
+/**
7
+ * name: CardStatusEnum
8
+ * package: org.dromara.common.core.enums
9
+ * description: 卡片状态枚举
10
+ * date: 2024-09-14 09:39:13 09:39
11
+ *
12
+ * @author luoyibo
13
+ * @version 0.1
14
+ * @since JDK 1.8
15
+ */
16
+public enum CardStatusEnum {
17
+    /**
18
+     * 正常
19
+     */
20
+    NORMAL(1, "正常"),
21
+    /**
22
+     * 挂失
23
+     */
24
+    LOCK(2, "挂失"),
25
+    /**
26
+     * 注销
27
+     */
28
+    CLOSE(3, "注销"),
29
+    /**
30
+     * 换卡
31
+     */
32
+    CHANGE(4, "换卡"),
33
+    /**
34
+     * 冻结
35
+     */
36
+    FREEZE(7, "冻结");
37
+
38
+    private final Integer code;
39
+    private final String message;
40
+
41
+    CardStatusEnum(Integer code, String message) {
42
+        this.code = code;
43
+        this.message = message;
44
+    }
45
+
46
+    public Integer code() {
47
+        return this.code;
48
+    }
49
+
50
+    public String message() {
51
+        return this.message;
52
+    }
53
+
54
+    public static String getMessage(String name) {
55
+        for (CardStatusEnum item : CardStatusEnum.values()) {
56
+            if (item.name().equals(name)) {
57
+                return item.message;
58
+            }
59
+        }
60
+        return name;
61
+    }
62
+
63
+    public static String getMessage(int code) {
64
+        for (CardStatusEnum item : CardStatusEnum.values()) {
65
+            if (item.code().equals(code)) {
66
+                return item.message;
67
+            }
68
+        }
69
+        return "未知";
70
+    }
71
+
72
+    public static Integer getCode(String name) {
73
+        for (CardStatusEnum item : CardStatusEnum.values()) {
74
+            if (item.name().equals(name)) {
75
+                return item.code;
76
+            }
77
+        }
78
+        return null;
79
+    }
80
+
81
+    @Override
82
+    public String toString() {
83
+        return this.name();
84
+    }
85
+
86
+    /***
87
+     * 校验重复的code值
88
+     */
89
+    public static void main(String[] args) {
90
+        CardStatusEnum[] thisEnums = CardStatusEnum.values();
91
+        List<Integer> codeList = new ArrayList<>();
92
+        for (CardStatusEnum thisEnum : thisEnums) {
93
+            if (!codeList.contains(thisEnum.code)) {
94
+                codeList.add(thisEnum.code());
95
+            }
96
+        }
97
+    }
98
+}

+ 90 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserAccountStatusEnum.java

@@ -0,0 +1,90 @@
1
+package org.dromara.common.core.enums;
2
+
3
+import java.util.ArrayList;
4
+import java.util.List;
5
+
6
+/**
7
+ * name: UserAccountStatusEnum
8
+ * package: org.dromara.common.core.enums
9
+ * description: 一卡通账户状态枚举
10
+ * date: 2024-09-14 09:08:21 09:08
11
+ *
12
+ * @author luoyibo
13
+ * @version 0.1
14
+ * @since JDK 1.8
15
+ */
16
+public enum UserAccountStatusEnum {
17
+    /**
18
+     * 未开户
19
+     */
20
+    NOT_OPEN(0, "未开户"),
21
+    /**
22
+     * 已开户
23
+     */
24
+    IS_OPEN(1, "已开户"),
25
+    /**
26
+     * 已销户
27
+     */
28
+    IS_CLOSE(-1, "已销户");
29
+
30
+    private final Integer code;
31
+    private final String message;
32
+
33
+    UserAccountStatusEnum(Integer code, String message) {
34
+        this.code = code;
35
+        this.message = message;
36
+    }
37
+
38
+    public Integer code() {
39
+        return this.code;
40
+    }
41
+
42
+    public String message() {
43
+        return this.message;
44
+    }
45
+
46
+    public static String getMessage(String name) {
47
+        for (UserAccountStatusEnum item : UserAccountStatusEnum.values()) {
48
+            if (item.name().equals(name)) {
49
+                return item.message;
50
+            }
51
+        }
52
+        return name;
53
+    }
54
+
55
+    public static String getMessage(int code) {
56
+        for (UserAccountStatusEnum item : UserAccountStatusEnum.values()) {
57
+            if (item.code().equals(code)) {
58
+                return item.message;
59
+            }
60
+        }
61
+        return "未知";
62
+    }
63
+
64
+    public static Integer getCode(String name) {
65
+        for (UserAccountStatusEnum item : UserAccountStatusEnum.values()) {
66
+            if (item.name().equals(name)) {
67
+                return item.code;
68
+            }
69
+        }
70
+        return null;
71
+    }
72
+
73
+    @Override
74
+    public String toString() {
75
+        return this.name();
76
+    }
77
+
78
+    /***
79
+     * 校验重复的code值
80
+     */
81
+    public static void main(String[] args) {
82
+        UserAccountStatusEnum[] thisEnums = UserAccountStatusEnum.values();
83
+        List<Integer> codeList = new ArrayList<>();
84
+        for (UserAccountStatusEnum thisEnum : thisEnums) {
85
+            if (!codeList.contains(thisEnum.code)) {
86
+                codeList.add(thisEnum.code());
87
+            }
88
+        }
89
+    }
90
+}

+ 1 - 0
ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java

@@ -207,6 +207,7 @@ public class RedisUtils {
207 207
      */
208 208
     public static <T> T getCacheObject(final String key) {
209 209
         RBucket<T> rBucket = CLIENT.getBucket(key);
210
+
210 211
         return rBucket.get();
211 212
     }
212 213
 

+ 12 - 0
ruoyi-common/ruoyi-common-sensitive/pom.xml

@@ -20,6 +20,18 @@
20 20
             <groupId>org.dromara</groupId>
21 21
             <artifactId>ruoyi-common-json</artifactId>
22 22
         </dependency>
23
+        <dependency>
24
+            <groupId>cn.dev33</groupId>
25
+            <artifactId>sa-token-core</artifactId>
26
+        </dependency>
27
+        <dependency>
28
+            <groupId>org.dromara</groupId>
29
+            <artifactId>ruoyi-common-satoken</artifactId>
30
+        </dependency>
31
+        <dependency>
32
+            <groupId>org.dromara</groupId>
33
+            <artifactId>ruoyi-common-tenant</artifactId>
34
+        </dependency>
23 35
     </dependencies>
24 36
 
25 37
 </project>

+ 44 - 0
ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveServiceImpl.java

@@ -0,0 +1,44 @@
1
+package org.dromara.common.sensitive.core;
2
+
3
+import cn.dev33.satoken.stp.StpUtil;
4
+import org.dromara.common.core.utils.StringUtils;
5
+import org.dromara.common.satoken.utils.LoginHelper;
6
+import org.dromara.common.tenant.helper.TenantHelper;
7
+import org.springframework.stereotype.Service;
8
+
9
+/**
10
+ * 脱敏服务
11
+ * 默认管理员不过滤
12
+ * 需自行根据业务重写实现
13
+ *
14
+ * @author Lion Li
15
+ */
16
+@Service
17
+public class SensitiveServiceImpl implements SensitiveService {
18
+    /**
19
+     * 是否脱敏
20
+     */
21
+    @Override
22
+    public boolean isSensitive(String roleKey, String perms) {
23
+        if (!LoginHelper.isLogin()) {
24
+            return true;
25
+        }
26
+        boolean roleExist = StringUtils.isNotBlank(roleKey);
27
+        boolean permsExist = StringUtils.isNotBlank(perms);
28
+        if (roleExist && permsExist) {
29
+            if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) {
30
+                return false;
31
+            }
32
+        } else if (roleExist && StpUtil.hasRole(roleKey)) {
33
+            return false;
34
+        } else if (permsExist && StpUtil.hasPermission(perms)) {
35
+            return false;
36
+        }
37
+
38
+        if (TenantHelper.isEnable()) {
39
+            return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin();
40
+        }
41
+        return !LoginHelper.isSuperAdmin();
42
+    }
43
+
44
+}

+ 9 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtParameterController.java

@@ -103,4 +103,13 @@ public class PtParameterController extends BaseController {
103 103
                           @PathVariable Long[] paramIds) {
104 104
         return toAjax(ptParameterService.deleteWithValidByIds(List.of(paramIds), true));
105 105
     }
106
+    /**
107
+     * 根据参数键名查询参数值
108
+     *
109
+     * @param paramCode 参数Key
110
+     */
111
+    @GetMapping(value = "/paramCode/{paramCode}")
112
+    public R<String> getConfigKey(@PathVariable String paramCode) {
113
+        return R.ok("操作成功", ptParameterService.selectParamByCode(paramCode));
114
+    }
106 115
 }

+ 10 - 7
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtParameterServiceImpl.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
10 10
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
11 11
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
12 12
 import lombok.RequiredArgsConstructor;
13
+import org.springframework.cache.annotation.CacheEvict;
13 14
 import org.springframework.cache.annotation.Cacheable;
14 15
 import org.springframework.stereotype.Service;
15 16
 import org.dromara.backstage.basics.domain.bo.PtParameterBo;
@@ -85,6 +86,7 @@ public class PtParameterServiceImpl implements IPtParameterService {
85 86
      * @param bo 系统参数
86 87
      * @return 是否新增成功
87 88
      */
89
+    @Cacheable(cacheNames = CacheNames.PT_PARAMETER, key = "#bo.paramCode")
88 90
     @Override
89 91
     public Boolean insertByBo(PtParameterBo bo) {
90 92
         PtParameter add = MapstructUtils.convert(bo, PtParameter.class);
@@ -102,6 +104,7 @@ public class PtParameterServiceImpl implements IPtParameterService {
102 104
      * @param bo 系统参数
103 105
      * @return 是否修改成功
104 106
      */
107
+    @CacheEvict(cacheNames = CacheNames.PT_PARAMETER, key = "#bo.paramCode")
105 108
     @Override
106 109
     public Boolean updateByBo(PtParameterBo bo) {
107 110
         PtParameter update = MapstructUtils.convert(bo, PtParameter.class);
@@ -109,13 +112,6 @@ public class PtParameterServiceImpl implements IPtParameterService {
109 112
         return baseMapper.updateById(update) > 0;
110 113
     }
111 114
 
112
-    /**
113
-     * 保存前的数据校验
114
-     */
115
-    private void validEntityBeforeSave(PtParameter entity){
116
-        //TODO 做一些数据校验,如唯一约束
117
-    }
118
-
119 115
     /**
120 116
      * 校验并批量删除系统参数信息
121 117
      *
@@ -123,6 +119,7 @@ public class PtParameterServiceImpl implements IPtParameterService {
123 119
      * @param isValid 是否进行有效性校验
124 120
      * @return 是否删除成功
125 121
      */
122
+    @CacheEvict(cacheNames = CacheNames.PT_PARAMETER, allEntries = true)
126 123
     @Override
127 124
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
128 125
         if(isValid){
@@ -146,4 +143,10 @@ public class PtParameterServiceImpl implements IPtParameterService {
146 143
         }
147 144
         return StringUtils.EMPTY;
148 145
     }
146
+    /**
147
+     * 保存前的数据校验
148
+     */
149
+    private void validEntityBeforeSave(PtParameter entity){
150
+        //TODO 做一些数据校验,如唯一约束
151
+    }
149 152
 }

+ 52 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/accouunt/UserAccountBusiness.java

@@ -0,0 +1,52 @@
1
+package org.dromara.backstage.business.accouunt;
2
+
3
+/**
4
+ * name: UserAccountBusiness
5
+ * package: org.dromara.backstage.business.accouunt
6
+ * description: 一卡通账户业务处理逻辑
7
+ * date: 2024-09-14 10:45:04 10:45
8
+ *
9
+ * @author luoyibo
10
+ * @version 0.1
11
+ * @since JDK 1.8
12
+ */
13
+
14
+import cn.hutool.core.bean.BeanUtil;
15
+import lombok.RequiredArgsConstructor;
16
+import lombok.extern.slf4j.Slf4j;
17
+import org.dromara.backstage.business.card.CardBusiness;
18
+import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
19
+import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
20
+import org.dromara.backstage.payment.service.IPtBagService;
21
+import org.dromara.backstage.payment.service.IPtUserAccountService;
22
+import org.dromara.common.core.domain.R;
23
+import org.springframework.stereotype.Service;
24
+
25
+import java.text.MessageFormat;
26
+
27
+@RequiredArgsConstructor
28
+@Service
29
+@Slf4j
30
+public class UserAccountBusiness {
31
+    private final IPtUserAccountService ptUserAccountService;
32
+    private final IPtBagService bagService;
33
+    private final CardBusiness cardBusiness;
34
+
35
+    /**
36
+     * 开通一卡通账户
37
+     * @param bo 一卡通账户业务
38
+     * @return 开通结果
39
+     */
40
+    public R<String> openAccount(PtUserAccountBo bo) {
41
+        //写账户表
42
+        boolean flag = ptUserAccountService.insertByBo(bo);
43
+        if (flag) {
44
+            //写账户表成功,初始化钱包表
45
+            bagService.initAccountBag(bo.getUserId());
46
+            //钱包表初始化成功,同时发虚拟卡
47
+            PtCardBo cardBo = BeanUtil.copyProperties(bo, PtCardBo.class);
48
+            return cardBusiness.openVirtualCard(cardBo);
49
+        }
50
+        return R.fail(MessageFormat.format("[一卡通开户]-[失败]-[写账户表失败,开户Id:{0}]", bo.getUserId()));
51
+    }
52
+}

+ 97 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/card/CardBusiness.java

@@ -0,0 +1,97 @@
1
+package org.dromara.backstage.business.card;
2
+
3
+import cn.hutool.core.bean.BeanUtil;
4
+import cn.hutool.core.date.DateUtil;
5
+import lombok.RequiredArgsConstructor;
6
+import lombok.extern.slf4j.Slf4j;
7
+import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
8
+import org.dromara.backstage.cardCenter.service.IPtCardService;
9
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
10
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
11
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
12
+import org.dromara.backstage.payment.service.IPtBagService;
13
+import org.dromara.backstage.payment.service.IPtUserAccountService;
14
+import org.dromara.common.core.domain.R;
15
+import org.dromara.common.core.enums.CardOpenEnum;
16
+import org.dromara.common.core.enums.CardStatusEnum;
17
+import org.dromara.common.core.enums.UserAccountStatusEnum;
18
+import org.springframework.stereotype.Service;
19
+
20
+import java.text.MessageFormat;
21
+import java.util.List;
22
+
23
+/**
24
+ * name: CardBusiness
25
+ * package: org.dromara.backstage.business.card
26
+ * description: 卡片业务处理
27
+ * date: 2024-09-12 20:25:23 20:25
28
+ *
29
+ * @author luoyibo
30
+ * @version 0.1
31
+ * @since JDK 1.8
32
+ */
33
+@RequiredArgsConstructor
34
+@Service
35
+@Slf4j
36
+public class CardBusiness {
37
+    private final IPtCardService ptCardService;
38
+    private final IPtUserAccountService userAccountService;
39
+    private final CardNoBusiness cardNoBusiness;
40
+    private final IPtBagService ptBagService;
41
+    public R<String> openVirtualCard(PtCardBo cardBo){
42
+        String resultMsg;
43
+        //验证是否存在开通虚拟卡的账户
44
+        PtUserAccountVo userAccountVo = userAccountService.queryById(cardBo.getUserId());
45
+        if(userAccountVo == null){
46
+            resultMsg = MessageFormat.format("[开通虚拟卡]-[失败]-[无此账户,账户Id:{0}]", cardBo.getUserId());
47
+            log.info(resultMsg);
48
+            return R.fail(resultMsg);
49
+        }
50
+        if(Integer.parseInt(userAccountVo.getAccountStatus())!= UserAccountStatusEnum.IS_OPEN.code()){
51
+            resultMsg = MessageFormat.format("[开通虚拟卡]-[失败]-[此账户尚未开户,账户Id:{0}]", cardBo.getUserId());
52
+            log.info(resultMsg);
53
+            return R.fail(resultMsg);
54
+        }
55
+        //检查当前账户是否存在正常、挂失或冻结的卡片,如果有这些卡片,表明账户是发过卡的,无须再开通虚拟卡
56
+        String cardInfo = ptCardService.selectAccountCardByIds(cardBo.getUserId().toString());
57
+        if(CardOpenEnum.NO.message().equals(cardInfo)){
58
+            //没有卡片,开通虚拟卡
59
+            PtCardBo addBo = BeanUtil.copyProperties(cardBo, PtCardBo.class);
60
+            addBo.setMainCard("Y");
61
+            addBo.setStatus(CardStatusEnum.NORMAL.code().toString());
62
+            addBo.setCardNo(cardNoBusiness.getCardNo());
63
+            addBo.setFactoryId(0L);
64
+            addBo.setChangeTime(DateUtil.date());
65
+
66
+            if(ptCardService.insertByBo(addBo)){
67
+                //写卡片表成功,检查一下是否还需要初始化钱包表
68
+                PtBagBo bagBo = new PtBagBo();
69
+                bagBo.setUserId(cardBo.getUserId());
70
+                List<PtBagVo> bagVos = ptBagService.queryList(bagBo);
71
+                if(bagVos==null || bagVos.isEmpty()){
72
+                    //如果没有钱包数据,初始化钱包数据
73
+                    if(ptBagService.initAccountBag(cardBo.getUserId())){
74
+                        resultMsg = MessageFormat.format("[开通虚拟卡]-[成功]-[开卡账户Id:{0}]", cardBo.getUserId());
75
+                        return R.ok(resultMsg);
76
+                    } else {
77
+                        resultMsg = MessageFormat.format("[开通虚拟卡]-[失败]-[写钱包数据表失败,账户Id:{0}]", cardBo.getUserId());
78
+                        log.info(resultMsg);
79
+                        return R.fail(resultMsg);
80
+                    }
81
+                } else {
82
+                    //已有钱包数据,不需要再初始化钱包,直接返回成功
83
+                    resultMsg = MessageFormat.format("[开通虚拟卡]-[成功]-[开卡账户Id:{0}]", cardBo.getUserId());
84
+                    return R.ok(resultMsg);
85
+                }
86
+            } else {
87
+                resultMsg = MessageFormat.format("[开通虚拟卡]-[失败]-[写卡片数据表失败,账户Id:{0}]", cardBo.getUserId());
88
+                log.info(resultMsg);
89
+                return R.fail(resultMsg);
90
+            }
91
+        } else {
92
+            //已开过卡了,无须再开虚拟卡,直接返回成功
93
+            resultMsg = MessageFormat.format("[开通虚拟卡]-[成功]-[账户已有卡片,开卡账户Id:{0}]", cardBo.getUserId());
94
+            return R.ok(resultMsg);
95
+        }
96
+    }
97
+}

+ 54 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/card/CardNoBusiness.java

@@ -0,0 +1,54 @@
1
+package org.dromara.backstage.business.card;
2
+
3
+import lombok.RequiredArgsConstructor;
4
+import lombok.extern.slf4j.Slf4j;
5
+import org.dromara.backstage.cardCenter.service.IPtCardService;
6
+import org.springframework.boot.CommandLineRunner;
7
+import org.springframework.scheduling.annotation.Scheduled;
8
+import org.springframework.stereotype.Service;
9
+
10
+import java.util.Objects;
11
+import java.util.concurrent.LinkedBlockingQueue;
12
+
13
+/**
14
+ * name: CardNoBusiness
15
+ * package: org.dromara.backstage.business.card
16
+ * description: 卡流水号处理业务
17
+ * 每天定时生成可用的卡流水号并写入缓存,发卡时顺序获取
18
+ * date: 2024-09-12 20:34:45 20:34
19
+ *
20
+ * @author luoyibo
21
+ * @version 0.1
22
+ * @since JDK 1.8
23
+ */
24
+@RequiredArgsConstructor
25
+@Service
26
+@Slf4j
27
+public class CardNoBusiness implements CommandLineRunner {
28
+    private final IPtCardService ptCardService;
29
+
30
+    private static final LinkedBlockingQueue<Integer> concurrentLinkedQueue = new LinkedBlockingQueue<Integer>();
31
+
32
+    @Scheduled(cron = "0 0 1 * * ?")
33
+    public void setCardNo() {
34
+        synchronized (concurrentLinkedQueue) {
35
+            concurrentLinkedQueue.clear();
36
+            long maxCardNo = 100;
37
+            Long dbCardNo = ptCardService.getMaxCardNo();
38
+            maxCardNo = maxCardNo > dbCardNo ? maxCardNo : dbCardNo;
39
+            for (long i = maxCardNo+1; i < maxCardNo+10000; i++) {
40
+                concurrentLinkedQueue.add(Math.toIntExact(i));
41
+            }
42
+        }
43
+    }
44
+    public Long getCardNo() {
45
+        synchronized (concurrentLinkedQueue) {
46
+            return Long.valueOf(Objects.requireNonNull(concurrentLinkedQueue.poll()));
47
+        }
48
+    }
49
+
50
+    @Override
51
+    public void run(String... args) throws Exception {
52
+        setCardNo();
53
+    }
54
+}

+ 0 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/bo/PtCardBo.java

@@ -25,7 +25,6 @@ public class PtCardBo extends BaseEntity {
25 25
     /**
26 26
      * 卡片Id,主键
27 27
      */
28
-    @NotNull(message = "卡片Id,主键不能为空", groups = { EditGroup.class })
29 28
     private Long cardId;
30 29
 
31 30
     /**
@@ -37,7 +36,6 @@ public class PtCardBo extends BaseEntity {
37 36
     /**
38 37
      * 卡流水号
39 38
      */
40
-    @NotNull(message = "卡流水号不能为空", groups = { AddGroup.class, EditGroup.class })
41 39
     private Long cardNo;
42 40
 
43 41
     /**
@@ -55,19 +53,16 @@ public class PtCardBo extends BaseEntity {
55 53
     /**
56 54
      * 物理卡号
57 55
      */
58
-    @NotNull(message = "物理卡号不能为空", groups = { AddGroup.class, EditGroup.class })
59 56
     private Long factoryId;
60 57
 
61 58
     /**
62 59
      * 是否主卡,见sys_yes_no字典类别
63 60
      */
64
-    @NotBlank(message = "是否主卡,见sys_yes_no字典类别不能为空", groups = { AddGroup.class, EditGroup.class })
65 61
     private String mainCard;
66 62
 
67 63
     /**
68 64
      * 卡片状态,见KZT字典类别
69 65
      */
70
-    @NotBlank(message = "卡片状态,见KZT字典类别不能为空", groups = { AddGroup.class, EditGroup.class })
71 66
     private String status;
72 67
 
73 68
     /**

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java

@@ -134,4 +134,10 @@ public interface IPtCardService {
134 134
      * @return 卡片信息
135 135
      */
136 136
     PtCardVo queryCardByCardNo(Long cardNo);
137
+
138
+    /**
139
+     * 获取已有的最大卡流水号
140
+     * @return 最大卡流水号
141
+     */
142
+    Long getMaxCardNo();
137 143
 }

+ 23 - 7
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java

@@ -3,6 +3,7 @@ package org.dromara.backstage.cardCenter.service.impl;
3 3
 import cn.hutool.core.convert.Convert;
4 4
 import cn.hutool.core.date.DateUtil;
5 5
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
6
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
6 7
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
7 8
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
8 9
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -18,8 +19,8 @@ import org.dromara.backstage.cardCenter.service.IPtCardService;
18 19
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
19 20
 import org.dromara.common.core.constant.CacheNames;
20 21
 import org.dromara.common.core.constant.Constants;
22
+import org.dromara.common.core.enums.CardOpenEnum;
21 23
 import org.dromara.common.core.utils.MapstructUtils;
22
-import org.dromara.common.core.utils.SpringUtils;
23 24
 import org.dromara.common.core.utils.StringUtils;
24 25
 import org.dromara.common.mybatis.core.page.PageQuery;
25 26
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -209,15 +210,15 @@ public class PtCardServiceImpl implements IPtCardService {
209 210
     public String selectAccountCardByIds(String userIds) {
210 211
         List<String> list = new ArrayList<>();
211 212
         for (Long id : StringUtils.splitTo(userIds, Convert::toLong)) {
212
-            PtCardBo bo = new PtCardBo();
213
-            bo.setStatus("1");
214
-            bo.setUserId(id);
213
+            LambdaQueryWrapper<PtCard> lqw = new LambdaQueryWrapper<>();
214
+            lqw.eq(PtCard::getUserId, id);
215
+            lqw.in(PtCard::getStatus,"1","2","7");
215 216
 
216
-            List<PtCardVo> listVo = SpringUtils.getAopProxy(this).queryList(bo);
217
+            List<PtCardVo> listVo = baseMapper.selectVoList(lqw,PtCardVo.class);
217 218
             if (listVo.isEmpty()) {
218
-                list.add("未发卡");
219
+                list.add(CardOpenEnum.NO.message());
219 220
             } else {
220
-                String cardInfo = listVo.stream().anyMatch(p -> p.getFactoryId() == 0) ? "虚拟卡" : "实体卡";
221
+                String cardInfo = listVo.stream().anyMatch(p -> p.getFactoryId() == 0) ? CardOpenEnum.VIRTUAL.message() : CardOpenEnum.ENTITY.message();
221 222
                 list.add(cardInfo);
222 223
             }
223 224
         }
@@ -326,4 +327,19 @@ public class PtCardServiceImpl implements IPtCardService {
326 327
         }
327 328
         return null;
328 329
     }
330
+
331
+    /**
332
+     * 获取已有的最大卡流水号
333
+     * @return 最大卡流水号
334
+     */
335
+    @Override
336
+    public Long getMaxCardNo() {
337
+        QueryWrapper<PtCard> lqw = new QueryWrapper<>();
338
+        lqw.select("max(card_no) as card_no");
339
+        lqw.in("status", "1","2","7");
340
+        lqw.eq("tenant_id", "20200813044411");
341
+        PtCard card = baseMapper.selectOne(lqw);
342
+
343
+        return card.getCardNo();
344
+    }
329 345
 }

+ 16 - 10
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/dubbo/RemoteUserAccountServiceImpl.java

@@ -1,9 +1,14 @@
1 1
 package org.dromara.backstage.payment.dubbo;
2 2
 
3
+import cn.hutool.core.bean.BeanUtil;
3 4
 import lombok.RequiredArgsConstructor;
4 5
 import org.apache.dubbo.config.annotation.DubboService;
5 6
 import org.dromara.backstage.api.RemoteUserAccountService;
7
+import org.dromara.backstage.api.domain.bo.RemoteUserAccountBo;
8
+import org.dromara.backstage.business.accouunt.UserAccountBusiness;
9
+import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
6 10
 import org.dromara.backstage.payment.service.IPtUserAccountService;
11
+import org.dromara.common.core.domain.R;
7 12
 import org.springframework.stereotype.Service;
8 13
 
9 14
 /**
@@ -21,6 +26,7 @@ import org.springframework.stereotype.Service;
21 26
 @DubboService
22 27
 public class RemoteUserAccountServiceImpl implements RemoteUserAccountService {
23 28
     private final IPtUserAccountService userAccountService;
29
+    private final UserAccountBusiness userAccountBusiness;
24 30
     /**
25 31
      * 根据人员账户Id获取账户的卡类
26 32
      *
@@ -32,15 +38,15 @@ public class RemoteUserAccountServiceImpl implements RemoteUserAccountService {
32 38
         return userAccountService.queryById(userId).getCardType();
33 39
     }
34 40
 
35
-    //@Override
36
-    //public void insertByBo(RemoteUserAccountBo bo) {
37
-    //    PtUserAccountBo ptUserAccountBo = BeanUtil.copyProperties(bo, PtUserAccountBo.class);
38
-    //    userAccountService.insertByBo(ptUserAccountBo);
39
-    //}
41
+    @Override
42
+    public void insertByBo(RemoteUserAccountBo bo) {
43
+        PtUserAccountBo ptUserAccountBo = BeanUtil.copyProperties(bo, PtUserAccountBo.class);
44
+        userAccountService.insertByBo(ptUserAccountBo);
45
+    }
40 46
 
41
-    //@Override
42
-    //public void openAccount(RemoteUserAccountBo bo) {
43
-    //    PtUserAccountBo ptUserAccountBo = BeanUtil.copyProperties(bo, PtUserAccountBo.class);
44
-    //    userAccountService.openAccount(ptUserAccountBo);
45
-    //}
47
+    @Override
48
+    public R<String> openAccount(RemoteUserAccountBo bo) {
49
+        PtUserAccountBo ptUserAccountBo = BeanUtil.copyProperties(bo, PtUserAccountBo.class);
50
+        return userAccountBusiness.openAccount(ptUserAccountBo);
51
+    }
46 52
 }

+ 27 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/mapper/PtUserAccountMapper.java

@@ -1,15 +1,25 @@
1 1
 package org.dromara.backstage.payment.mapper;
2 2
 
3
+import cn.hutool.core.collection.CollUtil;
3 4
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
5
+import com.baomidou.mybatisplus.core.metadata.IPage;
6
+import com.baomidou.mybatisplus.core.toolkit.Constants;
4 7
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
5 8
 import org.apache.ibatis.annotations.Param;
9
+import org.apache.poi.ss.formula.functions.T;
10
+import org.checkerframework.checker.units.qual.C;
6 11
 import org.dromara.backstage.basics.domain.PtOperator;
7 12
 import org.dromara.backstage.basics.domain.vo.PtOperatorVo;
8 13
 import org.dromara.backstage.payment.domain.PtUserAccount;
9 14
 import org.dromara.backstage.payment.domain.vo.PtUserAccount4SelectVo;
10 15
 import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
16
+import org.dromara.common.core.utils.MapstructUtils;
17
+import org.dromara.common.mybatis.annotation.DataColumn;
18
+import org.dromara.common.mybatis.annotation.DataPermission;
11 19
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
12 20
 
21
+import java.util.List;
22
+
13 23
 /**
14 24
  * 一卡通账户Mapper接口
15 25
  *
@@ -20,4 +30,21 @@ public interface PtUserAccountMapper extends BaseMapperPlus<PtUserAccount, PtUse
20 30
 
21 31
     Page<PtUserAccount4SelectVo> customPageList(@Param("page") Page<PtUserAccount> page, @Param("ew") Wrapper<PtUserAccount> wrapper);
22 32
 
33
+    @Override
34
+    @DataPermission({
35
+        @DataColumn(key = "deptName", value = "dept_id"),
36
+    })
37
+    List<PtUserAccount> selectList(@Param(Constants.WRAPPER) Wrapper<PtUserAccount> queryWrapper);
38
+
39
+    default Page<PtUserAccountVo>customSelectVoPage(Page<PtUserAccount> page, Wrapper<PtUserAccount> wrapper){
40
+        // 根据条件分页查询实体对象列表
41
+        List<PtUserAccount> list = this.selectList(page, wrapper);
42
+        // 创建一个新的VO对象分页列表,并设置分页信息
43
+        Page<PtUserAccountVo> voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
44
+        if (CollUtil.isEmpty(list)) {
45
+            return voPage;
46
+        }
47
+        voPage.setRecords(MapstructUtils.convert(list, PtUserAccountVo.class));
48
+        return voPage;
49
+    }
23 50
 }

+ 3 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPtUserAccountService.java

@@ -3,6 +3,7 @@ package org.dromara.backstage.payment.service;
3 3
 import org.dromara.backstage.payment.domain.vo.PtUserAccount4SelectVo;
4 4
 import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
5 5
 import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
6
+import org.dromara.common.core.domain.R;
6 7
 import org.dromara.common.mybatis.core.page.TableDataInfo;
7 8
 import org.dromara.common.mybatis.core.page.PageQuery;
8 9
 import org.springframework.web.multipart.MultipartFile;
@@ -136,10 +137,11 @@ public interface IPtUserAccountService {
136 137
 
137 138
     /**
138 139
      * 开户
140
+     *
139 141
      * @param bo 账户业务对象
140 142
      * @return 开户结果
141 143
      */
142
-    int openAccount(PtUserAccountBo bo);
144
+    R<String> openAccount(PtUserAccountBo bo);
143 145
     /*
144 146
      * 销户
145 147
      *

+ 13 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java

@@ -1,14 +1,17 @@
1 1
 package org.dromara.backstage.payment.service.impl;
2 2
 
3
+import cn.hutool.core.bean.BeanUtil;
3 4
 import cn.hutool.core.io.FileUtil;
4 5
 import cn.hutool.core.lang.UUID;
5 6
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
6 7
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
7 8
 import lombok.extern.slf4j.Slf4j;
8 9
 import org.apache.dubbo.config.annotation.DubboReference;
10
+import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
9 11
 import org.dromara.backstage.cardCenter.service.IPtCardService;
10 12
 import org.dromara.backstage.payment.domain.vo.PtUserAccount4SelectVo;
11 13
 import org.dromara.backstage.payment.service.IPtBagService;
14
+import org.dromara.common.core.domain.R;
12 15
 import org.dromara.common.core.utils.MapstructUtils;
13 16
 import org.dromara.common.core.utils.StringUtils;
14 17
 import org.dromara.common.core.utils.file.FileUtils;
@@ -30,6 +33,7 @@ import org.springframework.web.multipart.MultipartFile;
30 33
 
31 34
 import java.io.IOException;
32 35
 import java.math.BigDecimal;
36
+import java.text.MessageFormat;
33 37
 import java.util.*;
34 38
 import java.util.stream.Collectors;
35 39
 
@@ -47,6 +51,7 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
47 51
     private final PtUserAccountMapper baseMapper;
48 52
     private final IPtCardService ptCardService;
49 53
     private final IPtBagService bagService;
54
+    //private final CardBusiness cardBusiness;
50 55
 
51 56
     @DubboReference
52 57
     private final RemoteDeptService remoteDeptService;
@@ -79,7 +84,8 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
79 84
         LambdaQueryWrapper<PtUserAccount> lqw = buildQueryWrapper(bo);
80 85
         lqw.orderByAsc(PtUserAccount::getDeptId)
81 86
             .orderByAsc(PtUserAccount::getRealName);
82
-        Page<PtUserAccountVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
87
+        //Page<PtUserAccountVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
88
+        Page<PtUserAccountVo> result = baseMapper.customSelectVoPage(pageQuery.build(), lqw);
83 89
         return TableDataInfo.build(result);
84 90
     }
85 91
 
@@ -329,11 +335,12 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
329 335
     }
330 336
     /**
331 337
      * 开户
338
+     *
332 339
      * @param bo 账户业务对象
333 340
      * @return 开户结果
334 341
      */
335 342
     @Override
336
-    public int openAccount(PtUserAccountBo bo) {
343
+    public R<String> openAccount(PtUserAccountBo bo) {
337 344
         PtUserAccount add = MapstructUtils.convert(bo, PtUserAccount.class);
338 345
         validEntityBeforeSave(add);
339 346
         boolean flag = baseMapper.insert(add) > 0;
@@ -342,8 +349,11 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
342 349
                 bo.setUserId(add.getUserId());
343 350
             }
344 351
             bagService.initAccountBag(bo.getUserId());
352
+            PtCardBo cardBo = BeanUtil.copyProperties(add, PtCardBo.class);
353
+            //return cardBusiness.openVirtualCard(cardBo);
354
+
345 355
         }
346
-        return 0;
356
+        return R.fail(MessageFormat.format("[一卡通开户]-[失败]-[写账户表失败,开户Id:{0}]",bo.getUserId()));
347 357
     }
348 358
 
349 359
     /*

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java

@@ -71,10 +71,10 @@ public class SysProfileController extends BaseController {
71 71
         SysUserBo user = BeanUtil.toBean(profile, SysUserBo.class);
72 72
         user.setUserId(LoginHelper.getUserId());
73 73
         String username = LoginHelper.getUsername();
74
-        if (StringUtils.isNotEmpty(user.getPhone()) && !userService.checkPhoneUnique(user)) {
74
+        if (StringUtils.isNotEmpty(user.getPhone()) && userService.checkPhoneUnique(user)) {
75 75
             return R.fail("修改用户'" + username + "'失败,手机号码已存在");
76 76
         }
77
-        if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
77
+        if (StringUtils.isNotEmpty(user.getEmail()) && userService.checkEmailUnique(user)) {
78 78
             return R.fail("修改用户'" + username + "'失败,邮箱账号已存在");
79 79
         }
80 80
         if (userService.updateUserProfile(user) > 0) {

+ 7 - 10
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java

@@ -154,18 +154,17 @@ public class SysUserController extends BaseController {
154 154
     @PostMapping
155 155
     public R<Void> add(@Validated @RequestBody SysUserBo user) {
156 156
         deptService.checkDeptDataScope(user.getDeptId());
157
-        if (!userService.checkUserNameUnique(user)) {
157
+        if (userService.checkUserNameUnique(user)) {
158 158
             return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
159
-        } else if (StringUtils.isNotEmpty(user.getPhone()) && !userService.checkPhoneUnique(user)) {
160
-            return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
161
-        } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
162
-            return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
159
+        } else if (StringUtils.isNotEmpty(user.getUserNumb()) && userService.checkUserNumbUnique(user)) {
160
+            return R.fail("新增用户'" + user.getUserName() + "'失败,学/工号已存在");
163 161
         }
164 162
         if (TenantHelper.isEnable()) {
165 163
             if (!tenantService.checkAccountBalance(TenantHelper.getTenantId())) {
166 164
                 return R.fail("当前租户下用户名额不足,请联系管理员");
167 165
             }
168 166
         }
167
+        user.setNickName(user.getRealName());
169 168
         user.setPassword(BCrypt.hashpw(user.getPassword()));
170 169
         return toAjax(userService.insertUser(user));
171 170
     }
@@ -180,12 +179,10 @@ public class SysUserController extends BaseController {
180 179
         userService.checkUserAllowed(user.getUserId());
181 180
         userService.checkUserDataScope(user.getUserId());
182 181
         deptService.checkDeptDataScope(user.getDeptId());
183
-        if (!userService.checkUserNameUnique(user)) {
182
+        if (userService.checkUserNameUnique(user)) {
184 183
             return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
185
-        } else if (StringUtils.isNotEmpty(user.getPhone()) && !userService.checkPhoneUnique(user)) {
186
-            return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
187
-        } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
188
-            return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
184
+        } else if (StringUtils.isNotEmpty(user.getUserNumb()) && userService.checkUserNumbUnique(user)) {
185
+            return R.fail("修改用户'" + user.getUserName() + "'失败,学/工号已存在");
189 186
         }
190 187
         return toAjax(userService.updateUser(user));
191 188
     }

+ 1 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java

@@ -66,6 +66,7 @@ public class SysUser extends TenantEntity {
66 66
     /**
67 67
      * 身份证号
68 68
      */
69
+    @EncryptField(algorithm = AlgorithmType.BASE64)
69 70
     private String idNumber;
70 71
 
71 72
     /**

+ 19 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java

@@ -3,15 +3,20 @@ package org.dromara.system.domain.bo;
3 3
 import io.github.linpeilie.annotations.AutoMapper;
4 4
 import jakarta.validation.constraints.Email;
5 5
 import jakarta.validation.constraints.NotBlank;
6
+import jakarta.validation.constraints.NotNull;
6 7
 import jakarta.validation.constraints.Size;
7 8
 import lombok.Data;
8 9
 import lombok.EqualsAndHashCode;
9 10
 import lombok.NoArgsConstructor;
10 11
 import org.dromara.common.core.constant.UserConstants;
12
+import org.dromara.common.core.validate.AddGroup;
13
+import org.dromara.common.core.validate.EditGroup;
11 14
 import org.dromara.common.core.xss.Xss;
12 15
 import org.dromara.common.mybatis.core.domain.BaseEntity;
13 16
 import org.dromara.system.domain.SysUser;
14 17
 
18
+import java.util.Date;
19
+
15 20
 /**
16 21
  * 用户信息业务对象 sys_user
17 22
  *
@@ -118,6 +123,20 @@ public class SysUserBo extends BaseEntity {
118 123
      */
119 124
     private Long roleId;
120 125
 
126
+    /**
127
+     * 账户卡片类型
128
+     */
129
+    private Long cardType;
130
+
131
+    /**
132
+     * 账户有效期
133
+     */
134
+    private Date lifespan;
135
+
136
+    /**
137
+     * 身份证号
138
+     */
139
+    private String idNumber;
121 140
     /**
122 141
      * 排除不查询的用户(工作流用)
123 142
      */

+ 5 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java

@@ -77,7 +77,7 @@ public class SysUserVo implements Serializable {
77 77
     /**
78 78
      * 用户邮箱
79 79
      */
80
-    @Sensitive(strategy = SensitiveStrategy.EMAIL)
80
+    //@Sensitive(strategy = SensitiveStrategy.EMAIL,perms = "system:user:query")
81 81
     private String email;
82 82
 
83 83
     /**
@@ -91,6 +91,10 @@ public class SysUserVo implements Serializable {
91 91
      */
92 92
     private String sex;
93 93
 
94
+    /**
95
+     * 身份证号
96
+     */
97
+    private String idNumber;
94 98
     /**
95 99
      * 头像地址
96 100
      */

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java

@@ -115,6 +115,13 @@ public interface ISysUserService {
115 115
      */
116 116
     boolean checkEmailUnique(SysUserBo user);
117 117
 
118
+    /**
119
+     * 校验学/工号是否唯一
120
+     *
121
+     * @param user 用户信息
122
+     * @return 结果
123
+     */
124
+    boolean checkUserNumbUnique(SysUserBo user);
118 125
     /**
119 126
      * 校验用户是否允许操作
120 127
      *

+ 44 - 20
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -18,8 +18,12 @@ import org.dromara.backstage.api.RemotePtParameterService;
18 18
 import org.dromara.backstage.api.RemoteUserAccountService;
19 19
 import org.dromara.backstage.api.domain.bo.RemoteUserAccountBo;
20 20
 import org.dromara.common.core.constant.CacheNames;
21
+import org.dromara.common.core.constant.Constants;
22
+import org.dromara.common.core.constant.HttpStatus;
21 23
 import org.dromara.common.core.constant.UserConstants;
24
+import org.dromara.common.core.domain.R;
22 25
 import org.dromara.common.core.exception.ServiceException;
26
+import org.dromara.common.core.exception.user.UserException;
23 27
 import org.dromara.common.core.utils.MapstructUtils;
24 28
 import org.dromara.common.core.utils.SpringUtils;
25 29
 import org.dromara.common.core.utils.StreamUtils;
@@ -73,7 +77,7 @@ public class SysUserServiceImpl implements ISysUserService {
73 77
 
74 78
     @Override
75 79
     public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) {
76
-        Page<SysUserVo> page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user));
80
+        Page<SysUserVo> page = baseMapper.selectVoPage(pageQuery.build(), this.buildQueryWrapper(user));
77 81
         return TableDataInfo.build(page);
78 82
     }
79 83
 
@@ -91,24 +95,24 @@ public class SysUserServiceImpl implements ISysUserService {
91 95
     private Wrapper<SysUser> buildQueryWrapper(SysUserBo user) {
92 96
         Map<String, Object> params = user.getParams();
93 97
         QueryWrapper<SysUser> wrapper = Wrappers.query();
94
-        wrapper.eq("u.del_flag", UserConstants.USER_NORMAL)
95
-            .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId())
96
-            .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
97
-            .like(StringUtils.isNotBlank(user.getRealName()), "u.real_name", user.getRealName())
98
-            .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus())
99
-            .like(StringUtils.isNotBlank(user.getPhone()), "u.phone", user.getPhone())
98
+        wrapper.eq("del_flag", UserConstants.USER_NORMAL)
99
+            .eq(ObjectUtil.isNotNull(user.getUserId()), "user_id", user.getUserId())
100
+            .like(StringUtils.isNotBlank(user.getUserName()), "user_name", user.getUserName())
101
+            .like(StringUtils.isNotBlank(user.getRealName()), "real_name", user.getRealName())
102
+            .eq(StringUtils.isNotBlank(user.getStatus()), "status", user.getStatus())
103
+            .like(StringUtils.isNotBlank(user.getPhone()), "phone", user.getPhone())
100 104
             .between(params.get("beginTime") != null && params.get("endTime") != null,
101
-                "u.create_time", params.get("beginTime"), params.get("endTime"))
105
+                "create_time", params.get("beginTime"), params.get("endTime"))
102 106
             .and(ObjectUtil.isNotNull(user.getDeptId()), w -> {
103 107
                 List<SysDept> deptList = deptMapper.selectList(new LambdaQueryWrapper<SysDept>()
104 108
                     .select(SysDept::getDeptId)
105 109
                     .apply(DataBaseHelper.findInSet(user.getDeptId(), "ancestors")));
106 110
                 List<Long> ids = StreamUtils.toList(deptList, SysDept::getDeptId);
107 111
                 ids.add(user.getDeptId());
108
-                w.in("u.dept_id", ids);
109
-            }).orderByAsc("u.user_id");
112
+                w.in("dept_id", ids);
113
+            }).orderByAsc("user_id");
110 114
         if (StringUtils.isNotBlank(user.getExcludeUserIds())) {
111
-            wrapper.notIn("u.user_id", StringUtils.splitList(user.getExcludeUserIds()));
115
+            wrapper.notIn("user_id", StringUtils.splitList(user.getExcludeUserIds()));
112 116
         }
113 117
         return wrapper;
114 118
     }
@@ -247,7 +251,7 @@ public class SysUserServiceImpl implements ISysUserService {
247 251
         boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysUser>()
248 252
             .eq(SysUser::getUserName, user.getUserName())
249 253
             .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
250
-        return !exist;
254
+        return exist;
251 255
     }
252 256
 
253 257
     /**
@@ -257,10 +261,9 @@ public class SysUserServiceImpl implements ISysUserService {
257 261
      */
258 262
     @Override
259 263
     public boolean checkPhoneUnique(SysUserBo user) {
260
-        boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysUser>()
264
+        return baseMapper.exists(new LambdaQueryWrapper<SysUser>()
261 265
             .eq(SysUser::getPhone, user.getPhone())
262 266
             .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
263
-        return !exist;
264 267
     }
265 268
 
266 269
     /**
@@ -273,7 +276,19 @@ public class SysUserServiceImpl implements ISysUserService {
273 276
         boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysUser>()
274 277
             .eq(SysUser::getEmail, user.getEmail())
275 278
             .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
276
-        return !exist;
279
+        return exist;
280
+    }
281
+
282
+    /**
283
+     * 校验学/工号是否唯一
284
+     *
285
+     * @param user 用户信息
286
+     */
287
+    @Override
288
+    public boolean checkUserNumbUnique(SysUserBo user) {
289
+        return baseMapper.exists(new LambdaQueryWrapper<SysUser>()
290
+            .eq(SysUser::getUserNumb, user.getUserNumb())
291
+            .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
277 292
     }
278 293
 
279 294
     /**
@@ -325,14 +340,23 @@ public class SysUserServiceImpl implements ISysUserService {
325 340
          insertUserDept(user);
326 341
         // 新增用户与角色管理
327 342
         insertUserRole(user, false);
343
+        //一卡通账户处理
328 344
         String autoUserAccount = remotePtParameterService.getPtParameterByKey("AUTO_CREATE_BAG");
329 345
         RemoteUserAccountBo remoteUserAccountBo = BeanUtil.copyProperties(user, RemoteUserAccountBo.class);
330
-        //if("1".equals(autoUserAccount)){
331
-        //
332
-        //} else {
346
+        if(Constants.AUTO_USER_ACCOUNT.equals(autoUserAccount)){
347
+            //自动开通一卡通账户
348
+            remoteUserAccountBo.setAccountStatus("1");
349
+            R<String> result = remoteUserAccountService.openAccount(remoteUserAccountBo);
350
+            if(result.getCode()== HttpStatus.SUCCESS){
351
+                return rows;
352
+            } else {
353
+                throw new UserException(result.getMsg());
354
+            }
355
+        } else {
356
+            //不自动开通
333 357
           remoteUserAccountBo.setAccountStatus("0");
334
-          //remoteUserAccountService.insertByBo(remoteUserAccountBo);
335
-        //}
358
+          remoteUserAccountService.insertByBo(remoteUserAccountBo);
359
+        }
336 360
         return rows;
337 361
     }
338 362