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); }