feat:人员人脸审批

This commit is contained in:
dzc committed 2025-03-13 18:12:27 +08:00
1 parent 4c8c94a804
commit 4c4c7e9081
23 files changed
+787 -144

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,9 @@
package com.bsd.pjcloud.common.core.constant;
public interface CommonRoleConstant {
String DEFAULT_USER = "GENERAL_USER";
String DEPT_ADMIN = "DEPT_ADMIN";
}
@@ -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,10 @@ public class SysUserFaceDto extends SysUserFaceEntity {
private Long merchantDeptIdOrGlobal;
private Boolean isProcessIdNotNull = false;
/**
* 是否包含部门ids
*/
private Boolean isInclude;
}
@@ -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;
}
@@ -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;
+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 ************************************* */
/**
* 获取指定用户全部信息
*
@@ -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) {
@@ -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));
}
}
@@ -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());
}
@@ -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;
@@ -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());
}
}
@@ -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());
}
}
@@ -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());
}
}
@@ -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 {
}
@@ -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}
@@ -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)) {
@@ -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);
}