From 01b0623913a26f465d1e9da8874ea82e1927499f Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Sun, 12 Jan 2025 20:50:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=A1=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/800pjcloudx_wallet.sql | 2 + .../flow/task/dto/base/FlowBaseDto.java | 32 + .../bsd/pjcloud/admin/api/utils/DataUtil.java | 12 + .../pjcloud/admin/api/vo/SysUserFaceVo.java | 5 + .../pjcloud/admin/api/vo/UserExcelFaceVo.java | 47 ++ .../com/bsd/pjcloud/admin/api/vo/UserVO.java | 273 ++++----- .../admin/api/vo/base/BaseFacesInterface.java | 12 + pjcloud-upms/pjcloud-upms-biz/pom.xml | 5 + .../admin/controller/SysUserController.java | 8 + .../admin/mapper/SysUserFaceMapper.java | 7 +- .../pjcloud/admin/service/SysDeptService.java | 102 ++-- .../pjcloud/admin/service/SysUserService.java | 6 +- .../service/impl/SysDeptServiceImpl.java | 545 +++++++++--------- .../service/impl/SysMessageServiceImpl.java | 11 +- .../service/impl/SysUserServiceImpl.java | 155 ++++- .../pjcloud/admin/utils/excel/ExcelTool.java | 95 +++ .../resources/mapper/SysUserFaceMapper.xml | 15 + .../wallet/api/entity/WalletActiveEntity.java | 6 +- .../recharge/WalletRechargeApplyEntity.java | 18 +- .../pjcloud/wallet/api/vo/WalletActiveVo.java | 14 +- .../controller/WalletActiveController.java | 81 ++- .../WalletRechargeApplyController.java | 20 +- .../recharge/WalletRechargeController.java | 2 + .../wallet/mapper/WalletActiveMapper.java | 17 + .../wallet/service/WalletActiveService.java | 15 + .../service/WalletRechargeApplyService.java | 11 +- .../wallet/service/WalletRechargeService.java | 4 + .../service/impl/WalletActiveServiceImpl.java | 80 ++- .../impl/WalletForeignServiceImpl.java | 40 +- .../service/impl/WalletFreezeServiceImpl.java | 36 +- .../service/impl/WalletStrideServiceImpl.java | 36 +- .../impl/WalletTransactionServiceImpl.java | 3 +- .../WalletRechargeApplyServiceImpl.java | 95 ++- .../recharge/WalletRechargeServiceImpl.java | 1 - .../wallet/utils/{ => flow}/FlowUtil.java | 27 +- .../flow/dto/WalletForeignApplyFlowDto.java | 24 + .../flow/dto/WalletFreezeApplyFlowDto.java | 20 + .../flow/dto/WalletRechargeApplyFlowDto.java | 24 + .../flow/dto/WalletStrideApplyFlowDto.java | 19 + .../resources/mapper/WalletActiveMapper.xml | 4 + 40 files changed, 1354 insertions(+), 575 deletions(-) create mode 100644 pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/dto/base/FlowBaseDto.java create mode 100644 pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java create mode 100644 pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseFacesInterface.java create mode 100644 pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/excel/ExcelTool.java rename pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/{ => flow}/FlowUtil.java (84%) create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletForeignApplyFlowDto.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletFreezeApplyFlowDto.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletRechargeApplyFlowDto.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletStrideApplyFlowDto.java diff --git a/db/800pjcloudx_wallet.sql b/db/800pjcloudx_wallet.sql index cf66be4da..1d23877b5 100644 --- a/db/800pjcloudx_wallet.sql +++ b/db/800pjcloudx_wallet.sql @@ -188,6 +188,8 @@ CREATE TABLE wallet_recharge_apply ( id bigint NOT NULL COMMENT '主键ID', user_id bigint NOT NULL COMMENT '申请人ID', + process_id varchar(256) COMMENT '流程id', + process_status varchar(10) COMMENT '审核状体', biz_type tinytext DEFAULT NULL COMMENT '充值类型', wallet_type_id bigint DEFAULT NULL COMMENT '饭卡类型id', dept_id bigint NOT NULL COMMENT '部门ID', diff --git a/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/dto/base/FlowBaseDto.java b/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/dto/base/FlowBaseDto.java new file mode 100644 index 000000000..30f659a2a --- /dev/null +++ b/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/dto/base/FlowBaseDto.java @@ -0,0 +1,32 @@ +package com.bsd.pjcloud.flow.task.dto.base; + +import lombok.Data; + +@Data +public class FlowBaseDto { + + /** + * 发起人 + */ + private String applyUsername; + + /** + * 发起人id + */ + private Long applyUserId; + + /** + * 发起人部门 + */ + private String applyDeptName; + + /** + * 发起人部门id + */ + private Long applyDeptId; + + /** + * 发起时间 + */ + private String applyCreateTime; +} 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 db9e04939..88e002702 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 @@ -5,7 +5,9 @@ import cn.hutool.core.util.ObjectUtil; 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.SysUserFaceVo; import com.bsd.pjcloud.admin.api.vo.base.BaseDeptInterface; +import com.bsd.pjcloud.admin.api.vo.base.BaseFacesInterface; import com.bsd.pjcloud.admin.api.vo.base.BaseUserInterface; import com.bsd.pjcloud.common.core.util.CollectionUtils; import lombok.experimental.UtilityClass; @@ -115,4 +117,14 @@ public class DataUtil { return v; } + public List convertFacesList(List list, Map map) { + return CollectionUtils.convertList(list, entity -> convertFaces(entity, map.get(entity.getUserId()))); + } + + public T convertFaces(T v, SysUserFaceVo dept) { + if (ObjectUtil.isEmpty(dept)) return v; + v.setFaceImgs(dept.getFaceImgs()); + return v; + } + } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserFaceVo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserFaceVo.java index f0344f8c0..68a2a1312 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserFaceVo.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserFaceVo.java @@ -8,6 +8,11 @@ import lombok.Data; @Data public class SysUserFaceVo extends SysUserFaceEntity implements BaseUserInterface, BaseDeptInterface { + /** + * 人脸图片 + */ + private String faceImgs; + /** * 用户相关 */ diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java new file mode 100644 index 000000000..9ff35928c --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java @@ -0,0 +1,47 @@ +package com.bsd.pjcloud.admin.api.vo; + + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.bsd.pjcloud.common.excel.annotation.ExcelLine; +import lombok.Data; + +@Data +@ColumnWidth(30) +public class UserExcelFaceVo { + + @ExcelLine + @ExcelIgnore + private Long lineNum; + + /** + * 账号登录名没有就用手机号 + */ + @ExcelProperty("用户名称") + private String username; + + /** + * 用户真实姓名 + */ + @ExcelProperty("用户昵称") + private String name; + + /** + * 部门名称 + */ + @ExcelProperty("部门名称") + private String deptName; + + /** + * 手机号码 + */ + @ExcelProperty("手机号码") + private String mobile; + + /** + * 用户性别 + */ + @ExcelProperty("用户性别") + private String sex; +} diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java index 1bd570a6a..170c41bbd 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java @@ -19,6 +19,7 @@ package com.bsd.pjcloud.admin.api.vo; +import com.bsd.pjcloud.admin.api.vo.base.BaseFacesInterface; import com.fasterxml.jackson.annotation.JsonIgnore; import com.bsd.pjcloud.admin.api.entity.SysPost; import com.bsd.pjcloud.admin.api.entity.SysRole; @@ -37,169 +38,173 @@ import java.util.List; */ @Data @Schema(description = "前端用户展示对象") -public class UserVO implements Serializable { +public class UserVO implements BaseFacesInterface, Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 主键ID - */ - @Schema(description = "主键") - private Long userId; + /** + * 主键ID + */ + @Schema(description = "主键") + private Long userId; - /** - * 用户名 - */ - @Schema(description = "用户名") - private String username; + /** + * 用户名 + */ + @Schema(description = "用户名") + private String username; - /** - * 密码 - */ - @JsonIgnore - private String password; + /** + * 密码 + */ + @JsonIgnore + private String password; - /** - * 随机盐 - */ - @JsonIgnore - private String salt; + /** + * 随机盐 + */ + @JsonIgnore + private String salt; - /** - * 微信openid - */ - @Schema(description = "微信open id") - private String wxOpenid; + /** + * 微信openid + */ + @Schema(description = "微信open id") + private String wxOpenid; - /** - * QQ openid - */ - @Schema(description = "qq open id") - private String qqOpenid; + /** + * QQ openid + */ + @Schema(description = "qq open id") + private String qqOpenid; - /** - * gitee openid - */ - @Schema(description = "gitee open id") - private String giteeOpenId; + /** + * gitee openid + */ + @Schema(description = "gitee open id") + private String giteeOpenId; - /** - * 开源中国 openid - */ - @Schema(description = "开源中国 open id") - private String oscOpenId; + /** + * 开源中国 openid + */ + @Schema(description = "开源中国 open id") + private String oscOpenId; - /** - * 企微微信 userid - */ - @Schema(description = "企微微信 userid") - private String wxCpUserid; + /** + * 企微微信 userid + */ + @Schema(description = "企微微信 userid") + private String wxCpUserid; - /** - * 钉钉 userid - */ - @Schema(description = "钉钉 userid") - private String wxDingUserid; + /** + * 钉钉 userid + */ + @Schema(description = "钉钉 userid") + private String wxDingUserid; - /** - * 创建时间 - */ - @Schema(description = "创建时间") - private LocalDateTime createTime; + /** + * 创建时间 + */ + @Schema(description = "创建时间") + private LocalDateTime createTime; - /** - * 修改时间 - */ - @Schema(description = "修改时间") - private LocalDateTime updateTime; + /** + * 修改时间 + */ + @Schema(description = "修改时间") + private LocalDateTime updateTime; - /** - * 0-正常,1-删除 - */ - @Schema(description = "删除标记,1:已删除,0:正常") - private String delFlag; + /** + * 0-正常,1-删除 + */ + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; - /** - * 锁定标记 - */ - @Schema(description = "锁定标记,0:正常,9:已锁定") - private String lockFlag; + /** + * 锁定标记 + */ + @Schema(description = "锁定标记,0:正常,9:已锁定") + private String lockFlag; - /** - * 密码过期标记 - */ - @Schema(description = "密码过期标记") - private String passwordExpireFlag; + /** + * 密码过期标记 + */ + @Schema(description = "密码过期标记") + private String passwordExpireFlag; - /** - * 密码修改时间 - */ - @Schema(description = "密码修改时间") - private LocalDateTime passwordModifyTime; + /** + * 密码修改时间 + */ + @Schema(description = "密码修改时间") + private LocalDateTime passwordModifyTime; - /** - * 手机号 - */ - @Sensitive(type = SensitiveTypeEnum.MOBILE_PHONE) - @Schema(description = "手机号") - private String phone; + /** + * 手机号 + */ + @Sensitive(type = SensitiveTypeEnum.MOBILE_PHONE) + @Schema(description = "手机号") + private String phone; - /** - * 头像 - */ - @Schema(description = "头像") - private String avatar; + /** + * 头像 + */ + @Schema(description = "头像") + private String avatar; - /** - * 部门ID - */ - @Schema(description = "所属部门") - private Long deptId; + /** + * 部门ID + */ + @Schema(description = "所属部门") + private Long deptId; - /** - * 租户ID - */ - @Schema(description = "所属租户") - private Long tenantId; + /** + * 租户ID + */ + @Schema(description = "所属租户") + private Long tenantId; - /** - * 部门名称 - */ - @Schema(description = "所属部门名称") - private String deptName; + /** + * 部门名称 + */ + @Schema(description = "所属部门名称") + private String deptName; - /** - * 角色列表 - */ - @Schema(description = "拥有的角色列表") - private List roleList; + /** + * 角色列表 + */ + @Schema(description = "拥有的角色列表") + private List roleList; - /** - * 岗位列表 - */ - private List postList; + /** + * 岗位列表 + */ + private List postList; - /** - * 昵称 - */ - @Schema(description = "昵称") - private String nickname; + /** + * 昵称 + */ + @Schema(description = "昵称") + private String nickname; - /** - * 姓名 - */ - @Schema(description = "姓名") - private String name; + /** + * 姓名 + */ + @Schema(description = "姓名") + private String name; - /** - * 邮箱 - */ - @Schema(description = "邮箱") - private String email; + /** + * 邮箱 + */ + @Schema(description = "邮箱") + private String email; - @Schema(description = "员工浙政钉编码") - private String dingtalkEmployeeCode; + @Schema(description = "员工浙政钉编码") + private String dingtalkEmployeeCode; + /** + * 人脸 + */ + private String faceImgs; } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseFacesInterface.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseFacesInterface.java new file mode 100644 index 000000000..0920e95e6 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseFacesInterface.java @@ -0,0 +1,12 @@ +package com.bsd.pjcloud.admin.api.vo.base; + +public interface BaseFacesInterface { + + Long getUserId(); + + void setUserId(Long userId); + + String getFaceImgs(); + + void setFaceImgs(String faceImgs); +} diff --git a/pjcloud-upms/pjcloud-upms-biz/pom.xml b/pjcloud-upms/pjcloud-upms-biz/pom.xml index 4a0004959..e821294fc 100644 --- a/pjcloud-upms/pjcloud-upms-biz/pom.xml +++ b/pjcloud-upms/pjcloud-upms-biz/pom.xml @@ -189,6 +189,11 @@ org.springframework.boot spring-boot-starter-undertow + + + org.springframework.boot + spring-boot-starter-test + com.bsd pjcloud-wallet-api 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 fbb18f88e..a054f5c51 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 @@ -25,6 +25,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.dto.UserDTO; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.admin.api.vo.UserExcelFaceVo; import com.bsd.pjcloud.admin.api.vo.UserExcelVO; import com.bsd.pjcloud.admin.service.SysUserService; import com.bsd.pjcloud.common.core.constant.CommonConstants; @@ -47,6 +48,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -258,6 +260,12 @@ public class SysUserController { return userService.importUser(excelVOList, bindingResult); } + @PostMapping("/import-face") + @HasPermission("sys_user_export") + public R importUserFace(@RequestParam("file") MultipartFile file, @RequestExcel List excelList, BindingResult bindingResult) { + return userService.importUserFace(file, excelList, bindingResult); + } + /** * 锁定指定用户 * diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserFaceMapper.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserFaceMapper.java index 66de5bb86..e3f9a19ed 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserFaceMapper.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserFaceMapper.java @@ -1,26 +1,27 @@ package com.bsd.pjcloud.admin.mapper; import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.dto.SysUserFaceDto; import com.bsd.pjcloud.admin.api.entity.SysDept; import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.entity.SysUserFaceEntity; import com.bsd.pjcloud.admin.api.vo.SysUserFaceVo; -import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; -import com.github.yulichang.query.MPJLambdaQueryWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + @Mapper public interface SysUserFaceMapper extends PjcloudBaseMapper { Page scopePageList(Page page, @Param("pa") SysUserFaceDto dto, DataScope dataScope); + List groupConcatFaces(@Param("pa") SysUserFaceDto dto); + Long selectAllCount(); default SysUserFaceVo join(Long id) { diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java index 484388b68..9632ad48e 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java @@ -40,57 +40,71 @@ import java.util.Map; */ public interface SysDeptService extends IService { - /** - * 查询部门树菜单 - * @param deptName 部门名称 - * @return 树 - */ - List> selectTree(String deptName, Long parentId); + /** + * 查询部门树菜单 + * + * @param deptName 部门名称 + * @return 树 + */ + List> selectTree(String deptName, Long parentId); - /** - * 删除部门 - * @param id 部门 ID - * @return 成功、失败 - */ - Boolean removeDeptById(Long id); + /** + * 删除部门 + * + * @param id 部门 ID + * @return 成功、失败 + */ + Boolean removeDeptById(Long id); - List listExcelVo(); + List listExcelVo(); - R importDept(List excelVOList, BindingResult bindingResult); + R importDept(List excelVOList, BindingResult bindingResult); - /** - * 获取部门的所有后代部门列表 - * @param deptId 部门ID - * @return 后代部门列表 - */ - List listDescendant(Long deptId); + /** + * 获取部门的所有后代部门列表 + * + * @param deptId 部门ID + * @return 后代部门列表 + */ + List listDescendant(Long deptId); - /** - * 获取部门负责人 - * @param deptId deptId - * @return user id list - */ - List listDeptLeader(Long deptId); + /** + * 获取部门负责人 + * + * @param deptId deptId + * @return user id list + */ + List listDeptLeader(Long deptId); - /** - * 查询全部部门包含用户 - * @param parentDeptId 父部门ID - * @param type 查询类型 - */ - Map listOrgTree(Long parentDeptId, String type); + /** + * 查询全部部门包含用户 + * + * @param parentDeptId 父部门ID + * @param type 查询类型 + */ + Map listOrgTree(Long parentDeptId, String type); - /** - * 根据用户名模糊搜索用户 - * @param username 用户名 - * @return List user - */ - List getOrgTreeUser(String username); + /** + * 根据用户名模糊搜索用户 + * + * @param username 用户名 + * @return List user + */ + List getOrgTreeUser(String username); - /** - * 根据ids查询map集合 - * @param deptIds - * @return - */ - Map getDeptListByDeptIds(List deptIds); + /** + * 根据ids查询map集合 + * + * @param deptIds + * @return + */ + Map getDeptListByDeptIds(List deptIds); + + /** + * 根据部门名查询部门 + * @param names 部门名 + * @return + */ + List selectByNames(List names); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java index d65d4ff85..77f9991f5 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java @@ -25,10 +25,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.admin.api.dto.UserDTO; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.admin.api.vo.UserExcelFaceVo; import com.bsd.pjcloud.admin.api.vo.UserExcelVO; import com.bsd.pjcloud.admin.api.vo.UserVO; import com.bsd.pjcloud.common.core.util.R; import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -101,7 +103,7 @@ public interface SysUserService extends IService { * @param userDto DTO 对象 * @return success/fail */ - Boolean saveUser(UserDTO userDto); + Long saveUser(UserDTO userDto); /** * 查询全部的用户 @@ -121,6 +123,8 @@ public interface SysUserService extends IService { */ R importUser(List excelVOList, BindingResult bindingResult); + R importUserFace(MultipartFile file, List excelList, BindingResult bindingResult); + /** * 注册用户 * diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java index 0f4f1b7f0..949954d19 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java @@ -24,7 +24,9 @@ import cn.hutool.core.lang.Dict; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.TreeNode; import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.constant.OrgTypeEnum; @@ -59,306 +61,321 @@ import java.util.stream.Collectors; @AllArgsConstructor public class SysDeptServiceImpl extends ServiceImpl implements SysDeptService { - private final SysUserMapper userMapper; + private final SysUserMapper userMapper; - private final SysDeptMapper deptMapper; + private final SysDeptMapper deptMapper; - private final SysPostMapper postMapper; + private final SysPostMapper postMapper; - private final SysRoleMapper roleMapper; + private final SysRoleMapper roleMapper; - private final SysUserPostMapper userPostMapper; + private final SysUserPostMapper userPostMapper; - /** - * 删除部门 - * @param id 部门 ID - * @return 成功、失败 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean removeDeptById(Long id) { - // 级联删除部门 - List idList = this.listDescendant(id).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + /** + * 删除部门 + * + * @param id 部门 ID + * @return 成功、失败 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean removeDeptById(Long id) { + // 级联删除部门 + List idList = this.listDescendant(id).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - Optional.ofNullable(idList).filter(CollUtil::isNotEmpty).ifPresent(this::removeByIds); + Optional.ofNullable(idList).filter(CollUtil::isNotEmpty).ifPresent(this::removeByIds); - return Boolean.TRUE; - } + return Boolean.TRUE; + } - /** - * 查询全部部门树 - * @param deptName - * @param parentId - * @return 树 部门名称 - */ - @Override - public List> selectTree(String deptName, Long parentId) { - // 查询全部部门 - List deptAllList = deptMapper - .selectList(Wrappers.lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName)); - // 查询数据权限内部门 - List deptOwnIdList = deptMapper - .selectListByScope( - Wrappers.lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName), - DataScope.of()) - .stream() - .map(SysDept::getDeptId) - .toList(); + /** + * 查询全部部门树 + * + * @param deptName + * @param parentId + * @return 树 部门名称 + */ + @Override + public List> selectTree(String deptName, Long parentId) { + // 查询全部部门 + List deptAllList = deptMapper + .selectList(Wrappers.lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName)); + // 查询数据权限内部门 + List deptOwnIdList = deptMapper + .selectListByScope( + Wrappers.lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName), + DataScope.of()) + .stream() + .map(SysDept::getDeptId) + .toList(); - // 权限内部门 - List> collect = deptAllList.stream() - .filter(dept -> dept.getDeptId().intValue() != dept.getParentId()) - .sorted(Comparator.comparingInt(SysDept::getSortOrder)) - .map(dept -> { - TreeNode treeNode = new TreeNode<>(); - treeNode.setId(dept.getDeptId()); - treeNode.setParentId(dept.getParentId()); - treeNode.setName(dept.getName()); - treeNode.setWeight(dept.getSortOrder()); - // 有权限不返回标识 - Map extra = new HashMap<>(8); - extra.put("isLock", !deptOwnIdList.contains(dept.getDeptId())); - extra.put("createTime", dept.getCreateTime()); - treeNode.setExtra(extra); - return treeNode; - }) - .collect(Collectors.toList()); + // 权限内部门 + List> collect = deptAllList.stream() + .filter(dept -> dept.getDeptId().intValue() != dept.getParentId()) + .sorted(Comparator.comparingInt(SysDept::getSortOrder)) + .map(dept -> { + TreeNode treeNode = new TreeNode<>(); + treeNode.setId(dept.getDeptId()); + treeNode.setParentId(dept.getParentId()); + treeNode.setName(dept.getName()); + treeNode.setWeight(dept.getSortOrder()); + // 有权限不返回标识 + Map extra = new HashMap<>(8); + extra.put("isLock", !deptOwnIdList.contains(dept.getDeptId())); + extra.put("createTime", dept.getCreateTime()); + treeNode.setExtra(extra); + return treeNode; + }) + .collect(Collectors.toList()); - // 模糊查询 不组装树结构 直接返回 表格方便编辑 - if (StrUtil.isNotBlank(deptName)) { - return collect.stream().map(node -> { - Tree tree = new Tree<>(); - tree.putAll(node.getExtra()); - BeanUtils.copyProperties(node, tree); - return tree; - }).collect(Collectors.toList()); - } + // 模糊查询 不组装树结构 直接返回 表格方便编辑 + if (StrUtil.isNotBlank(deptName)) { + return collect.stream().map(node -> { + Tree tree = new Tree<>(); + tree.putAll(node.getExtra()); + BeanUtils.copyProperties(node, tree); + return tree; + }).collect(Collectors.toList()); + } - return TreeUtil.build(collect, parentId == null ? 0 : parentId); - } + return TreeUtil.build(collect, parentId == null ? 0 : parentId); + } - /** - * 导出部门 - * @return - */ - @Override - public List listExcelVo() { - List list = this.list(); - List deptExcelVos = list.stream().map(item -> { - DeptExcelVO deptExcelVo = new DeptExcelVO(); - deptExcelVo.setName(item.getName()); - Optional first = this.list() - .stream() - .filter(it -> item.getParentId().equals(it.getDeptId())) - .map(SysDept::getName) - .findFirst(); - deptExcelVo.setParentName(first.orElse("根部门")); - deptExcelVo.setSortOrder(item.getSortOrder()); - return deptExcelVo; - }).collect(Collectors.toList()); - return deptExcelVos; - } + /** + * 导出部门 + * + * @return + */ + @Override + public List listExcelVo() { + List list = this.list(); + List deptExcelVos = list.stream().map(item -> { + DeptExcelVO deptExcelVo = new DeptExcelVO(); + deptExcelVo.setName(item.getName()); + Optional first = this.list() + .stream() + .filter(it -> item.getParentId().equals(it.getDeptId())) + .map(SysDept::getName) + .findFirst(); + deptExcelVo.setParentName(first.orElse("根部门")); + deptExcelVo.setSortOrder(item.getSortOrder()); + return deptExcelVo; + }).collect(Collectors.toList()); + return deptExcelVos; + } - @Override - public R importDept(List excelVOList, BindingResult bindingResult) { - List errorMessageList = (List) bindingResult.getTarget(); + @Override + public R importDept(List excelVOList, BindingResult bindingResult) { + List errorMessageList = (List) bindingResult.getTarget(); - List deptList = this.list(); - for (DeptExcelVO item : excelVOList) { - Set errorMsg = new HashSet<>(); - boolean exsitUsername = deptList.stream().anyMatch(sysDept -> item.getName().equals(sysDept.getName())); - if (exsitUsername) { - errorMsg.add("部门名称已经存在"); - } - SysDept one = this.getOne(Wrappers.lambdaQuery().eq(SysDept::getName, item.getParentName())); - if (item.getParentName().equals("根部门")) { - one = new SysDept(); - one.setDeptId(0L); - } - if (one == null) { - errorMsg.add("上级部门不存在"); - } - if (CollUtil.isEmpty(errorMsg)) { - SysDept sysDept = new SysDept(); - sysDept.setName(item.getName()); - sysDept.setParentId(one.getDeptId()); - sysDept.setSortOrder(item.getSortOrder()); - baseMapper.insert(sysDept); - } - else { - // 数据不合法情况 - errorMessageList.add(new ErrorMessage(item.getLineNum(), errorMsg)); - } - } - if (CollUtil.isNotEmpty(errorMessageList)) { - return R.failed(errorMessageList); - } - return R.ok(null, "部门导入成功"); - } + List deptList = this.list(); + for (DeptExcelVO item : excelVOList) { + Set errorMsg = new HashSet<>(); + boolean exsitUsername = deptList.stream().anyMatch(sysDept -> item.getName().equals(sysDept.getName())); + if (exsitUsername) { + errorMsg.add("部门名称已经存在"); + } + SysDept one = this.getOne(Wrappers.lambdaQuery().eq(SysDept::getName, item.getParentName())); + if (item.getParentName().equals("根部门")) { + one = new SysDept(); + one.setDeptId(0L); + } + if (one == null) { + errorMsg.add("上级部门不存在"); + } + if (CollUtil.isEmpty(errorMsg)) { + SysDept sysDept = new SysDept(); + sysDept.setName(item.getName()); + sysDept.setParentId(one.getDeptId()); + sysDept.setSortOrder(item.getSortOrder()); + baseMapper.insert(sysDept); + } else { + // 数据不合法情况 + errorMessageList.add(new ErrorMessage(item.getLineNum(), errorMsg)); + } + } + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(null, "部门导入成功"); + } - /** - * 查询所有子节点 (包含当前节点) - * @param deptId 部门ID 目标部门ID - * @return ID - */ - @Override - public List listDescendant(Long deptId) { - // 查询全部部门 - List allDeptList = baseMapper.selectList(Wrappers.emptyWrapper()); + /** + * 查询所有子节点 (包含当前节点) + * + * @param deptId 部门ID 目标部门ID + * @return ID + */ + @Override + public List listDescendant(Long deptId) { + // 查询全部部门 + List allDeptList = baseMapper.selectList(Wrappers.emptyWrapper()); - // 递归查询所有子节点 - List resDeptList = new ArrayList<>(); - recursiveDept(allDeptList, deptId, resDeptList); + // 递归查询所有子节点 + List resDeptList = new ArrayList<>(); + recursiveDept(allDeptList, deptId, resDeptList); - // 添加当前节点 - resDeptList.addAll(allDeptList.stream().filter(sysDept -> deptId.equals(sysDept.getDeptId())).toList()); - return resDeptList; - } + // 添加当前节点 + resDeptList.addAll(allDeptList.stream().filter(sysDept -> deptId.equals(sysDept.getDeptId())).toList()); + return resDeptList; + } - /** - * 获取部门负责人 - * - * 1. 根据dept 查询用户 2. 筛选用户列表中 post - * @param deptId deptId - * @return user id list - */ - @Override - public List listDeptLeader(Long deptId) { - List sysUserList = userMapper - .selectList(Wrappers.lambdaQuery().eq(SysUser::getDeptId, deptId)); - if (CollUtil.isEmpty(sysUserList)) { - return null; - } + /** + * 获取部门负责人 + *

+ * 1. 根据dept 查询用户 2. 筛选用户列表中 post + * + * @param deptId deptId + * @return user id list + */ + @Override + public List listDeptLeader(Long deptId) { + List sysUserList = userMapper + .selectList(Wrappers.lambdaQuery().eq(SysUser::getDeptId, deptId)); + if (CollUtil.isEmpty(sysUserList)) { + return null; + } - SysPost deptLeader = postMapper - .selectOne(Wrappers.lambdaQuery().eq(SysPost::getPostCode, PostCodeEnum.TEAM_LEADER.getCode())); - if (deptLeader == null) { - return null; - } + SysPost deptLeader = postMapper + .selectOne(Wrappers.lambdaQuery().eq(SysPost::getPostCode, PostCodeEnum.TEAM_LEADER.getCode())); + if (deptLeader == null) { + return null; + } - List userIdList = sysUserList.stream().map(SysUser::getUserId).toList(); - return userPostMapper.selectList(Wrappers.lambdaQuery().in(SysUserPost::getUserId, userIdList)) - .stream() - .filter(post -> Objects.equals(post.getPostId(), deptLeader.getPostId())) - .map(SysUserPost::getUserId) - .toList(); - } + List userIdList = sysUserList.stream().map(SysUser::getUserId).toList(); + return userPostMapper.selectList(Wrappers.lambdaQuery().in(SysUserPost::getUserId, userIdList)) + .stream() + .filter(post -> Objects.equals(post.getPostId(), deptLeader.getPostId())) + .map(SysUserPost::getUserId) + .toList(); + } - /** - * 根据父部门ID和类型获取组织树 - * @param parentDeptId 父部门ID - * @param type 类型 - * @return 组织树信息 - */ - public Map listOrgTree(Long parentDeptId, String type) { + /** + * 根据父部门ID和类型获取组织树 + * + * @param parentDeptId 父部门ID + * @param type 类型 + * @return 组织树信息 + */ + public Map listOrgTree(Long parentDeptId, String type) { - List orgs = new LinkedList<>(); + List orgs = new LinkedList<>(); - if (StrUtil.equals(type, OrgTypeEnum.ROLE.getType())) { - // 角色 - List roleList = roleMapper.selectList(Wrappers.emptyWrapper()); + if (StrUtil.equals(type, OrgTypeEnum.ROLE.getType())) { + // 角色 + List roleList = roleMapper.selectList(Wrappers.emptyWrapper()); - roleList.forEach(role -> { - OrgTreeVO orgTreeVo = new OrgTreeVO(); - orgTreeVo.setId(role.getRoleId()); - orgTreeVo.setName(role.getRoleName()); - orgTreeVo.setType(OrgTypeEnum.ROLE.getType()); - orgTreeVo.setSelected(false); - orgs.add(orgTreeVo); - }); + roleList.forEach(role -> { + OrgTreeVO orgTreeVo = new OrgTreeVO(); + orgTreeVo.setId(role.getRoleId()); + orgTreeVo.setName(role.getRoleName()); + orgTreeVo.setType(OrgTypeEnum.ROLE.getType()); + orgTreeVo.setSelected(false); + orgs.add(orgTreeVo); + }); - return Dict.create() - .set("roleList", orgs) - .set("childDepartments", orgs) - .set("employees", new ArrayList<>()); - } + return Dict.create() + .set("roleList", orgs) + .set("childDepartments", orgs) + .set("employees", new ArrayList<>()); + } - Dict dict = Dict.create() - .set("titleDepartments", new ArrayList<>()) - .set("roleList", new ArrayList<>()) - .set("employees", new ArrayList<>()); + Dict dict = Dict.create() + .set("titleDepartments", new ArrayList<>()) + .set("roleList", new ArrayList<>()) + .set("employees", new ArrayList<>()); - List deptList = this.list( - Wrappers.lambdaQuery().eq(Objects.nonNull(parentDeptId), SysDept::getParentId, parentDeptId)); + List deptList = this.list( + Wrappers.lambdaQuery().eq(Objects.nonNull(parentDeptId), SysDept::getParentId, parentDeptId)); - // 查询所有部门及员工 - List deptVoList = new ArrayList<>(); - deptList.forEach(dept -> { - OrgTreeVO orgTreeVo = new OrgTreeVO(); - orgTreeVo.setId(dept.getDeptId()); - orgTreeVo.setName(dept.getName()); - orgTreeVo.setType(OrgTypeEnum.DEPT.getType()); - orgTreeVo.setSelected(false); - deptVoList.add(orgTreeVo); - }); - dict.set("childDepartments", deptVoList); + // 查询所有部门及员工 + List deptVoList = new ArrayList<>(); + deptList.forEach(dept -> { + OrgTreeVO orgTreeVo = new OrgTreeVO(); + orgTreeVo.setId(dept.getDeptId()); + orgTreeVo.setName(dept.getName()); + orgTreeVo.setType(OrgTypeEnum.DEPT.getType()); + orgTreeVo.setSelected(false); + deptVoList.add(orgTreeVo); + }); + dict.set("childDepartments", deptVoList); - if (!StrUtil.equals(type, OrgTypeEnum.DEPT.getType())) { + if (!StrUtil.equals(type, OrgTypeEnum.DEPT.getType())) { - List userVoList = new ArrayList<>(); + List userVoList = new ArrayList<>(); - List userList = userMapper - .selectList(Wrappers.lambdaQuery().in(SysUser::getDeptId, CollUtil.toList(parentDeptId))); + List userList = userMapper + .selectList(Wrappers.lambdaQuery().in(SysUser::getDeptId, CollUtil.toList(parentDeptId))); - userList.forEach(user -> { - OrgTreeVO orgTreeVo = new OrgTreeVO(); - orgTreeVo.setId(user.getUserId()); - orgTreeVo.setName(user.getUsername()); - orgTreeVo.setType(OrgTypeEnum.USER.getType()); - orgTreeVo.setSelected(false); - orgTreeVo.setAvatar(user.getAvatar()); - userVoList.add(orgTreeVo); - }); - dict.set("employees", userVoList); - } + userList.forEach(user -> { + OrgTreeVO orgTreeVo = new OrgTreeVO(); + orgTreeVo.setId(user.getUserId()); + orgTreeVo.setName(user.getUsername()); + orgTreeVo.setType(OrgTypeEnum.USER.getType()); + orgTreeVo.setSelected(false); + orgTreeVo.setAvatar(user.getAvatar()); + userVoList.add(orgTreeVo); + }); + dict.set("employees", userVoList); + } - if (parentDeptId > 0) { - List allDept = this.list(); - List depts = DataUtil.selectParentByDept(parentDeptId, allDept); - dict.set("titleDepartments", CollUtil.reverse(depts)); - } + if (parentDeptId > 0) { + List allDept = this.list(); + List depts = DataUtil.selectParentByDept(parentDeptId, allDept); + dict.set("titleDepartments", CollUtil.reverse(depts)); + } - return dict; - } + return dict; + } - /** - * 模糊搜索用户 - * @param username 用户名/拼音/首字母 - * @return 匹配到的用户 - */ - public List getOrgTreeUser(String username) { - return userMapper.selectList(Wrappers.lambdaQuery().like(SysUser::getUsername, username)) - .stream() - .map(user -> { - OrgTreeVO orgTreeVo = new OrgTreeVO(); - orgTreeVo.setId(user.getUserId()); - orgTreeVo.setName(user.getUsername()); - orgTreeVo.setType(OrgTypeEnum.USER.getType()); - orgTreeVo.setSelected(false); - orgTreeVo.setAvatar(user.getAvatar()); - return orgTreeVo; - }) - .collect(Collectors.toList()); - } + /** + * 模糊搜索用户 + * + * @param username 用户名/拼音/首字母 + * @return 匹配到的用户 + */ + public List getOrgTreeUser(String username) { + return userMapper.selectList(Wrappers.lambdaQuery().like(SysUser::getUsername, username)) + .stream() + .map(user -> { + OrgTreeVO orgTreeVo = new OrgTreeVO(); + orgTreeVo.setId(user.getUserId()); + orgTreeVo.setName(user.getUsername()); + orgTreeVo.setType(OrgTypeEnum.USER.getType()); + orgTreeVo.setSelected(false); + orgTreeVo.setAvatar(user.getAvatar()); + return orgTreeVo; + }) + .collect(Collectors.toList()); + } - @Override - public Map getDeptListByDeptIds(List deptIds) { - List sysDepts = baseMapper.selectList(Wrappers.lambdaQuery().in(SysDept::getDeptId, deptIds)); - return sysDepts.stream().collect(Collectors.toMap(SysDept::getDeptId, sysDept -> sysDept)); - } + @Override + public Map getDeptListByDeptIds(List deptIds) { + List sysDepts = baseMapper.selectList(Wrappers.lambdaQuery().in(SysDept::getDeptId, deptIds)); + return sysDepts.stream().collect(Collectors.toMap(SysDept::getDeptId, sysDept -> sysDept)); + } - /** - * 递归查询所有子节点。 - * @param allDeptList 所有部门列表 - * @param parentId 父部门ID - * @param resDeptList 结果集合 - */ - private void recursiveDept(List allDeptList, Long parentId, List resDeptList) { - // 使用 Stream API 进行筛选和遍历 - allDeptList.stream().filter(sysDept -> sysDept.getParentId().equals(parentId)).forEach(sysDept -> { - resDeptList.add(sysDept); - recursiveDept(allDeptList, sysDept.getDeptId(), resDeptList); - }); - } + @Override + public List selectByNames(List names) { + if (ObjectUtil.isEmpty(names)) return null; + return baseMapper.selectList(new LambdaQueryWrapper() + .in(SysDept::getName, names) + ); + } + + /** + * 递归查询所有子节点。 + * + * @param allDeptList 所有部门列表 + * @param parentId 父部门ID + * @param resDeptList 结果集合 + */ + private void recursiveDept(List allDeptList, Long parentId, List resDeptList) { + // 使用 Stream API 进行筛选和遍历 + allDeptList.stream().filter(sysDept -> sysDept.getParentId().equals(parentId)).forEach(sysDept -> { + resDeptList.add(sysDept); + recursiveDept(allDeptList, sysDept.getDeptId(), resDeptList); + }); + } } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysMessageServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysMessageServiceImpl.java index 29dcf944a..c5d9ced93 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysMessageServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysMessageServiceImpl.java @@ -181,7 +181,16 @@ public class SysMessageServiceImpl extends ServiceImpl pageUserMessage(Page page, SysMessageVO sysMessage) { - MPJLambdaWrapper wrapper = new MPJLambdaWrapper().selectAll(SysMessageEntity.class).select(SysMessageRelationEntity::getReadFlag).leftJoin(SysMessageRelationEntity.class, SysMessageRelationEntity::getMsgId, SysMessageEntity::getId).eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId()).eq(SysMessageEntity::getSendFlag, YesNoEnum.YES.getCode()).eq(StrUtil.isNotBlank(sysMessage.getCategory()), SysMessageEntity::getCategory, sysMessage.getCategory()).eq(StrUtil.isNotBlank(sysMessage.getReadFlag()), SysMessageRelationEntity::getReadFlag, sysMessage.getReadFlag()).orderByDesc(SysMessageEntity::getSort).orderByDesc(SysMessageEntity::getCreateTime); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(SysMessageEntity.class) + .select(SysMessageRelationEntity::getReadFlag) + .leftJoin(SysMessageRelationEntity.class, SysMessageRelationEntity::getMsgId, SysMessageEntity::getId) + .eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId()) + .eq(SysMessageEntity::getSendFlag, YesNoEnum.YES.getCode()) + .eq(StrUtil.isNotBlank(sysMessage.getCategory()), SysMessageEntity::getCategory, sysMessage.getCategory()) + .eq(StrUtil.isNotBlank(sysMessage.getReadFlag()), SysMessageRelationEntity::getReadFlag, sysMessage.getReadFlag()) + .orderByDesc(SysMessageEntity::getSort) + .orderByDesc(SysMessageEntity::getCreateTime); return baseMapper.selectJoinPage(page, SysMessageVO.class, wrapper); } 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 cc7f4dd51..c4d2bc1b6 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 @@ -20,7 +20,11 @@ package com.bsd.pjcloud.admin.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -29,39 +33,55 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.constant.UserStateEnum; +import com.bsd.pjcloud.admin.api.dto.SysUserFaceDto; import com.bsd.pjcloud.admin.api.dto.UserDTO; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.*; +import com.bsd.pjcloud.admin.api.utils.DataUtil; +import com.bsd.pjcloud.admin.api.vo.SysUserFaceVo; +import com.bsd.pjcloud.admin.api.vo.UserExcelFaceVo; import com.bsd.pjcloud.admin.api.vo.UserExcelVO; import com.bsd.pjcloud.admin.api.vo.UserVO; +import com.bsd.pjcloud.admin.mapper.SysUserFaceMapper; import com.bsd.pjcloud.admin.mapper.SysUserMapper; import com.bsd.pjcloud.admin.mapper.SysUserPostMapper; import com.bsd.pjcloud.admin.mapper.SysUserRoleMapper; import com.bsd.pjcloud.admin.service.*; +import com.bsd.pjcloud.admin.utils.excel.ExcelTool; import com.bsd.pjcloud.common.audit.annotation.Audit; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.constant.CommonConstants; import com.bsd.pjcloud.common.core.exception.ErrorCodes; +import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.MsgUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.resolver.ParamResolver; import com.bsd.pjcloud.common.excel.vo.ErrorMessage; +import com.bsd.pjcloud.common.file.core.FileProperties; +import com.bsd.pjcloud.common.file.core.FileTemplate; 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.apache.http.entity.ContentType; +import org.apache.poi.ss.usermodel.PictureData; import org.springframework.beans.BeanUtils; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.context.annotation.Lazy; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -76,6 +96,8 @@ import java.util.stream.Collectors; @AllArgsConstructor public class SysUserServiceImpl extends ServiceImpl implements SysUserService { + private static final String TAG = "系统用户"; + private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); private final SysMenuService sysMenuService; @@ -86,6 +108,10 @@ public class SysUserServiceImpl extends ServiceImpl impl private final SysDeptService sysDeptService; + @Lazy + private final SysUserFaceService sysUserFaceService; + private final SysUserFaceMapper sysUserFaceMapper; + private final SysUserRoleMapper sysUserRoleMapper; private final SysUserPostMapper sysUserPostMapper; @@ -94,6 +120,8 @@ public class SysUserServiceImpl extends ServiceImpl impl private final RemoteWalletService remoteWalletService; + private final SysFileService sysFileService; + /** * 保存用户信息 * @@ -102,7 +130,7 @@ public class SysUserServiceImpl extends ServiceImpl impl */ @Override @Transactional(rollbackFor = Exception.class) - public Boolean saveUser(UserDTO userDto) { + public Long saveUser(UserDTO userDto) { SysUser sysUser = new SysUser(); BeanUtils.copyProperties(userDto, sysUser); sysUser.setLockFlag( @@ -141,9 +169,9 @@ public class SysUserServiceImpl extends ServiceImpl impl }).forEach(sysUserRoleMapper::insert); // 创建用户默认钱包 - CompletableFuture.runAsync(() -> remoteWalletService.createWallet(userDto.getUserId())); + CompletableFuture.runAsync(() -> remoteWalletService.createWallet(sysUser.getUserId())); - return Boolean.TRUE; + return sysUser.getUserId(); } /** @@ -193,7 +221,16 @@ public class SysUserServiceImpl extends ServiceImpl impl */ @Override public IPage getUsersWithRolePage(Page page, UserDTO userDTO) { - return baseMapper.getUserVosPage(page, userDTO, DataScope.of()); + IPage list = baseMapper.getUserVosPage(page, userDTO, DataScope.of()); + if (ObjectUtil.isNotEmpty(list.getRecords())) { + List userIds = list.getRecords().stream().map(UserVO::getUserId).distinct().toList(); + if (ObjectUtil.isNotEmpty(userIds)) { + SysUserFaceDto faceDto = new SysUserFaceDto(); + List faceList = sysUserFaceMapper.groupConcatFaces(faceDto); + DataUtil.convertFacesList(list.getRecords(), CollectionUtils.convertMap(faceList, SysUserFaceVo::getUserId)); + } + } + return list; } /** @@ -414,6 +451,77 @@ public class SysUserServiceImpl extends ServiceImpl impl return R.ok(null, MsgUtils.getMessage(ErrorCodes.SYS_USER_IMPORT_SUCCEED)); } + @Override + public R importUserFace(MultipartFile file, List excelList, BindingResult bindingResult) { + try { + if (ObjectUtil.isEmpty(excelList)) R.failed("excel内容为空"); + // 校验导入的内容 + List errorMessageList = (List) bindingResult.getTarget(); + List deptNames = excelList.stream().map(UserExcelFaceVo::getDeptName).distinct().filter(ObjectUtil::isNotEmpty).toList(); + // 部门 + List sysDeptList = sysDeptService.selectByNames(deptNames); + // 角色 + List roleList = sysRoleService.list(); + // 用户 + List userList = this.list(); + String walletAutoCreate = ParamResolver.getStr("WALLET_AUTO_CREATE"); + String userDefaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); + List roleIds = roleList.stream().filter(v -> ObjectUtil.equals(v.getRoleCode(), walletAutoCreate) || ObjectUtil.equals(v.getRoleCode(), userDefaultRole)).map(SysRole::getRoleId).toList(); + // 读取图片 + Map images = ExcelTool.getPictureFromExcel(file, 1); + for (UserExcelFaceVo v : excelList) { + Long deptId = null; + Set errorMsg = new HashSet<>(); + String username = v.getUsername(), name = v.getName(), mobile = v.getMobile(), sex = v.getSex(), deptName = v.getDeptName(); + if (ObjectUtil.isEmpty(name)) { + errorMsg.add("用户昵称为空"); + } + if (ObjectUtil.isEmpty(mobile)) { + errorMsg.add("手机号码为空"); + } else if (!Validator.isMobile(mobile.trim())) { + errorMsg.add("手机号码格式不正确"); + } else { + // 校验用户名是否存在 + boolean existMobile = userList.stream().anyMatch(i -> ObjectUtil.equals(i.getPhone(), mobile.trim())); + if (existMobile) { + errorMsg.add("手机号已存在"); + } + } + if (ObjectUtil.isEmpty(deptName)) { + errorMsg.add("部门名称为空"); + } else { + Optional targetDept = sysDeptList.stream().filter(i -> ObjectUtil.equals(i.getName(), deptName)).findFirst(); + if (targetDept.isEmpty()) { + errorMsg.add("没有该部门"); + } else { + deptId = targetDept.get().getDeptId(); + } + } + PictureData face = null; + if (ObjectUtil.isNotEmpty(images)) { + String key = String.valueOf(v.getLineNum() - 1); + face = images.getOrDefault(key, null); + } + if (ObjectUtil.isEmpty(face)) { + errorMsg.add("人脸照片为空"); + } + if (CollUtil.isEmpty(errorMsg)) { + insertExcelUser(v, deptId, roleIds, face); + } else { + errorMessageList.add(new ErrorMessage(v.getLineNum(), errorMsg)); + } + } + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(null, MsgUtils.getMessage(ErrorCodes.SYS_USER_IMPORT_SUCCEED)); + } catch (Exception e) { + e.printStackTrace(); + log.error("|{}|导入用户意外的错误error:|{}|", TAG, e.getMessage()); + } + return null; + } + /** * 插入excel User */ @@ -441,6 +549,42 @@ public class SysUserServiceImpl extends ServiceImpl impl this.saveUser(userDTO); } + public void insertExcelUser(UserExcelFaceVo excel, Long deptId, List roleList, PictureData face) { + String username = ObjectUtil.isEmpty(excel.getUsername()) ? excel.getMobile() : excel.getUsername(); + UserDTO userDTO = new UserDTO(); + userDTO.setUsername(username.replaceAll("\\s+", "")); + userDTO.setName(excel.getName().replaceAll("\\s+", "")); + userDTO.setNickname(excel.getName().replaceAll("\\s+", "")); + userDTO.setPhone(excel.getMobile().replaceAll("\\s+", "")); + userDTO.setDeptId(deptId); + // 批量导入初始密码为手机号 + userDTO.setPasswordModifyTime(LocalDateTime.now()); + userDTO.setPassword(userDTO.getPhone().replaceAll("\\s+", "")); + // 根据角色名称查询角色ID + userDTO.setRole(roleList); + // 插入用户 + Long usrId = this.saveUser(userDTO); + userDTO.setUserId(usrId); + insertExcelFace(userDTO, face); + } + + public void insertExcelFace(UserDTO user, PictureData face) { + try { + // 查询用户 + MultipartFile multipartFile = new MockMultipartFile("file", UUID.randomUUID() + "_face.png", "image/png", new ByteArrayInputStream(face.getData())); + Map data = (Map) sysFileService.uploadFile(multipartFile, null, null, null).getData(); + String url = data.get("url").toString(); + SysUserFaceEntity updateObj = new SysUserFaceEntity(); + updateObj.setUserId(user.getUserId()); + updateObj.setFaceImg(url); + sysUserFaceService.create(updateObj); + } catch (Exception e) { + e.printStackTrace(); + log.error("|{}|获取人脸图片错误error:|{}|", TAG, e.getMessage()); + } + } + + /** * 注册用户 赋予用户默认角色 * @@ -465,7 +609,8 @@ public class SysUserServiceImpl extends ServiceImpl impl String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_PHONE_EXISTING, userDto.getPhone()); return R.failed(message); } - return R.ok(saveUser(userDto)); + saveUser(userDto); + return R.ok(true); } /** diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/excel/ExcelTool.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/excel/ExcelTool.java new file mode 100644 index 000000000..6c3d7374b --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/excel/ExcelTool.java @@ -0,0 +1,95 @@ +package com.bsd.pjcloud.admin.utils.excel; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.EasyExcel; +import lombok.experimental.UtilityClass; +import org.apache.poi.EncryptedDocumentException; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.ss.usermodel.PictureData; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.*; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@UtilityClass +public class ExcelTool { + + /** + * 读取sheet的所有图片 + */ + public static Map getPictureFromExcel(MultipartFile file, int sheetNum) throws EncryptedDocumentException, IOException { + String fileName = file.getOriginalFilename(); + Workbook workbook = null; + if (ObjectUtil.isEmpty(fileName)) return null; + InputStream fileInputStream = file.getInputStream(); + if (fileName.endsWith("xls")) { + //2003 + workbook = new HSSFWorkbook(fileInputStream); + HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(sheetNum - 1); + Map pictures = getPictures(sheet); + return pictures; + } else if (fileName.endsWith("xlsx")) { + //2007 + workbook = new XSSFWorkbook(fileInputStream); + XSSFSheet sheet = (XSSFSheet) workbook.getSheetAt(sheetNum - 1); + Map pictures = getPictures(sheet); + return pictures; + } + return new HashMap(); + } + + /** + * 获取图片和位置 (xls版) + */ + public static Map getPictures(HSSFSheet sheet) throws IOException { + Map map = new HashMap(); + List list = sheet.getDrawingPatriarch().getChildren(); + for (HSSFShape shape : list) { + if (shape instanceof HSSFPicture) { + HSSFPicture picture = (HSSFPicture) shape; + HSSFClientAnchor cAnchor = picture.getClientAnchor(); + PictureData pdata = picture.getPictureData(); + String key = String.valueOf(cAnchor.getRow1()); + map.put(key, pdata); + } + } + return map; + } + + /** + * 获取图片和位置 (xlsx版) + */ + public static Map getPictures(XSSFSheet sheet) throws IOException { + Map map = new HashMap(); + List list = sheet.getRelations(); + for (POIXMLDocumentPart part : list) { + if (part instanceof XSSFDrawing) { + XSSFDrawing drawing = (XSSFDrawing) part; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) { + XSSFPicture picture = (XSSFPicture) shape; + XSSFClientAnchor anchor = picture.getPreferredSize(); + CTMarker marker = anchor.getFrom(); + String key = String.valueOf(marker.getRow()); + map.put(key, picture.getPictureData()); + } + } + } + return map; + } + + public static List read(MultipartFile file, Class head) throws IOException { + return EasyExcel.read(file.getInputStream(), head, null) + .autoCloseStream(false) + .doReadAllSync(); + } +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml index 98a12f845..c787a9970 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml @@ -46,4 +46,19 @@ + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletActiveEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletActiveEntity.java index 2ecce9e77..fa6b7a1c7 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletActiveEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletActiveEntity.java @@ -3,8 +3,7 @@ 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 lombok.*; import com.bsd.pjcloud.common.core.util.TenantTable; import java.time.LocalDateTime; @@ -14,6 +13,9 @@ import java.time.LocalDateTime; * @author dzc * @date 2024-12-31 18:53:31 */ +@Builder +@AllArgsConstructor +@NoArgsConstructor @Data @TenantTable @TableName("wallet_active") diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeApplyEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeApplyEntity.java index 75032aae3..493f01693 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeApplyEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeApplyEntity.java @@ -5,8 +5,7 @@ import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.*; import com.bsd.pjcloud.common.core.util.TenantTable; import java.time.LocalDate; @@ -18,6 +17,9 @@ import java.time.LocalDateTime; * @author pjcloud * @date 2024-12-31 14:23:57 */ +@Builder +@AllArgsConstructor +@NoArgsConstructor @Data @TenantTable @TableName("wallet_recharge_apply") @@ -32,6 +34,18 @@ public class WalletRechargeApplyEntity extends Model @Schema(description = "主键ID") private Long id; + /** + * 流程id + */ + @Schema(description = "流程id") + private String processId; + + /** + * 流程状态 + */ + @Schema(description = "流程状态") + private String processStatus; + /** * 申请人ID */ diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletActiveVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletActiveVo.java index e12a0ffd2..6bc7a3df4 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletActiveVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletActiveVo.java @@ -4,11 +4,12 @@ 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.WalletActiveEntity; import com.bsd.pjcloud.wallet.api.vo.base.BaseMchInterface; +import com.bsd.pjcloud.wallet.api.vo.base.BaseWalletTypeInterface; import lombok.Data; @Data -public class WalletActiveVo extends WalletActiveEntity implements BaseUserInterface, BaseDeptInterface, BaseMchInterface { +public class WalletActiveVo extends WalletActiveEntity implements BaseUserInterface, BaseDeptInterface, BaseMchInterface, BaseWalletTypeInterface { /** * 用户相关 */ @@ -29,4 +30,15 @@ public class WalletActiveVo extends WalletActiveEntity implements BaseUserInterf private String merchantName; private String logoPic; + + /** + * 钱包类型相关 + */ + private Long walletTypeId; + + private String walletTypeName; + + private String walletTypeUniqueCode; + + private String walletTypeIcon; } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletActiveController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletActiveController.java index d6d7f5b23..b59d9279b 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletActiveController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletActiveController.java @@ -10,6 +10,7 @@ import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.wallet.api.dto.WalletActiveDto; import com.bsd.pjcloud.wallet.api.entity.WalletActiveEntity; +import com.bsd.pjcloud.wallet.api.vo.WalletActiveVo; import com.bsd.pjcloud.wallet.service.WalletActiveService; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; @@ -41,6 +42,37 @@ public class WalletActiveController { private final WalletActiveService walletActiveService; + /* ************************************* start android start ************************************* */ + @GetMapping("/ad/open-card-list") + @Operation(summary = "android开卡列表") + public R> AdOpenCardList(@ParameterObject Page page, @ParameterObject WalletActiveDto dto) { + return R.ok(walletActiveService.pageJoin(page, dto).getRecords()); + } + + @GetMapping("/ad/open-card-success") + @Operation(summary = "android开卡成功通知") + @Idempotent(info = "正在开卡中,请勿重复提交") + public R AdOpenCardSuccess(@RequestParam Long id) { + return R.ok(walletActiveService.openCardSuccess(id)); + } + + @GetMapping("/ad/refresh-avatar") + @Operation(summary = "重新激活") + @SysLog("android重新激活") + @Idempotent(info = "正在处理中,请勿重复提交") + public R adRefreshAvatar(@RequestParam Long id) { + return R.ok(walletActiveService.refreshAvatar(id)); + } + /* ************************************* end android end ************************************* */ + + @GetMapping("/refresh-avatar") + @Operation(summary = "重新激活") + @SysLog("重新激活") + @Idempotent(info = "正在处理中,请勿重复提交") + public R refreshAvatar(@RequestParam Long id) { + return R.ok(walletActiveService.refreshAvatar(id)); + } + @PostMapping("/fast-create-card") @Operation(summary = "一键开卡") @Idempotent(info = "正在开卡中,请勿重复提交") @@ -49,13 +81,6 @@ public class WalletActiveController { return R.ok(true); } - /** - * 分页查询 - * - * @param page 分页对象 - * @param walletActive 钱包开卡 - * @return - */ @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('wallet_walletActive_view')") @@ -64,27 +89,13 @@ public class WalletActiveController { return R.ok(walletActiveService.page(page, wrapper)); } - /** - * 分页复杂查询 - * - * @param page 分页对象 - * @param walletActive 钱包开卡 - * @return - */ @Operation(summary = "分页复杂查询", description = "分页复杂查询") @GetMapping("/page-join") @PreAuthorize("@pms.hasPermission('wallet_walletActive_view')") public R getWalletActivePageJoin(@ParameterObject Page page, @ParameterObject WalletActiveDto dto) { - return R.ok(walletActiveService.pageJoin(page, dto)); + return R.ok(walletActiveService.scopePage(page, dto)); } - - /** - * 通过id查询钱包开卡 - * - * @param id id - * @return R - */ @Operation(summary = "通过id查询", description = "通过id查询") @GetMapping("/{id}") @PreAuthorize("@pms.hasPermission('wallet_walletActive_view')") @@ -92,12 +103,6 @@ public class WalletActiveController { return R.ok(walletActiveService.getById(id)); } - /** - * 新增钱包开卡 - * - * @param walletActive 钱包开卡 - * @return R - */ @Operation(summary = "新增钱包开卡", description = "新增钱包开卡") @SysLog("新增钱包开卡") @PostMapping @@ -106,12 +111,6 @@ public class WalletActiveController { return R.ok(walletActiveService.save(walletActive)); } - /** - * 修改钱包开卡 - * - * @param walletActive 钱包开卡 - * @return R - */ @Operation(summary = "修改钱包开卡", description = "修改钱包开卡") @SysLog("修改钱包开卡") @PutMapping @@ -120,12 +119,6 @@ public class WalletActiveController { return R.ok(walletActiveService.updateById(walletActive)); } - /** - * 通过id删除钱包开卡 - * - * @param ids id列表 - * @return R - */ @Operation(summary = "通过id删除钱包开卡", description = "通过id删除钱包开卡") @SysLog("通过id删除钱包开卡") @DeleteMapping @@ -134,14 +127,6 @@ public class WalletActiveController { return R.ok(walletActiveService.removeBatchByIds(CollUtil.toList(ids))); } - - /** - * 导出excel 表格 - * - * @param walletActive 查询条件 - * @param ids 导出指定ID - * @return excel 文件流 - */ @ResponseExcel @GetMapping("/export") @PreAuthorize("@pms.hasPermission('wallet_walletActive_export')") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java index fc6763c8a..737202257 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java @@ -8,6 +8,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.excel.annotation.RequestExcel; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto; import com.bsd.pjcloud.wallet.api.dto.excel.WalletRechargeExcelDto; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; @@ -34,12 +38,20 @@ public class WalletRechargeApplyController { private final WalletRechargeApplyService walletRechargeApplyService; + /* ************************************* start callback start ************************************* */ + @Inner(value = false) + @PostMapping("/apply-callback") + public void applyCallback(@RequestBody ProcessNodeRecordAssignUserParamDto dto) { + walletRechargeApplyService.applyCallback(dto); + } + /* ************************************* start callback start ************************************* */ + @Operation(summary = "提交申请", description = "提交申请") @SysLog("提交申请") - @PostMapping("/apply") - @PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_apply')") - public R apply(@RequestBody WalletRechargeApplyDto dto) { - walletRechargeApplyService.apply(dto); + @GetMapping("/apply") + // @PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_apply')") + public R apply(@RequestParam Long id) { + walletRechargeApplyService.apply(id); return R.ok(true); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeController.java index 5d65384ee..0764448d5 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeController.java @@ -7,6 +7,8 @@ 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.common.security.annotation.Inner; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundDto; import com.bsd.pjcloud.wallet.api.dto.recharge.app.WalletAppRechargeDto; diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletActiveMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletActiveMapper.java index 4472ae6c9..98676705e 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletActiveMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletActiveMapper.java @@ -1,7 +1,10 @@ package com.bsd.pjcloud.wallet.mapper; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.wallet.api.dto.WalletActiveDto; import com.bsd.pjcloud.wallet.api.entity.WalletActiveEntity; @@ -17,7 +20,21 @@ public interface WalletActiveMapper extends PjcloudBaseMapper scopePage(Page page, WalletActiveDto dto) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .like(ObjectUtil.isNotEmpty(dto.getCardNumber()), WalletActiveEntity::getCardNumber, dto.getCardNumber()) + .eq(ObjectUtil.isNotEmpty(dto.getIsActiveHardware()), WalletActiveEntity::getIsActiveHardware, dto.getIsActiveHardware()) + .eq(ObjectUtil.isNotEmpty(dto.getDeptId()), WalletActiveEntity::getDeptId, dto.getDeptId()) + .in(ObjectUtil.isNotEmpty(dto.getUserIds()), WalletActiveEntity::getId, dto.getUserIds()); + Page list = selectPageByScope(page, wrapper, DataScope.of()); + list.setRecords(BeanUtils.toBean(list.getRecords(), WalletActiveVo.class)); + return list; + } + + WalletActiveEntity getLast(); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletActiveService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletActiveService.java index 7fa47e0a2..11436ea1a 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletActiveService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletActiveService.java @@ -14,5 +14,20 @@ public interface WalletActiveService extends IService { */ void fastCreateCard(WalletActiveDto dto); + /** + * 开卡成功的通知 + * + * @param id 开卡id + */ + Boolean openCardSuccess(Long id); + + /** + * 重新激活 + * @param id 开卡id + */ + Boolean refreshAvatar(Long id); + Page pageJoin(Page page, WalletActiveDto dto); + + Page scopePage(Page page, WalletActiveDto dto); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java index 087ecde84..a2176f3e2 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java @@ -3,6 +3,7 @@ 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.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto; import com.bsd.pjcloud.wallet.api.dto.excel.WalletRechargeExcelDto; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; @@ -20,9 +21,9 @@ public interface WalletRechargeApplyService extends IService excelVOList, BindingResult bindingResult); + + /** + * 审批回调 + */ + void applyCallback(ProcessNodeRecordAssignUserParamDto dto); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeService.java index 088e85468..0a1ab747b 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeService.java @@ -2,6 +2,7 @@ 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.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundDto; import com.bsd.pjcloud.wallet.api.dto.recharge.app.WalletAppRechargeDto; @@ -14,6 +15,7 @@ public interface WalletRechargeService extends IService { /** * app充值 + * * @param dto * @return */ @@ -21,6 +23,7 @@ public interface WalletRechargeService extends IService { /** * 远程调用-退款 + * * @param dto * @return */ @@ -29,6 +32,7 @@ public interface WalletRechargeService extends IService { /** * 根据退款id查询 + * * @return */ WalletRechargeEntity getByRefundId(Long refundId); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletActiveServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletActiveServiceImpl.java index 69d0d1a64..5fa89c73e 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletActiveServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletActiveServiceImpl.java @@ -17,6 +17,7 @@ import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.dto.MchManageDto; import com.bsd.pjcloud.wallet.api.dto.WalletActiveDto; +import com.bsd.pjcloud.wallet.api.dto.WalletTypeDto; import com.bsd.pjcloud.wallet.api.entity.MchManageEntity; import com.bsd.pjcloud.wallet.api.entity.WalletActiveEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; @@ -24,6 +25,7 @@ import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.api.vo.WalletActiveVo; import com.bsd.pjcloud.wallet.mapper.WalletActiveMapper; +import com.bsd.pjcloud.wallet.mapper.WalletTypeMapper; import com.bsd.pjcloud.wallet.service.MchManageService; import com.bsd.pjcloud.wallet.service.WalletActiveService; import com.bsd.pjcloud.wallet.service.WalletTypeService; @@ -49,6 +51,8 @@ import java.util.Map; @Service public class WalletActiveServiceImpl extends ServiceImpl implements WalletActiveService { + private final WalletTypeMapper walletTypeMapper; + private final WalletTypeService walletTypeService; private final MchManageService mchManageService; @@ -66,7 +70,7 @@ public class WalletActiveServiceImpl extends ServiceImpl batchSaveList = new ArrayList<>(); for (int i = 0; i < count; i++) { @@ -84,6 +88,30 @@ public class WalletActiveServiceImpl extends ServiceImpl 0; + } + + @Override + public Boolean refreshAvatar(Long id) { + // 校验存在 + WalletActiveEntity detail = baseMapper.selectById(id); + if (ObjectUtil.isEmpty(detail)) throw new RuntimeException("开卡记录不存在"); + if (ObjectUtil.isNotEmpty(detail.getIsActiveHardware()) && ObjectUtil.equals(detail.getIsActiveHardware(), YesNoEnum.NO.getCode())) { + throw new RuntimeException("该卡未激活,无需重新激活"); + } + WalletActiveEntity updateObj = WalletActiveEntity.builder().id(detail.getId()).isActiveHardware(YesNoEnum.NO.getCode()).build(); + return baseMapper.updateById(updateObj) > 0; + } + @Override public Page pageJoin(Page page, WalletActiveDto dto) { Page list = baseMapper.pageJoin(page, dto); @@ -92,27 +120,63 @@ public class WalletActiveServiceImpl extends ServiceImpl userIds = list.getRecords().stream().map(WalletActiveVo::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)); + DataUtil.convertUserList(list.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); } // 部门 List deptIds = list.getRecords().stream().map(WalletActiveVo::getDeptId).distinct().toList(); R> deptList = deptService.getDeptByDeptIds(deptIds); if (ObjectUtil.isNotEmpty(deptList.getData())) { - DataUtil.convertDeptList(page.getRecords(), deptList.getData()); + DataUtil.convertDeptList(list.getRecords(), deptList.getData()); } // 商户 List mchIds = list.getRecords().stream().map(WalletActiveVo::getMerchantId).distinct().toList(); List mchList = mchManageService.list(MchManageDto.builder().ids(mchIds).build()); if (ObjectUtil.isNotEmpty(mchList)) { - WalletDataUtil.convertMchList(page.getRecords(), CollectionUtils.convertMap(mchList, MchManageVo::getId)); + WalletDataUtil.convertMchList(list.getRecords(), CollectionUtils.convertMap(mchList, MchManageVo::getId)); + } + // 饭卡类型 + List walletTypeIds = list.getRecords().stream().map(WalletActiveVo::getWalletTypeId).distinct().toList(); + if (ObjectUtil.isNotEmpty(walletTypeIds)) { + WalletTypeDto walletTypeDto = new WalletTypeDto(); + walletTypeDto.setWalletTypeIds(walletTypeIds); + List walletTypeList = walletTypeMapper.list(walletTypeDto); + if (ObjectUtil.isNotEmpty(walletTypeList)) { + WalletDataUtil.convertWalletTYpeList(list.getRecords(), CollectionUtils.convertMap(walletTypeList, WalletTypeEntity::getId)); + } } } return list; } - private WalletActiveEntity getLast() { - LambdaQueryWrapper query = new LambdaQueryWrapper(); - query.orderByDesc(WalletActiveEntity::getId).last("LIMIT 1"); - return baseMapper.selectOne(query); + @Override + public Page scopePage(Page page, WalletActiveDto dto) { + Page list = baseMapper.scopePage(page, dto); + if (ObjectUtil.isNotEmpty(list.getRecords())) { + // 用户 + List userIds = list.getRecords().stream().map(WalletActiveVo::getUserId).distinct().toList(); + if (ObjectUtil.isNotEmpty(userIds)) { + 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(WalletActiveVo::getDeptId).distinct().toList(); + if (ObjectUtil.isNotEmpty(deptIds)) { + R> deptList = deptService.getDeptByDeptIds(deptIds); + if (ObjectUtil.isNotEmpty(deptList.getData())) { + DataUtil.convertDeptList(page.getRecords(), deptList.getData()); + } + } + // 商户 + List mchIds = list.getRecords().stream().map(WalletActiveVo::getMerchantId).distinct().toList(); + if (ObjectUtil.isNotEmpty(mchIds)) { + List mchList = mchManageService.list(MchManageDto.builder().ids(mchIds).build()); + if (ObjectUtil.isNotEmpty(mchList)) { + WalletDataUtil.convertMchList(page.getRecords(), CollectionUtils.convertMap(mchList, MchManageVo::getId)); + } + } + } + return list; } } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletForeignServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletForeignServiceImpl.java index dc0c8a465..c6195973a 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletForeignServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletForeignServiceImpl.java @@ -1,5 +1,7 @@ package com.bsd.pjcloud.wallet.service.impl; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -22,13 +24,15 @@ import com.bsd.pjcloud.wallet.api.entity.WalletForeignEntity; import com.bsd.pjcloud.wallet.api.vo.WalletForeignVo; import com.bsd.pjcloud.wallet.mapper.WalletForeignMapper; import com.bsd.pjcloud.wallet.service.WalletForeignService; -import com.bsd.pjcloud.wallet.utils.FlowUtil; +import com.bsd.pjcloud.wallet.utils.flow.FlowUtil; +import com.bsd.pjcloud.wallet.utils.flow.dto.WalletForeignApplyFlowDto; 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; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -57,19 +61,27 @@ public class WalletForeignServiceImpl extends ServiceImpl userData = userService.getByUserId(dto.getUserId()); - if (ObjectUtil.isEmpty(userData.getData())) { - throw new RuntimeException("发起人不存在"); - } - // 判断之前有没有在审核的 - if (isCheckData(dto.getUserId())) { - throw new RuntimeException("已提交申请,请勿重复提交"); - } - dto.setDeptId(userData.getData().getSysUser().getDeptId()); + UserInfo userData = userService.getByUserId(dto.getUserId()).getData(); + if (ObjectUtil.isEmpty(userData)) throw new RuntimeException("发起人不存在"); + dto.setDeptId(userData.getSysUser().getDeptId()); dto.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); + // 查询部门 + SysDept dept = deptService.getDeptByDeptId(dto.getDeptId()).getData(); + if (ObjectUtil.isEmpty(dept)) throw new RuntimeException("发起人部门不存在"); + // 判断之前有没有在审核的 + if (isCheckData(dto.getUserId())) throw new RuntimeException("已提交申请,请勿重复提交"); baseMapper.insert(dto); // 发起审批 - String processId = flowUtil.startFlow("TASK_FOREIGN_FLOW", userData.getData().getSysUser(), dto.getId()); + WalletForeignApplyFlowDto flowDto = new WalletForeignApplyFlowDto(); + flowDto.setApplyUsername(userData.getSysUser().getUsername()); + flowDto.setApplyUserId(userData.getSysUser().getUserId()); + flowDto.setApplyDeptName(dept.getName()); + flowDto.setApplyDeptId(dept.getDeptId()); + flowDto.setApplyCreateTime(LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.NORM_DATETIME_PATTERN)); + flowDto.setCount(dto.getCount()); + flowDto.setRemark(dto.getRemark()); + flowDto.setApplyTime(LocalDateTimeUtil.format(dto.getApplyStartTime(), DatePattern.NORM_DATE_PATTERN) + " - " + LocalDateTimeUtil.format(dto.getApplyEndTime(), DatePattern.NORM_DATE_PATTERN)); + String processId = flowUtil.startFlow("TASK_FOREIGN_FLOW", userData.getSysUser(), dto.getId(), flowDto); baseMapper.updateById(WalletForeignEntity.builder().id(dto.getId()).processId(processId).build()); return dto.getId(); } @@ -98,7 +110,7 @@ public class WalletForeignServiceImpl extends ServiceImpl userData = userService.getByUserId(dto.getUserId()); - if (ObjectUtil.isEmpty(userData.getData())) { - throw new RuntimeException("发起人不存在"); - } + UserInfo userData = userService.getByUserId(dto.getUserId()).getData(); + if (ObjectUtil.isEmpty(userData)) throw new RuntimeException("发起人不存在"); // 查询钱包 WalletManageEntity wallet = walletManageService.getWallet(dto.getUserId(), dto.getWalletTypeId()); - if (ObjectUtil.isEmpty(wallet)) { - throw new RuntimeException("用户钱包不存在"); - } - dto.setDeptId(userData.getData().getSysUser().getDeptId()); + if (ObjectUtil.isEmpty(wallet)) throw new RuntimeException("用户钱包不存在"); + dto.setDeptId(userData.getSysUser().getDeptId()); dto.setFreeStatus(YesNoEnum.NO.getCode()); dto.setWalletId(wallet.getId()); dto.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); + // 查询部门 + SysDept dept = deptService.getDeptByDeptId(dto.getDeptId()).getData(); + if (ObjectUtil.isEmpty(dept)) throw new RuntimeException("发起人部门不存在"); baseMapper.insert(dto); // 发起审批 - String processId = flowUtil.startFlow("TASK_FREEZE_FLOW", userData.getData().getSysUser(), dto.getId()); + WalletFreezeApplyFlowDto flowDto = new WalletFreezeApplyFlowDto(); + flowDto.setApplyUsername(userData.getSysUser().getUsername()); + flowDto.setApplyUserId(userData.getSysUser().getUserId()); + flowDto.setApplyDeptName(dept.getName()); + flowDto.setApplyDeptId(dept.getDeptId()); + flowDto.setApplyCreateTime(LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.NORM_DATETIME_PATTERN)); + flowDto.setCardNumber(wallet.getCardNumber()); + flowDto.setRemark(dto.getRemark()); + String processId = flowUtil.startFlow("TASK_FREEZE_FLOW", userData.getSysUser(), dto.getId(), flowDto); baseMapper.updateById(WalletFreezeEntity.builder().id(dto.getId()).processId(processId).build()); return dto.getId(); } @@ -112,6 +120,10 @@ public class WalletFreezeServiceImpl extends ServiceImpl userData = userService.getByUserId(dto.getUserId()); - if (ObjectUtil.isEmpty(userData.getData())) { - throw new RuntimeException("发起人不存在"); - } + UserInfo userData = userService.getByUserId(dto.getUserId()).getData(); + if (ObjectUtil.isEmpty(userData)) throw new RuntimeException("发起人不存在"); + dto.setDeptId(userData.getSysUser().getDeptId()); + dto.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); + // 查询部门 + SysDept dept = deptService.getDeptByDeptId(dto.getDeptId()).getData(); + if (ObjectUtil.isEmpty(dept)) throw new RuntimeException("发起人部门不存在"); // 判断之前有没有在审核的 if (isCheckData(dto.getUserId())) { throw new RuntimeException("已提交申请,请勿重复提交"); } - dto.setDeptId(userData.getData().getSysUser().getDeptId()); - dto.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); baseMapper.insert(dto); // 发起审批 - String processId = flowUtil.startFlow("TASK_STRIDE_FLOW", userData.getData().getSysUser(), dto.getId()); + WalletStrideApplyFlowDto flowDto = new WalletStrideApplyFlowDto(); + flowDto.setApplyUsername(userData.getSysUser().getUsername()); + flowDto.setApplyUserId(userData.getSysUser().getUserId()); + flowDto.setApplyDeptName(dept.getName()); + flowDto.setApplyDeptId(dept.getDeptId()); + flowDto.setApplyCreateTime(LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.NORM_DATETIME_PATTERN)); + flowDto.setCount(dto.getCount()); + flowDto.setRemark(dto.getRemark()); + String processId = flowUtil.startFlow("TASK_STRIDE_FLOW", userData.getSysUser(), dto.getId(), flowDto); baseMapper.updateById(WalletStrideEntity.builder().id(dto.getId()).processId(processId).build()); return dto.getId(); } @@ -121,6 +135,10 @@ public class WalletStrideServiceImpl extends ServiceImpl implements WalletRechargeApplyService { + static private final String TAG = "充值/扣款申请"; + private final WalletRechargeImportServiceImpl rechargeImportService; private final WalletManageService walletManageService; + private final WalletTransactionService walletTransactionService; + private final WalletTypeService walletTypeService; private final RemoteUserService userService; private final RemoteDeptService deptService; + private final FlowUtil flowUtil; + @Override public void create(WalletRechargeApplyEntity dto) { PjcloudUser loginUser = SecurityUtils.getUser(); @@ -83,12 +104,35 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl() + .eq(WalletRechargeApplyEntity::getProcessId, processId) + ); + if (ObjectUtil.isEmpty(detail)) return; + if (!ObjectUtil.equals(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) { + log.error("|{}|重复的回调,dto:|{}|", TAG); + return; + } + try { + Boolean isConsent = flowUtil.isConsent(dto); + String processStatus = isConsent ? TaskCheckStatusEnum.RESULT.getCode() : TaskCheckStatusEnum.REJECT.getCode(); + baseMapper.updateById(WalletRechargeApplyEntity.builder().id(detail.getId()).processStatus(processStatus).build()); + if (isConsent) { + List importList = rechargeImportService.list(new LambdaQueryWrapper() + .eq(WalletRechargeImportEntity::getApplyId, detail.getId()) + ); + if (ObjectUtil.isEmpty(importList)) return; + if (ObjectUtil.equals(detail.getBizType(), WalletBizRechargeEnum.REDUCTION.getCode())) { + importList.forEach(v -> v.setPrice(-1 * Math.abs(v.getPrice()))); + } + for (WalletRechargeImportEntity v : importList) { + // 查询每个人的钱包余额 + WalletManageEntity wallet = walletManageService.getWallet(v.getUserId(), detail.getWalletTypeId()); + if (ObjectUtil.isEmpty(wallet)) continue; + walletTransactionService.addWalletBalance(wallet.getId(), v.getPrice(), String.valueOf(v.getId()), WalletBizEnum.BATCH); + } + log.info("|{}|审批回调成功,dto:|{}", TAG, JSON.toJSONString(dto)); + } + } catch (Exception e) { + e.printStackTrace(); + log.error("|{}|审批回调意外的错误,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage()); + } + } } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeServiceImpl.java index 79888650d..f545585e9 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeServiceImpl.java @@ -21,7 +21,6 @@ import com.bsd.pjcloud.wallet.service.WalletRechargeService; import com.bsd.pjcloud.wallet.service.WalletTransactionService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.seata.spring.annotation.GlobalTransactional; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/FlowUtil.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/FlowUtil.java similarity index 84% rename from pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/FlowUtil.java rename to pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/FlowUtil.java index 6f3c2004f..bbb09a1e5 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/FlowUtil.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/FlowUtil.java @@ -1,5 +1,6 @@ -package com.bsd.pjcloud.wallet.utils; +package com.bsd.pjcloud.wallet.utils.flow; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; @@ -40,6 +41,10 @@ public class FlowUtil { private final ObjectMapper objectMapper; public String startFlow(String flowIdKey, SysUser user, Long businessId) { + return startFlow(flowIdKey, user, businessId, null); + } + + public String startFlow(String flowIdKey, SysUser user, Long businessId, Object dto) { // 发起工作流 String defaultRole = ParamResolver.getStr(flowIdKey); if (ObjectUtil.isEmpty(defaultRole)) { @@ -53,7 +58,11 @@ public class FlowUtil { } ProcessVO processVo = detail.getData(); ProcessInstanceParamDto processDto = new ProcessInstanceParamDto(); - Map paramMap = readMap(processVo, user); + Map dtoMap = null; + if (ObjectUtil.isNotEmpty(dto)) { + dtoMap = BeanUtil.beanToMap(dto); + } + Map paramMap = readMap(user, dtoMap); processDto.setFlowId(processVo.getFlowId()); processDto.setParamMap(paramMap); processDto.setStartUserId(String.valueOf(user.getUserId())); @@ -61,24 +70,14 @@ public class FlowUtil { return startVo.getData(); } - public Map readMap(ProcessVO vo, SysUser user) { + public Map readMap(SysUser user, Map dtoMap) { Map paramMap = new HashMap<>(); + if (ObjectUtil.isNotEmpty(dtoMap)) paramMap = dtoMap; Dict rootUser = Dict.create() .set("id", user.getUserId()) .set("name", user.getUsername()) .set("type", NodeUserTypeEnum.USER.getKey()); paramMap.put("root", CollUtil.newArrayList(rootUser)); - try { - List formItemVOList = objectMapper.readValue(vo.getFormItems(), new TypeReference<>() { - }); - for (FormItemVO v : formItemVOList) { - if (ObjectUtil.equals(v.getType(), "Layout")) continue; - if (!ObjectUtil.isAllNotEmpty(v.getId(), v.getProps())) continue; - paramMap.put(v.getId(), v.getProps().getValue()); - } - } catch (Exception e) { - e.printStackTrace(); - } return paramMap; } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletForeignApplyFlowDto.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletForeignApplyFlowDto.java new file mode 100644 index 000000000..70e71ccaf --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletForeignApplyFlowDto.java @@ -0,0 +1,24 @@ +package com.bsd.pjcloud.wallet.utils.flow.dto; + +import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto; +import lombok.Data; + +@Data +public class WalletForeignApplyFlowDto extends FlowBaseDto { + + /** + * 申请数量 + */ + private Integer count; + + /** + * 备注 + */ + private String remark; + + /** + * 使用时间 + */ + private String applyTime; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletFreezeApplyFlowDto.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletFreezeApplyFlowDto.java new file mode 100644 index 000000000..ec8e70c82 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletFreezeApplyFlowDto.java @@ -0,0 +1,20 @@ +package com.bsd.pjcloud.wallet.utils.flow.dto; + +import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto; +import lombok.Data; + + +@Data +public class WalletFreezeApplyFlowDto extends FlowBaseDto { + + /** + * 卡号 + */ + private String cardNumber; + + /** + * 备注 + */ + private String remark; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletRechargeApplyFlowDto.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletRechargeApplyFlowDto.java new file mode 100644 index 000000000..84cb2438d --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletRechargeApplyFlowDto.java @@ -0,0 +1,24 @@ +package com.bsd.pjcloud.wallet.utils.flow.dto; + +import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto; +import lombok.Data; + +@Data +public class WalletRechargeApplyFlowDto extends FlowBaseDto { + + /** + * 饭卡类型 + */ + private String walletTypeStr; + + /** + * 充值年月 + */ + private String importTime; + + /** + * 备注 + */ + private String remark; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletStrideApplyFlowDto.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletStrideApplyFlowDto.java new file mode 100644 index 000000000..5af4bc915 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletStrideApplyFlowDto.java @@ -0,0 +1,19 @@ +package com.bsd.pjcloud.wallet.utils.flow.dto; + +import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto; +import lombok.Data; + +@Data +public class WalletStrideApplyFlowDto extends FlowBaseDto { + + /** + * 申请数量 + */ + private Integer count; + + /** + * 备注 + */ + private String remark; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletActiveMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletActiveMapper.xml index daf14beab..8f6ff1f0d 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletActiveMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletActiveMapper.xml @@ -19,4 +19,8 @@ + + \ No newline at end of file