feat:人员人脸审批
This commit is contained in:
1 parent
4c8c94a804
commit
4c4c7e9081
23 files changed
+787
-144
No files matched your search
+33
-23
@@ -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
|
||||
-- ----------------------------
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package com.bsd.pjcloud.common.core.constant;
|
||||
|
||||
public interface CommonRoleConstant {
|
||||
|
||||
String DEFAULT_USER = "GENERAL_USER";
|
||||
|
||||
String DEPT_ADMIN = "DEPT_ADMIN";
|
||||
|
||||
}
|
||||
+4
@@ -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;
|
||||
|
||||
+10
-1
@@ -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;
|
||||
}
|
||||
+20
-4
@@ -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<SysUser> 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<SysUser> implements Serializable {
|
||||
@Schema(description = "密码过期标记")
|
||||
private String passwordExpireFlag;
|
||||
|
||||
|
||||
/**
|
||||
* 密码修改时间
|
||||
*/
|
||||
@Schema(description = "密码修改时间")
|
||||
private LocalDateTime passwordModifyTime;
|
||||
|
||||
|
||||
/**
|
||||
* 手机号
|
||||
*/
|
||||
@@ -216,14 +234,12 @@ public class SysUser extends Model<SysUser> implements Serializable {
|
||||
@Schema(description = "邮箱")
|
||||
private String email;
|
||||
|
||||
|
||||
/**
|
||||
* 员工浙政钉编码
|
||||
*/
|
||||
@Schema(description = "员工浙政钉编码")
|
||||
private String dingtalkEmployeeCode;
|
||||
|
||||
|
||||
@Schema(description = "员工所属系统类型")
|
||||
private String systemType;
|
||||
|
||||
|
||||
+69
-43
@@ -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<SysUserFaceEntity> {
|
||||
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
@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;
|
||||
}
|
||||
+19
-1
@@ -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;
|
||||
|
||||
|
||||
@@ -216,6 +216,10 @@
|
||||
<version>5.7.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.bsd</groupId>
|
||||
<artifactId>pjcloud-flow-task-api</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
+26
-7
@@ -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<UserInfo> getUserByNameAndMobile(@RequestParam("name") String name, @RequestParam("mobile") String mobile) {
|
||||
SysUser user = userService.getOne(Wrappers.<SysUser>query().lambda().eq(SysUser::getName, name).eq(SysUser::getPhone, mobile));
|
||||
public R<UserInfo> getUserByNameAndMobile(@RequestParam("name") String name,
|
||||
@RequestParam("mobile") String mobile) {
|
||||
SysUser user = userService.getOne(
|
||||
Wrappers.<SysUser>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<UserExcelFaceVo> excelList, BindingResult bindingResult) {
|
||||
public R importUserFace(@RequestParam("file") MultipartFile file, @RequestExcel List<UserExcelFaceVo> excelList,
|
||||
BindingResult bindingResult) {
|
||||
return userService.importUserFace(file, excelList, bindingResult);
|
||||
}
|
||||
|
||||
@@ -370,7 +387,9 @@ public class SysUserController {
|
||||
@Inner
|
||||
public R<List<SysUser>> getUserByMobileOrEmployeeCode(@RequestParam("employeeCode") String employeeCode,
|
||||
@RequestParam("mobile") String mobile) {
|
||||
return R.ok(userService.list(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getDingtalkEmployeeCode, employeeCode).or().eq(SysUser::getPhone, mobile)));
|
||||
return R.ok(userService.list(
|
||||
Wrappers.<SysUser>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<List<SimpleUserAllListVO>> getSimpleUserAllList(@RequestParam(value = "mobile", required = false) String mobile,
|
||||
@RequestParam(value = "name", required = false) String name) {
|
||||
public R<List<SimpleUserAllListVO>> getSimpleUserAllList(
|
||||
@RequestParam(value = "mobile", required = false) String mobile,
|
||||
@RequestParam(value = "name", required = false) String name) {
|
||||
LambdaQueryWrapper<SysUser> 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<Map<Long, SysUser>> getUserMap(@RequestParam(value = "userIds") Set<Long> userIds) {
|
||||
|
||||
+29
-2
@@ -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<Page<SysUserFaceVo>> 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<Page<SysUserFaceVo>> 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<SysUserFaceEntity> 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));
|
||||
}
|
||||
}
|
||||
+21
-2
@@ -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<SysUserFaceEntity>
|
||||
.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());
|
||||
}
|
||||
|
||||
+5
@@ -90,4 +90,9 @@ public interface SysRoleService extends IService<SysRole> {
|
||||
*/
|
||||
List<RoleExcelVO> listRole(SysRole sysRole, Long[] ids);
|
||||
|
||||
/**
|
||||
* 是否为部门管理员
|
||||
*/
|
||||
boolean isDeptAdmin(Long userId);
|
||||
|
||||
}
|
||||
+12
@@ -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<SysUserFaceEntity> {
|
||||
Page<SysUserFaceVo> pageJoin(Page page, SysUserFaceDto dto);
|
||||
|
||||
SysUserFaceVo join(Long id);
|
||||
|
||||
/**
|
||||
* 开启审批
|
||||
*/
|
||||
void applyFlow(SysUser user, SysUserFaceEntity detail);
|
||||
|
||||
/**
|
||||
* 审批回调
|
||||
*/
|
||||
void applyCallback(ProcessNodeRecordAssignUserParamDto dto);
|
||||
}
|
||||
+12
-3
@@ -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<SysUser> {
|
||||
|
||||
List<UserVO> getUserDeptByIds(List<Long> userIds);
|
||||
|
||||
|
||||
/**
|
||||
* 查询所有用户简单信息
|
||||
* @param sysUserLambdaQueryWrapper
|
||||
* @return
|
||||
*/
|
||||
List<SimpleUserAllListVO> listScope(LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper);
|
||||
|
||||
/**
|
||||
* 添加用户审批回调
|
||||
*/
|
||||
void applyCallback(ProcessNodeRecordAssignUserParamDto dto);
|
||||
|
||||
/**
|
||||
* 开启审批
|
||||
*/
|
||||
void applyFlow(SysUser user);
|
||||
}
|
||||
+17
-2
@@ -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<SysRoleMapper, SysRole> impl
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List findRolesByUserId(Long userId) {
|
||||
public List<SysRole> findRolesByUserId(Long userId) {
|
||||
return baseMapper.listRolesByUserId(userId);
|
||||
}
|
||||
|
||||
@@ -89,7 +93,9 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
|
||||
|
||||
@Override
|
||||
public List<SysRole> findRolesByCodes(List<String> codes) {
|
||||
if (ObjectUtil.isEmpty(codes)) return null;
|
||||
if (ObjectUtil.isEmpty(codes)) {
|
||||
return null;
|
||||
}
|
||||
return baseMapper.selectList(new LambdaQueryWrapper<SysRole>()
|
||||
.in(SysRole::getRoleCode, codes)
|
||||
);
|
||||
@@ -179,6 +185,15 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDeptAdmin(Long userId) {
|
||||
List<SysRole> userRoles = findRolesByUserId(userId);
|
||||
if (ObjectUtil.isEmpty(userRoles)) {
|
||||
return false;
|
||||
}
|
||||
return userRoles.stream().anyMatch(v -> ObjectUtil.equals(v.getRoleCode(), CommonRoleConstant.DEPT_ADMIN));
|
||||
}
|
||||
|
||||
/**
|
||||
* 插入excel Role
|
||||
*/
|
||||
|
||||
+119
-5
@@ -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<SysUserFaceMapper, SysUserFaceEntity> implements SysUserFaceService {
|
||||
public class SysUserFaceServiceImpl extends ServiceImpl<SysUserFaceMapper, SysUserFaceEntity>
|
||||
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<SysUserFaceMapper, SysUs
|
||||
updateObj.setId(sysUserFace.getId());
|
||||
updateObj.setAutoCode(String.valueOf(count));
|
||||
baseMapper.updateById(updateObj);
|
||||
if (isDeptAdmin) {
|
||||
// 开启审批
|
||||
SysUser userDetail = sysUserService.getById(applyUser.getId());
|
||||
getSelf().applyFlow(userDetail, sysUserFace);
|
||||
}
|
||||
// 发送mq
|
||||
sendFaceMq(List.of(sysUserFace.getUserId()), null);
|
||||
return sysUserFace.getId();
|
||||
@@ -74,7 +113,9 @@ public class SysUserFaceServiceImpl extends ServiceImpl<SysUserFaceMapper, SysUs
|
||||
@Override
|
||||
public Boolean editGlobalFace(SysUserFaceDto dto) {
|
||||
SysUser user = sysUserService.getById(dto.getUserId());
|
||||
if (ObjectUtil.isEmpty(user)) throw new RuntimeException("用户不存在");
|
||||
if (ObjectUtil.isEmpty(user)) {
|
||||
throw new RuntimeException("用户不存在");
|
||||
}
|
||||
SysUser updateObj = new SysUser();
|
||||
updateObj.setUserId(dto.getUserId());
|
||||
updateObj.setIsGlobalFace(dto.getIsGlobalFace());
|
||||
@@ -86,7 +127,9 @@ public class SysUserFaceServiceImpl extends ServiceImpl<SysUserFaceMapper, SysUs
|
||||
|
||||
@Override
|
||||
public void delByIds(ArrayList<Long> list) {
|
||||
if (ObjectUtil.isEmpty(list)) return;
|
||||
if (ObjectUtil.isEmpty(list)) {
|
||||
return;
|
||||
}
|
||||
// 发送mq
|
||||
List<SysUserFaceEntity> faceList = baseMapper.selectList(new LambdaQueryWrapper<SysUserFaceEntity>()
|
||||
.in(SysUserFaceEntity::getId, list)
|
||||
@@ -94,6 +137,10 @@ public class SysUserFaceServiceImpl extends ServiceImpl<SysUserFaceMapper, SysUs
|
||||
if (ObjectUtil.isNotEmpty(faceList)) {
|
||||
sendFaceMq(faceList.stream().map(SysUserFaceEntity::getUserId).toList(), null);
|
||||
}
|
||||
// 取消审批
|
||||
TaskParamDto dto = new TaskParamDto();
|
||||
dto.setProcessInstanceIdList(faceList.stream().map(SysUserFaceEntity::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList());
|
||||
remoteFlowEngineService.stopProcessInstance(dto).getData();
|
||||
baseMapper.deleteBatchIds(list);
|
||||
}
|
||||
|
||||
@@ -119,21 +166,88 @@ public class SysUserFaceServiceImpl extends ServiceImpl<SysUserFaceMapper, SysUs
|
||||
return baseMapper.join(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 开启审批
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void applyFlow(SysUser user, SysUserFaceEntity detail) {
|
||||
// 查询用户
|
||||
SysUser userDetail = sysUserService.getById(detail.getUserId());
|
||||
if (ObjectUtil.isEmpty(userDetail)) {
|
||||
return;
|
||||
}
|
||||
// 查询发起人部门
|
||||
SysDept applyDept = sysDeptService.getById(user.getDeptId());
|
||||
if (ObjectUtil.isEmpty(applyDept)) {
|
||||
return;
|
||||
}
|
||||
UserFaceApplyFlowDto flowDto = new UserFaceApplyFlowDto();
|
||||
flowDto.setUsername(userDetail.getName());
|
||||
flowDto.setApplyDeptName(applyDept.getName());
|
||||
String processId = flowUtil.startFlow("ADD_USER_FACE_FLOW", user, detail.getId(), flowDto);
|
||||
SysUserFaceEntity updateObj = new SysUserFaceEntity();
|
||||
updateObj.setId(detail.getId());
|
||||
updateObj.setProcessId(processId);
|
||||
updateObj.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode());
|
||||
baseMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
/**
|
||||
* 审批回调
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void applyCallback(ProcessNodeRecordAssignUserParamDto dto) {
|
||||
if (!flowUtil.checkCallback(dto)) {
|
||||
return;
|
||||
}
|
||||
String processId = dto.getProcessInstanceId();
|
||||
SysUserFaceEntity detail = baseMapper.selectOne(new LambdaQueryWrapper<SysUserFaceEntity>()
|
||||
.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<SysUserFaceEntity>()
|
||||
.eq(SysUserFaceEntity::getUserId, userId)
|
||||
.eq(SysUserFaceEntity::getProcessStatus, TaskCheckStatusEnum.RESULT.getCode())
|
||||
);
|
||||
return count >= 3;
|
||||
}
|
||||
|
||||
// 发送mq
|
||||
private void sendFaceMq(List<Long> userIds, Boolean isGlobalFace) {
|
||||
if (ObjectUtil.isEmpty(userIds)) return;
|
||||
if (ObjectUtil.isEmpty(userIds)) {
|
||||
return;
|
||||
}
|
||||
List<SysUser> list = sysUserService.list(new LambdaQueryWrapper<SysUser>().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());
|
||||
}
|
||||
}
|
||||
+115
-12
@@ -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<SysUserMapper, SysUser> impl
|
||||
|
||||
private final SysFileService sysFileService;
|
||||
|
||||
private final FlowUtil flowUtil;
|
||||
|
||||
/**
|
||||
* 保存用户信息
|
||||
*
|
||||
@@ -124,9 +136,28 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> 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<SysRole> 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<SysUserMapper, SysUser> 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<SysUserMapper, SysUser> impl
|
||||
if (ObjectUtil.isNotEmpty(userIds)) {
|
||||
SysUserFaceDto faceDto = new SysUserFaceDto();
|
||||
List<SysUserFaceVo> 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<SysUserMapper, SysUser> impl
|
||||
*/
|
||||
@Override
|
||||
public R importUser(List<UserExcelVO> excelVOList, BindingResult bindingResult) {
|
||||
PjcloudUser user = SecurityUtils.getUser();
|
||||
|
||||
// 通用校验获取失败的数据
|
||||
List<ErrorMessage> errorMessageList = (List<ErrorMessage>) bindingResult.getTarget();
|
||||
List<SysDept> deptList = sysDeptService.list();
|
||||
@@ -440,7 +479,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> 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<SysUserMapper, SysUser> impl
|
||||
@Override
|
||||
public R importUserFace(MultipartFile file, List<UserExcelFaceVo> excelList, BindingResult bindingResult) {
|
||||
try {
|
||||
if (ObjectUtil.isEmpty(excelList)) R.failed("excel内容为空");
|
||||
if (ObjectUtil.isEmpty(excelList)) {
|
||||
R.failed("excel内容为空");
|
||||
}
|
||||
// 校验导入的内容
|
||||
List<ErrorMessage> errorMessageList = (List<ErrorMessage>) bindingResult.getTarget();
|
||||
List<String> deptNames = excelList.stream().map(UserExcelFaceVo::getDeptName).distinct().filter(ObjectUtil::isNotEmpty).toList();
|
||||
List<String> deptNames =
|
||||
excelList.stream().map(UserExcelFaceVo::getDeptName).distinct().filter(ObjectUtil::isNotEmpty)
|
||||
.toList();
|
||||
// 部门
|
||||
List<SysDept> sysDeptList = sysDeptService.selectByNames(deptNames);
|
||||
// 角色
|
||||
@@ -469,13 +512,16 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
||||
List<SysUser> userList = this.list();
|
||||
String walletAutoCreate = ParamResolver.getStr("WALLET_AUTO_CREATE");
|
||||
String userDefaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE");
|
||||
List<Long> roleIds = roleList.stream().filter(v -> ObjectUtil.equals(v.getRoleCode(), walletAutoCreate) || ObjectUtil.equals(v.getRoleCode(), userDefaultRole)).map(SysRole::getRoleId).toList();
|
||||
List<Long> roleIds = roleList.stream()
|
||||
.filter(v -> ObjectUtil.equals(v.getRoleCode(), walletAutoCreate) || ObjectUtil.equals(
|
||||
v.getRoleCode(), userDefaultRole)).map(SysRole::getRoleId).toList();
|
||||
// 读取图片
|
||||
Map<String, PictureData> images = ExcelTool.getPictureFromExcel(file, 1);
|
||||
for (UserExcelFaceVo v : excelList) {
|
||||
Long deptId = null;
|
||||
Set<String> 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<SysUserMapper, SysUser> 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<SysUserMapper, SysUser> impl
|
||||
if (ObjectUtil.isEmpty(deptName)) {
|
||||
errorMsg.add("部门名称为空");
|
||||
} else {
|
||||
Optional<SysDept> targetDept = sysDeptList.stream().filter(i -> ObjectUtil.equals(i.getName(), deptName)).findFirst();
|
||||
Optional<SysDept> 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<SysUserMapper, SysUser> impl
|
||||
* 插入excel User
|
||||
*/
|
||||
private void insertExcelUser(UserExcelVO excel, Optional<SysDept> deptOptional, List<SysRole> roleCollList,
|
||||
List<SysPost> postCollList) {
|
||||
List<SysPost> postCollList, PjcloudUser user) {
|
||||
UserDTO userDTO = new UserDTO();
|
||||
userDTO.setUsername(excel.getUsername());
|
||||
userDTO.setPhone(excel.getPhone());
|
||||
@@ -574,7 +622,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> 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<SysUserMapper, SysUser> impl
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 注册用户 赋予用户默认角色
|
||||
*
|
||||
@@ -775,4 +823,59 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> 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<SysUser>()
|
||||
.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());
|
||||
}
|
||||
}
|
||||
+138
@@ -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 <T extends UserApplyFlowDto> 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<ProcessVO> 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<String, Object> dtoMap = null;
|
||||
if (ObjectUtil.isNotEmpty(dto)) {
|
||||
dtoMap = BeanUtil.beanToMap(dto);
|
||||
}
|
||||
Map<String, Object> paramMap = readMap(user, dtoMap);
|
||||
processDto.setFlowId(processVo.getFlowId());
|
||||
processDto.setParamMap(paramMap);
|
||||
processDto.setStartUserId(String.valueOf(user.getUserId()));
|
||||
R<String> startVo = flowApiFlowService.startProcessInstance(processDto);
|
||||
return startVo.getData();
|
||||
}
|
||||
|
||||
public Map<String, Object> readMap(SysUser user, Map<String, Object> dtoMap) {
|
||||
Map<String, Object> 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<TaskDto> queryProcessInstanceList(String userId, List<String> processInstanceIds) {
|
||||
List<TaskDto> 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<TaskDto> 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());
|
||||
}
|
||||
}
|
||||
+10
@@ -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 {
|
||||
|
||||
}
|
||||
+12
@@ -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;
|
||||
|
||||
}
|
||||
@@ -23,6 +23,9 @@
|
||||
<!-- 通用查询映射结果 -->
|
||||
<resultMap id="baseResultMap" type="com.bsd.pjcloud.admin.api.vo.UserVO">
|
||||
<id column="user_id" property="userId"/>
|
||||
<result column="process_id" property="processId"/>
|
||||
<result column="process_status" property="processStatus"/>
|
||||
<result column="process_time" property="processTime"/>
|
||||
<result column="username" property="username"/>
|
||||
<result column="password" property="password"/>
|
||||
<result column="salt" property="salt"/>
|
||||
@@ -58,6 +61,9 @@
|
||||
|
||||
<sql id="userRoleSql">
|
||||
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>
|
||||
|
||||
<select id="getUserVoById" resultMap="baseResultMap">
|
||||
@@ -137,6 +143,9 @@
|
||||
<select id="getUserVosPage" resultMap="baseResultMap">
|
||||
SELECT
|
||||
u.user_id,
|
||||
u.process_id,
|
||||
u.process_status,
|
||||
u.process_time,
|
||||
u.username,
|
||||
u.password,
|
||||
u.salt,
|
||||
@@ -170,6 +179,9 @@
|
||||
<if test="query.userId != null">
|
||||
AND u.user_id = #{query.userId}
|
||||
</if>
|
||||
<if test="query.processStatus != null">
|
||||
AND u.process_status = #{query.processStatus}
|
||||
</if>
|
||||
<if test="query.username != null and query.username != ''">
|
||||
<bind name="usernameLike" value="'%'+query.username+'%'"/>
|
||||
AND u.username LIKE #{usernameLike}
|
||||
|
||||
+90
-35
@@ -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<WalletRechargeApplyMapper, WalletRechargeApplyEntity> implements WalletRechargeApplyService {
|
||||
public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeApplyMapper, WalletRechargeApplyEntity>
|
||||
implements WalletRechargeApplyService {
|
||||
|
||||
static private final String TAG = "充值/扣款申请";
|
||||
|
||||
@@ -104,7 +108,9 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean edit(WalletRechargeApplyDto dto) {
|
||||
WalletRechargeApplyEntity detail = baseMapper.selectById(dto.getId());
|
||||
if (ObjectUtil.isEmpty(detail)) throw new RuntimeException("申请不存在");
|
||||
if (ObjectUtil.isEmpty(detail)) {
|
||||
throw new RuntimeException("申请不存在");
|
||||
}
|
||||
WalletRechargeApplyEntity updateObj = BeanUtils.toBean(dto, WalletRechargeApplyEntity.class);
|
||||
baseMapper.updateById(updateObj);
|
||||
getSelf().updateBeforePrice(baseMapper.selectById(dto.getId()));
|
||||
@@ -120,7 +126,8 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
|
||||
if (ObjectUtil.isNotEmpty(userIds)) {
|
||||
R<List<SysUser>> 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<WalletRechargeAp
|
||||
public void apply(Long id) {
|
||||
// 查询详情
|
||||
WalletRechargeApplyEntity detail = baseMapper.selectById(id);
|
||||
if (ObjectUtil.isEmpty(detail)) throw new RuntimeException("充值申请不存在");
|
||||
if (ObjectUtil.isEmpty(detail)) {
|
||||
throw new RuntimeException("充值申请不存在");
|
||||
}
|
||||
if (!ObjectUtil.isAllNotEmpty(detail.getImportTime(), detail.getWalletTypeId())) {
|
||||
throw new RuntimeException("请先编辑导入时间等信息");
|
||||
}
|
||||
// 判断之前有没有在审核的
|
||||
if (isCheckData(detail.getUserId())) throw new RuntimeException("最多提交3个申请,请勿重复提交");
|
||||
if (isCheckData(detail.getUserId())) {
|
||||
throw new RuntimeException("最多提交3个申请,请勿重复提交");
|
||||
}
|
||||
// 查询用户
|
||||
UserInfo user = userService.getByUserId(detail.getUserId()).getData();
|
||||
if (ObjectUtil.isEmpty(user)) throw new RuntimeException("发起人不存在");
|
||||
if (ObjectUtil.isEmpty(user)) {
|
||||
throw new RuntimeException("发起人不存在");
|
||||
}
|
||||
// 查询部门
|
||||
SysDept dept = deptService.getDeptByDeptId(detail.getDeptId()).getData();
|
||||
if (ObjectUtil.isEmpty(dept)) throw new RuntimeException("发起人部门不存在");
|
||||
if (ObjectUtil.isEmpty(dept)) {
|
||||
throw new RuntimeException("发起人部门不存在");
|
||||
}
|
||||
// 查询饭卡类型
|
||||
WalletTypeEntity walletType = walletTypeService.getById(detail.getWalletTypeId());
|
||||
if (ObjectUtil.isEmpty(walletType)) throw new RuntimeException("饭卡类型不存在");
|
||||
if (ObjectUtil.isEmpty(walletType)) {
|
||||
throw new RuntimeException("饭卡类型不存在");
|
||||
}
|
||||
// 发起审批
|
||||
WalletRechargeApplyFlowDto flowDto = new WalletRechargeApplyFlowDto();
|
||||
flowDto.setApplyUsername(user.getSysUser().getUsername());
|
||||
@@ -219,9 +236,14 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public R readExcel(List<WalletRechargeExcelDto> 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<ErrorMessage> errorMessageList = (List<ErrorMessage>) bindingResult.getTarget();
|
||||
List<String> usernameList = list.stream().map(WalletRechargeExcelDto::getUsername).toList();
|
||||
List<String> userPoneList = list.stream().map(WalletRechargeExcelDto::getUserMobile).toList();
|
||||
@@ -281,7 +303,9 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
|
||||
if (i <= 0) {
|
||||
throw new RuntimeException("导入失败");
|
||||
}
|
||||
List<WalletRechargeImportEntity> batchSaveList = list.stream().map(v -> WalletRechargeImportEntity.builder().price(v.getPriceNumber()).userId(v.getUserId()).userDeptId(v.getUserDeptId()).build()).toList();
|
||||
List<WalletRechargeImportEntity> 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<WalletRechargeAp
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void applyCallback(ProcessNodeRecordAssignUserParamDto dto) {
|
||||
if (!flowUtil.checkCallback(dto)) return;
|
||||
if (!flowUtil.checkCallback(dto)) {
|
||||
return;
|
||||
}
|
||||
String processId = dto.getProcessInstanceId();
|
||||
WalletRechargeApplyEntity detail = baseMapper.selectOne(new LambdaQueryWrapper<WalletRechargeApplyEntity>()
|
||||
.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<WalletRechargeImportEntity> importList = rechargeImportService.list(new LambdaQueryWrapper<WalletRechargeImportEntity>()
|
||||
.eq(WalletRechargeImportEntity::getApplyId, detail.getId())
|
||||
);
|
||||
if (ObjectUtil.isEmpty(importList)) return;
|
||||
List<WalletRechargeImportEntity> importList =
|
||||
rechargeImportService.list(new LambdaQueryWrapper<WalletRechargeImportEntity>()
|
||||
.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<WalletRechargeAp
|
||||
for (WalletRechargeImportEntity v : importList) {
|
||||
// 查询每个人的钱包余额
|
||||
WalletManageEntity wallet = walletManageService.getWallet(v.getUserId(), detail.getWalletTypeId());
|
||||
if (ObjectUtil.isEmpty(wallet)) continue;
|
||||
walletTransactionService.addWalletBalance(wallet.getId(), v.getPrice(), String.valueOf(v.getId()), WalletBizEnum.BATCH);
|
||||
if (ObjectUtil.isEmpty(wallet)) {
|
||||
continue;
|
||||
}
|
||||
walletTransactionService.addWalletBalance(wallet.getId(), v.getPrice(), String.valueOf(v.getId()),
|
||||
WalletBizEnum.BATCH);
|
||||
}
|
||||
log.info("|{}|审批回调成功,dto:|{}", TAG, JSON.toJSONString(dto));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
log.error("|{}|审批回调意外的错误,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage());
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateBeforePrice(WalletRechargeApplyEntity detail) {
|
||||
if (ObjectUtil.isNotEmpty(detail.getProcessStatus()) || ObjectUtil.equals(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) {
|
||||
if (ObjectUtil.isNotEmpty(detail.getProcessStatus()) || ObjectUtil.equals(detail.getProcessStatus(),
|
||||
TaskCheckStatusEnum.PADDING.getCode())) {
|
||||
return;
|
||||
}
|
||||
WalletTypeEntity walletType = walletTypeService.getById(detail.getWalletTypeId());
|
||||
@@ -341,17 +380,23 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
|
||||
return;
|
||||
}
|
||||
String importTimeStr = LocalDateTimeUtil.format(detail.getImportTime(), DatePattern.NORM_MONTH_PATTERN);
|
||||
List<WalletRechargeImportEntity> importList = rechargeImportService.list(new LambdaQueryWrapper<WalletRechargeImportEntity>()
|
||||
.eq(WalletRechargeImportEntity::getApplyId, detail.getId())
|
||||
);
|
||||
if (ObjectUtil.isEmpty(importList)) return;
|
||||
List<WalletRechargeImportEntity> importList =
|
||||
rechargeImportService.list(new LambdaQueryWrapper<WalletRechargeImportEntity>()
|
||||
.eq(WalletRechargeImportEntity::getApplyId, detail.getId())
|
||||
);
|
||||
if (ObjectUtil.isEmpty(importList)) {
|
||||
return;
|
||||
}
|
||||
List<WalletRechargeImportEntity> 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<WalletRechargeAp
|
||||
public List<WalletRechargeByApplyExcelVo> exportExcel(WalletRechargeImportDto dto) {
|
||||
List<WalletRechargeByApplyExcelVo> result = new ArrayList<>();
|
||||
List<WalletRechargeImportVo> 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<WalletRechargeAp
|
||||
walletTypeDto.setWalletTypeIds(walletTypeIds);
|
||||
List<WalletTypeEntity> 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<String> processInstanceIds = list.stream().map(WalletRechargeApplyVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList();
|
||||
List<String> processInstanceIds =
|
||||
list.stream().map(WalletRechargeApplyVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct()
|
||||
.toList();
|
||||
if (ObjectUtil.isNotEmpty(processInstanceIds)) {
|
||||
List<TaskDto> taskList = flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), processInstanceIds);
|
||||
List<TaskDto> taskList =
|
||||
flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(),
|
||||
processInstanceIds);
|
||||
if (ObjectUtil.isNotEmpty(taskList)) {
|
||||
Map<String, TaskDto> taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId);
|
||||
Map<String, TaskDto> taskMap =
|
||||
CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId);
|
||||
CollectionUtils.convertList(list, v -> {
|
||||
TaskDto task = taskMap.get(v.getProcessId());
|
||||
if (ObjectUtil.isNotEmpty(task)) {
|
||||
|
||||
-3
@@ -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);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user