【7.6.0】【sys】【org approver】获取审批人绑定列表

pull/55/MERGE
fengshuonan 2023-06-11 15:39:57 +08:00
parent 75b8440bfb
commit 7b475d4fa2
9 changed files with 345 additions and 2 deletions

View File

@ -24,13 +24,23 @@
*/ */
package cn.stylefeng.roses.kernel.sys.api; package cn.stylefeng.roses.kernel.sys.api;
import cn.stylefeng.roses.kernel.sys.api.pojo.SysUserDTO;
/** /**
* Api * Api
* *
* @author fengshuonan * @author fengshuonan
* @date 2023-06-10 20:50:43 * @date 2023-06-10 20:50:43
*/ */
public interface SysApi { public interface SysUserServiceApi {
/**
* ID
*
* @param userId ID
* @author majianguo
* @since 2021/1/9 19:00
*/
SysUserDTO getUserInfoByUserId(Long userId);
} }

View File

@ -0,0 +1,164 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.sys.api.pojo;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
*
*
* @author fengshuonan
* @since 2020/4/2 9:19
*/
@Data
public class SysUserDTO {
/**
*
*/
@ChineseDescription("主键")
private Long userId;
/**
*
*/
@ChineseDescription("账号")
private String account;
/**
*
*/
@ChineseDescription("昵称")
private String nickName;
/**
*
*/
@ChineseDescription("姓名")
private String realName;
/**
*
*/
@ChineseDescription("头像")
private Long avatar;
/**
*
*/
@ChineseDescription("生日")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
/**
* M-F-
*/
@ChineseDescription("性别M-男F-女)")
private String sex;
/**
*
*/
@ChineseDescription("邮箱")
private String email;
/**
*
*/
@ChineseDescription("手机")
private String phone;
/**
*
*/
@ChineseDescription("密码")
private String password;
/**
*
*/
@ChineseDescription("电话")
private String tel;
/**
*
*/
@ChineseDescription("用户所属机构")
private Long orgId;
/**
*
*/
@ChineseDescription("用户所属机构名称")
private String orgName;
/**
*
*/
@ChineseDescription("用户所属机构的职务")
private Long positionId;
/**
*
*/
@ChineseDescription("职务名称")
private String positionName;
/**
*
*/
@ChineseDescription("状态")
private Integer statusFlag;
/**
* id
*/
@ChineseDescription("用户角色id")
private List<Long> grantRoleIdList;
/**
* Y-N-
*/
@ChineseDescription("是否是超级管理员超级管理员可以拥有所有权限Y-是N-否)")
private String superAdminFlag;
/**
* 5
*/
@ChineseDescription("是否密码重试次数过多")
private Boolean loginErrorCountFlag = false;
/**
*
*/
@ChineseDescription("头像地址")
private String avatarUrl;
}

View File

@ -5,7 +5,10 @@ import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData; import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource; import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource; import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
import cn.stylefeng.roses.kernel.sys.modular.org.entity.HrOrgApprover;
import cn.stylefeng.roses.kernel.sys.modular.org.pojo.request.HrOrgApproverRequest;
import cn.stylefeng.roses.kernel.sys.modular.org.service.HrOrgApproverService; import cn.stylefeng.roses.kernel.sys.modular.org.service.HrOrgApproverService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -35,4 +38,15 @@ public class HrOrgApproverController {
return new SuccessResponseData<>(hrOrgApproverService.getApproverTypeList()); return new SuccessResponseData<>(hrOrgApproverService.getApproverTypeList());
} }
/**
*
*
* @author fengshuonan
* @since 2022/09/13 23:15
*/
@GetResource(name = "获取组织机构审批人绑定列表", path = "/hrOrgApprover/getBindingList")
public ResponseData<List<HrOrgApprover>> getOrgApproverList(@Validated(HrOrgApproverRequest.list.class) HrOrgApproverRequest hrOrgApproverRequest) {
return new SuccessResponseData<>(hrOrgApproverService.getOrgApproverList(hrOrgApproverRequest));
}
} }

View File

@ -2,6 +2,7 @@ package cn.stylefeng.roses.kernel.sys.modular.org.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity; import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription; import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.sys.modular.org.pojo.response.ApproverBindUserItem;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
@ -9,6 +10,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.List;
/** /**
* *
* *
@ -55,4 +58,15 @@ public class HrOrgApprover extends BaseEntity {
@ChineseDescription("租户id") @ChineseDescription("租户id")
private Long tenantId; private Long tenantId;
//-------------------------------非实体字段-------------------------------
//-------------------------------非实体字段-------------------------------
//-------------------------------非实体字段-------------------------------
/**
*
*/
@TableField(exist = false)
@ChineseDescription("绑定人员信息")
private List<ApproverBindUserItem> bindUserItemList;
} }

View File

@ -0,0 +1,55 @@
package cn.stylefeng.roses.kernel.sys.modular.org.factory;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.stylefeng.roses.kernel.sys.api.SysUserServiceApi;
import cn.stylefeng.roses.kernel.sys.api.pojo.SysUserDTO;
import cn.stylefeng.roses.kernel.sys.modular.org.entity.HrOrgApprover;
import cn.stylefeng.roses.kernel.sys.modular.org.pojo.response.ApproverBindUserItem;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
*
*
* @author fengshuonan
* @since 2023/6/11 15:35
*/
public class OrgApproverFactory {
/**
* Approver
*
* @author fengshuonan
* @since 2023/6/11 15:35
*/
public static List<ApproverBindUserItem> convertUserItem(List<HrOrgApprover> userList) {
// 获取所有用户id
List<Long> userIdList = userList.stream().map(HrOrgApprover::getUserId).collect(Collectors.toList());
if (ObjectUtil.isEmpty(userIdList)) {
return new ArrayList<>();
}
List<ApproverBindUserItem> users = new ArrayList<>();
for (Long userId : userIdList) {
ApproverBindUserItem bindUserItem = new ApproverBindUserItem();
bindUserItem.setUserId(userId);
// 获取用户详情信息
SysUserServiceApi sysUserServiceApi = SpringUtil.getBean(SysUserServiceApi.class);
SysUserDTO sysUserDTO = sysUserServiceApi.getUserInfoByUserId(userId);
bindUserItem.setName(sysUserDTO.getRealName());
bindUserItem.setAvatarUrl(sysUserDTO.getAvatarUrl());
users.add(bindUserItem);
}
return users;
}
}

View File

@ -20,7 +20,6 @@ public class HrOrgApproverRequest extends BaseRequest {
/** /**
* id * id
*/ */
@NotNull(message = "主键id不能为空", groups = {edit.class, delete.class})
@ChineseDescription("主键id") @ChineseDescription("主键id")
private Long orgApproverId; private Long orgApproverId;
@ -34,6 +33,7 @@ public class HrOrgApproverRequest extends BaseRequest {
* id * id
*/ */
@ChineseDescription("组织机构id") @ChineseDescription("组织机构id")
@NotNull(message = "组织机构id不能为空", groups = {list.class})
private Long orgId; private Long orgId;
/** /**

View File

@ -0,0 +1,34 @@
package cn.stylefeng.roses.kernel.sys.modular.org.pojo.response;
import lombok.Data;
/**
*
*
* @author fengshuonan
* @since 2022/9/13 23:47
*/
@Data
public class ApproverBindUserItem {
/**
* id
*/
private Long userId;
/**
* url
*/
private String avatarUrl;
/**
*
*/
private String name;
/**
*
*/
private String deptName;
}

View File

@ -81,4 +81,12 @@ public interface HrOrgApproverService extends IService<HrOrgApprover> {
*/ */
List<SimpleDict> getApproverTypeList(); List<SimpleDict> getApproverTypeList();
/**
*
*
* @author fengshuonan
* @since 2023/6/11 15:23
*/
List<HrOrgApprover> getOrgApproverList(HrOrgApproverRequest hrOrgApproverRequest);
} }

View File

@ -1,6 +1,7 @@
package cn.stylefeng.roses.kernel.sys.modular.org.service.impl; package cn.stylefeng.roses.kernel.sys.modular.org.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory; import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory; import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
@ -12,8 +13,10 @@ import cn.stylefeng.roses.kernel.sys.api.callback.RemoveOrgCallbackApi;
import cn.stylefeng.roses.kernel.sys.modular.org.constants.ApproverConstants; import cn.stylefeng.roses.kernel.sys.modular.org.constants.ApproverConstants;
import cn.stylefeng.roses.kernel.sys.modular.org.entity.HrOrgApprover; import cn.stylefeng.roses.kernel.sys.modular.org.entity.HrOrgApprover;
import cn.stylefeng.roses.kernel.sys.modular.org.enums.HrOrgApproverExceptionEnum; import cn.stylefeng.roses.kernel.sys.modular.org.enums.HrOrgApproverExceptionEnum;
import cn.stylefeng.roses.kernel.sys.modular.org.factory.OrgApproverFactory;
import cn.stylefeng.roses.kernel.sys.modular.org.mapper.HrOrgApproverMapper; import cn.stylefeng.roses.kernel.sys.modular.org.mapper.HrOrgApproverMapper;
import cn.stylefeng.roses.kernel.sys.modular.org.pojo.request.HrOrgApproverRequest; import cn.stylefeng.roses.kernel.sys.modular.org.pojo.request.HrOrgApproverRequest;
import cn.stylefeng.roses.kernel.sys.modular.org.pojo.response.ApproverBindUserItem;
import cn.stylefeng.roses.kernel.sys.modular.org.service.HrOrgApproverService; import cn.stylefeng.roses.kernel.sys.modular.org.service.HrOrgApproverService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -22,8 +25,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
/** /**
* *
@ -74,6 +80,44 @@ public class HrOrgApproverServiceImpl extends ServiceImpl<HrOrgApproverMapper, H
return dictApi.getDictDetailsByDictTypeCode(ApproverConstants.APPROVER_TYPE_DICT_TYPE_CODE); return dictApi.getDictDetailsByDictTypeCode(ApproverConstants.APPROVER_TYPE_DICT_TYPE_CODE);
} }
@Override
public List<HrOrgApprover> getOrgApproverList(HrOrgApproverRequest hrOrgApproverRequest) {
// 获取当前系统的审批人类型列表
List<SimpleDict> approverTypeList = this.getApproverTypeList();
// 获取指定机构的绑定情况
LambdaQueryWrapper<HrOrgApprover> hrOrgApproverLambdaQueryWrapper = new LambdaQueryWrapper<>();
hrOrgApproverLambdaQueryWrapper.eq(HrOrgApprover::getOrgId, hrOrgApproverRequest.getOrgId());
List<HrOrgApprover> orgTotalBindingList = this.list(hrOrgApproverLambdaQueryWrapper);
if (ObjectUtil.isEmpty(orgTotalBindingList)) {
return new ArrayList<>();
}
// 将每个类型的用户分组key是审批组类型value是该组下的用户
Map<Integer, List<HrOrgApprover>> groupingByUsers = orgTotalBindingList.stream().collect(Collectors.groupingBy(HrOrgApprover::getOrgApproverType));
// 先初始化空的绑定情况列表
ArrayList<HrOrgApprover> resultList = new ArrayList<>();
for (SimpleDict orgApproverType : approverTypeList) {
HrOrgApprover hrOrgApprover = new HrOrgApprover();
// 设置类型
hrOrgApprover.setOrgApproverType(Convert.toInt(orgApproverType.getCode()));
// 设置该类型下的审批人列表
List<HrOrgApprover> userList = groupingByUsers.get(hrOrgApprover.getOrgApproverType());
if (ObjectUtil.isNotEmpty(userList)) {
List<ApproverBindUserItem> bindUserItems = OrgApproverFactory.convertUserItem(userList);
hrOrgApprover.setBindUserItemList(bindUserItems);
}
resultList.add(hrOrgApprover);
}
return resultList;
}
@Override @Override
public List<HrOrgApprover> findList(HrOrgApproverRequest hrOrgApproverRequest) { public List<HrOrgApprover> findList(HrOrgApproverRequest hrOrgApproverRequest) {
LambdaQueryWrapper<HrOrgApprover> wrapper = this.createWrapper(hrOrgApproverRequest); LambdaQueryWrapper<HrOrgApprover> wrapper = this.createWrapper(hrOrgApproverRequest);