diff --git a/db/800pjcloudx_wallet.sql b/db/800pjcloudx_wallet.sql index 5d3f02f9..374cfc8a 100644 --- a/db/800pjcloudx_wallet.sql +++ b/db/800pjcloudx_wallet.sql @@ -9,8 +9,8 @@ CREATE TABLE wallet_manage id bigint NOT NULL COMMENT '主键', user_id bigint NOT NULL COMMENT '饭卡绑定的用户id', wallet_type_id bigint NOT NULL COMMENT '饭卡类型id', + dept_id BIGINT NOT NULL COMMENT '部门id', card_number varchar(64) COMMENT '饭卡卡号', - code varchar(1024) COMMENT '钱包二维码', balance int DEFAULT 0 NOT NULL COMMENT '余额,单位分', total_expense int DEFAULT 0 NOT NULL COMMENT '累计支出,单位分', total_recharge int DEFAULT 0 NOT NULL COMMENT '累计充值,单位分', @@ -27,11 +27,11 @@ CREATE TABLE wallet_manage PRIMARY KEY (id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 - COLLATE = utf8mb4_general_ci COMMENT ='商户管理'; + COLLATE = utf8mb4_general_ci COMMENT ='钱包管理'; CREATE INDEX idx_dept_id ON wallet_manage (user_id); -- ---------------------------- --- Table structure for wallet_manage +-- Table structure for wallet_type -- ---------------------------- DROP TABLE IF EXISTS wallet_type; CREATE TABLE wallet_type @@ -54,16 +54,23 @@ CREATE TABLE wallet_type -- ---------------------------- -- Table structure for wallet_active -- ---------------------------- +DROP TABLE IF EXISTS wallet_active; CREATE TABLE wallet_active ( - id bigint NOT NULL COMMENT '主键', - user_id bigint NOT NULL COMMENT '用户编号', - wallet_id bigint NOT NULL COMMENT '钱包编号', - wallet_type_id bigint NOT NULL COMMENT '饭卡类型', - dept_id BIGINT NOT NULL COMMENT '部门id', - merchant_id BIGINT NOT NULL COMMENT '商户id', - card_number varchar(128) NOT NULL COMMENT '用户卡号', - active_hardware_status TINYINT DEFAULT 0 COMMENT '是否在硬件上激活', + id bigint NOT NULL COMMENT '主键', + user_id bigint NOT NULL COMMENT '用户id', + wallet_id bigint NOT NULL COMMENT '钱包id', + wallet_type_id bigint NOT NULL COMMENT '饭卡类型id', + dept_id BIGINT NOT NULL COMMENT '部门id', + merchant_id BIGINT NOT NULL COMMENT '商户id', + card_number varchar(128) NOT NULL COMMENT '用户卡号', + is_active_hardware BIT DEFAULT 0 COMMENT '饭卡是否在硬件上激活', + create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + update_time datetime DEFAULT NULL COMMENT '修改时间', + del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + tenant_id bigint DEFAULT NULL COMMENT '租户ID', PRIMARY KEY (id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='钱包开卡'; @@ -74,22 +81,24 @@ CREATE INDEX idx_dept_id ON wallet_active (wallet_type_id); -- ---------------------------- -- Table structure for wallet_freeze -- ---------------------------- +DROP TABLE IF EXISTS wallet_freeze; CREATE TABLE wallet_freeze ( - id bigint NOT NULL COMMENT '编号', - wallet_id bigint NOT NULL COMMENT '钱包id', - user_id bigint NOT NULL COMMENT '用户id', - flow_id bigint DEFAULT NULL COMMENT '流程id', - username varchar(128) COMMENT '用户名', - status TINYINT NOT NULL COMMENT '审核状态', - remark varchar(1024) COMMENT '备注', + id bigint NOT NULL COMMENT '编号', + wallet_id bigint NOT NULL COMMENT '钱包id', + user_id bigint NOT NULL COMMENT '用户id', + free_status TINYINT NOT NULL COMMENT '冻结状态', + remark varchar(1024) COMMENT '备注', PRIMARY KEY (id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='饭卡冻结记录表'; +CREATE INDEX idx_dept_id ON wallet_freeze (wallet_id); +CREATE INDEX idx_dept_id ON wallet_freeze (user_id); -- ---------------------------- -- Table structure for wallet_transaction -- ---------------------------- +DROP TABLE IF EXISTS wallet_transaction; CREATE TABLE wallet_transaction ( id bigint NOT NULL COMMENT '编号', diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java index 4699950c..f349c7f6 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java @@ -120,4 +120,11 @@ public interface CacheConstants { */ String PROJECT_OAUTH_ACCESS = "token::access_token"; + /* ************************************* start 钱包相关 start ************************************* */ + + String WALLET_DETAIL = "wallet:detail:manage"; + + String WALLET_TYPE_DETAIL = "wallet:detail:type"; + + /* ************************************* end 钱包相关 end ************************************* */ } diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/ServiceNameConstants.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/ServiceNameConstants.java index 20bee816..7ff46284 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/ServiceNameConstants.java +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/ServiceNameConstants.java @@ -67,5 +67,8 @@ public interface ServiceNameConstants { */ String CANTEEN_SERVICE = "pjcloud-canteen-biz"; - + /** + * 钱包模块 + */ + String WALLET_SERVICE = "pjcloud-wallet-biz"; } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/UserInfo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/UserInfo.java index 6e4c00b4..93043bdf 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/UserInfo.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/UserInfo.java @@ -51,4 +51,10 @@ public class UserInfo implements Serializable { @Schema(description = "角色标识集合") private Long[] roles; + /** + * 角色集合 + */ + @Schema(description = "角色标识集合") + private String[] roleCodes; + } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java index 4d90ce0a..cd3a6b44 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java @@ -37,94 +37,113 @@ import java.util.List; @FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.UPMS_SERVICE) public interface RemoteUserService { - /** - * 通过用户名查询用户、角色信息 - * @param username 用户名 - * @return R - */ - @NoToken - @GetMapping("/user/info/{username}") - R info(@PathVariable("username") String username); + /** + * 通过用户名查询用户、角色信息 + * + * @param username 用户名 + * @return R + */ + @NoToken + @GetMapping("/user/info/{username}") + R info(@PathVariable("username") String username); - /** - * 根据用户ID获取用户 - * @param userIds ID - * @return SysUser - */ - @GetMapping("/user/list") - R> getUserById(@RequestParam("userIds") List userIds); + /** + * 通过用户id查询用户、角色信息 + * + * @param userId 用户名 + * @return R + */ + @NoToken + @GetMapping("/user/get-by-user-id") + R getByUserId(@RequestParam("userId") Long userId); - /** - * 通过社交账号或手机号查询用户、角色信息 - * @param inStr appid@code - * @return - */ - @NoToken - @GetMapping("/social/info/{inStr}") - R social(@PathVariable("inStr") String inStr); + /** + * 根据用户ID获取用户 + * + * @param userIds ID + * @return SysUser + */ + @GetMapping("/user/list") + R> getUserById(@RequestParam("userIds") List userIds); - /** - * 查询上级部门的用户信息 - * @param username 用户名 - * @return R - */ - @GetMapping("/user/ancestor/{username}") - R> ancestorUsers(@PathVariable("username") String username); + /** + * 通过社交账号或手机号查询用户、角色信息 + * + * @param inStr appid@code + * @return + */ + @NoToken + @GetMapping("/social/info/{inStr}") + R social(@PathVariable("inStr") String inStr); - /** - * 锁定用户 - * @param username 用户名 - * @return - */ - @NoToken - @PutMapping("/user/lock/{username}") - R lockUser(@PathVariable("username") String username); + /** + * 查询上级部门的用户信息 + * + * @param username 用户名 + * @return R + */ + @GetMapping("/user/ancestor/{username}") + R> ancestorUsers(@PathVariable("username") String username); - /** - * 根据角色ID查询用户列表 - * @param roleIdList 角色ID列表 - * @return 用户ID列表 - */ - @GetMapping("/user/getUserIdListByRoleIdList") - R> getUserIdListByRoleIdList(@RequestParam("roleIdList") List roleIdList); + /** + * 锁定用户 + * + * @param username 用户名 + * @return + */ + @NoToken + @PutMapping("/user/lock/{username}") + R lockUser(@PathVariable("username") String username); - /** - * 根据部门ID列表获取用户ID列表接口 - * @param deptIdList 部门ID列表 - * @return 用户ID列表 - */ - @GetMapping("/user/getUserIdListByDeptIdList") - R> getUserIdListByDeptIdList(@RequestParam("deptIdList") List deptIdList); + /** + * 根据角色ID查询用户列表 + * + * @param roleIdList 角色ID列表 + * @return 用户ID列表 + */ + @GetMapping("/user/getUserIdListByRoleIdList") + R> getUserIdListByRoleIdList(@RequestParam("roleIdList") List roleIdList); - /** - * 通过用户名查询用户列表 - * @param userName 用户名 - * @return 用户列表 - */ - @GetMapping("/user/getUserListByUserName") - R> getUserListByUserName(@RequestParam("username") String userName); + /** + * 根据部门ID列表获取用户ID列表接口 + * + * @param deptIdList 部门ID列表 + * @return 用户ID列表 + */ + @GetMapping("/user/getUserIdListByDeptIdList") + R> getUserIdListByDeptIdList(@RequestParam("deptIdList") List deptIdList); - /** - * 注册用户 - * @param userDTO 用户信息 - * @return success/false - */ - @NoToken - @PostMapping("/register/user") - R registerUser(@RequestBody UserDTO userDTO); + /** + * 通过用户名查询用户列表 + * + * @param userName 用户名 + * @return 用户列表 + */ + @GetMapping("/user/getUserListByUserName") + R> getUserListByUserName(@RequestParam("username") String userName); - /** - * 根据钉钉号和手机号查询用户信息 - * @param employeeCode 钉钉号 - * - * @return 用户信息 - */ - @NoToken - @GetMapping("/user/getUserByMobileOrEmployeeCode") - R> getUserByMobileOrEmployeeCode(@RequestParam("employeeCode")String employeeCode, - @RequestParam("mobile") String mobile); + /** + * 注册用户 + * + * @param userDTO 用户信息 + * @return success/false + */ + @NoToken + @PostMapping("/register/user") + R registerUser(@RequestBody UserDTO userDTO); - @NoToken - @GetMapping("/user/getUserByMobile") - R> getUserByMobile(@RequestParam("mobile") String mobile); + /** + * 根据钉钉号和手机号查询用户信息 + * + * @param employeeCode 钉钉号 + * @return 用户信息 + */ + @NoToken + @GetMapping("/user/getUserByMobileOrEmployeeCode") + R> getUserByMobileOrEmployeeCode(@RequestParam("employeeCode") String employeeCode, + @RequestParam("mobile") String mobile); + + @NoToken + @GetMapping("/user/getUserByMobile") + R> getUserByMobile(@RequestParam("mobile") String mobile); } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/utils/DataUtil.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/utils/DataUtil.java index 77afc3be..3e55e8cc 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/utils/DataUtil.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/utils/DataUtil.java @@ -3,84 +3,113 @@ package com.bsd.pjcloud.admin.api.utils; import cn.hutool.core.collection.CollUtil; import com.bsd.pjcloud.admin.api.entity.SysDept; import com.bsd.pjcloud.admin.api.entity.SysMenu; +import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.admin.api.vo.base.BaseDeptInterface; +import com.bsd.pjcloud.admin.api.vo.base.BaseUserInterface; +import com.bsd.pjcloud.common.core.util.CollectionUtils; import lombok.experimental.UtilityClass; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @UtilityClass public class DataUtil { - /** - * 根据当前部门id,向上查找所有的部门 - * @param deptId 当前部门id - * @param allDeptList 所有部门列表 - * @return 返回包括自己部门在内的所有父级部门 - */ - public List selectParentByDept(long deptId, List allDeptList) { - List list = new ArrayList<>(); - Optional optionalDept = allDeptList.stream().filter(w -> w.getDeptId() == deptId).findFirst(); + /** + * 根据当前部门id,向上查找所有的部门 + * + * @param deptId 当前部门id + * @param allDeptList 所有部门列表 + * @return 返回包括自己部门在内的所有父级部门 + */ + public List selectParentByDept(long deptId, List allDeptList) { + List list = new ArrayList<>(); + Optional optionalDept = allDeptList.stream().filter(w -> w.getDeptId() == deptId).findFirst(); - optionalDept.ifPresent(dept -> { - if (dept.getParentId() != null) { - Long parentId = dept.getParentId(); - List depts = selectParentByDept(parentId, allDeptList); - list.add(dept); - list.addAll(depts); - } - }); + optionalDept.ifPresent(dept -> { + if (dept.getParentId() != null) { + Long parentId = dept.getParentId(); + List depts = selectParentByDept(parentId, allDeptList); + list.add(dept); + list.addAll(depts); + } + }); - return list; - } + return list; + } - /** - * 根据当前部门id,向下查找所有的部门 - * @param deptId 当前部门id - * @param allDeptList 所有部门列表 - * @return 返回包括自己部门在内的所有子级部门 - */ - public List selectChildrenByDept(long deptId, List allDeptList) { - List list = new ArrayList<>(); - Optional optionalDept = allDeptList.stream().filter(w -> w.getDeptId() == deptId).findFirst(); + /** + * 根据当前部门id,向下查找所有的部门 + * + * @param deptId 当前部门id + * @param allDeptList 所有部门列表 + * @return 返回包括自己部门在内的所有子级部门 + */ + public List selectChildrenByDept(long deptId, List allDeptList) { + List list = new ArrayList<>(); + Optional optionalDept = allDeptList.stream().filter(w -> w.getDeptId() == deptId).findFirst(); - optionalDept.ifPresent(list::add); + optionalDept.ifPresent(list::add); - List collect = allDeptList.stream() - .filter(w -> w.getParentId() == deptId) - .collect(Collectors.toList()); + List collect = allDeptList.stream() + .filter(w -> w.getParentId() == deptId) + .collect(Collectors.toList()); - if (CollUtil.isEmpty(collect)) { - return list; - } + if (CollUtil.isEmpty(collect)) { + return list; + } - collect.forEach(dept -> { - List depts = selectChildrenByDept(dept.getDeptId(), allDeptList); - list.addAll(depts); - }); + collect.forEach(dept -> { + List depts = selectChildrenByDept(dept.getDeptId(), allDeptList); + list.addAll(depts); + }); - return list; - } + return list; + } - /** - * 根据当前菜单id,向下查找所有的菜单 - * @param menuId 当前菜单id - * @param allMenuList 所有菜单列表 - * @return 返回包括自己在内的所有子级菜单 - */ - public List selectChildrenByMenu(long menuId, List allMenuList) { - List list = new ArrayList<>(); - list.add(allMenuList.stream().filter(w -> w.getMenuId() == menuId).findFirst().get()); + /** + * 根据当前菜单id,向下查找所有的菜单 + * + * @param menuId 当前菜单id + * @param allMenuList 所有菜单列表 + * @return 返回包括自己在内的所有子级菜单 + */ + public List selectChildrenByMenu(long menuId, List allMenuList) { + List list = new ArrayList<>(); + list.add(allMenuList.stream().filter(w -> w.getMenuId() == menuId).findFirst().get()); - List collect = allMenuList.stream() - .filter(w -> w.getParentId() == menuId) - .collect(Collectors.toList()); - if (CollUtil.isEmpty(collect)) { - return list; - } - collect.forEach(dept -> list.addAll(selectChildrenByMenu(dept.getMenuId(), allMenuList))); - return list; - } + List collect = allMenuList.stream() + .filter(w -> w.getParentId() == menuId) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(collect)) { + return list; + } + collect.forEach(dept -> list.addAll(selectChildrenByMenu(dept.getMenuId(), allMenuList))); + return list; + } + + public List convertUserList(List list, Map map) { + return CollectionUtils.convertList(list, user -> convertUser(user, map.get(user.getUserId()))); + } + + public T convertUser(T v, SysUser user) { + v.setUsername(user.getUsername()); + v.setUserMobile(user.getPhone()); + v.setUserAvatar(user.getAvatar()); + return v; + } + + public List convertDeptList(List list, Map map) { + return CollectionUtils.convertList(list, user -> convertDept(user, map.get(user.getDeptId()))); + } + + public T convertDept(T v, SysDept dept) { + v.setDeptId(dept.getDeptId()); + v.setDeptName(dept.getName()); + return v; + } } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseDeptInterface.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseDeptInterface.java new file mode 100644 index 00000000..a217a0cf --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseDeptInterface.java @@ -0,0 +1,19 @@ +package com.bsd.pjcloud.admin.api.vo.base; + +public interface BaseDeptInterface { + + /** + * 部门id + */ + Long getDeptId(); + + void setDeptId(Long deptId); + + /** + * 部门名 + */ + String getDeptName(); + + void setDeptName(String deptName); + +} diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseUserInterface.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseUserInterface.java new file mode 100644 index 00000000..537038cf --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseUserInterface.java @@ -0,0 +1,33 @@ +package com.bsd.pjcloud.admin.api.vo.base; + + +public interface BaseUserInterface { + /** + * 用户id + */ + Long getUserId(); + + void setUserId(Long userId); + + /** + * 用户名 + */ + String getUsername(); + + void setUsername(String username); + + /** + * 用户手机号 + */ + String getUserMobile(); + + void setUserMobile(String userMobile); + + /** + * 用户头像 + */ + String getUserAvatar(); + + void setUserAvatar(String userAvatar); + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/pom.xml b/pjcloud-upms/pjcloud-upms-biz/pom.xml index 6413ffd8..891c5465 100644 --- a/pjcloud-upms/pjcloud-upms-biz/pom.xml +++ b/pjcloud-upms/pjcloud-upms-biz/pom.xml @@ -189,6 +189,12 @@ org.springframework.boot spring-boot-starter-undertow + + com.bsd + pjcloud-wallet-api + 5.7.0 + compile + diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java index 8a8d83ab..2b7b270e 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java @@ -78,6 +78,21 @@ public class SysUserController { return R.ok(userService.findUserInfo(user)); } + /** + * 获取指定用户全部信息 + * + * @return 用户信息 + */ + @Inner + @GetMapping("/get-by-user-id") + public R getByUserId(@RequestParam Long userId) { + SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getUserId, userId)); + if (user == null) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, userId)); + } + return R.ok(userService.findUserInfo(user)); + } + /** * 获取当前用户全部信息 * @@ -314,6 +329,7 @@ public class SysUserController { /** * 根据浙政钉号和手机号查询 + * * @param employeeCode * @param mobile * @return diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java index 333fb50d..4b6068be 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java @@ -49,6 +49,7 @@ import com.bsd.pjcloud.common.data.resolver.ParamResolver; import com.bsd.pjcloud.common.excel.vo.ErrorMessage; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -90,6 +91,8 @@ public class SysUserServiceImpl extends ServiceImpl impl private final CacheManager cacheManager; + private final RemoteWalletService remoteWalletService; + /** * 保存用户信息 * @@ -135,6 +138,10 @@ public class SysUserServiceImpl extends ServiceImpl impl userRole.setRoleId(roleId); return userRole; }).forEach(sysUserRoleMapper::insert); + + // 创建用户默认钱包 + remoteWalletService.createWallet(userDto.getUserId()); + return Boolean.TRUE; } @@ -155,6 +162,13 @@ public class SysUserServiceImpl extends ServiceImpl impl .collect(Collectors.toList()); userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class)); + // 设置角色列表 (CODE) + List roleCodes = sysRoleService.findRolesByUserId(sysUser.getUserId()) + .stream() + .map(SysRole::getRoleCode) + .collect(Collectors.toList()); + userInfo.setRoleCodes(ArrayUtil.toArray(roleCodes, String.class)); + // 设置权限列表(menu.permission) Set permissions = new HashSet<>(); roleIds.forEach(roleId -> { @@ -267,6 +281,9 @@ public class SysUserServiceImpl extends ServiceImpl impl }).forEach(SysUserPost::insert); } + // 创建用户默认钱包 + remoteWalletService.createWallet(userDto.getUserId()); + return Boolean.TRUE; } diff --git a/pjcloud-visual/pjcloud-mp-platform/src/main/java/com/bsd/pjcloud/mp/config/WxMpInRedisConfigStorage.java b/pjcloud-visual/pjcloud-mp-platform/src/main/java/com/bsd/pjcloud/mp/config/WxMpInRedisConfigStorage.java index cb69d2c9..7f6c5893 100644 --- a/pjcloud-visual/pjcloud-mp-platform/src/main/java/com/bsd/pjcloud/mp/config/WxMpInRedisConfigStorage.java +++ b/pjcloud-visual/pjcloud-mp-platform/src/main/java/com/bsd/pjcloud/mp/config/WxMpInRedisConfigStorage.java @@ -30,88 +30,89 @@ import java.util.concurrent.TimeUnit; */ public class WxMpInRedisConfigStorage extends WxMpDefaultConfigImpl { - private final static String ACCESS_TOKEN_KEY = "wechat:access_token_"; + private final static String ACCESS_TOKEN_KEY = "wechat:access_token_"; - private final static String JSAPI_TICKET_KEY = "wechat:jsapi_ticket_"; + private final static String JSAPI_TICKET_KEY = "wechat:jsapi_ticket_"; - private final static String CARDAPI_TICKET_KEY = "wechat:cardapi_ticket_"; + private final static String CARDAPI_TICKET_KEY = "wechat:cardapi_ticket_"; - private final RedisTemplate redisTemplate; + private final RedisTemplate redisTemplate; - private String accessTokenKey; + private String accessTokenKey; - private String jsapiTicketKey; + private String jsapiTicketKey; - private String cardapiTicketKey; + private String cardapiTicketKey; - public WxMpInRedisConfigStorage(RedisTemplate redisTemplate) { - this.redisTemplate = redisTemplate; - } + public WxMpInRedisConfigStorage(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } - /** - * 每个公众号生成独有的存储key - * @param appId - */ - @Override - public void setAppId(String appId) { - super.setAppId(appId); - this.accessTokenKey = ACCESS_TOKEN_KEY.concat(appId); - this.jsapiTicketKey = JSAPI_TICKET_KEY.concat(appId); - this.cardapiTicketKey = CARDAPI_TICKET_KEY.concat(appId); - } + /** + * 每个公众号生成独有的存储key + * + * @param appId + */ + @Override + public void setAppId(String appId) { + super.setAppId(appId); + this.accessTokenKey = ACCESS_TOKEN_KEY.concat(appId); + this.jsapiTicketKey = JSAPI_TICKET_KEY.concat(appId); + this.cardapiTicketKey = CARDAPI_TICKET_KEY.concat(appId); + } - @Override - public String getAccessToken() { - return redisTemplate.opsForValue().get(this.accessTokenKey); - } + @Override + public String getAccessToken() { + return redisTemplate.opsForValue().get(this.accessTokenKey); + } - @Override - public boolean isAccessTokenExpired() { - return redisTemplate.getExpire(accessTokenKey) < 2L; - } + @Override + public boolean isAccessTokenExpired() { + return redisTemplate.getExpire(accessTokenKey) < 2L; + } - @Override - public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { - redisTemplate.opsForValue().set(accessTokenKey, accessToken, expiresInSeconds - 200, TimeUnit.SECONDS); - } + @Override + public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { + redisTemplate.opsForValue().set(accessTokenKey, accessToken, expiresInSeconds - 200, TimeUnit.SECONDS); + } - @Override - public void expireAccessToken() { - redisTemplate.expire(this.accessTokenKey, 0, TimeUnit.SECONDS); - } + @Override + public void expireAccessToken() { + redisTemplate.expire(this.accessTokenKey, 0, TimeUnit.SECONDS); + } - @Override - public String getJsapiTicket() { - return redisTemplate.opsForValue().get(this.jsapiTicketKey); - } + @Override + public String getJsapiTicket() { + return redisTemplate.opsForValue().get(this.jsapiTicketKey); + } - @Override - public String getCardApiTicket() { - return redisTemplate.opsForValue().get(cardapiTicketKey); - } + @Override + public String getCardApiTicket() { + return redisTemplate.opsForValue().get(cardapiTicketKey); + } - @Override - public String getTicket(TicketType type) { - return redisTemplate.opsForValue().get(getTicketRedisKey(type)); - } + @Override + public String getTicket(TicketType type) { + return redisTemplate.opsForValue().get(getTicketRedisKey(type)); + } - @Override - public boolean isTicketExpired(TicketType type) { - return redisTemplate.getExpire(this.getTicketRedisKey(type)) < 2; - } + @Override + public boolean isTicketExpired(TicketType type) { + return redisTemplate.getExpire(this.getTicketRedisKey(type)) < 2; + } - @Override - public synchronized void updateTicket(TicketType type, String jsapiTicket, int expiresInSeconds) { - redisTemplate.opsForValue().set(getTicketRedisKey(type), jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); - } + @Override + public synchronized void updateTicket(TicketType type, String jsapiTicket, int expiresInSeconds) { + redisTemplate.opsForValue().set(getTicketRedisKey(type), jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); + } - @Override - public void expireTicket(TicketType type) { - redisTemplate.expire(getTicketRedisKey(type), 0, TimeUnit.SECONDS); - } + @Override + public void expireTicket(TicketType type) { + redisTemplate.expire(getTicketRedisKey(type), 0, TimeUnit.SECONDS); + } - private String getTicketRedisKey(TicketType type) { - return String.format("wechat:ticket:key:%s:%s", this.appId, type.getCode()); - } + private String getTicketRedisKey(TicketType type) { + return String.format("wechat:ticket:key:%s:%s", this.appId, type.getCode()); + } } diff --git a/pjcloud-wallet/pjcloud-wallet-api/pom.xml b/pjcloud-wallet/pjcloud-wallet-api/pom.xml index a4b35825..574f7175 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/pom.xml +++ b/pjcloud-wallet/pjcloud-wallet-api/pom.xml @@ -26,7 +26,7 @@ com.baomidou - mybatis-plus-extension + mybatis-plus-spring @@ -38,5 +38,19 @@ com.bsd pjcloud-common-excel - + + + org.javers + javers-core + + + + com.bsd + pjcloud-common-sensitive + + + com.bsd + pjcloud-upms-api + + diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizEnum.java new file mode 100644 index 00000000..7b290a54 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizEnum.java @@ -0,0 +1,28 @@ +package com.bsd.pjcloud.wallet.api.constant; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Getter; + +import java.util.Arrays; + +@Getter +public enum WalletBizEnum { + UPDATE("1", "更新余额"), + BATCH("2", "批量更新余额"), + RECHARGE("3", "充值"), + ; + private final String code; + + private final String desc; + + WalletBizEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + public static WalletBizEnum descOf(String description) { + return Arrays.stream(WalletBizEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().get(); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeCodeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeCodeEnum.java new file mode 100644 index 00000000..6df4eb0c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeCodeEnum.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.wallet.api.constant; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Getter; + +import java.util.Arrays; + +@Getter +public enum WalletTypeCodeEnum { + SUPERMARKET("1", "超市"), + CANTEEN("2", "食堂"), + ; + private final String code; + + private final String desc; + + WalletTypeCodeEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + public static WalletTypeCodeEnum descOf(String description) { + return Arrays.stream(WalletTypeCodeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().get(); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeEnum.java new file mode 100644 index 00000000..3d3a6b54 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeEnum.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud.wallet.api.constant; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Getter; + +import java.util.Arrays; + +@Getter +public enum WalletTypeEnum { + + EAT("1", "饭卡钱包"), + PAY("2", "虚拟钱包"), + ; + + private final String code; + + private final String desc; + + WalletTypeEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + public static WalletTypeEnum descOf(String description) { + return Arrays.stream(WalletTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().get(); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletManageDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletManageDto.java new file mode 100644 index 00000000..791296b5 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletManageDto.java @@ -0,0 +1,12 @@ +package com.bsd.pjcloud.wallet.api.dto; + +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +public class WalletManageDto extends WalletManageEntity { + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletManageEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletManageEntity.java new file mode 100644 index 00000000..53a98032 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletManageEntity.java @@ -0,0 +1,140 @@ +package com.bsd.pjcloud.wallet.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; + +import java.time.LocalDateTime; + +/** + * 钱包管理 + * + * @author dzc + * @date 2024-12-30 09:06:35 + */ +@Data +@TenantTable +@TableName("wallet_manage") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "钱包管理") +public class WalletManageEntity extends Model { + + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 饭卡绑定的用户id + */ + @Schema(description = "饭卡绑定的用户id") + private Long userId; + + /** + * 饭卡类型id + */ + @Schema(description = "饭卡类型id") + private Long walletTypeId; + + /** + * 部门id + */ + @Schema(description = "部门id") + private Long deptId; + + /** + * 饭卡卡号 + */ + @Schema(description = "饭卡卡号") + private String cardNumber; + + /** + * 余额,单位分 + */ + @Schema(description = "余额,单位分") + private Integer balance; + + /** + * 累计支出,单位分 + */ + @Schema(description = "累计支出,单位分") + private Integer totalExpense; + + /** + * 累计充值,单位分 + */ + @Schema(description = "累计充值,单位分") + private Integer totalRecharge; + + /** + * 冻结金额,单位分 + */ + @Schema(description = "冻结金额,单位分") + private Integer freezePrice; + + /** + * 是否冻结饭卡 + */ + @Schema(description = "是否冻结饭卡") + private Boolean isFreeze; + + /** + * 绑定饭卡时间 + */ + @Schema(description = "绑定饭卡时间") + private LocalDateTime activeBindTime; + + /** + * 饭卡绑定状态 + */ + @Schema(description = "饭卡绑定状态") + private Integer activeBindStatus; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTransactionEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTransactionEntity.java new file mode 100644 index 00000000..feacd44c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTransactionEntity.java @@ -0,0 +1,70 @@ +package com.bsd.pjcloud.wallet.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 会员钱包流水表 + * + * @author pjcloud + * @date 2024-12-30 09:17:49 + */ +@Data +@TableName("wallet_transaction") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "会员钱包流水表") +public class WalletTransactionEntity extends Model { + + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="编号") + private Long id; + + /** + * 会员钱包 id + */ + @Schema(description="会员钱包 id") + private Long walletId; + + /** + * 关联类型 + */ + @Schema(description="关联类型") + private String bizType; + + /** + * 关联业务编号 + */ + @Schema(description="关联业务编号") + private String bizId; + + /** + * 流水号 + */ + @Schema(description="流水号") + private String no; + + /** + * 流水标题 + */ + @Schema(description="流水标题") + private String title; + + /** + * 交易金额, 单位分 + */ + @Schema(description="交易金额, 单位分") + private Integer price; + + /** + * 余额, 单位分 + */ + @Schema(description="余额, 单位分") + private Integer balance; +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTypeEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTypeEntity.java new file mode 100644 index 00000000..4fbe7280 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTypeEntity.java @@ -0,0 +1,91 @@ +package com.bsd.pjcloud.wallet.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; +import java.time.LocalDateTime; + +/** + * 钱包类型 + * + * @author dzc + * @date 2024-12-30 09:13:18 + */ +@Data +@TenantTable +@TableName("wallet_type") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "钱包类型") +public class WalletTypeEntity extends Model { + + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="主键") + private Long id; + + /** + * 钱包名 + */ + @Schema(description="钱包名") + private String name; + + /** + * 钱包图标 + */ + @Schema(description="钱包图标") + private String icon; + + /** + * 饭卡code + */ + @Schema(description="饭卡code") + private String uniqueCode; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description="修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description="修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description="删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description="租户ID") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java new file mode 100644 index 00000000..75e64491 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.wallet.api.feign; + +import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.feign.annotation.NoToken; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeCodeEnum; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(contextId = "remoteWalletService", value = ServiceNameConstants.WALLET_SERVICE) +public interface RemoteWalletService { + + @NoToken + @GetMapping("/wallet-manage/get-or-create-wallet") + R getOrCreateWallet(@RequestParam Long userId, @RequestParam(required = false) WalletTypeCodeEnum walletTypeCode); + + @NoToken + @GetMapping("/wallet-manage/get-wallet") + R getWallet(@RequestParam Long userId, @RequestParam WalletTypeCodeEnum walletTypeCode); + + @NoToken + @GetMapping("/wallet-manage/create-wallet") + R createWallet(@RequestParam Long userId); + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletManageVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletManageVo.java new file mode 100644 index 00000000..458dd70c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletManageVo.java @@ -0,0 +1,32 @@ +package com.bsd.pjcloud.wallet.api.vo; + +import com.bsd.pjcloud.admin.api.vo.base.BaseDeptInterface; +import com.bsd.pjcloud.admin.api.vo.base.BaseUserInterface; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import lombok.Data; + + +@Data +public class WalletManageVo extends WalletManageEntity implements BaseUserInterface, BaseDeptInterface { + + /** + * 钱包类型名 + */ + private String walletTypeName; + + private String walletTypeUniqueCode; + + /** + * 用户相关 + */ + private String username; + + private String userMobile; + + private String userAvatar; + + /** + * 部门相关 + */ + private String deptName; +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports new file mode 100644 index 00000000..66232e3f --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -0,0 +1 @@ +com.bsd.pjcloud.wallet.api.feign.RemoteWalletService \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java new file mode 100644 index 00000000..638df70a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java @@ -0,0 +1,170 @@ +package com.bsd.pjcloud.wallet.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.common.core.exception.ErrorCodes; +import com.bsd.pjcloud.common.core.util.MsgUtils; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeCodeEnum; +import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import com.bsd.pjcloud.wallet.service.WalletManageService; +import org.springframework.security.access.prepost.PreAuthorize; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 钱包管理 + * + * @author dzc + * @date 2024-12-30 09:06:35 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/wallet-manage") +@Tag(description = "walletManage", name = "钱包管理管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class WalletManageController { + + private final WalletManageService walletManageService; + + /* ************************************* start 远程调用 start ************************************* */ + + @Inner + @GetMapping("/get-or-create-wallet") + public R getOrCreateWallet(@RequestParam Long userId, @RequestParam WalletTypeCodeEnum walletTypeCode) { + WalletManageEntity wallet = walletManageService.getOrCreateWallet(userId, walletTypeCode); + if (ObjectUtil.isEmpty(wallet)) { + return R.failed("用户钱包不存在"); + } + return R.ok(wallet); + } + + @Inner + @GetMapping("/create-wallet") + public R getWallet(@RequestParam Long userId) { + walletManageService.createWallet(userId); + return R.ok(); + } + + @Inner + @GetMapping("/get-wallet") + public R getWallet(@RequestParam Long userId, @RequestParam WalletTypeCodeEnum walletTypeCode) { + WalletManageEntity wallet = walletManageService.getWallet(userId, walletTypeCode); + if (ObjectUtil.isEmpty(wallet)) { + return R.failed("用户钱包不存在"); + } + return R.ok(wallet); + } + + /* ************************************* start 远程调用 start ************************************* */ + + /** + * 分页查询 + * + * @param page 分页对象 + * @param walletManage 钱包管理 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('wallet_walletManage_view')") + public R getWalletManagePage(@ParameterObject Page page, @ParameterObject WalletManageEntity walletManage) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(walletManageService.page(page, wrapper)); + } + + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page-join") + @PreAuthorize("@pms.hasPermission('wallet_walletManage_view')") + public R getWalletManagePageJoin(@ParameterObject Page page, @ParameterObject WalletManageDto dto) { + return walletManageService.pageJoin(page, dto); + } + + + /** + * 通过id查询钱包管理 + * + * @param id id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('wallet_walletManage_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(walletManageService.getById(id)); + } + + /** + * 新增钱包管理 + * + * @param walletManage 钱包管理 + * @return R + */ + @Operation(summary = "新增钱包管理", description = "新增钱包管理") + @SysLog("新增钱包管理") + @PostMapping + @PreAuthorize("@pms.hasPermission('wallet_walletManage_add')") + public R save(@RequestBody WalletManageEntity walletManage) { + return R.ok(walletManageService.save(walletManage)); + } + + /** + * 修改钱包管理 + * + * @param walletManage 钱包管理 + * @return R + */ + @Operation(summary = "修改钱包管理", description = "修改钱包管理") + @SysLog("修改钱包管理") + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_walletManage_edit')") + public R updateById(@RequestBody WalletManageEntity walletManage) { + return R.ok(walletManageService.updateById(walletManage)); + } + + /** + * 通过id删除钱包管理 + * + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除钱包管理", description = "通过id删除钱包管理") + @SysLog("通过id删除钱包管理") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_walletManage_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(walletManageService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * + * @param walletManage 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('wallet_walletManage_export')") + public List export(WalletManageEntity walletManage, Long[] ids) { + return walletManageService.list(Wrappers.lambdaQuery(walletManage).in(ArrayUtil.isNotEmpty(ids), WalletManageEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java new file mode 100644 index 00000000..5b099d4f --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java @@ -0,0 +1,118 @@ +package com.bsd.pjcloud.wallet.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; +import com.bsd.pjcloud.wallet.service.WalletTransactionService; +import org.springframework.security.access.prepost.PreAuthorize; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 会员钱包流水表 + * + * @author pjcloud + * @date 2024-12-30 09:17:49 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/walletTransaction" ) +@Tag(description = "walletTransaction" , name = "会员钱包流水表管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class WalletTransactionController { + + private final WalletTransactionService walletTransactionService; + + /** + * 分页查询 + * @param page 分页对象 + * @param walletTransaction 会员钱包流水表 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('wallet_walletTransaction_view')" ) + public R getWalletTransactionPage(@ParameterObject Page page, @ParameterObject WalletTransactionEntity walletTransaction) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(walletTransactionService.page(page, wrapper)); + } + + + /** + * 通过id查询会员钱包流水表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('wallet_walletTransaction_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(walletTransactionService.getById(id)); + } + + /** + * 新增会员钱包流水表 + * @param walletTransaction 会员钱包流水表 + * @return R + */ + @Operation(summary = "新增会员钱包流水表" , description = "新增会员钱包流水表" ) + @SysLog("新增会员钱包流水表" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('wallet_walletTransaction_add')" ) + public R save(@RequestBody WalletTransactionEntity walletTransaction) { + return R.ok(walletTransactionService.save(walletTransaction)); + } + + /** + * 修改会员钱包流水表 + * @param walletTransaction 会员钱包流水表 + * @return R + */ + @Operation(summary = "修改会员钱包流水表" , description = "修改会员钱包流水表" ) + @SysLog("修改会员钱包流水表" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_walletTransaction_edit')" ) + public R updateById(@RequestBody WalletTransactionEntity walletTransaction) { + return R.ok(walletTransactionService.updateById(walletTransaction)); + } + + /** + * 通过id删除会员钱包流水表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除会员钱包流水表" , description = "通过id删除会员钱包流水表" ) + @SysLog("通过id删除会员钱包流水表" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_walletTransaction_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(walletTransactionService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param walletTransaction 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('wallet_walletTransaction_export')" ) + public List export(WalletTransactionEntity walletTransaction,Long[] ids) { + return walletTransactionService.list(Wrappers.lambdaQuery(walletTransaction).in(ArrayUtil.isNotEmpty(ids), WalletTransactionEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTypeController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTypeController.java new file mode 100644 index 00000000..ccb8a86d --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTypeController.java @@ -0,0 +1,119 @@ +package com.bsd.pjcloud.wallet.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; +import com.bsd.pjcloud.wallet.service.WalletTypeService; +import org.springframework.security.access.prepost.PreAuthorize; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 钱包类型 + * + * @author dzc + * @date 2024-12-30 09:13:18 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/walletType" ) +@Tag(description = "walletType" , name = "钱包类型管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class WalletTypeController { + + private final WalletTypeService walletTypeService; + + /** + * 分页查询 + * @param page 分页对象 + * @param walletType 钱包类型 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('wallet_walletType_view')" ) + public R getWalletTypePage(@ParameterObject Page page, @ParameterObject WalletTypeEntity walletType) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(walletTypeService.page(page, wrapper)); + } + + + /** + * 通过id查询钱包类型 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('wallet_walletType_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(walletTypeService.getById(id)); + } + + /** + * 新增钱包类型 + * @param walletType 钱包类型 + * @return R + */ + @Operation(summary = "新增钱包类型" , description = "新增钱包类型" ) + @SysLog("新增钱包类型" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('wallet_walletType_add')" ) + public R save(@RequestBody WalletTypeEntity walletType) { + return R.ok(walletTypeService.save(walletType)); + } + + /** + * 修改钱包类型 + * @param walletType 钱包类型 + * @return R + */ + @Operation(summary = "修改钱包类型" , description = "修改钱包类型" ) + @SysLog("修改钱包类型" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_walletType_edit')" ) + public R updateById(@RequestBody WalletTypeEntity walletType) { + return R.ok(walletTypeService.updateById(walletType)); + } + + /** + * 通过id删除钱包类型 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除钱包类型" , description = "通过id删除钱包类型" ) + @SysLog("通过id删除钱包类型" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_walletType_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(walletTypeService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param walletType 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('wallet_walletType_export')" ) + public List export(WalletTypeEntity walletType,Long[] ids) { + return walletTypeService.list(Wrappers.lambdaQuery(walletType).in(ArrayUtil.isNotEmpty(ids), WalletTypeEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletManageMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletManageMapper.java new file mode 100644 index 00000000..ab6455da --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletManageMapper.java @@ -0,0 +1,43 @@ +package com.bsd.pjcloud.wallet.mapper; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; +import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface WalletManageMapper extends PjcloudBaseMapper { + default int updateWhenConsumption(Long id, Integer price) { + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() + .setSql(" balance = balance - " + price + ", total_expense = total_expense + " + price) + .eq(WalletManageEntity::getId, id) + .ge(WalletManageEntity::getBalance, price); + return update(null, lambdaUpdateWrapper); + } + + default int updateWhenRecharge(Long id, Integer price) { + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() + .setSql(" balance = balance + " + price + ", total_recharge = total_recharge + " + price) + .eq(WalletManageEntity::getId, id); + return update(null, lambdaUpdateWrapper); + } + + default Page pageJoin(Page page, @Param("pa") WalletManageDto dto) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(WalletManageEntity.class) + .selectAs(WalletTypeEntity::getName, WalletManageVo::getWalletTypeName) + .selectAs(WalletTypeEntity::getUniqueCode, WalletManageVo::getWalletTypeUniqueCode) + .leftJoin(WalletTypeEntity.class, WalletTypeEntity::getId, WalletManageEntity::getWalletTypeId) + .eqIfExists(WalletManageEntity::getUserId, dto.getUserId()) + .eqIfExists(WalletManageEntity::getWalletTypeId, dto.getWalletTypeId()) + .eqIfExists(WalletManageEntity::getIsFreeze, dto.getIsFreeze()) + .likeIfExists(WalletManageEntity::getCardNumber, dto.getCardNumber()); + return selectJoinPage(page, WalletManageVo.class, wrapper); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java new file mode 100644 index 00000000..f51fdf65 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java @@ -0,0 +1,12 @@ +package com.bsd.pjcloud.wallet.mapper; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface WalletTransactionMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTypeMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTypeMapper.java new file mode 100644 index 00000000..42daadf8 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTypeMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.wallet.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface WalletTypeMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java new file mode 100644 index 00000000..71ba3de2 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java @@ -0,0 +1,52 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeCodeEnum; +import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import jakarta.validation.constraints.NotNull; + +public interface WalletManageService extends IService { + + /** + * 创建钱包 + * + * @param userId + * @param checkPermission + */ + void createWallet(@NotNull Long userId, @NotNull Boolean checkPermission); + + /** + * 创建钱包 + * + * @param userId + */ + void createWallet(@NotNull Long userId); + + /** + * 获取钱包没有就创建用户钱包(没有缓存) + * + * @param userId + */ + WalletManageEntity getOrCreateWallet(@NotNull Long userId, @NotNull WalletTypeCodeEnum walletTypeCode); + + /** + * 获取钱包(有缓存) + * @param userId + * @param walletTypeCode + * @return + */ + WalletManageEntity getWallet(@NotNull Long userId, @NotNull WalletTypeCodeEnum walletTypeCode); + + + /** + * 分页连表查询 + * + * @param page + * @param dto + * @return + */ + R pageJoin(Page page, WalletManageDto dto); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java new file mode 100644 index 00000000..47cc505e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java @@ -0,0 +1,32 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; +import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; + +public interface WalletTransactionService extends IService { + + /** + * 扣减钱包余额 + * + * @param walletId 钱包 id + * @param price 扣减金额 + * @param bizId 业务关联 id + * @param bizType 业务关联分类 + * @return 钱包流水 + */ + WalletTransactionEntity reduceWalletBalance(Long walletId, Integer price, Long bizId, WalletBizEnum bizType); + + + /** + * 增加钱包余额 + * + * @param walletId 钱包 id + * @param price 增加金额 + * @param bizId 业务关联 id + * @param bizType 业务关联分类 + * @return 钱包流水 + */ + WalletTransactionEntity addWalletBalance(Long walletId, Integer price, String bizId, WalletBizEnum bizType); + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTypeService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTypeService.java new file mode 100644 index 00000000..ad9d0219 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTypeService.java @@ -0,0 +1,13 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeCodeEnum; +import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; + +import java.io.Serializable; + +public interface WalletTypeService extends IService { + + WalletTypeEntity getByUniqueCode(WalletTypeCodeEnum walletTypeCodeEnum); + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java new file mode 100644 index 00000000..c4419856 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java @@ -0,0 +1,144 @@ +package com.bsd.pjcloud.wallet.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.entity.SysDept; +import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.admin.api.utils.DataUtil; +import com.bsd.pjcloud.common.core.constant.CacheConstants; +import com.bsd.pjcloud.common.core.util.CollectionUtils; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.resolver.ParamResolver; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeCodeEnum; +import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; +import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; +import com.bsd.pjcloud.wallet.mapper.WalletManageMapper; +import com.bsd.pjcloud.wallet.mapper.WalletTypeMapper; +import com.bsd.pjcloud.wallet.service.WalletManageService; +import com.bsd.pjcloud.wallet.service.WalletTypeService; +import com.bsd.pjcloud.wallet.utils.ConvertUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 钱包管理 + * + * @author dzc + * @date 2024-12-30 09:06:35 + */ +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class WalletManageServiceImpl extends ServiceImpl implements WalletManageService { + + static private final String TAG = "钱包管理"; + + private final WalletTypeMapper walletTypeMapper; + + private final WalletTypeService walletTypeService; + + private final RemoteUserService userService; + private final RemoteDeptService deptService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void createWallet(Long userId, Boolean checkPermission) { + UserInfo user = null; + if (checkPermission) { + user = userService.getByUserId(userId).getData(); + if (ObjectUtil.isEmpty(user)) { + log.info("|{}|创建用户电子钱包失败,userId:{},用户id不存在", TAG, userId); + return; + } + String role = Arrays.stream(user.getRoleCodes()).filter(v -> ObjectUtil.equals(v, ParamResolver.getStr("WALLET_AUTO_CREATE"))).findFirst().get(); + if (ObjectUtil.isEmpty(role)) { + log.info("|{}|创建用户电子钱包失败,userId:{},没有{}权限", TAG, userId, "WALLET_AUTO_CREATE"); + return; + } + } + List list = walletTypeMapper.selectList(new LambdaQueryWrapper<>()); + if (ObjectUtil.isEmpty(list)) return; + if (ObjectUtil.isEmpty(user)) user = userService.getByUserId(userId).getData(); + for (WalletTypeEntity v : list) { + WalletManageEntity wallet = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(WalletManageEntity::getUserId, userId) + .eq(WalletManageEntity::getWalletTypeId, v.getId()) + ); + if (ObjectUtil.isNotEmpty(wallet)) continue; + WalletManageEntity insertObj = new WalletManageEntity(); + insertObj.setUserId(userId); + insertObj.setWalletTypeId(v.getId()); + insertObj.setDeptId(user.getSysUser().getDeptId()); + baseMapper.insert(insertObj); + } + } + + @Override + public void createWallet(Long userId) { + getSelf().createWallet(userId, true); + } + + @Override + @CachePut(value = CacheConstants.WALLET_DETAIL, key = "#userId-#walletTypeCode.name()", unless = "#result == null ") + public WalletManageEntity getOrCreateWallet(Long userId, WalletTypeCodeEnum walletTypeCode) { + WalletTypeEntity walletType = walletTypeService.getByUniqueCode(walletTypeCode); + if (ObjectUtil.isEmpty(walletType)) return null; + LambdaQueryWrapper walletQuery = new LambdaQueryWrapper().eq(WalletManageEntity::getUserId, userId).eq(WalletManageEntity::getWalletTypeId, walletType.getId()); + WalletManageEntity wallet = baseMapper.selectOne(walletQuery); + if (ObjectUtil.isEmpty(wallet)) createWallet(userId); + return baseMapper.selectOne(walletQuery); + } + + @Override + @Cacheable(value = CacheConstants.WALLET_DETAIL, key = "#userId-#walletTypeCode.name()", unless = "#result == null ") + public WalletManageEntity getWallet(Long userId, WalletTypeCodeEnum walletTypeCode) { + WalletTypeEntity walletType = walletTypeService.getByUniqueCode(walletTypeCode); + if (ObjectUtil.isEmpty(walletType)) return null; + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(WalletManageEntity::getUserId, userId) + .eq(WalletManageEntity::getWalletTypeId, walletType.getId()) + ); + } + + @Override + public R pageJoin(Page page, WalletManageDto dto) { + Page list = baseMapper.pageJoin(page, dto); + if (ObjectUtil.isNotEmpty(list.getRecords())) { + // 用户 + List userIds = list.getRecords().stream().map(WalletManageVo::getUserId).distinct().toList(); + R> userList = userService.getUserById(new ArrayList<>(userIds)); + if (ObjectUtil.isNotEmpty(userList.getData())) { + DataUtil.convertUserList(page.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); + } + // 部门 + List deptIds = list.getRecords().stream().map(WalletManageVo::getDeptId).distinct().toList(); + R> deptList = deptService.getDeptByDeptIds(deptIds); + if (ObjectUtil.isNotEmpty(deptList.getData())) { + DataUtil.convertDeptList(page.getRecords(), deptList.getData()); + } + } + return R.ok(list); + } + + private WalletManageServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java new file mode 100644 index 00000000..51c36f7e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java @@ -0,0 +1,98 @@ +package com.bsd.pjcloud.wallet.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.common.core.exception.CheckedException; +import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; +import com.bsd.pjcloud.wallet.mapper.WalletManageMapper; +import com.bsd.pjcloud.wallet.mapper.WalletTransactionMapper; +import com.bsd.pjcloud.wallet.service.WalletManageService; +import com.bsd.pjcloud.wallet.service.WalletTransactionService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +/** + * 会员钱包流水表 + * + * @author pjcloud + * @date 2024-12-30 09:17:49 + */ +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class WalletTransactionServiceImpl extends ServiceImpl implements WalletTransactionService { + + static private final String TAG = "会员钱包流水"; + + private final WalletManageService walletManageService; + + private final WalletManageMapper walletManageMapper; + + + @Override + public boolean save(WalletTransactionEntity entity) { + return baseMapper.insert(entity) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public WalletTransactionEntity reduceWalletBalance(Long walletId, Integer price, Long bizId, WalletBizEnum bizType) { + WalletManageEntity wallet = walletManageService.getById(walletId); + if (ObjectUtil.isEmpty(wallet)) { + log.error("|{}|,用户钱包id({})不存在.", TAG, walletId); + throw new CheckedException("扣款失败,用户钱包不存在"); + } + int updateCounts = walletManageMapper.updateWhenConsumption(wallet.getId(), price); + if (updateCounts == 0) { + log.error("|{}|,用户钱包id({})余额不足.", TAG, walletId); + throw new CheckedException("钱包余额不足"); + } + Integer afterBalance = wallet.getBalance() - price; + WalletTransactionEntity insetObj = new WalletTransactionEntity(); + insetObj.setWalletId(walletId); + insetObj.setPrice(-price); + insetObj.setBalance(afterBalance); + insetObj.setBizId(String.valueOf(bizId)); + insetObj.setBizType(bizType.getCode()); + insetObj.setTitle(bizType.getDesc()); + save(insetObj); + return insetObj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public WalletTransactionEntity addWalletBalance(Long walletId, Integer price, String bizId, WalletBizEnum bizType) { + WalletManageEntity wallet = walletManageService.getById(walletId); + if (ObjectUtil.isEmpty(wallet)) { + log.error("|{}|,用户钱包id({})不存在.", TAG, walletId); + throw new CheckedException("扣款失败,用户钱包不存在"); + } + switch (bizType) { + case UPDATE: + case BATCH: + case RECHARGE: { + walletManageMapper.updateWhenRecharge(wallet.getId(), price); + break; + } + default: { + log.error("|{}|,钱包id({})使用未实现的增加钱包余额的类型({}).", TAG, walletId, bizType.getDesc()); + throw new UnsupportedOperationException("待实现"); + } + } + WalletTransactionEntity insetObj = new WalletTransactionEntity(); + insetObj.setWalletId(walletId); + insetObj.setPrice(-price); + insetObj.setBalance(wallet.getBalance() + price); + insetObj.setBizId(String.valueOf(bizId)); + insetObj.setBizType(bizType.getCode()); + insetObj.setTitle(bizType.getDesc()); + save(insetObj); + return insetObj; + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTypeServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTypeServiceImpl.java new file mode 100644 index 00000000..fe1ab411 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTypeServiceImpl.java @@ -0,0 +1,37 @@ +package com.bsd.pjcloud.wallet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.common.core.constant.CacheConstants; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeCodeEnum; +import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; +import com.bsd.pjcloud.wallet.mapper.WalletTypeMapper; +import com.bsd.pjcloud.wallet.service.WalletTypeService; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.io.Serializable; + +/** + * 钱包类型 + * + * @author dzc + * @date 2024-12-30 09:13:18 + */ +@Service +public class WalletTypeServiceImpl extends ServiceImpl implements WalletTypeService { + + @Override + public WalletTypeEntity getById(Serializable id) { + return super.getById(id); + } + + + @Override + public WalletTypeEntity getByUniqueCode(WalletTypeCodeEnum walletTypeCodeEnum) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(WalletTypeEntity::getUniqueCode, walletTypeCodeEnum.getCode()) + ); + } + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/ConvertUtil.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/ConvertUtil.java new file mode 100644 index 00000000..aba627e5 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/ConvertUtil.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.wallet.utils; + +import lombok.experimental.UtilityClass; + +import java.util.List; +import java.util.Map; + +@UtilityClass +public class ConvertUtil { + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/application.yml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/application.yml index 3cd098f7..db282b56 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/application.yml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/application.yml @@ -9,7 +9,7 @@ spring: username: @nacos.username@ password: @nacos.password@ discovery: - server-addr: 123.156.230.15:8848 + server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848} config: server-addr: ${spring.cloud.nacos.discovery.server-addr} config: diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletManageMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletManageMapper.xml new file mode 100644 index 00000000..e0dd8720 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletManageMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml new file mode 100644 index 00000000..4981a24e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTypeMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTypeMapper.xml new file mode 100644 index 00000000..399c3dc1 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTypeMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file