From 4c4c7e90814647ca838cdb06b321b6d31f63cf31 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 13 Mar 2025 18:12:27 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=E4=BA=BA=E5=91=98=E4=BA=BA=E8=84=B8?= =?UTF-8?q?=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 | 56 ++++--- .../core/constant/CommonRoleConstant.java | 9 ++ .../common/security/util/SecurityUtils.java | 4 + .../pjcloud/admin/api/dto/SysUserFaceDto.java | 11 +- .../bsd/pjcloud/admin/api/entity/SysUser.java | 24 ++- .../admin/api/entity/SysUserFaceEntity.java | 112 ++++++++------ .../com/bsd/pjcloud/admin/api/vo/UserVO.java | 20 ++- pjcloud-upms/pjcloud-upms-biz/pom.xml | 4 + .../admin/controller/SysUserController.java | 33 ++++- .../controller/SysUserFaceController.java | 31 +++- .../admin/mapper/SysUserFaceMapper.java | 23 ++- .../pjcloud/admin/service/SysRoleService.java | 5 + .../admin/service/SysUserFaceService.java | 12 ++ .../pjcloud/admin/service/SysUserService.java | 15 +- .../service/impl/SysRoleServiceImpl.java | 19 ++- .../service/impl/SysUserFaceServiceImpl.java | 124 +++++++++++++++- .../service/impl/SysUserServiceImpl.java | 127 ++++++++++++++-- .../pjcloud/admin/utils/flow/FlowUtil.java | 138 ++++++++++++++++++ .../utils/flow/dto/UserApplyFlowDto.java | 10 ++ .../utils/flow/dto/UserFaceApplyFlowDto.java | 12 ++ .../main/resources/mapper/SysUserMapper.xml | 14 +- .../WalletRechargeApplyServiceImpl.java | 125 +++++++++++----- .../pjcloud/wallet/utils/flow/FlowUtil.java | 3 - 23 files changed, 787 insertions(+), 144 deletions(-) create mode 100644 pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java create mode 100644 pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java create mode 100644 pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserApplyFlowDto.java create mode 100644 pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserFaceApplyFlowDto.java diff --git a/db/800pjcloudx_wallet.sql b/db/800pjcloudx_wallet.sql index 4b0156144..c9b7e645f 100644 --- a/db/800pjcloudx_wallet.sql +++ b/db/800pjcloudx_wallet.sql @@ -1,6 +1,31 @@ create database `pjcloudx_wallet` default character set utf8mb4 collate utf8mb4_general_ci; +-- ---------------------------- +-- Table structure for sys_user_face +-- ---------------------------- +DROP TABLE IF EXISTS sys_user_face; +CREATE TABLE `sys_user_face` +( + id bigint NOT NULL COMMENT '编号', + auto_code varchar(1024) DEFAULT NULL COMMENT '自增code', + user_id bigint NOT NULL COMMENT '用户ID', + process_id varchar(256) COMMENT '流程id', + process_status varchar(10) COMMENT '审核状体', + process_time datetime COMMENT '审核时间', + face_img varchar(256) NOT NULL COMMENT '人脸图片', + create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + update_time datetime DEFAULT NULL COMMENT '修改时间', + del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + tenant_id bigint DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (id) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci COMMENT ='人脸样本表'; +CREATE INDEX idx_dept_id ON sys_user_face (user_id); + -- ---------------------------- -- Table structure for mch_manage -- ---------------------------- @@ -61,6 +86,14 @@ CREATE TABLE wallet_manage COLLATE = utf8mb4_general_ci COMMENT ='钱包管理'; CREATE INDEX idx_dept_id ON wallet_manage (user_id); +-- ---------------------------- +-- Table structure for wallet_rule_dept +-- ---------------------------- + +-- ---------------------------- +-- Table structure for wallet_rule_config +-- ---------------------------- + -- ---------------------------- -- Table structure for wallet_type -- ---------------------------- @@ -159,29 +192,6 @@ CREATE TABLE wallet_transaction DEFAULT CHARSET = utf8mb4 COMMENT ='会员钱包流水表'; CREATE INDEX idx_dept_id ON wallet_transaction (wallet_id); - --- ---------------------------- --- Table structure for sys_user_face --- ---------------------------- -DROP TABLE IF EXISTS sys_user_face; -CREATE TABLE `sys_user_face` -( - id bigint NOT NULL COMMENT '编号', - auto_code varchar(1024) DEFAULT NULL COMMENT '自增code', - user_id bigint NOT NULL COMMENT '用户ID', - face_img varchar(256) NOT NULL COMMENT '人脸图片', - create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', - create_time datetime DEFAULT NULL COMMENT '创建时间', - update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', - update_time datetime DEFAULT NULL COMMENT '修改时间', - del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', - tenant_id bigint DEFAULT NULL COMMENT '租户ID', - PRIMARY KEY (id) -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4 - COLLATE = utf8mb4_general_ci COMMENT ='人脸样本表'; -CREATE INDEX idx_dept_id ON sys_user_face (user_id); - -- ---------------------------- -- Table structure for wallet_recharge_apply -- ---------------------------- diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java new file mode 100644 index 000000000..2e611d3a9 --- /dev/null +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java @@ -0,0 +1,9 @@ +package com.bsd.pjcloud.common.core.constant; + +public interface CommonRoleConstant { + + String DEFAULT_USER = "GENERAL_USER"; + + String DEPT_ADMIN = "DEPT_ADMIN"; + +} diff --git a/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/util/SecurityUtils.java b/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/util/SecurityUtils.java index e0ad8ca31..741ab5808 100644 --- a/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/util/SecurityUtils.java +++ b/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/util/SecurityUtils.java @@ -17,10 +17,14 @@ package com.bsd.pjcloud.common.security.util; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; + import com.bsd.pjcloud.common.core.constant.SecurityConstants; import com.bsd.pjcloud.common.security.service.PjcloudUser; + import lombok.experimental.UtilityClass; + import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java index d222f1957..83b967915 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java @@ -1,12 +1,15 @@ package com.bsd.pjcloud.admin.api.dto; import com.bsd.pjcloud.admin.api.entity.SysUserFaceEntity; +import com.bsd.pjcloud.admin.api.vo.base.BaseIsDeepDeptTreeInterface; +import com.bsd.pjcloud.admin.api.vo.base.BaseIsIncludeTreeInterface; + import lombok.Data; import java.util.List; @Data -public class SysUserFaceDto extends SysUserFaceEntity { +public class SysUserFaceDto extends SysUserFaceEntity implements BaseIsIncludeTreeInterface { private Long merchantDeptId; @@ -18,4 +21,10 @@ public class SysUserFaceDto extends SysUserFaceEntity { private Long merchantDeptIdOrGlobal; + private Boolean isProcessIdNotNull = false; + + /** + * 是否包含部门ids + */ + private Boolean isInclude; } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java index 4b2115bfd..b23834d93 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java @@ -23,8 +23,10 @@ import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.fasterxml.jackson.annotation.JsonIgnore; import com.bsd.pjcloud.common.core.util.TenantTable; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; + import org.javers.core.metamodel.annotation.DiffInclude; import org.javers.core.metamodel.annotation.PropertyName; @@ -53,6 +55,24 @@ public class SysUser extends Model implements Serializable { @Schema(description = "主键id") private Long userId; + /** + * 流程id + */ + @Schema(description = "流程id") + private String processId; + + /** + * 流程状态 + */ + @Schema(description = "流程状态") + private String processStatus; + + /** + * 审核时间 + */ + @Schema(description = "审核时间") + private LocalDateTime processTime; + /** * 用户名 */ @@ -120,14 +140,12 @@ public class SysUser extends Model implements Serializable { @Schema(description = "密码过期标记") private String passwordExpireFlag; - /** * 密码修改时间 */ @Schema(description = "密码修改时间") private LocalDateTime passwordModifyTime; - /** * 手机号 */ @@ -216,14 +234,12 @@ public class SysUser extends Model implements Serializable { @Schema(description = "邮箱") private String email; - /** * 员工浙政钉编码 */ @Schema(description = "员工浙政钉编码") private String dingtalkEmployeeCode; - @Schema(description = "员工所属系统类型") private String systemType; diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserFaceEntity.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserFaceEntity.java index 9224f8019..b7a6efc3b 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserFaceEntity.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserFaceEntity.java @@ -2,10 +2,16 @@ package com.bsd.pjcloud.admin.api.entity; import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.extension.activerecord.Model; + import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + import com.bsd.pjcloud.common.core.util.TenantTable; + import java.time.LocalDateTime; /** @@ -14,6 +20,9 @@ import java.time.LocalDateTime; * @author pjcloud * @date 2024-12-31 11:20:04 */ +@Builder +@AllArgsConstructor +@NoArgsConstructor @Data @TenantTable @TableName("sys_user_face") @@ -21,71 +30,88 @@ import java.time.LocalDateTime; @Schema(description = "人脸样本表") public class SysUserFaceEntity extends Model { - - /** - * 编号 - */ + /** + * 编号 + */ @TableId(type = IdType.ASSIGN_ID) - @Schema(description="编号") + @Schema(description = "编号") private Long id; /** * 自增code */ - @Schema(description="自增code") + @Schema(description = "自增code") private String autoCode; - /** - * 用户ID - */ - @Schema(description="用户ID") + /** + * 用户ID + */ + @Schema(description = "用户ID") private Long userId; - /** - * 人脸图片 - */ - @Schema(description="人脸图片") + /** + * 流程id + */ + @Schema(description = "流程id") + private String processId; + + /** + * 流程状态 + */ + @Schema(description = "流程状态") + private String processStatus; + + /** + * 审核时间 + */ + @Schema(description = "审核时间") + private LocalDateTime processTime; + + /** + * 人脸图片 + */ + @Schema(description = "人脸图片") private String faceImg; - /** - * 创建人 - */ - @TableField(fill = FieldFill.INSERT) - @Schema(description="创建人") + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") private String createBy; - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - @Schema(description="创建时间") + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") private LocalDateTime createTime; - /** - * 修改人 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - @Schema(description="修改人") + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") private String updateBy; - /** - * 修改时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - @Schema(description="修改时间") + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") private LocalDateTime updateTime; - /** - * 删除标记 - */ + /** + * 删除标记 + */ @TableLogic - @TableField(fill = FieldFill.INSERT) - @Schema(description="删除标记") + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") private String delFlag; - /** - * 租户ID - */ - @Schema(description="租户ID") + /** + * 租户ID + */ + @Schema(description = "租户ID") private Long tenantId; } \ No newline at end of file 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 9ba88024d..c518b672e 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 @@ -25,6 +25,7 @@ import com.bsd.pjcloud.admin.api.entity.SysPost; import com.bsd.pjcloud.admin.api.entity.SysRole; import com.bsd.pjcloud.common.sensitive.annotation.Sensitive; import com.bsd.pjcloud.common.sensitive.core.SensitiveTypeEnum; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -48,6 +49,24 @@ public class UserVO implements BaseFacesInterface, Serializable { @Schema(description = "主键") private Long userId; + /** + * 流程id + */ + @Schema(description = "流程id") + private String processId; + + /** + * 流程状态 + */ + @Schema(description = "流程状态") + private String processStatus; + + /** + * 审核时间 + */ + @Schema(description = "审核时间") + private LocalDateTime processTime; + /** * 用户名 */ @@ -198,7 +217,6 @@ public class UserVO implements BaseFacesInterface, Serializable { @Schema(description = "邮箱") private String email; - @Schema(description = "员工浙政钉编码") private String dingtalkEmployeeCode; diff --git a/pjcloud-upms/pjcloud-upms-biz/pom.xml b/pjcloud-upms/pjcloud-upms-biz/pom.xml index 52ff8f921..93ca708b1 100644 --- a/pjcloud-upms/pjcloud-upms-biz/pom.xml +++ b/pjcloud-upms/pjcloud-upms-biz/pom.xml @@ -216,6 +216,10 @@ 5.7.0 compile + + com.bsd + pjcloud-flow-task-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 5171e7914..572400057 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 @@ -20,6 +20,7 @@ package com.bsd.pjcloud.admin.controller; import cn.hutool.core.collection.CollUtil; + import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -41,12 +42,15 @@ import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.HasPermission; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; + import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.AllArgsConstructor; + import org.apache.commons.lang3.StringUtils; import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.HttpHeaders; @@ -73,6 +77,16 @@ public class SysUserController { private final SysUserService userService; + /* ************************************* start 回调 start ************************************* */ + + @Inner(value = false) + @PostMapping("/apply-callback") + public void applyCallback(@RequestBody ProcessNodeRecordAssignUserParamDto dto) { + userService.applyCallback(dto); + } + + /* ************************************* end 回调 end ************************************* */ + /** * 获取指定用户全部信息 * @@ -90,8 +104,10 @@ public class SysUserController { @Inner @GetMapping("/get-name-and-mobile") - public R getUserByNameAndMobile(@RequestParam("name") String name, @RequestParam("mobile") String mobile) { - SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getName, name).eq(SysUser::getPhone, mobile)); + public R getUserByNameAndMobile(@RequestParam("name") String name, + @RequestParam("mobile") String mobile) { + SysUser user = userService.getOne( + Wrappers.query().lambda().eq(SysUser::getName, name).eq(SysUser::getPhone, mobile)); if (user == null) { return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, name, mobile)); } @@ -270,7 +286,8 @@ public class SysUserController { @PostMapping("/import-face") @HasPermission("sys_user_export") - public R importUserFace(@RequestParam("file") MultipartFile file, @RequestExcel List excelList, BindingResult bindingResult) { + public R importUserFace(@RequestParam("file") MultipartFile file, @RequestExcel List excelList, + BindingResult bindingResult) { return userService.importUserFace(file, excelList, bindingResult); } @@ -370,7 +387,9 @@ public class SysUserController { @Inner public R> getUserByMobileOrEmployeeCode(@RequestParam("employeeCode") String employeeCode, @RequestParam("mobile") String mobile) { - return R.ok(userService.list(Wrappers.lambdaQuery().eq(SysUser::getDingtalkEmployeeCode, employeeCode).or().eq(SysUser::getPhone, mobile))); + return R.ok(userService.list( + Wrappers.lambdaQuery().eq(SysUser::getDingtalkEmployeeCode, employeeCode).or() + .eq(SysUser::getPhone, mobile))); } @GetMapping("/getUserByMobile") @@ -382,8 +401,9 @@ public class SysUserController { @GetMapping("/getSimpleUserAll") @Schema(description = "简要用户信息") - public R> getSimpleUserAllList(@RequestParam(value = "mobile", required = false) String mobile, - @RequestParam(value = "name", required = false) String name) { + public R> getSimpleUserAllList( + @RequestParam(value = "mobile", required = false) String mobile, + @RequestParam(value = "name", required = false) String name) { LambdaQueryWrapper sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); sysUserLambdaQueryWrapper.like(StringUtils.isNotBlank(mobile), SysUser::getPhone, mobile); sysUserLambdaQueryWrapper.like(StringUtils.isNotBlank(name), SysUser::getName, name); @@ -391,7 +411,6 @@ public class SysUserController { return R.ok(list); } - @GetMapping("/getUserMap") @Schema(description = "根据ids获取用户map") public R> getUserMap(@RequestParam(value = "userIds") Set userIds) { diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java index bb98b7853..0709cab8c 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.admin.controller; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.collection.CollUtil; + import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -12,15 +13,22 @@ import com.bsd.pjcloud.admin.service.SysUserFaceService; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; 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.common.excel.annotation.ResponseExcel; +import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; + import io.swagger.v3.oas.annotations.security.SecurityRequirement; + import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.HttpHeaders; + import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; + import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -41,12 +49,21 @@ public class SysUserFaceController { private final SysUserFaceService sysUserFaceService; + /* ************************************* start 回调 start ************************************* */ + @Inner(value = false) + @PostMapping("/apply-callback") + public void applyCallback(@RequestBody ProcessNodeRecordAssignUserParamDto dto) { + sysUserFaceService.applyCallback(dto); + } + /* ************************************* end 回调 end ************************************* */ + /* ************************************* start app start ************************************* */ @Operation(summary = "app查询人脸列表", description = "app查询人脸列表") @GetMapping("/app/page-join") public R> appPageJoin(@ParameterObject Page page, @ParameterObject SysUserFaceDto dto) { PjcloudUser user = SecurityUtils.getUser(); dto.setUserId(user.getId()); + dto.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode()); return R.ok(sysUserFaceService.pageJoin(page, dto)); } @@ -86,10 +103,12 @@ public class SysUserFaceController { /* ************************************* start android start ************************************* */ @Operation(summary = "android查询人脸数据库", description = "android查询人脸数据库") @GetMapping("/ad/find-face") - public R adFinFace(@ParameterObject Page page, @RequestParam(required = false) Long userId, @RequestParam(required = false) Long merchantDeptId) { + public R adFinFace(@ParameterObject Page page, @RequestParam(required = false) Long userId, + @RequestParam(required = false) Long merchantDeptId) { SysUserFaceDto dto = new SysUserFaceDto(); dto.setUserId(userId); dto.setMerchantDeptIdOrGlobal(merchantDeptId); + dto.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode()); return R.ok(sysUserFaceService.pageJoin(page, dto).getRecords()); } /* ************************************* start android start ************************************* */ @@ -117,6 +136,13 @@ public class SysUserFaceController { return R.ok(sysUserFaceService.pageJoin(page, dto)); } + @Operation(summary = "查询人脸审核列表", description = "查询人脸审核列表") + @PostMapping("/page-check-join") + public R> appPageCheckJoin(@ParameterObject Page page, @RequestBody SysUserFaceDto dto) { + dto.setIsProcessIdNotNull(true); + return R.ok(sysUserFaceService.pageJoin(page, dto)); + } + @Operation(summary = "通过id查询", description = "通过id查询") @GetMapping("/{id}") @PreAuthorize("@pms.hasPermission('userFace_sysUserFace_view')") @@ -155,6 +181,7 @@ public class SysUserFaceController { @GetMapping("/export") @PreAuthorize("@pms.hasPermission('userFace_sysUserFace_export')") public List export(SysUserFaceEntity sysUserFace, Long[] ids) { - return sysUserFaceService.list(Wrappers.lambdaQuery(sysUserFace).in(ArrayUtil.isNotEmpty(ids), SysUserFaceEntity::getId, ids)); + return sysUserFaceService.list( + Wrappers.lambdaQuery(sysUserFace).in(ArrayUtil.isNotEmpty(ids), SysUserFaceEntity::getId, ids)); } } \ No newline at end of file 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 6adde37ce..ee20eef85 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,6 +1,7 @@ package com.bsd.pjcloud.admin.mapper; import cn.hutool.core.util.ObjectUtil; + import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.dto.SysUserFaceDto; import com.bsd.pjcloud.admin.api.entity.SysDept; @@ -11,6 +12,7 @@ import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; + import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -45,9 +47,26 @@ public interface SysUserFaceMapper extends PjcloudBaseMapper .innerJoin(SysUser.class, SysUser::getUserId, SysUserFaceEntity::getUserId) .innerJoin(SysDept.class, SysDept::getDeptId, SysUser::getDeptId) .eq(ObjectUtil.isNotEmpty(dto.getUserId()), SysUserFaceEntity::getUserId, dto.getUserId()) - .in(ObjectUtil.isNotEmpty(dto.getUserIds()), SysUserFaceEntity::getUserId, dto.getUserIds()); + .eq(ObjectUtil.isNotEmpty(dto.getProcessStatus()), SysUserFaceEntity::getProcessStatus, + dto.getProcessStatus()) + .in(ObjectUtil.isNotEmpty(dto.getUserIds()), SysUserFaceEntity::getUserId, dto.getUserIds()) + .orderByDesc(SysUserFaceEntity::getCreateTime) + .orderByDesc(SysUserFaceEntity::getUserId); if (ObjectUtil.isNotEmpty(dto.getMerchantDeptIdOrGlobal()) && ObjectUtil.isNotEmpty(dto.getDeptIds())) { - wrapper.and(v -> v.in(ObjectUtil.isNotEmpty(dto.getDeptIds()), SysUser::getDeptId, dto.getDeptIds()).or().eq(SysUser::getIsGlobalFace, YesNoEnum.YES.getCode())); + wrapper.and(v -> v.in(ObjectUtil.isNotEmpty(dto.getDeptIds()), SysUser::getDeptId, dto.getDeptIds()).or() + .eq(SysUser::getIsGlobalFace, YesNoEnum.YES.getCode())); + } else { + wrapper.in(ObjectUtil.isNotEmpty(dto.getDeptIds()), SysUser::getDeptId, dto.getDeptIds()); + } + if (dto.getIsProcessIdNotNull()) { + wrapper.isNotNull(SysUserFaceEntity::getProcessId); + } + if (ObjectUtil.isNotEmpty(dto.getIsInclude())) { + if (dto.getIsInclude()) { + wrapper.in(ObjectUtil.isNotEmpty(dto.getDeptIds()), SysUser::getDeptId, dto.getDeptIds()); + } else { + wrapper.notIn(ObjectUtil.isNotEmpty(dto.getDeptIds()), SysUser::getDeptId, dto.getDeptIds()); + } } else { wrapper.in(ObjectUtil.isNotEmpty(dto.getDeptIds()), SysUser::getDeptId, dto.getDeptIds()); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysRoleService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysRoleService.java index 0b448edc1..9f040d74d 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysRoleService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysRoleService.java @@ -90,4 +90,9 @@ public interface SysRoleService extends IService { */ List listRole(SysRole sysRole, Long[] ids); + /** + * 是否为部门管理员 + */ + boolean isDeptAdmin(Long userId); + } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserFaceService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserFaceService.java index 0c23ef41a..1ef233b84 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserFaceService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserFaceService.java @@ -3,9 +3,11 @@ package com.bsd.pjcloud.admin.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.admin.api.dto.SysUserFaceDto; +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.data.datascope.DataScope; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import java.util.ArrayList; @@ -24,4 +26,14 @@ public interface SysUserFaceService extends IService { Page pageJoin(Page page, SysUserFaceDto dto); SysUserFaceVo join(Long id); + + /** + * 开启审批 + */ + void applyFlow(SysUser user, SysUserFaceEntity detail); + + /** + * 审批回调 + */ + void applyCallback(ProcessNodeRecordAssignUserParamDto dto); } \ No newline at end of file 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 da9ddc687..38f2804ee 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 @@ -31,6 +31,8 @@ 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 com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; + import org.springframework.validation.BindingResult; import org.springframework.web.multipart.MultipartFile; @@ -194,11 +196,18 @@ public interface SysUserService extends IService { List getUserDeptByIds(List userIds); - /** * 查询所有用户简单信息 - * @param sysUserLambdaQueryWrapper - * @return */ List listScope(LambdaQueryWrapper sysUserLambdaQueryWrapper); + + /** + * 添加用户审批回调 + */ + void applyCallback(ProcessNodeRecordAssignUserParamDto dto); + + /** + * 开启审批 + */ + void applyFlow(SysUser user); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java index c504e1bdf..fb504e454 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java @@ -23,6 +23,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; + import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -34,11 +35,14 @@ import com.bsd.pjcloud.admin.mapper.SysRoleMapper; import com.bsd.pjcloud.admin.service.SysRoleMenuService; import com.bsd.pjcloud.admin.service.SysRoleService; import com.bsd.pjcloud.common.core.constant.CacheConstants; +import com.bsd.pjcloud.common.core.constant.CommonRoleConstant; import com.bsd.pjcloud.common.core.exception.ErrorCodes; import com.bsd.pjcloud.common.core.util.MsgUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.excel.vo.ErrorMessage; + import lombok.AllArgsConstructor; + import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -70,7 +74,7 @@ public class SysRoleServiceImpl extends ServiceImpl impl * @return */ @Override - public List findRolesByUserId(Long userId) { + public List findRolesByUserId(Long userId) { return baseMapper.listRolesByUserId(userId); } @@ -89,7 +93,9 @@ public class SysRoleServiceImpl extends ServiceImpl impl @Override public List findRolesByCodes(List codes) { - if (ObjectUtil.isEmpty(codes)) return null; + if (ObjectUtil.isEmpty(codes)) { + return null; + } return baseMapper.selectList(new LambdaQueryWrapper() .in(SysRole::getRoleCode, codes) ); @@ -179,6 +185,15 @@ public class SysRoleServiceImpl extends ServiceImpl impl }).collect(Collectors.toList()); } + @Override + public boolean isDeptAdmin(Long userId) { + List userRoles = findRolesByUserId(userId); + if (ObjectUtil.isEmpty(userRoles)) { + return false; + } + return userRoles.stream().anyMatch(v -> ObjectUtil.equals(v.getRoleCode(), CommonRoleConstant.DEPT_ADMIN)); + } + /** * 插入excel Role */ diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java index 3168ef55d..0d53481b8 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java @@ -1,6 +1,8 @@ package com.bsd.pjcloud.admin.service.impl; import cn.hutool.core.util.ObjectUtil; + +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -11,17 +13,33 @@ import com.bsd.pjcloud.admin.api.entity.SysUserFaceEntity; import com.bsd.pjcloud.admin.api.vo.SysUserFaceVo; import com.bsd.pjcloud.admin.mapper.SysUserFaceMapper; import com.bsd.pjcloud.admin.service.SysDeptService; +import com.bsd.pjcloud.admin.service.SysRoleService; import com.bsd.pjcloud.admin.service.SysUserFaceService; import com.bsd.pjcloud.admin.service.SysUserService; +import com.bsd.pjcloud.admin.utils.flow.FlowUtil; +import com.bsd.pjcloud.admin.utils.flow.dto.UserFaceApplyFlowDto; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.exception.CheckedException; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowEngineService; +import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.flow.task.dto.TaskParamDto; import com.bsd.pjcloud.mqtt.api.feign.RemoteMqttEventService; +import com.bsd.pjcloud.wallet.api.entity.WalletFreezeEntity; +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; + +import cn.hutool.extra.spring.SpringUtil; 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; @@ -35,18 +53,34 @@ import java.util.List; @Slf4j @RequiredArgsConstructor @Service -public class SysUserFaceServiceImpl extends ServiceImpl implements SysUserFaceService { +public class SysUserFaceServiceImpl extends ServiceImpl + implements SysUserFaceService { + + static private final String TAG = "用户人脸"; private final SysUserService sysUserService; private final SysDeptService sysDeptService; + private final SysRoleService sysRoleService; private final RemoteMqttEventService remoteMqttEventService; + private final RemoteFlowEngineService remoteFlowEngineService; + + private final FlowUtil flowUtil; @Override + @Transactional(rollbackFor = Exception.class) public Long create(SysUserFaceEntity sysUserFace) { if (isExceedMax(sysUserFace.getUserId())) { throw new RuntimeException("最多只能上传3张人脸图片"); } + PjcloudUser applyUser = SecurityUtils.getUser(); + boolean isDeptAdmin = sysRoleService.isDeptAdmin(applyUser.getId()); + if (isDeptAdmin) { + sysUserFace.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); + } else { + sysUserFace.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode()); + sysUserFace.setProcessTime(LocalDateTime.now()); + } // 插入 baseMapper.insert(sysUserFace); // 自增code @@ -55,6 +89,11 @@ public class SysUserFaceServiceImpl extends ServiceImpl list) { - if (ObjectUtil.isEmpty(list)) return; + if (ObjectUtil.isEmpty(list)) { + return; + } // 发送mq List faceList = baseMapper.selectList(new LambdaQueryWrapper() .in(SysUserFaceEntity::getId, list) @@ -94,6 +137,10 @@ public class SysUserFaceServiceImpl extends ServiceImpl() + .eq(SysUserFaceEntity::getProcessId, processId) + ); + if (ObjectUtil.isEmpty(detail)) { + return; + } + if (!ObjectUtil.equals(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) { + log.error("|{}|重复的回调,dto:|{}|", TAG, JSON.toJSONString(dto)); + return; + } + try { + Boolean isConsent = flowUtil.isConsent(dto); + String processStatus = isConsent ? TaskCheckStatusEnum.RESULT.getCode() : + TaskCheckStatusEnum.REJECT.getCode(); + baseMapper.updateById(SysUserFaceEntity.builder().id(detail.getId()).processTime(LocalDateTime.now()).processStatus(processStatus).build()); + } catch (Exception e) { + e.printStackTrace(); + log.error("|{}|审批回调意外的错误,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage()); + throw new RuntimeException(e); + } + } + // 上传的人脸是否超过最大限制 private Boolean isExceedMax(Long userId) { Long count = baseMapper.selectCount(new LambdaQueryWrapper() .eq(SysUserFaceEntity::getUserId, userId) + .eq(SysUserFaceEntity::getProcessStatus, TaskCheckStatusEnum.RESULT.getCode()) ); return count >= 3; } // 发送mq private void sendFaceMq(List userIds, Boolean isGlobalFace) { - if (ObjectUtil.isEmpty(userIds)) return; + if (ObjectUtil.isEmpty(userIds)) { + return; + } List list = sysUserService.list(new LambdaQueryWrapper().in(SysUser::getUserId, userIds)); - if (ObjectUtil.isEmpty(list)) return; + if (ObjectUtil.isEmpty(list)) { + return; + } for (SysUser v : list) { remoteMqttEventService.sendFaceChangeMsg(v.getDeptId(), v.getUserId(), isGlobalFace); } } + + private SysUserFaceServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } } \ No newline at end of file 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 7061aee77..92e8e7890 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 @@ -24,6 +24,8 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; + +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -44,9 +46,12 @@ 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.admin.utils.flow.FlowUtil; +import com.bsd.pjcloud.admin.utils.flow.dto.UserFaceApplyFlowDto; 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.constant.CommonRoleConstant; import com.bsd.pjcloud.common.core.exception.ErrorCodes; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.MsgUtils; @@ -56,9 +61,14 @@ import com.bsd.pjcloud.common.data.resolver.ParamResolver; import com.bsd.pjcloud.common.excel.vo.ErrorMessage; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; + +import cn.hutool.extra.spring.SpringUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; + import org.apache.poi.ss.usermodel.PictureData; import org.springframework.beans.BeanUtils; import org.springframework.cache.Cache; @@ -114,6 +124,8 @@ public class SysUserServiceImpl extends ServiceImpl impl private final SysFileService sysFileService; + private final FlowUtil flowUtil; + /** * 保存用户信息 * @@ -124,9 +136,28 @@ public class SysUserServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class) public Long saveUser(UserDTO userDto) { SysUser sysUser = new SysUser(); + // 判断是否为部门管理员 + PjcloudUser applyUser = SecurityUtils.getUser(); + boolean isDeptAdmin = sysRoleService.isDeptAdmin(applyUser.getId()); + if (isDeptAdmin) { + List defaultRoles = sysRoleService.findRolesByCodes( + List.of(CommonRoleConstant.DEFAULT_USER, CommonRoleConstant.DEPT_ADMIN)); + if (ObjectUtil.isEmpty(defaultRoles)) { + userDto.setRole(null); + } else { + userDto.setRole(defaultRoles.stream().map(SysRole::getRoleId).toList()); + } + userDto.setDeptIds(null); + userDto.setRole(List.of()); + sysUser.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); + } else { + sysUser.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode()); + sysUser.setProcessTime(LocalDateTime.now()); + } BeanUtils.copyProperties(userDto, sysUser); sysUser.setLockFlag( - StrUtil.isBlank(userDto.getLockFlag()) ? UserStateEnum.NORMAL.getCode() : userDto.getLockFlag()); + StrUtil.isBlank(userDto.getLockFlag()) ? UserStateEnum.NORMAL.getCode() : userDto.getLockFlag() + ); sysUser.setCreateBy(userDto.getUsername()); sysUser.setUpdateBy(userDto.getUsername()); sysUser.setPassword(ENCODER.encode(userDto.getPassword())); @@ -164,8 +195,13 @@ public class SysUserServiceImpl extends ServiceImpl impl CompletableFuture.runAsync(() -> { remoteWalletService.createWallet(sysUser.getUserId()); }); + remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE); + if (isDeptAdmin) { + getSelf().applyFlow(sysUser); + } + return sysUser.getUserId(); } @@ -222,7 +258,8 @@ public class SysUserServiceImpl extends ServiceImpl impl if (ObjectUtil.isNotEmpty(userIds)) { SysUserFaceDto faceDto = new SysUserFaceDto(); List faceList = sysUserFaceMapper.groupConcatFaces(faceDto); - DataUtil.convertFacesList(list.getRecords(), CollectionUtils.convertMap(faceList, SysUserFaceVo::getUserId)); + DataUtil.convertFacesList(list.getRecords(), + CollectionUtils.convertMap(faceList, SysUserFaceVo::getUserId)); } } return list; @@ -390,6 +427,8 @@ public class SysUserServiceImpl extends ServiceImpl impl */ @Override public R importUser(List excelVOList, BindingResult bindingResult) { + PjcloudUser user = SecurityUtils.getUser(); + // 通用校验获取失败的数据 List errorMessageList = (List) bindingResult.getTarget(); List deptList = sysDeptService.list(); @@ -440,7 +479,7 @@ public class SysUserServiceImpl extends ServiceImpl impl // 数据合法情况 if (CollUtil.isEmpty(errorMsg)) { - insertExcelUser(excel, deptOptional, roleCollList, postCollList); + insertExcelUser(excel, deptOptional, roleCollList, postCollList, user); } else { // 数据不合法情况 errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); @@ -457,10 +496,14 @@ public class SysUserServiceImpl extends ServiceImpl impl @Override public R importUserFace(MultipartFile file, List excelList, BindingResult bindingResult) { try { - if (ObjectUtil.isEmpty(excelList)) R.failed("excel内容为空"); + 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 deptNames = + excelList.stream().map(UserExcelFaceVo::getDeptName).distinct().filter(ObjectUtil::isNotEmpty) + .toList(); // 部门 List sysDeptList = sysDeptService.selectByNames(deptNames); // 角色 @@ -469,13 +512,16 @@ public class SysUserServiceImpl extends ServiceImpl impl 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(); + 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(); + String username = v.getUsername(), name = v.getName(), mobile = v.getMobile(), sex = v.getSex(), + deptName = v.getDeptName(); if (ObjectUtil.isEmpty(name)) { errorMsg.add("用户昵称为空"); } @@ -485,7 +531,8 @@ public class SysUserServiceImpl extends ServiceImpl impl errorMsg.add("手机号码格式不正确"); } else { // 校验用户名是否存在 - boolean existMobile = userList.stream().anyMatch(i -> ObjectUtil.equals(i.getPhone(), mobile.trim())); + boolean existMobile = + userList.stream().anyMatch(i -> ObjectUtil.equals(i.getPhone(), mobile.trim())); if (existMobile) { errorMsg.add("手机号已存在"); } @@ -493,7 +540,8 @@ public class SysUserServiceImpl extends ServiceImpl impl if (ObjectUtil.isEmpty(deptName)) { errorMsg.add("部门名称为空"); } else { - Optional targetDept = sysDeptList.stream().filter(i -> ObjectUtil.equals(i.getName(), deptName)).findFirst(); + Optional targetDept = + sysDeptList.stream().filter(i -> ObjectUtil.equals(i.getName(), deptName)).findFirst(); if (targetDept.isEmpty()) { errorMsg.add("没有该部门"); } else { @@ -529,7 +577,7 @@ public class SysUserServiceImpl extends ServiceImpl impl * 插入excel User */ private void insertExcelUser(UserExcelVO excel, Optional deptOptional, List roleCollList, - List postCollList) { + List postCollList, PjcloudUser user) { UserDTO userDTO = new UserDTO(); userDTO.setUsername(excel.getUsername()); userDTO.setPhone(excel.getPhone()); @@ -574,7 +622,8 @@ public class SysUserServiceImpl extends ServiceImpl impl public void insertExcelFace(UserDTO user, PictureData face) { try { // 查询用户 - MultipartFile multipartFile = new MockMultipartFile("file", UUID.randomUUID() + "_face.png", "image/png", new ByteArrayInputStream(face.getData())); + 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(); @@ -587,7 +636,6 @@ public class SysUserServiceImpl extends ServiceImpl impl } } - /** * 注册用户 赋予用户默认角色 * @@ -775,4 +823,59 @@ public class SysUserServiceImpl extends ServiceImpl impl return collect; } + + /** + * 添加用户审批回调 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void applyCallback(ProcessNodeRecordAssignUserParamDto dto) { + if (!flowUtil.checkCallback(dto)) { + return; + } + String processId = dto.getProcessInstanceId(); + SysUser detail = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(SysUser::getProcessId, processId) + ); + if (ObjectUtil.isEmpty(detail)) { + return; + } + if (!ObjectUtil.equals(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) { + log.error("|{}|重复的回调,dto:|{}|", TAG, JSON.toJSONString(dto)); + return; + } + try { + Boolean isConsent = flowUtil.isConsent(dto); + String processStatus = + isConsent ? TaskCheckStatusEnum.RESULT.getCode() : TaskCheckStatusEnum.REJECT.getCode(); + SysUser updateUser = new SysUser(); + updateUser.setUserId(detail.getUserId()); + updateUser.setProcessStatus(processStatus); + updateUser.setPasswordModifyTime(LocalDateTime.now()); + baseMapper.updateById(updateUser); + } catch (Exception e) { + e.printStackTrace(); + log.error("|{}|审批回调意外的错误,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage()); + throw new RuntimeException(e); + } + } + + /** + * 开启审批 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void applyFlow(SysUser user) { + UserFaceApplyFlowDto flowDto = new UserFaceApplyFlowDto(); + String processId = flowUtil.startFlow("ADD_USER_FLOW", user, user.getUserId(), flowDto); + SysUser updateObj = new SysUser(); + updateObj.setUserId(user.getUserId()); + updateObj.setProcessId(processId); + updateObj.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); + baseMapper.updateById(updateObj); + } + + private SysUserServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java new file mode 100644 index 000000000..b04294cc8 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java @@ -0,0 +1,138 @@ +package com.bsd.pjcloud.admin.utils.flow; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.admin.utils.flow.dto.UserApplyFlowDto; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.resolver.ParamResolver; +import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowApiFlowService; +import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowEngineService; +import com.bsd.pjcloud.flow.task.constant.NodeUserTypeEnum; +import com.bsd.pjcloud.flow.task.dto.ProcessInstanceParamDto; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.flow.task.dto.TaskDto; +import com.bsd.pjcloud.flow.task.dto.TaskQueryParamDto; +import com.bsd.pjcloud.flow.task.entity.Process; +import com.bsd.pjcloud.flow.task.vo.ProcessVO; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Validated +@Slf4j +@RequiredArgsConstructor +@Component +public class FlowUtil { + + static private final String TAG = "用户钱包审批流工具类"; + + private final RemoteFlowApiFlowService flowApiFlowService; + private final RemoteFlowEngineService flowEngineService; + + public String startFlow(String flowIdKey, SysUser user, Long businessId) { + return startFlow(flowIdKey, user, businessId, null); + } + + public String startFlow(String flowIdKey, SysUser user, Long businessId, T dto) { + // 发起工作流 + String defaultRole = ParamResolver.getStr(flowIdKey); + if (ObjectUtil.isEmpty(defaultRole)) { + log.error("|{}|请配置跨单位审批流程ID;userId:|{}|businessId:|{}|", TAG, user.getUserId(), businessId); + throw new RuntimeException("请配置跨单位审批流程ID"); + } + R detail = flowApiFlowService.getDetail(defaultRole); + if (Optional.of(detail.getData()).map(Process::getId).isEmpty()) { + log.error("|{}|未查询到该审批流程;userId:|{}|businessId:|{}|", TAG, user.getUserId(), businessId); + throw new RuntimeException("未查询到该审批流程"); + } + ProcessVO processVo = detail.getData(); + ProcessInstanceParamDto processDto = new ProcessInstanceParamDto(); + if (ObjectUtil.isNotEmpty(dto)) { + if (ObjectUtil.isNotEmpty(user.getUserId())) { + dto.setApplyUserId(user.getUserId()); + } + if (ObjectUtil.isNotEmpty(user.getName())) { + dto.setApplyUsername(user.getName()); + } + if (ObjectUtil.isNotEmpty(user.getDeptId())) { + dto.setApplyDeptId(user.getDeptId()); + } + dto.setApplyCreateTime(LocalDateTimeUtil.format(LocalDate.now(), DatePattern.NORM_DATETIME_PATTERN)); + } + 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())); + R startVo = flowApiFlowService.startProcessInstance(processDto); + return startVo.getData(); + } + + 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)); + return paramMap; + } + + public List queryProcessInstanceList(String userId, List processInstanceIds) { + List result = new ArrayList<>(); + TaskQueryParamDto taskQueryParamDto = new TaskQueryParamDto(); + taskQueryParamDto.setAssign(userId); + taskQueryParamDto.setProcessInstanceIds(processInstanceIds); + taskQueryParamDto.setIsActive(true); + taskQueryParamDto.setCurrent(1); + taskQueryParamDto.setSize(processInstanceIds.size() + 10); + Page taskList = flowEngineService.queryAssignTask(taskQueryParamDto).getData(); + if (ObjectUtil.isEmpty(taskList) || ObjectUtil.isEmpty(taskList.getRecords())) { + return result; + } + return taskList.getRecords(); + } + + // 检查回调是否正确 + public Boolean checkCallback(ProcessNodeRecordAssignUserParamDto dto) { + if (!ObjectUtil.isAllNotEmpty(dto, dto.getFlowId())) { + return false; + } + return true; + } + + // 是否同意 + public Boolean isConsent(ProcessNodeRecordAssignUserParamDto dto) { + if (!ObjectUtil.isAllNotEmpty(dto, dto.getNodeId())) { + return false; + } + String statusKey = dto.getNodeId() + "_approve_condition"; + JSONObject jsonObject = JSON.parseObject(dto.getData()); + return Boolean.parseBoolean(jsonObject.get(statusKey).toString()); + } +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserApplyFlowDto.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserApplyFlowDto.java new file mode 100644 index 000000000..39d57e4db --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserApplyFlowDto.java @@ -0,0 +1,10 @@ +package com.bsd.pjcloud.admin.utils.flow.dto; + +import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto; + +import lombok.Data; + +@Data +public class UserApplyFlowDto extends FlowBaseDto { + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserFaceApplyFlowDto.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserFaceApplyFlowDto.java new file mode 100644 index 000000000..a5f493296 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserFaceApplyFlowDto.java @@ -0,0 +1,12 @@ +package com.bsd.pjcloud.admin.utils.flow.dto; + +import lombok.Data; + +@Data +public class UserFaceApplyFlowDto extends UserApplyFlowDto { + + private String username; + + private String userFaceImage; + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml index f158b22ef..5eb1d7820 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml @@ -23,6 +23,9 @@ + + + @@ -58,6 +61,9 @@ u.user_id, + u.process_id, + u.process_status, + u.process_time, u.username, u.password, u.salt, @@ -121,7 +127,7 @@ sys_user u LEFT JOIN sys_user_role urole ON urole.user_id = u.user_id LEFT JOIN sys_role r ON r.role_id = urole.role_id and r.del_flag = '0' - WHERE u.username = #{username} and u.del_flag = '0' + WHERE u.username = #{username} and u.del_flag = '0' SELECT u.user_id, + u.process_id, + u.process_status, + u.process_time, u.username, u.password, u.salt, @@ -170,6 +179,9 @@ AND u.user_id = #{query.userId} + + AND u.process_status = #{query.processStatus} + AND u.username LIKE #{usernameLike} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java index 79f617fde..b891de460 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; + import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -52,8 +53,10 @@ import com.bsd.pjcloud.wallet.service.WalletTransactionService; import com.bsd.pjcloud.wallet.service.WalletTypeService; import com.bsd.pjcloud.wallet.utils.flow.FlowUtil; import com.bsd.pjcloud.wallet.utils.flow.dto.WalletRechargeApplyFlowDto; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; @@ -74,7 +77,8 @@ import java.util.*; @Slf4j @RequiredArgsConstructor @Service -public class WalletRechargeApplyServiceImpl extends ServiceImpl implements WalletRechargeApplyService { +public class WalletRechargeApplyServiceImpl extends ServiceImpl + implements WalletRechargeApplyService { static private final String TAG = "充值/扣款申请"; @@ -104,7 +108,9 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl> userList = userService.getUserById(new ArrayList<>(userIds)); if (ObjectUtil.isNotEmpty(userList.getData())) { - DataUtil.convertUserList(list.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); + DataUtil.convertUserList(list.getRecords(), + CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); } } // 部门 @@ -171,21 +178,31 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl list, BindingResult bindingResult) { - if (ObjectUtil.isEmpty(list)) return R.failed(); - list = list.stream().filter(v -> !ObjectUtil.isAllEmpty(v.getUsername(), v.getUserMobile(), v.getPrice())).toList(); - if (ObjectUtil.isEmpty(list)) return R.failed(); + if (ObjectUtil.isEmpty(list)) { + return R.failed(); + } + list = list.stream().filter(v -> !ObjectUtil.isAllEmpty(v.getUsername(), v.getUserMobile(), v.getPrice())) + .toList(); + if (ObjectUtil.isEmpty(list)) { + return R.failed(); + } List errorMessageList = (List) bindingResult.getTarget(); List usernameList = list.stream().map(WalletRechargeExcelDto::getUsername).toList(); List userPoneList = list.stream().map(WalletRechargeExcelDto::getUserMobile).toList(); @@ -281,7 +303,9 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl batchSaveList = list.stream().map(v -> WalletRechargeImportEntity.builder().price(v.getPriceNumber()).userId(v.getUserId()).userDeptId(v.getUserDeptId()).build()).toList(); + List batchSaveList = list.stream() + .map(v -> WalletRechargeImportEntity.builder().price(v.getPriceNumber()).userId(v.getUserId()) + .userDeptId(v.getUserDeptId()).build()).toList(); batchSaveList.forEach(v -> v.setApplyId(insertObj.getId())); rechargeImportService.saveBatch(batchSaveList); return R.ok(null, MsgUtils.getMessage(ErrorCodes.SYS_USER_IMPORT_SUCCEED)); @@ -292,25 +316,35 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl() .eq(WalletRechargeApplyEntity::getProcessId, processId) ); - if (ObjectUtil.isEmpty(detail)) return; + if (ObjectUtil.isEmpty(detail)) { + return; + } if (!ObjectUtil.equals(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) { log.error("|{}|重复的回调,dto:|{}|", TAG, JSON.toJSONString(dto)); return; } try { Boolean isConsent = flowUtil.isConsent(dto); - String processStatus = isConsent ? TaskCheckStatusEnum.RESULT.getCode() : TaskCheckStatusEnum.REJECT.getCode(); - baseMapper.updateById(WalletRechargeApplyEntity.builder().id(detail.getId()).processTime(LocalDateTime.now()).processStatus(processStatus).build()); + String processStatus = + isConsent ? TaskCheckStatusEnum.RESULT.getCode() : TaskCheckStatusEnum.REJECT.getCode(); + baseMapper.updateById( + WalletRechargeApplyEntity.builder().id(detail.getId()).processTime(LocalDateTime.now()) + .processStatus(processStatus).build()); if (isConsent) { - List importList = rechargeImportService.list(new LambdaQueryWrapper() - .eq(WalletRechargeImportEntity::getApplyId, detail.getId()) - ); - if (ObjectUtil.isEmpty(importList)) return; + List importList = + rechargeImportService.list(new LambdaQueryWrapper() + .eq(WalletRechargeImportEntity::getApplyId, detail.getId()) + ); + if (ObjectUtil.isEmpty(importList)) { + return; + } getSelf().updateBeforePrice(detail); if (ObjectUtil.equals(detail.getBizType(), WalletBizRechargeEnum.REDUCTION.getCode())) { importList.forEach(v -> v.setPrice(-1 * Math.abs(v.getPrice()))); @@ -318,21 +352,26 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl importList = rechargeImportService.list(new LambdaQueryWrapper() - .eq(WalletRechargeImportEntity::getApplyId, detail.getId()) - ); - if (ObjectUtil.isEmpty(importList)) return; + List importList = + rechargeImportService.list(new LambdaQueryWrapper() + .eq(WalletRechargeImportEntity::getApplyId, detail.getId()) + ); + if (ObjectUtil.isEmpty(importList)) { + return; + } List saveList = new ArrayList<>(); for (WalletRechargeImportEntity v : importList) { WalletRechargeImportEntity item = new WalletRechargeImportEntity(); item.setId(v.getId()); WalletManageEntity wallet = walletManageService.getOrCreateWallet(v.getUserId(), walletTypeEnum); - if (ObjectUtil.isEmpty(wallet)) continue; - Integer price = walletTransactionMapper.getTransactionPriceCount(importTimeStr, wallet.getId(), WalletBizEnum.BATCH.getCode()); + if (ObjectUtil.isEmpty(wallet)) { + continue; + } + Integer price = walletTransactionMapper.getTransactionPriceCount(importTimeStr, wallet.getId(), + WalletBizEnum.BATCH.getCode()); if (ObjectUtil.isNotEmpty(price)) { item.setBeforePrice(price); } @@ -364,14 +409,18 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl exportExcel(WalletRechargeImportDto dto) { List result = new ArrayList<>(); List list = rechargeImportService.listJoin(dto); - if (ObjectUtil.isEmpty(list)) return result; + if (ObjectUtil.isEmpty(list)) { + return result; + } for (WalletRechargeImportVo v : list) { WalletRechargeByApplyExcelVo item = new WalletRechargeByApplyExcelVo(); item.setUsername(v.getUsername()); item.setUserMobile(v.getUserMobile()); item.setUserDeptName(v.getUserDeptName()); if (ObjectUtil.isNotEmpty(v.getPrice())) { - String price = new BigDecimal(v.getPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString(); + String price = + new BigDecimal(v.getPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + .toString(); item.setPrice(price); } result.add(item); @@ -404,16 +453,22 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl walletTypeList = walletTypeMapper.list(walletTypeDto); if (ObjectUtil.isNotEmpty(walletTypeList)) { - WalletDataUtil.convertWalletTypeList(list, CollectionUtils.convertMap(walletTypeList, WalletTypeEntity::getId)); + WalletDataUtil.convertWalletTypeList(list, + CollectionUtils.convertMap(walletTypeList, WalletTypeEntity::getId)); } } // 审批流程 if (dto.getIsFindCheckUser()) { - List processInstanceIds = list.stream().map(WalletRechargeApplyVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + List processInstanceIds = + list.stream().map(WalletRechargeApplyVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct() + .toList(); if (ObjectUtil.isNotEmpty(processInstanceIds)) { - List taskList = flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), processInstanceIds); + List taskList = + flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), + processInstanceIds); if (ObjectUtil.isNotEmpty(taskList)) { - Map taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId); + Map taskMap = + CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId); CollectionUtils.convertList(list, v -> { TaskDto task = taskMap.get(v.getProcessId()); if (ObjectUtil.isNotEmpty(task)) { diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/FlowUtil.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/FlowUtil.java index 3dbbafd0f..28f9914ad 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/FlowUtil.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/FlowUtil.java @@ -19,7 +19,6 @@ import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.flow.task.dto.TaskQueryParamDto; import com.bsd.pjcloud.flow.task.entity.Process; import com.bsd.pjcloud.flow.task.vo.ProcessVO; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -38,8 +37,6 @@ public class FlowUtil { private final RemoteFlowApiFlowService flowApiFlowService; private final RemoteFlowEngineService flowEngineService; - private final ObjectMapper objectMapper; - public String startFlow(String flowIdKey, SysUser user, Long businessId) { return startFlow(flowIdKey, user, businessId, null); } From de8d31cf46ffcf9dfec10da915d1e1c14b07c031 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 13 Mar 2025 21:08:58 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat:=E4=BA=BA=E8=84=B8=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E5=AE=A1=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/constant/CommonRoleConstant.java | 2 + .../pjcloud/admin/api/dto/SysUserFaceDto.java | 2 + .../bsd/pjcloud/admin/api/dto/UserDTO.java | 5 + .../pjcloud/admin/api/vo/SysUserFaceVo.java | 3 + .../com/bsd/pjcloud/admin/api/vo/UserVO.java | 5 + .../admin/controller/SysUserController.java | 21 +-- .../controller/SysUserFaceController.java | 2 +- .../admin/mapper/SysUserFaceMapper.java | 5 +- .../service/impl/SysUserFaceServiceImpl.java | 43 +++-- .../service/impl/SysUserServiceImpl.java | 177 +++++++----------- .../pjcloud/admin/utils/flow/FlowUtil.java | 5 +- .../utils/flow/dto/UserApplyFlowDto.java | 1 + .../utils/flow/dto/UserFaceApplyFlowDto.java | 4 +- .../main/resources/mapper/SysUserMapper.xml | 2 +- .../WalletRechargeApplyServiceImpl.java | 66 ++----- 15 files changed, 150 insertions(+), 193 deletions(-) diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java index 2e611d3a9..0fdb41a12 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java @@ -6,4 +6,6 @@ public interface CommonRoleConstant { String DEPT_ADMIN = "DEPT_ADMIN"; + String AUTO_CREATE_WALLET = "WALLET_AUTO_CREATE"; + } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java index 83b967915..c4d9eddc9 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java @@ -27,4 +27,6 @@ public class SysUserFaceDto extends SysUserFaceEntity implements BaseIsIncludeTr * 是否包含部门ids */ private Boolean isInclude; + + private Boolean isFindCheckUser = false; } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/UserDTO.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/UserDTO.java index bfec27d8a..fb5730555 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/UserDTO.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/UserDTO.java @@ -82,4 +82,9 @@ public class UserDTO extends SysUser implements BaseIsIncludeTreeInterface { */ private Boolean isInclude; + /** + * 是否是审批用户 + */ + private Boolean isFindCheckUser = false; + } 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 68a2a1312..98bed8b11 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 @@ -3,6 +3,7 @@ package com.bsd.pjcloud.admin.api.vo; import com.bsd.pjcloud.admin.api.entity.SysUserFaceEntity; import com.bsd.pjcloud.admin.api.vo.base.BaseDeptInterface; import com.bsd.pjcloud.admin.api.vo.base.BaseUserInterface; + import lombok.Data; @Data @@ -28,4 +29,6 @@ public class SysUserFaceVo extends SysUserFaceEntity implements BaseUserInterfac private Long deptId; private String deptName; + + private Boolean isCheckUser = false; } 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 c518b672e..7afd2238e 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 @@ -232,4 +232,9 @@ public class UserVO implements BaseFacesInterface, Serializable { @Schema(description = "是否为全局人脸") private String isGlobalFace; + /** + * 是否是审核用户 + */ + private Boolean isCheckUser = false; + } 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 572400057..3796ea6f7 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 @@ -104,10 +104,8 @@ public class SysUserController { @Inner @GetMapping("/get-name-and-mobile") - public R getUserByNameAndMobile(@RequestParam("name") String name, - @RequestParam("mobile") String mobile) { - SysUser user = userService.getOne( - Wrappers.query().lambda().eq(SysUser::getName, name).eq(SysUser::getPhone, mobile)); + public R getUserByNameAndMobile(@RequestParam("name") String name, @RequestParam("mobile") String mobile) { + SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getName, name).eq(SysUser::getPhone, mobile)); if (user == null) { return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, name, mobile)); } @@ -208,6 +206,7 @@ public class SysUserController { */ @GetMapping("/page") public R getUserPage(@ParameterObject Page page, @ParameterObject UserDTO userDTO) { + userDTO.setIsFindCheckUser(true); return R.ok(userService.getUsersWithRolePage(page, userDTO)); } @@ -286,8 +285,7 @@ public class SysUserController { @PostMapping("/import-face") @HasPermission("sys_user_export") - public R importUserFace(@RequestParam("file") MultipartFile file, @RequestExcel List excelList, - BindingResult bindingResult) { + public R importUserFace(@RequestParam("file") MultipartFile file, @RequestExcel List excelList, BindingResult bindingResult) { return userService.importUserFace(file, excelList, bindingResult); } @@ -385,11 +383,8 @@ public class SysUserController { */ @GetMapping("/getUserByMobileOrEmployeeCode") @Inner - public R> getUserByMobileOrEmployeeCode(@RequestParam("employeeCode") String employeeCode, - @RequestParam("mobile") String mobile) { - return R.ok(userService.list( - Wrappers.lambdaQuery().eq(SysUser::getDingtalkEmployeeCode, employeeCode).or() - .eq(SysUser::getPhone, mobile))); + public R> getUserByMobileOrEmployeeCode(@RequestParam("employeeCode") String employeeCode, @RequestParam("mobile") String mobile) { + return R.ok(userService.list(Wrappers.lambdaQuery().eq(SysUser::getDingtalkEmployeeCode, employeeCode).or().eq(SysUser::getPhone, mobile))); } @GetMapping("/getUserByMobile") @@ -401,9 +396,7 @@ public class SysUserController { @GetMapping("/getSimpleUserAll") @Schema(description = "简要用户信息") - public R> getSimpleUserAllList( - @RequestParam(value = "mobile", required = false) String mobile, - @RequestParam(value = "name", required = false) String name) { + public R> getSimpleUserAllList(@RequestParam(value = "mobile", required = false) String mobile, @RequestParam(value = "name", required = false) String name) { LambdaQueryWrapper sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); sysUserLambdaQueryWrapper.like(StringUtils.isNotBlank(mobile), SysUser::getPhone, mobile); sysUserLambdaQueryWrapper.like(StringUtils.isNotBlank(name), SysUser::getName, name); diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java index 0709cab8c..51b17e34e 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java @@ -139,7 +139,7 @@ public class SysUserFaceController { @Operation(summary = "查询人脸审核列表", description = "查询人脸审核列表") @PostMapping("/page-check-join") public R> appPageCheckJoin(@ParameterObject Page page, @RequestBody SysUserFaceDto dto) { - dto.setIsProcessIdNotNull(true); + dto.setIsFindCheckUser(true); return R.ok(sysUserFaceService.pageJoin(page, dto)); } 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 ee20eef85..a5a996461 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 @@ -53,10 +53,7 @@ public interface SysUserFaceMapper extends PjcloudBaseMapper .orderByDesc(SysUserFaceEntity::getCreateTime) .orderByDesc(SysUserFaceEntity::getUserId); if (ObjectUtil.isNotEmpty(dto.getMerchantDeptIdOrGlobal()) && ObjectUtil.isNotEmpty(dto.getDeptIds())) { - wrapper.and(v -> v.in(ObjectUtil.isNotEmpty(dto.getDeptIds()), SysUser::getDeptId, dto.getDeptIds()).or() - .eq(SysUser::getIsGlobalFace, YesNoEnum.YES.getCode())); - } else { - wrapper.in(ObjectUtil.isNotEmpty(dto.getDeptIds()), SysUser::getDeptId, dto.getDeptIds()); + wrapper.and(v -> v.in(ObjectUtil.isNotEmpty(dto.getDeptIds()), SysUser::getDeptId, dto.getDeptIds()).or().eq(SysUser::getIsGlobalFace, YesNoEnum.YES.getCode())); } if (dto.getIsProcessIdNotNull()) { wrapper.isNotNull(SysUserFaceEntity::getProcessId); diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java index 0d53481b8..c5d9cb264 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java @@ -11,6 +11,7 @@ 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.admin.api.vo.UserVO; import com.bsd.pjcloud.admin.mapper.SysUserFaceMapper; import com.bsd.pjcloud.admin.service.SysDeptService; import com.bsd.pjcloud.admin.service.SysRoleService; @@ -20,12 +21,14 @@ import com.bsd.pjcloud.admin.utils.flow.FlowUtil; import com.bsd.pjcloud.admin.utils.flow.dto.UserFaceApplyFlowDto; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.exception.CheckedException; +import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowEngineService; import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.flow.task.dto.TaskParamDto; import com.bsd.pjcloud.mqtt.api.feign.RemoteMqttEventService; import com.bsd.pjcloud.wallet.api.entity.WalletFreezeEntity; @@ -42,6 +45,7 @@ import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * 人脸样本表 @@ -53,8 +57,7 @@ import java.util.List; @Slf4j @RequiredArgsConstructor @Service -public class SysUserFaceServiceImpl extends ServiceImpl - implements SysUserFaceService { +public class SysUserFaceServiceImpl extends ServiceImpl implements SysUserFaceService { static private final String TAG = "用户人脸"; @@ -131,9 +134,7 @@ public class SysUserFaceServiceImpl extends ServiceImpl faceList = baseMapper.selectList(new LambdaQueryWrapper() - .in(SysUserFaceEntity::getId, list) - ); + List faceList = baseMapper.selectList(new LambdaQueryWrapper().in(SysUserFaceEntity::getId, list)); if (ObjectUtil.isNotEmpty(faceList)) { sendFaceMq(faceList.stream().map(SysUserFaceEntity::getUserId).toList(), null); } @@ -158,7 +159,25 @@ public class SysUserFaceServiceImpl extends ServiceImpl list = baseMapper.pageJoin(page, dto); + // 审批流程 + if (dto.getIsFindCheckUser()) { + List processInstanceIds = list.getRecords().stream().map(SysUserFaceVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + if (ObjectUtil.isNotEmpty(processInstanceIds)) { + List taskList = flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), processInstanceIds); + if (ObjectUtil.isNotEmpty(taskList)) { + Map taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId); + CollectionUtils.convertList(list.getRecords(), v -> { + TaskDto task = taskMap.get(v.getProcessId()); + if (ObjectUtil.isNotEmpty(task)) { + v.setIsCheckUser(true); + } + return v; + }); + } + } + } + return list; } @Override @@ -202,9 +221,7 @@ public class SysUserFaceServiceImpl extends ServiceImpl() - .eq(SysUserFaceEntity::getProcessId, processId) - ); + SysUserFaceEntity detail = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysUserFaceEntity::getProcessId, processId)); if (ObjectUtil.isEmpty(detail)) { return; } @@ -214,8 +231,7 @@ public class SysUserFaceServiceImpl extends ServiceImpl() - .eq(SysUserFaceEntity::getUserId, userId) - .eq(SysUserFaceEntity::getProcessStatus, TaskCheckStatusEnum.RESULT.getCode()) - ); + Long count = baseMapper.selectCount(new LambdaQueryWrapper().eq(SysUserFaceEntity::getUserId, userId).eq(SysUserFaceEntity::getProcessStatus, TaskCheckStatusEnum.RESULT.getCode())); return count >= 3; } 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 92e8e7890..caeb3829a 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 @@ -47,6 +47,7 @@ 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.admin.utils.flow.FlowUtil; +import com.bsd.pjcloud.admin.utils.flow.dto.UserApplyFlowDto; import com.bsd.pjcloud.admin.utils.flow.dto.UserFaceApplyFlowDto; import com.bsd.pjcloud.common.audit.annotation.Audit; import com.bsd.pjcloud.common.core.constant.CacheConstants; @@ -63,7 +64,9 @@ import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; +import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo; import cn.hutool.extra.spring.SpringUtil; import lombok.AllArgsConstructor; @@ -136,28 +139,24 @@ public class SysUserServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class) public Long saveUser(UserDTO userDto) { SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(userDto, sysUser); // 判断是否为部门管理员 PjcloudUser applyUser = SecurityUtils.getUser(); boolean isDeptAdmin = sysRoleService.isDeptAdmin(applyUser.getId()); if (isDeptAdmin) { - List defaultRoles = sysRoleService.findRolesByCodes( - List.of(CommonRoleConstant.DEFAULT_USER, CommonRoleConstant.DEPT_ADMIN)); + List defaultRoles = sysRoleService.findRolesByCodes(List.of(CommonRoleConstant.DEFAULT_USER, CommonRoleConstant.AUTO_CREATE_WALLET)); if (ObjectUtil.isEmpty(defaultRoles)) { userDto.setRole(null); } else { userDto.setRole(defaultRoles.stream().map(SysRole::getRoleId).toList()); } userDto.setDeptIds(null); - userDto.setRole(List.of()); sysUser.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); } else { sysUser.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode()); sysUser.setProcessTime(LocalDateTime.now()); } - BeanUtils.copyProperties(userDto, sysUser); - sysUser.setLockFlag( - StrUtil.isBlank(userDto.getLockFlag()) ? UserStateEnum.NORMAL.getCode() : userDto.getLockFlag() - ); + sysUser.setLockFlag(StrUtil.isBlank(userDto.getLockFlag()) ? UserStateEnum.NORMAL.getCode() : userDto.getLockFlag()); sysUser.setCreateBy(userDto.getUsername()); sysUser.setUpdateBy(userDto.getUsername()); sysUser.setPassword(ENCODER.encode(userDto.getPassword())); @@ -178,8 +177,7 @@ public class SysUserServiceImpl extends ServiceImpl impl // 获取默认角色编码 String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); // 默认角色 - SysRole sysRole = sysRoleService - .getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); + SysRole sysRole = sysRoleService.getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); userDto.setRole(Collections.singletonList(sysRole.getRoleId())); } @@ -216,27 +214,17 @@ public class SysUserServiceImpl extends ServiceImpl impl UserInfo userInfo = new UserInfo(); userInfo.setSysUser(sysUser); // 设置角色列表 (ID) - List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()) - .stream() - .map(SysRole::getRoleId) - .collect(Collectors.toList()); + List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()).stream().map(SysRole::getRoleId).collect(Collectors.toList()); userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class)); // 设置角色列表 (CODE) - List roleCodes = sysRoleService.findRolesByUserId(sysUser.getUserId()) - .stream() - .map(SysRole::getRoleCode) - .collect(Collectors.toList()); + List roleCodes = sysRoleService.findRolesByUserId(sysUser.getUserId()).stream().map(SysRole::getRoleCode).collect(Collectors.toList()); userInfo.setRoleCodes(ArrayUtil.toArray(roleCodes, String.class)); // 设置权限列表(menu.permission) Set permissions = new HashSet<>(); roleIds.forEach(roleId -> { - List permissionList = sysMenuService.findMenuByRoleId(roleId) - .stream() - .filter(menu -> StrUtil.isNotEmpty(menu.getPermission())) - .map(SysMenu::getPermission) - .collect(Collectors.toList()); + List permissionList = sysMenuService.findMenuByRoleId(roleId).stream().filter(menu -> StrUtil.isNotEmpty(menu.getPermission())).map(SysMenu::getPermission).collect(Collectors.toList()); permissions.addAll(permissionList); }); userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); @@ -258,8 +246,24 @@ public class SysUserServiceImpl extends ServiceImpl impl if (ObjectUtil.isNotEmpty(userIds)) { SysUserFaceDto faceDto = new SysUserFaceDto(); List faceList = sysUserFaceMapper.groupConcatFaces(faceDto); - DataUtil.convertFacesList(list.getRecords(), - CollectionUtils.convertMap(faceList, SysUserFaceVo::getUserId)); + DataUtil.convertFacesList(list.getRecords(), CollectionUtils.convertMap(faceList, SysUserFaceVo::getUserId)); + } + // 审批流程 + if (userDTO.getIsFindCheckUser()) { + List processInstanceIds = list.getRecords().stream().map(UserVO::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + if (ObjectUtil.isNotEmpty(processInstanceIds)) { + List taskList = flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), processInstanceIds); + if (ObjectUtil.isNotEmpty(taskList)) { + Map taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId); + CollectionUtils.convertList(list.getRecords(), v -> { + TaskDto task = taskMap.get(v.getProcessId()); + if (ObjectUtil.isNotEmpty(task)) { + v.setIsCheckUser(true); + } + return v; + }); + } + } } } return list; @@ -338,8 +342,7 @@ public class SysUserServiceImpl extends ServiceImpl impl // 更新用户角色表 if (userDto.getRole() != null) { - sysUserRoleMapper - .delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId())); + sysUserRoleMapper.delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId())); userDto.getRole().stream().map(roleId -> { SysUserRole userRole = new SysUserRole(); userRole.setUserId(sysUser.getUserId()); @@ -350,8 +353,7 @@ public class SysUserServiceImpl extends ServiceImpl impl // 更新用户岗位表 if (userDto.getPost() != null) { - sysUserPostMapper - .delete(Wrappers.lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId())); + sysUserPostMapper.delete(Wrappers.lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId())); userDto.getPost().stream().map(postId -> { SysUserPost userPost = new SysUserPost(); userPost.setUserId(sysUser.getUserId()); @@ -403,15 +405,9 @@ public class SysUserServiceImpl extends ServiceImpl impl List userExcelVOList = voList.stream().map(userVO -> { UserExcelVO excelVO = new UserExcelVO(); BeanUtils.copyProperties(userVO, excelVO); - String roleNameList = userVO.getRoleList() - .stream() - .map(SysRole::getRoleName) - .collect(Collectors.joining(StrUtil.COMMA)); + String roleNameList = userVO.getRoleList().stream().map(SysRole::getRoleName).collect(Collectors.joining(StrUtil.COMMA)); excelVO.setRoleNameList(roleNameList); - String postNameList = userVO.getPostList() - .stream() - .map(SysPost::getPostName) - .collect(Collectors.joining(StrUtil.COMMA)); + String postNameList = userVO.getPostList().stream().map(SysPost::getPostName).collect(Collectors.joining(StrUtil.COMMA)); excelVO.setPostNameList(postNameList); return excelVO; }).collect(Collectors.toList()); @@ -442,26 +438,21 @@ public class SysUserServiceImpl extends ServiceImpl impl Set errorMsg = new HashSet<>(); // 校验用户名是否存在 - boolean exsitUserName = userList.stream() - .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); + boolean exsitUserName = userList.stream().anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); if (exsitUserName) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); } // 判断输入的部门名称列表是否合法 - Optional deptOptional = deptList.stream() - .filter(dept -> excel.getDeptName().equals(dept.getName())) - .findFirst(); + Optional deptOptional = deptList.stream().filter(dept -> excel.getDeptName().equals(dept.getName())).findFirst(); if (!deptOptional.isPresent()) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName())); } // 判断输入的角色名称列表是否合法 List roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA); - List roleCollList = roleList.stream() - .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) - .collect(Collectors.toList()); + List roleCollList = roleList.stream().filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))).collect(Collectors.toList()); if (roleCollList.size() != roleNameList.size()) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); @@ -469,9 +460,7 @@ public class SysUserServiceImpl extends ServiceImpl impl // 判断输入的部门名称列表是否合法 List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); - List postCollList = postList.stream() - .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) - .collect(Collectors.toList()); + List postCollList = postList.stream().filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))).collect(Collectors.toList()); if (postCollList.size() != postNameList.size()) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); @@ -501,9 +490,7 @@ public class SysUserServiceImpl extends ServiceImpl impl } // 校验导入的内容 List errorMessageList = (List) bindingResult.getTarget(); - List deptNames = - excelList.stream().map(UserExcelFaceVo::getDeptName).distinct().filter(ObjectUtil::isNotEmpty) - .toList(); + List deptNames = excelList.stream().map(UserExcelFaceVo::getDeptName).distinct().filter(ObjectUtil::isNotEmpty).toList(); // 部门 List sysDeptList = sysDeptService.selectByNames(deptNames); // 角色 @@ -512,16 +499,13 @@ public class SysUserServiceImpl extends ServiceImpl impl 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(); + 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(); + String username = v.getUsername(), name = v.getName(), mobile = v.getMobile(), sex = v.getSex(), deptName = v.getDeptName(); if (ObjectUtil.isEmpty(name)) { errorMsg.add("用户昵称为空"); } @@ -531,8 +515,7 @@ public class SysUserServiceImpl extends ServiceImpl impl errorMsg.add("手机号码格式不正确"); } else { // 校验用户名是否存在 - boolean existMobile = - userList.stream().anyMatch(i -> ObjectUtil.equals(i.getPhone(), mobile.trim())); + boolean existMobile = userList.stream().anyMatch(i -> ObjectUtil.equals(i.getPhone(), mobile.trim())); if (existMobile) { errorMsg.add("手机号已存在"); } @@ -540,8 +523,7 @@ public class SysUserServiceImpl extends ServiceImpl impl if (ObjectUtil.isEmpty(deptName)) { errorMsg.add("部门名称为空"); } else { - Optional targetDept = - sysDeptList.stream().filter(i -> ObjectUtil.equals(i.getName(), deptName)).findFirst(); + Optional targetDept = sysDeptList.stream().filter(i -> ObjectUtil.equals(i.getName(), deptName)).findFirst(); if (targetDept.isEmpty()) { errorMsg.add("没有该部门"); } else { @@ -576,8 +558,7 @@ public class SysUserServiceImpl extends ServiceImpl impl /** * 插入excel User */ - private void insertExcelUser(UserExcelVO excel, Optional deptOptional, List roleCollList, - List postCollList, PjcloudUser user) { + private void insertExcelUser(UserExcelVO excel, Optional deptOptional, List roleCollList, List postCollList, PjcloudUser user) { UserDTO userDTO = new UserDTO(); userDTO.setUsername(excel.getUsername()); userDTO.setPhone(excel.getPhone()); @@ -622,8 +603,7 @@ public class SysUserServiceImpl extends ServiceImpl impl public void insertExcelFace(UserDTO user, PictureData face) { try { // 查询用户 - MultipartFile multipartFile = new MockMultipartFile("file", UUID.randomUUID() + "_face.png", "image/png", - new ByteArrayInputStream(face.getData())); + 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(); @@ -646,16 +626,14 @@ public class SysUserServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class) public R registerUser(UserDTO userDto) { // 判断用户名是否存在 - boolean usernameExists = this.exists(Wrappers.lambdaQuery() - .eq(SysUser::getUsername, userDto.getUsername())); + boolean usernameExists = this.exists(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); if (usernameExists) { String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); return R.failed(message); } // 判断手机号是否存在 - boolean phoneExists = this.exists(Wrappers.lambdaQuery() - .eq(SysUser::getPhone, userDto.getPhone())); + boolean phoneExists = this.exists(Wrappers.lambdaQuery().eq(SysUser::getPhone, userDto.getPhone())); if (phoneExists) { String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_PHONE_EXISTING, userDto.getPhone()); return R.failed(message); @@ -700,10 +678,7 @@ public class SysUserServiceImpl extends ServiceImpl impl } String password = ENCODER.encode(userDto.getNewpassword1()); - this.update(Wrappers.lambdaUpdate() - .set(SysUser::getPassword, password) - .set(SysUser::getPasswordModifyTime, LocalDateTime.now()) - .eq(SysUser::getUserId, user.getUserId())); + this.update(Wrappers.lambdaUpdate().set(SysUser::getPassword, password).set(SysUser::getPasswordModifyTime, LocalDateTime.now()).eq(SysUser::getUserId, user.getUserId())); return R.ok(); } @@ -712,29 +687,17 @@ public class SysUserServiceImpl extends ServiceImpl impl PjcloudUser user = SecurityUtils.getUser(); LambdaUpdateWrapper wrapper = null; if (type.equals("wechat")) { - wrapper = Wrappers.lambdaUpdate() - .set(SysUser::getWxOpenid, null) - .eq(SysUser::getUserId, user.getId()); + wrapper = Wrappers.lambdaUpdate().set(SysUser::getWxOpenid, null).eq(SysUser::getUserId, user.getId()); } else if (type.equals("gitee")) { - wrapper = Wrappers.lambdaUpdate() - .set(SysUser::getGiteeLogin, null) - .eq(SysUser::getUserId, user.getId()); + wrapper = Wrappers.lambdaUpdate().set(SysUser::getGiteeLogin, null).eq(SysUser::getUserId, user.getId()); } else if (type.equals("osc")) { - wrapper = Wrappers.lambdaUpdate() - .set(SysUser::getOscId, null) - .eq(SysUser::getUserId, user.getId()); + wrapper = Wrappers.lambdaUpdate().set(SysUser::getOscId, null).eq(SysUser::getUserId, user.getId()); } else if (type.equals("tencent")) { - wrapper = Wrappers.lambdaUpdate() - .set(SysUser::getQqOpenid, null) - .eq(SysUser::getUserId, user.getId()); + wrapper = Wrappers.lambdaUpdate().set(SysUser::getQqOpenid, null).eq(SysUser::getUserId, user.getId()); } else if (type.equals("cp")) { - wrapper = Wrappers.lambdaUpdate() - .set(SysUser::getWxCpUserid, null) - .eq(SysUser::getUserId, user.getId()); + wrapper = Wrappers.lambdaUpdate().set(SysUser::getWxCpUserid, null).eq(SysUser::getUserId, user.getId()); } else if (type.equals("dingding")) { - wrapper = Wrappers.lambdaUpdate() - .set(SysUser::getWxDingUserid, null) - .eq(SysUser::getUserId, user.getId()); + wrapper = Wrappers.lambdaUpdate().set(SysUser::getWxDingUserid, null).eq(SysUser::getUserId, user.getId()); } if (wrapper == null) { return R.failed("解绑账号类型不存在"); @@ -779,20 +742,13 @@ public class SysUserServiceImpl extends ServiceImpl impl // 重置密码 String password = ENCODER.encode(userDto.getNewpassword1()); - this.update(Wrappers.lambdaUpdate() - .set(SysUser::getPassword, password) - .set(SysUser::getPasswordModifyTime, LocalDateTime.now()) - .set(SysUser::getPasswordExpireFlag, CommonConstants.STATUS_NORMAL) - .eq(SysUser::getUsername, userDto.getUsername())); + this.update(Wrappers.lambdaUpdate().set(SysUser::getPassword, password).set(SysUser::getPasswordModifyTime, LocalDateTime.now()).set(SysUser::getPasswordExpireFlag, CommonConstants.STATUS_NORMAL).eq(SysUser::getUsername, userDto.getUsername())); return R.ok(); } @Override public List listUserIdByRoleIds(List roleIdList) { - return sysUserRoleMapper.selectList(Wrappers.lambdaQuery().in(SysUserRole::getRoleId, roleIdList)) - .stream() - .map(SysUserRole::getUserId) - .collect(Collectors.toList()); + return sysUserRoleMapper.selectList(Wrappers.lambdaQuery().in(SysUserRole::getRoleId, roleIdList)).stream().map(SysUserRole::getUserId).collect(Collectors.toList()); } /** @@ -834,9 +790,7 @@ public class SysUserServiceImpl extends ServiceImpl impl return; } String processId = dto.getProcessInstanceId(); - SysUser detail = baseMapper.selectOne(new LambdaQueryWrapper() - .eq(SysUser::getProcessId, processId) - ); + SysUser detail = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysUser::getProcessId, processId)); if (ObjectUtil.isEmpty(detail)) { return; } @@ -846,12 +800,11 @@ public class SysUserServiceImpl extends ServiceImpl impl } try { Boolean isConsent = flowUtil.isConsent(dto); - String processStatus = - isConsent ? TaskCheckStatusEnum.RESULT.getCode() : TaskCheckStatusEnum.REJECT.getCode(); + String processStatus = isConsent ? TaskCheckStatusEnum.RESULT.getCode() : TaskCheckStatusEnum.REJECT.getCode(); SysUser updateUser = new SysUser(); updateUser.setUserId(detail.getUserId()); updateUser.setProcessStatus(processStatus); - updateUser.setPasswordModifyTime(LocalDateTime.now()); + updateUser.setProcessTime(LocalDateTime.now()); baseMapper.updateById(updateUser); } catch (Exception e) { e.printStackTrace(); @@ -866,8 +819,20 @@ public class SysUserServiceImpl extends ServiceImpl impl @Override @Transactional(rollbackFor = Exception.class) public void applyFlow(SysUser user) { - UserFaceApplyFlowDto flowDto = new UserFaceApplyFlowDto(); - String processId = flowUtil.startFlow("ADD_USER_FLOW", user, user.getUserId(), flowDto); + // 查询发起用户 + SysUser applyUser = baseMapper.selectById(SecurityUtils.getUser().getId()); + if (ObjectUtil.isEmpty(applyUser)) { + return; + } + SysDept applyDept = sysDeptService.getById(applyUser.getDeptId()); + if (ObjectUtil.isEmpty(applyDept)) { + return; + } + + UserApplyFlowDto flowDto = new UserApplyFlowDto(); + flowDto.setApplyDeptName(applyDept.getName()); + + String processId = flowUtil.startFlow("ADD_USER_FLOW", applyUser, user.getUserId(), flowDto); SysUser updateObj = new SysUser(); updateObj.setUserId(user.getUserId()); updateObj.setProcessId(processId); diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java index b04294cc8..e3c042dc5 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java @@ -14,7 +14,6 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.entity.SysUser; -import com.bsd.pjcloud.admin.utils.flow.dto.UserApplyFlowDto; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.resolver.ParamResolver; import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowApiFlowService; @@ -24,13 +23,13 @@ import com.bsd.pjcloud.flow.task.dto.ProcessInstanceParamDto; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.flow.task.dto.TaskQueryParamDto; +import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto; import com.bsd.pjcloud.flow.task.entity.Process; import com.bsd.pjcloud.flow.task.vo.ProcessVO; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; @@ -52,7 +51,7 @@ public class FlowUtil { return startFlow(flowIdKey, user, businessId, null); } - public String startFlow(String flowIdKey, SysUser user, Long businessId, T dto) { + public String startFlow(String flowIdKey, SysUser user, Long businessId, T dto) { // 发起工作流 String defaultRole = ParamResolver.getStr(flowIdKey); if (ObjectUtil.isEmpty(defaultRole)) { diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserApplyFlowDto.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserApplyFlowDto.java index 39d57e4db..7f61fa253 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserApplyFlowDto.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserApplyFlowDto.java @@ -7,4 +7,5 @@ import lombok.Data; @Data public class UserApplyFlowDto extends FlowBaseDto { + } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserFaceApplyFlowDto.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserFaceApplyFlowDto.java index a5f493296..d095ec6f3 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserFaceApplyFlowDto.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserFaceApplyFlowDto.java @@ -1,9 +1,11 @@ package com.bsd.pjcloud.admin.utils.flow.dto; +import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto; + import lombok.Data; @Data -public class UserFaceApplyFlowDto extends UserApplyFlowDto { +public class UserFaceApplyFlowDto extends FlowBaseDto { private String username; diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml index 5eb1d7820..22b807bd7 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml @@ -179,7 +179,7 @@ AND u.user_id = #{query.userId} - + AND u.process_status = #{query.processStatus} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java index b891de460..df85ed468 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java @@ -77,8 +77,7 @@ import java.util.*; @Slf4j @RequiredArgsConstructor @Service -public class WalletRechargeApplyServiceImpl extends ServiceImpl - implements WalletRechargeApplyService { +public class WalletRechargeApplyServiceImpl extends ServiceImpl implements WalletRechargeApplyService { static private final String TAG = "充值/扣款申请"; @@ -126,8 +125,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl> userList = userService.getUserById(new ArrayList<>(userIds)); if (ObjectUtil.isNotEmpty(userList.getData())) { - DataUtil.convertUserList(list.getRecords(), - CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); + DataUtil.convertUserList(list.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); } } // 部门 @@ -239,8 +237,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl !ObjectUtil.isAllEmpty(v.getUsername(), v.getUserMobile(), v.getPrice())) - .toList(); + list = list.stream().filter(v -> !ObjectUtil.isAllEmpty(v.getUsername(), v.getUserMobile(), v.getPrice())).toList(); if (ObjectUtil.isEmpty(list)) { return R.failed(); } @@ -303,9 +300,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl batchSaveList = list.stream() - .map(v -> WalletRechargeImportEntity.builder().price(v.getPriceNumber()).userId(v.getUserId()) - .userDeptId(v.getUserDeptId()).build()).toList(); + List batchSaveList = list.stream().map(v -> WalletRechargeImportEntity.builder().price(v.getPriceNumber()).userId(v.getUserId()).userDeptId(v.getUserDeptId()).build()).toList(); batchSaveList.forEach(v -> v.setApplyId(insertObj.getId())); rechargeImportService.saveBatch(batchSaveList); return R.ok(null, MsgUtils.getMessage(ErrorCodes.SYS_USER_IMPORT_SUCCEED)); @@ -320,9 +315,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl() - .eq(WalletRechargeApplyEntity::getProcessId, processId) - ); + WalletRechargeApplyEntity detail = baseMapper.selectOne(new LambdaQueryWrapper().eq(WalletRechargeApplyEntity::getProcessId, processId)); if (ObjectUtil.isEmpty(detail)) { return; } @@ -332,16 +325,10 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl importList = - rechargeImportService.list(new LambdaQueryWrapper() - .eq(WalletRechargeImportEntity::getApplyId, detail.getId()) - ); + List importList = rechargeImportService.list(new LambdaQueryWrapper().eq(WalletRechargeImportEntity::getApplyId, detail.getId())); if (ObjectUtil.isEmpty(importList)) { return; } @@ -355,8 +342,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl importList = - rechargeImportService.list(new LambdaQueryWrapper() - .eq(WalletRechargeImportEntity::getApplyId, detail.getId()) - ); + List importList = rechargeImportService.list(new LambdaQueryWrapper().eq(WalletRechargeImportEntity::getApplyId, detail.getId())); if (ObjectUtil.isEmpty(importList)) { return; } @@ -395,8 +377,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl walletTypeList = walletTypeMapper.list(walletTypeDto); if (ObjectUtil.isNotEmpty(walletTypeList)) { - WalletDataUtil.convertWalletTypeList(list, - CollectionUtils.convertMap(walletTypeList, WalletTypeEntity::getId)); + WalletDataUtil.convertWalletTypeList(list, CollectionUtils.convertMap(walletTypeList, WalletTypeEntity::getId)); } } // 审批流程 if (dto.getIsFindCheckUser()) { - List processInstanceIds = - list.stream().map(WalletRechargeApplyVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct() - .toList(); + List processInstanceIds = list.stream().map(WalletRechargeApplyVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList(); if (ObjectUtil.isNotEmpty(processInstanceIds)) { - List taskList = - flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), - processInstanceIds); + List taskList = flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), processInstanceIds); if (ObjectUtil.isNotEmpty(taskList)) { - Map taskMap = - CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId); + Map taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId); CollectionUtils.convertList(list, v -> { TaskDto task = taskMap.get(v.getProcessId()); if (ObjectUtil.isNotEmpty(task)) { @@ -483,10 +456,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl() - .eq(WalletRechargeApplyEntity::getUserId, walletId) - .eq(WalletRechargeApplyEntity::getProcessStatus, NodeStatusEnum.JXZ.getCode()) - ); + Long count = baseMapper.selectCount(new LambdaQueryWrapper().eq(WalletRechargeApplyEntity::getUserId, walletId).eq(WalletRechargeApplyEntity::getProcessStatus, NodeStatusEnum.JXZ.getCode())); return count >= 3; } From 3e64081964df783c0b601acd12943c6ac66f222c Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 13 Mar 2025 21:59:07 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=E5=AE=A1=E6=A0=B8=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E5=90=8E=E5=86=8D=E6=96=B0=E5=BB=BA=E9=92=B1=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/service/impl/SysUserServiceImpl.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) 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 caeb3829a..c65fd1733 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 @@ -189,15 +189,15 @@ public class SysUserServiceImpl extends ServiceImpl impl return userRole; }).forEach(sysUserRoleMapper::insert); - // 创建用户默认钱包 - CompletableFuture.runAsync(() -> { - remoteWalletService.createWallet(sysUser.getUserId()); - }); - - remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE); - if (isDeptAdmin) { getSelf().applyFlow(sysUser); + } else { + // 创建用户默认钱包 + CompletableFuture.runAsync(() -> { + remoteWalletService.createWallet(sysUser.getUserId()); + }); + + remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE); } return sysUser.getUserId(); @@ -806,6 +806,8 @@ public class SysUserServiceImpl extends ServiceImpl impl updateUser.setProcessStatus(processStatus); updateUser.setProcessTime(LocalDateTime.now()); baseMapper.updateById(updateUser); + // 创建用户默认钱包 + remoteWalletService.createWallet(detail.getUserId()); } catch (Exception e) { e.printStackTrace(); log.error("|{}|审批回调意外的错误,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage()); From b998612e3b9b0029c0dbf1fb3aff0ece1bdf9116 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 14 Mar 2025 11:31:16 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E5=85=85=E5=80=BC?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/mapper/recharge/WalletRechargeApplyMapper.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargeApplyMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargeApplyMapper.java index fd5b18ddd..814616387 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargeApplyMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargeApplyMapper.java @@ -54,11 +54,10 @@ public interface WalletRechargeApplyMapper extends PjcloudBaseMapper scopePageList(Page page, WalletRechargeApplyDto dto) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .eq(ObjectUtil.isNotEmpty(dto.getWalletTypeId()), WalletRechargeApplyEntity::getWalletTypeId, - dto.getWalletTypeId()) + .eq(ObjectUtil.isNotEmpty(dto.getWalletTypeId()), WalletRechargeApplyEntity::getWalletTypeId, dto.getWalletTypeId()) + .eq(ObjectUtil.isNotEmpty(dto.getProcessStatus()), WalletRechargeApplyEntity::getProcessStatus, dto.getProcessStatus()) .in(ObjectUtil.isNotEmpty(dto.getUserIds()), WalletRechargeApplyEntity::getUserId, dto.getUserIds()) - .in(ObjectUtil.isNotEmpty(dto.getWalletTypeIds()), WalletRechargeApplyEntity::getWalletTypeId, - dto.getWalletTypeIds()) + .in(ObjectUtil.isNotEmpty(dto.getWalletTypeIds()), WalletRechargeApplyEntity::getWalletTypeId, dto.getWalletTypeIds()) .orderByDesc(WalletRechargeApplyEntity::getCreateTime) .orderByDesc(WalletRechargeApplyEntity::getId); Page list = selectPageByScope(page, wrapper, DataScope.of());