Merge remote-tracking branch 'origin/master'

This commit is contained in:
zjf committed 2025-03-14 17:46:47 +08:00
commit 463e4228d0
26 files changed
+818 -217

No files matched your search

+33 -23
View File
@@ -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
-- ----------------------------
@@ -0,0 +1,11 @@
package com.bsd.pjcloud.common.core.constant;
public interface CommonRoleConstant {
String DEFAULT_USER = "GENERAL_USER";
String DEPT_ADMIN = "DEPT_ADMIN";
String AUTO_CREATE_WALLET = "WALLET_AUTO_CREATE";
}
@@ -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;
@@ -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,12 @@ public class SysUserFaceDto extends SysUserFaceEntity {
private Long merchantDeptIdOrGlobal;
private Boolean isProcessIdNotNull = false;
/**
* 是否包含部门ids
*/
private Boolean isInclude;
private Boolean isFindCheckUser = false;
}
@@ -82,4 +82,9 @@ public class UserDTO extends SysUser implements BaseIsIncludeTreeInterface {
*/
private Boolean isInclude;
/**
* 是否是审批用户
*/
private Boolean isFindCheckUser = false;
}
@@ -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;
@@ -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;
}
@@ -3,6 +3,7 @@ package com.bsd.pjcloud.admin.api.vo;
import com.bsd.pjcloud.admin.api.entity.SysUserFaceEntity;
import com.bsd.pjcloud.admin.api.vo.base.BaseDeptInterface;
import com.bsd.pjcloud.admin.api.vo.base.BaseUserInterface;
import lombok.Data;
@Data
@@ -28,4 +29,6 @@ public class SysUserFaceVo extends SysUserFaceEntity implements BaseUserInterfac
private Long deptId;
private String deptName;
private Boolean isCheckUser = false;
}
@@ -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;
@@ -214,4 +232,9 @@ public class UserVO implements BaseFacesInterface, Serializable {
@Schema(description = "是否为全局人脸")
private String isGlobalFace;
/**
* 是否是审核用户
*/
private Boolean isCheckUser = false;
}
+4
View File
@@ -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>
@@ -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 ************************************* */
/**
* 获取指定用户全部信息
*
@@ -192,6 +206,7 @@ public class SysUserController {
*/
@GetMapping("/page")
public R getUserPage(@ParameterObject Page page, @ParameterObject UserDTO userDTO) {
userDTO.setIsFindCheckUser(true);
return R.ok(userService.getUsersWithRolePage(page, userDTO));
}
@@ -368,8 +383,7 @@ public class SysUserController {
*/
@GetMapping("/getUserByMobileOrEmployeeCode")
@Inner
public R<List<SysUser>> getUserByMobileOrEmployeeCode(@RequestParam("employeeCode") String employeeCode,
@RequestParam("mobile") String mobile) {
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)));
}
@@ -382,8 +396,7 @@ 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 +404,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) {
@@ -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.setIsFindCheckUser(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));
}
}
@@ -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,23 @@ 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()));
}
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());
}
@@ -90,4 +90,9 @@ public interface SysRoleService extends IService<SysRole> {
*/
List<RoleExcelVO> listRole(SysRole sysRole, Long[] ids);
/**
* 是否为部门管理员
*/
boolean isDeptAdmin(Long userId);
}
@@ -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);
}
@@ -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);
}
@@ -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
*/
@@ -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;
@@ -9,21 +11,41 @@ import com.bsd.pjcloud.admin.api.entity.SysDept;
import com.bsd.pjcloud.admin.api.entity.SysUser;
import com.bsd.pjcloud.admin.api.entity.SysUserFaceEntity;
import com.bsd.pjcloud.admin.api.vo.SysUserFaceVo;
import com.bsd.pjcloud.admin.api.vo.UserVO;
import com.bsd.pjcloud.admin.mapper.SysUserFaceMapper;
import com.bsd.pjcloud.admin.service.SysDeptService;
import com.bsd.pjcloud.admin.service.SysRoleService;
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.core.util.CollectionUtils;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowEngineService;
import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum;
import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto;
import com.bsd.pjcloud.flow.task.dto.TaskDto;
import com.bsd.pjcloud.flow.task.dto.TaskParamDto;
import com.bsd.pjcloud.mqtt.api.feign.RemoteMqttEventService;
import com.bsd.pjcloud.wallet.api.entity.WalletFreezeEntity;
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;
import java.util.Map;
/**
* 人脸样本表
@@ -37,16 +59,31 @@ import java.util.List;
@Service
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 +92,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 +116,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,14 +130,18 @@ 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)
);
List<SysUserFaceEntity> faceList = baseMapper.selectList(new LambdaQueryWrapper<SysUserFaceEntity>().in(SysUserFaceEntity::getId, list));
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);
}
@@ -111,7 +159,25 @@ public class SysUserFaceServiceImpl extends ServiceImpl<SysUserFaceMapper, SysUs
dto.setDeptIds(deptIds);
}
}
return baseMapper.pageJoin(page, dto);
Page<SysUserFaceVo> list = baseMapper.pageJoin(page, dto);
// 审批流程
if (dto.getIsFindCheckUser()) {
List<String> processInstanceIds = list.getRecords().stream().map(SysUserFaceVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList();
if (ObjectUtil.isNotEmpty(processInstanceIds)) {
List<TaskDto> taskList = flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), processInstanceIds);
if (ObjectUtil.isNotEmpty(taskList)) {
Map<String, TaskDto> taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId);
CollectionUtils.convertList(list.getRecords(), v -> {
TaskDto task = taskMap.get(v.getProcessId());
if (ObjectUtil.isNotEmpty(task)) {
v.setIsCheckUser(true);
}
return v;
});
}
}
}
return list;
}
@Override
@@ -119,21 +185,82 @@ 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)
);
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());
}
}
@@ -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,13 @@ 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.UserApplyFlowDto;
import com.bsd.pjcloud.admin.utils.flow.dto.UserFaceApplyFlowDto;
import com.bsd.pjcloud.common.audit.annotation.Audit;
import com.bsd.pjcloud.common.core.constant.CacheConstants;
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 +62,16 @@ 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.flow.task.dto.TaskDto;
import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService;
import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo;
import cn.hutool.extra.spring.SpringUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.PictureData;
import org.springframework.beans.BeanUtils;
import org.springframework.cache.Cache;
@@ -114,6 +127,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
private final SysFileService sysFileService;
private final FlowUtil flowUtil;
/**
* 保存用户信息
*
@@ -125,8 +140,23 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
public Long saveUser(UserDTO userDto) {
SysUser sysUser = new SysUser();
BeanUtils.copyProperties(userDto, sysUser);
sysUser.setLockFlag(
StrUtil.isBlank(userDto.getLockFlag()) ? UserStateEnum.NORMAL.getCode() : userDto.getLockFlag());
// 判断是否为部门管理员
PjcloudUser applyUser = SecurityUtils.getUser();
boolean isDeptAdmin = sysRoleService.isDeptAdmin(applyUser.getId());
if (isDeptAdmin) {
List<SysRole> defaultRoles = sysRoleService.findRolesByCodes(List.of(CommonRoleConstant.DEFAULT_USER, CommonRoleConstant.AUTO_CREATE_WALLET));
if (ObjectUtil.isEmpty(defaultRoles)) {
userDto.setRole(null);
} else {
userDto.setRole(defaultRoles.stream().map(SysRole::getRoleId).toList());
}
userDto.setDeptIds(null);
sysUser.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode());
} else {
sysUser.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode());
sysUser.setProcessTime(LocalDateTime.now());
}
sysUser.setLockFlag(StrUtil.isBlank(userDto.getLockFlag()) ? UserStateEnum.NORMAL.getCode() : userDto.getLockFlag());
sysUser.setCreateBy(userDto.getUsername());
sysUser.setUpdateBy(userDto.getUsername());
sysUser.setPassword(ENCODER.encode(userDto.getPassword()));
@@ -147,8 +177,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 获取默认角色编码
String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE");
// 默认角色
SysRole sysRole = sysRoleService
.getOne(Wrappers.<SysRole>lambdaQuery().eq(SysRole::getRoleCode, defaultRole));
SysRole sysRole = sysRoleService.getOne(Wrappers.<SysRole>lambdaQuery().eq(SysRole::getRoleCode, defaultRole));
userDto.setRole(Collections.singletonList(sysRole.getRoleId()));
}
@@ -160,11 +189,16 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
return userRole;
}).forEach(sysUserRoleMapper::insert);
// 创建用户默认钱包
CompletableFuture.runAsync(() -> {
remoteWalletService.createWallet(sysUser.getUserId());
});
remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE);
if (isDeptAdmin) {
getSelf().applyFlow(sysUser);
} else {
// 创建用户默认钱包
CompletableFuture.runAsync(() -> {
remoteWalletService.createWallet(sysUser.getUserId());
});
remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE);
}
return sysUser.getUserId();
}
@@ -180,27 +214,17 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
UserInfo userInfo = new UserInfo();
userInfo.setSysUser(sysUser);
// 设置角色列表 (ID)
List<Long> roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId())
.stream()
.map(SysRole::getRoleId)
.collect(Collectors.toList());
List<Long> roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()).stream().map(SysRole::getRoleId).collect(Collectors.toList());
userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class));
// 设置角色列表 (CODE)
List<String> roleCodes = sysRoleService.findRolesByUserId(sysUser.getUserId())
.stream()
.map(SysRole::getRoleCode)
.collect(Collectors.toList());
List<String> roleCodes = sysRoleService.findRolesByUserId(sysUser.getUserId()).stream().map(SysRole::getRoleCode).collect(Collectors.toList());
userInfo.setRoleCodes(ArrayUtil.toArray(roleCodes, String.class));
// 设置权限列表(menu.permission)
Set<String> permissions = new HashSet<>();
roleIds.forEach(roleId -> {
List<String> permissionList = sysMenuService.findMenuByRoleId(roleId)
.stream()
.filter(menu -> StrUtil.isNotEmpty(menu.getPermission()))
.map(SysMenu::getPermission)
.collect(Collectors.toList());
List<String> permissionList = sysMenuService.findMenuByRoleId(roleId).stream().filter(menu -> StrUtil.isNotEmpty(menu.getPermission())).map(SysMenu::getPermission).collect(Collectors.toList());
permissions.addAll(permissionList);
});
userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class));
@@ -224,6 +248,23 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
List<SysUserFaceVo> faceList = sysUserFaceMapper.groupConcatFaces(faceDto);
DataUtil.convertFacesList(list.getRecords(), CollectionUtils.convertMap(faceList, SysUserFaceVo::getUserId));
}
// 审批流程
if (userDTO.getIsFindCheckUser()) {
List<String> processInstanceIds = list.getRecords().stream().map(UserVO::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList();
if (ObjectUtil.isNotEmpty(processInstanceIds)) {
List<TaskDto> taskList = flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), processInstanceIds);
if (ObjectUtil.isNotEmpty(taskList)) {
Map<String, TaskDto> taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId);
CollectionUtils.convertList(list.getRecords(), v -> {
TaskDto task = taskMap.get(v.getProcessId());
if (ObjectUtil.isNotEmpty(task)) {
v.setIsCheckUser(true);
}
return v;
});
}
}
}
}
return list;
}
@@ -301,8 +342,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 更新用户角色表
if (userDto.getRole() != null) {
sysUserRoleMapper
.delete(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId()));
sysUserRoleMapper.delete(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId()));
userDto.getRole().stream().map(roleId -> {
SysUserRole userRole = new SysUserRole();
userRole.setUserId(sysUser.getUserId());
@@ -313,8 +353,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 更新用户岗位表
if (userDto.getPost() != null) {
sysUserPostMapper
.delete(Wrappers.<SysUserPost>lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId()));
sysUserPostMapper.delete(Wrappers.<SysUserPost>lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId()));
userDto.getPost().stream().map(postId -> {
SysUserPost userPost = new SysUserPost();
userPost.setUserId(sysUser.getUserId());
@@ -366,15 +405,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
List<UserExcelVO> userExcelVOList = voList.stream().map(userVO -> {
UserExcelVO excelVO = new UserExcelVO();
BeanUtils.copyProperties(userVO, excelVO);
String roleNameList = userVO.getRoleList()
.stream()
.map(SysRole::getRoleName)
.collect(Collectors.joining(StrUtil.COMMA));
String roleNameList = userVO.getRoleList().stream().map(SysRole::getRoleName).collect(Collectors.joining(StrUtil.COMMA));
excelVO.setRoleNameList(roleNameList);
String postNameList = userVO.getPostList()
.stream()
.map(SysPost::getPostName)
.collect(Collectors.joining(StrUtil.COMMA));
String postNameList = userVO.getPostList().stream().map(SysPost::getPostName).collect(Collectors.joining(StrUtil.COMMA));
excelVO.setPostNameList(postNameList);
return excelVO;
}).collect(Collectors.toList());
@@ -390,6 +423,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();
@@ -403,26 +438,21 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
Set<String> errorMsg = new HashSet<>();
// 校验用户名是否存在
boolean exsitUserName = userList.stream()
.anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername()));
boolean exsitUserName = userList.stream().anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername()));
if (exsitUserName) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername()));
}
// 判断输入的部门名称列表是否合法
Optional<SysDept> deptOptional = deptList.stream()
.filter(dept -> excel.getDeptName().equals(dept.getName()))
.findFirst();
Optional<SysDept> deptOptional = deptList.stream().filter(dept -> excel.getDeptName().equals(dept.getName())).findFirst();
if (!deptOptional.isPresent()) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName()));
}
// 判断输入的角色名称列表是否合法
List<String> roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA);
List<SysRole> roleCollList = roleList.stream()
.filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name)))
.collect(Collectors.toList());
List<SysRole> roleCollList = roleList.stream().filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))).collect(Collectors.toList());
if (roleCollList.size() != roleNameList.size()) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList()));
@@ -430,9 +460,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 判断输入的部门名称列表是否合法
List<String> postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA);
List<SysPost> postCollList = postList.stream()
.filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name)))
.collect(Collectors.toList());
List<SysPost> postCollList = postList.stream().filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))).collect(Collectors.toList());
if (postCollList.size() != postNameList.size()) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList()));
@@ -440,7 +468,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,7 +485,9 @@ 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();
@@ -528,8 +558,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) {
private void insertExcelUser(UserExcelVO excel, Optional<SysDept> deptOptional, List<SysRole> roleCollList, List<SysPost> postCollList, PjcloudUser user) {
UserDTO userDTO = new UserDTO();
userDTO.setUsername(excel.getUsername());
userDTO.setPhone(excel.getPhone());
@@ -587,7 +616,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
}
}
/**
* 注册用户 赋予用户默认角色
*
@@ -598,16 +626,14 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
@Transactional(rollbackFor = Exception.class)
public R<Boolean> registerUser(UserDTO userDto) {
// 判断用户名是否存在
boolean usernameExists = this.exists(Wrappers.<SysUser>lambdaQuery()
.eq(SysUser::getUsername, userDto.getUsername()));
boolean usernameExists = this.exists(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUsername, userDto.getUsername()));
if (usernameExists) {
String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername());
return R.failed(message);
}
// 判断手机号是否存在
boolean phoneExists = this.exists(Wrappers.<SysUser>lambdaQuery()
.eq(SysUser::getPhone, userDto.getPhone()));
boolean phoneExists = this.exists(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getPhone, userDto.getPhone()));
if (phoneExists) {
String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_PHONE_EXISTING, userDto.getPhone());
return R.failed(message);
@@ -652,10 +678,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
}
String password = ENCODER.encode(userDto.getNewpassword1());
this.update(Wrappers.<SysUser>lambdaUpdate()
.set(SysUser::getPassword, password)
.set(SysUser::getPasswordModifyTime, LocalDateTime.now())
.eq(SysUser::getUserId, user.getUserId()));
this.update(Wrappers.<SysUser>lambdaUpdate().set(SysUser::getPassword, password).set(SysUser::getPasswordModifyTime, LocalDateTime.now()).eq(SysUser::getUserId, user.getUserId()));
return R.ok();
}
@@ -664,29 +687,17 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
PjcloudUser user = SecurityUtils.getUser();
LambdaUpdateWrapper<SysUser> wrapper = null;
if (type.equals("wechat")) {
wrapper = Wrappers.<SysUser>lambdaUpdate()
.set(SysUser::getWxOpenid, null)
.eq(SysUser::getUserId, user.getId());
wrapper = Wrappers.<SysUser>lambdaUpdate().set(SysUser::getWxOpenid, null).eq(SysUser::getUserId, user.getId());
} else if (type.equals("gitee")) {
wrapper = Wrappers.<SysUser>lambdaUpdate()
.set(SysUser::getGiteeLogin, null)
.eq(SysUser::getUserId, user.getId());
wrapper = Wrappers.<SysUser>lambdaUpdate().set(SysUser::getGiteeLogin, null).eq(SysUser::getUserId, user.getId());
} else if (type.equals("osc")) {
wrapper = Wrappers.<SysUser>lambdaUpdate()
.set(SysUser::getOscId, null)
.eq(SysUser::getUserId, user.getId());
wrapper = Wrappers.<SysUser>lambdaUpdate().set(SysUser::getOscId, null).eq(SysUser::getUserId, user.getId());
} else if (type.equals("tencent")) {
wrapper = Wrappers.<SysUser>lambdaUpdate()
.set(SysUser::getQqOpenid, null)
.eq(SysUser::getUserId, user.getId());
wrapper = Wrappers.<SysUser>lambdaUpdate().set(SysUser::getQqOpenid, null).eq(SysUser::getUserId, user.getId());
} else if (type.equals("cp")) {
wrapper = Wrappers.<SysUser>lambdaUpdate()
.set(SysUser::getWxCpUserid, null)
.eq(SysUser::getUserId, user.getId());
wrapper = Wrappers.<SysUser>lambdaUpdate().set(SysUser::getWxCpUserid, null).eq(SysUser::getUserId, user.getId());
} else if (type.equals("dingding")) {
wrapper = Wrappers.<SysUser>lambdaUpdate()
.set(SysUser::getWxDingUserid, null)
.eq(SysUser::getUserId, user.getId());
wrapper = Wrappers.<SysUser>lambdaUpdate().set(SysUser::getWxDingUserid, null).eq(SysUser::getUserId, user.getId());
}
if (wrapper == null) {
return R.failed("解绑账号类型不存在");
@@ -731,20 +742,13 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 重置密码
String password = ENCODER.encode(userDto.getNewpassword1());
this.update(Wrappers.<SysUser>lambdaUpdate()
.set(SysUser::getPassword, password)
.set(SysUser::getPasswordModifyTime, LocalDateTime.now())
.set(SysUser::getPasswordExpireFlag, CommonConstants.STATUS_NORMAL)
.eq(SysUser::getUsername, userDto.getUsername()));
this.update(Wrappers.<SysUser>lambdaUpdate().set(SysUser::getPassword, password).set(SysUser::getPasswordModifyTime, LocalDateTime.now()).set(SysUser::getPasswordExpireFlag, CommonConstants.STATUS_NORMAL).eq(SysUser::getUsername, userDto.getUsername()));
return R.ok();
}
@Override
public List<Long> listUserIdByRoleIds(List<Long> roleIdList) {
return sysUserRoleMapper.selectList(Wrappers.<SysUserRole>lambdaQuery().in(SysUserRole::getRoleId, roleIdList))
.stream()
.map(SysUserRole::getUserId)
.collect(Collectors.toList());
return sysUserRoleMapper.selectList(Wrappers.<SysUserRole>lambdaQuery().in(SysUserRole::getRoleId, roleIdList)).stream().map(SysUserRole::getUserId).collect(Collectors.toList());
}
/**
@@ -775,4 +779,70 @@ 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.setProcessTime(LocalDateTime.now());
baseMapper.updateById(updateUser);
// 创建用户默认钱包
remoteWalletService.createWallet(detail.getUserId());
} catch (Exception e) {
e.printStackTrace();
log.error("|{}|审批回调意外的错误,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage());
throw new RuntimeException(e);
}
}
/**
* 开启审批
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void applyFlow(SysUser user) {
// 查询发起用户
SysUser applyUser = baseMapper.selectById(SecurityUtils.getUser().getId());
if (ObjectUtil.isEmpty(applyUser)) {
return;
}
SysDept applyDept = sysDeptService.getById(applyUser.getDeptId());
if (ObjectUtil.isEmpty(applyDept)) {
return;
}
UserApplyFlowDto flowDto = new UserApplyFlowDto();
flowDto.setApplyDeptName(applyDept.getName());
String processId = flowUtil.startFlow("ADD_USER_FLOW", applyUser, user.getUserId(), flowDto);
SysUser updateObj = new SysUser();
updateObj.setUserId(user.getUserId());
updateObj.setProcessId(processId);
updateObj.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode());
baseMapper.updateById(updateObj);
}
private SysUserServiceImpl getSelf() {
return SpringUtil.getBean(getClass());
}
}
@@ -0,0 +1,137 @@
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.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.dto.base.FlowBaseDto;
import com.bsd.pjcloud.flow.task.entity.Process;
import com.bsd.pjcloud.flow.task.vo.ProcessVO;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.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 FlowBaseDto> 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());
}
}
@@ -0,0 +1,11 @@
package com.bsd.pjcloud.admin.utils.flow.dto;
import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto;
import lombok.Data;
@Data
public class UserApplyFlowDto extends FlowBaseDto {
}
@@ -0,0 +1,14 @@
package com.bsd.pjcloud.admin.utils.flow.dto;
import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto;
import lombok.Data;
@Data
public class UserFaceApplyFlowDto extends FlowBaseDto {
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 query.processStatus != '' ">
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}
@@ -54,11 +54,10 @@ public interface WalletRechargeApplyMapper extends PjcloudBaseMapper<WalletRecha
default Page<WalletRechargeApplyVo> scopePageList(Page page, WalletRechargeApplyDto dto) {
LambdaQueryWrapper<WalletRechargeApplyEntity> wrapper = new LambdaQueryWrapper<WalletRechargeApplyEntity>()
.eq(ObjectUtil.isNotEmpty(dto.getWalletTypeId()), WalletRechargeApplyEntity::getWalletTypeId,
dto.getWalletTypeId())
.eq(ObjectUtil.isNotEmpty(dto.getWalletTypeId()), WalletRechargeApplyEntity::getWalletTypeId, dto.getWalletTypeId())
.eq(ObjectUtil.isNotEmpty(dto.getProcessStatus()), WalletRechargeApplyEntity::getProcessStatus, dto.getProcessStatus())
.in(ObjectUtil.isNotEmpty(dto.getUserIds()), WalletRechargeApplyEntity::getUserId, dto.getUserIds())
.in(ObjectUtil.isNotEmpty(dto.getWalletTypeIds()), WalletRechargeApplyEntity::getWalletTypeId,
dto.getWalletTypeIds())
.in(ObjectUtil.isNotEmpty(dto.getWalletTypeIds()), WalletRechargeApplyEntity::getWalletTypeId, dto.getWalletTypeIds())
.orderByDesc(WalletRechargeApplyEntity::getCreateTime)
.orderByDesc(WalletRechargeApplyEntity::getId);
Page list = selectPageByScope(page, wrapper, DataScope.of());
@@ -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;
@@ -104,7 +107,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()));
@@ -171,21 +176,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 +234,13 @@ 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();
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<ErrorMessage> errorMessageList = (List<ErrorMessage>) bindingResult.getTarget();
List<String> usernameList = list.stream().map(WalletRechargeExcelDto::getUsername).toList();
List<String> userPoneList = list.stream().map(WalletRechargeExcelDto::getUserMobile).toList();
@@ -292,12 +311,14 @@ 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;
WalletRechargeApplyEntity detail = baseMapper.selectOne(new LambdaQueryWrapper<WalletRechargeApplyEntity>().eq(WalletRechargeApplyEntity::getProcessId, processId));
if (ObjectUtil.isEmpty(detail)) {
return;
}
if (!ObjectUtil.equals(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) {
log.error("|{}|重复的回调,dto:|{}|", TAG, JSON.toJSONString(dto));
return;
@@ -307,10 +328,10 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
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,7 +339,9 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
for (WalletRechargeImportEntity v : importList) {
// 查询每个人的钱包余额
WalletManageEntity wallet = walletManageService.getWallet(v.getUserId(), detail.getWalletTypeId());
if (ObjectUtil.isEmpty(wallet)) continue;
if (ObjectUtil.isEmpty(wallet)) {
continue;
}
walletTransactionService.addWalletBalance(wallet.getId(), v.getPrice(), String.valueOf(v.getId()), WalletBizEnum.BATCH);
}
log.info("|{}|审批回调成功,dto:|{}", TAG, JSON.toJSONString(dto));
@@ -326,6 +349,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
} catch (Exception e) {
e.printStackTrace();
log.error("|{}|审批回调意外的错误,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage());
throw new RuntimeException(e);
}
}
@@ -341,16 +365,18 @@ 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;
if (ObjectUtil.isEmpty(wallet)) {
continue;
}
Integer price = walletTransactionMapper.getTransactionPriceCount(importTimeStr, wallet.getId(), WalletBizEnum.BATCH.getCode());
if (ObjectUtil.isNotEmpty(price)) {
item.setBeforePrice(price);
@@ -364,7 +390,9 @@ 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());
@@ -428,10 +456,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
}
private boolean isCheckData(Long walletId) {
Long count = baseMapper.selectCount(new LambdaQueryWrapper<WalletRechargeApplyEntity>()
.eq(WalletRechargeApplyEntity::getUserId, walletId)
.eq(WalletRechargeApplyEntity::getProcessStatus, NodeStatusEnum.JXZ.getCode())
);
Long count = baseMapper.selectCount(new LambdaQueryWrapper<WalletRechargeApplyEntity>().eq(WalletRechargeApplyEntity::getUserId, walletId).eq(WalletRechargeApplyEntity::getProcessStatus, NodeStatusEnum.JXZ.getCode()));
return count >= 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);
}