运维人员申请

dev
wangxy 2 months ago
parent 3f6be007eb
commit 339d568033

@ -0,0 +1,126 @@
package com.ruoyi.system.controller;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.TdApplyInfoList;
import com.ruoyi.system.manager.ApplyInfoListManager;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* ClassName: ApplyInfoListController
* Package: com.ruoyi.system.controller
* Description:
*
* @Author wangxy
* @Create 2025/8/13 9:31
* @Version 1.0
*/
@RestController
@RequestMapping("/system/applyList")
public class ApplyInfoListController extends BaseController {
@Resource
private ApplyInfoListManager applyInfoListManager;
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:apply:list')")
@GetMapping("/list")
public TableDataInfo list(TdApplyInfoList applyInfoList) {
startPage();
List<TdApplyInfoList> list = applyInfoListManager.selectTdApplyInfoListList(applyInfoList);
return getDataTable(list);
}
/**
* OA
*/
@GetMapping(value = "/getInfo/{applyId}")
public AjaxResult getInfo(@PathVariable("applyId") String applyId)
{
return success(applyInfoListManager.selectTdApplyInfoListById(applyId));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:apply:add')")
@Log(title = "人员申请新增", businessType = BusinessType.INSERT)
@PostMapping("/add")
@Transactional(rollbackFor = Exception.class)
public AjaxResult add(@RequestBody TdApplyInfoList applyInfoList) {
return toAjax(applyInfoListManager.insertTdApplyInfoList(applyInfoList));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:apply:edit')")
@Log(title = "人员申请修改", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
@Transactional(rollbackFor = Exception.class)
public AjaxResult edit(@RequestBody TdApplyInfoList applyInfoList) {
return toAjax(applyInfoListManager.updateTdApplyInfoList(applyInfoList));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:apply:remove')")
@Log(title = "删除人员申请", businessType = BusinessType.DELETE)
@PostMapping("/remove/{applyIds}")
@Transactional(rollbackFor = Exception.class)
public AjaxResult remove(@PathVariable String[] applyIds) {
return toAjax(applyInfoListManager.deleteApplyInfoListByIds(applyIds));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:apply:submit')")
@Log(title = "人员申请提交", businessType = BusinessType.OTHER)
@GetMapping(value = "/submit")
@Transactional(rollbackFor = Exception.class)
public AjaxResult submit(String id) {
return toAjax(applyInfoListManager.submit(id));
}
/**
* (退
*/
@Log(title = "流程实例", businessType = BusinessType.OTHER)
@PostMapping("/handle")
@Transactional(rollbackFor = Exception.class)
public AjaxResult handle(@RequestBody TdApplyInfoList applyInfoList, Long taskId, String skipType, String message) {
return toAjax(applyInfoListManager.handle(applyInfoList, taskId, skipType, message));
}
/**
*
*
* @param applyInfoList
* @return
*/
@PostMapping("/termination")
@Transactional(rollbackFor = Exception.class)
public AjaxResult termination(@RequestBody TdApplyInfoList applyInfoList) {
return toAjax(applyInfoListManager.termination(applyInfoList));
}
}

@ -0,0 +1,170 @@
package com.ruoyi.system.domain;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import java.util.Date;
/**
* @author 13560
* sm
* @TableName td_apply_info_list
*/
@Data
public class TdApplyInfoList extends BaseEntity {
/**
*
*/
private String applyId;
/**
*
*/
private String name;
/**
*
*/
private String sex;
/**
*
*/
private String nationa;
/**
* 0123退45
*/
private String applyStatus;
/**
*
*/
private Date appTime;
/**
* 退
*/
private String applyMsg;
/**
*
*/
private Date authTime;
/**
* id
*/
private Long createId;
/**
* id
*/
private Long deptId;
/**
* id
*/
private String deptName;
/**
*
*/
private String formerName;
/**
*
*/
private String nationality;
/**
*
*/
private String maritalStatus;
/**
*
*/
private String political;
/**
*
*/
private String phone;
/**
*
*/
private String cerno;
/**
*
*/
private String address;
/**
*
*/
private String registeredAuthority;
/**
*
*/
private String permanentAddress;
/**
*
*/
private String residentBureau;
/**
*
*/
private String positionCapacity;
/**
*
*/
private String smPost;
/**
*
*/
private String smGrade;
/**
*
*/
private String photoUrl;
/**
* 退
*/
private String leaveMsg;
/**
*
*/
private Date leaveTime;
/** 流程实例的id */
private Long instanceId;
/** 节点编码 */
private String nodeCode;
/** 流程节点名称 */
private String nodeName;
/**
* 0 1 2 3 4
*/
private Integer nodeType;
/** 流程状态0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效 */
private String flowStatus;
}

@ -0,0 +1,44 @@
package com.ruoyi.system.enums;
import lombok.Getter;
/**
*
*
* @author wangxy
* @date 2024/4/11 9:15
*/
@Getter
public enum ApplyListStatusEnum {
/**新建*/
NEWSAVE("0","保存"),
/**已提交*/
SUBMIT("1","已提交"),
/**审核通过*/
AUDITED("2","审核通过"),
/**审核不通过*/
GOBACK("3","退回"),
/**培训教育提交*/
TRAIN("4","培训教育提交"),
/**承诺书已上传*/
PROMISE("5","承诺书已上传"),
/**离职离岗材料提交*/
LEAVESUBMIT("6","离职离岗材料提交"),
/**离职离岗审核通过*/
LEAVEADUIT("7","离职离岗审核通过"),
/**离职离岗审核退回*/
LEAVEBACK("8","离职离岗审核退回");
private final String status;
private final String description;
ApplyListStatusEnum(String status, String description){
this.status = status;
this.description = description;
}
}

@ -0,0 +1,255 @@
package com.ruoyi.system.manager;
import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.domain.TdApplyInfoList;
import com.ruoyi.system.enums.ApplyListStatusEnum;
import com.ruoyi.system.service.ISysDictTypeService;
import com.ruoyi.system.service.TdApplyInfoListService;
import lombok.val;
import org.dromara.warm.flow.core.FlowFactory;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.core.entity.Task;
import org.dromara.warm.flow.core.enums.SkipType;
import org.dromara.warm.flow.core.service.InsService;
import org.dromara.warm.flow.core.service.TaskService;
import org.dromara.warm.flow.core.utils.IdUtils;
import org.dromara.warm.flow.core.utils.StreamUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* ClassName: ApplyInfoListManager
* Package: com.ruoyi.web.controller.manager
* Description:
*
* @Author wangxy
* @Create 2025/5/14 11:30
* @Version 1.0
*/
@Component
public class ApplyInfoListManager {
@Resource
private TdApplyInfoListService applyInfoListService;
@Resource
private InsService insService;
@Resource
private TaskService taskService;
@Resource
private ISysDictTypeService sysDictTypeService;
/**
*
*
* @param applyInfoList
* @return
*/
public List<TdApplyInfoList> selectTdApplyInfoListList(TdApplyInfoList applyInfoList) {
return applyInfoListService.selectApplyInfoListList(applyInfoList);
}
public TdApplyInfoList selectTdApplyInfoListById(String applyId) {
return applyInfoListService.lambdaQuery().eq(TdApplyInfoList::getApplyId, applyId).one();
}
public boolean insertTdApplyInfoList(TdApplyInfoList applyInfoList) {
// 设置流转参数
String id = IdUtils.nextIdStr();
applyInfoList.setApplyId(id);
LoginUser user = SecurityUtils.getLoginUser();
// 从字典表中获取流程编码
String flowCode = getFlowType(1L);
// 传递流程编码,绑定流程定义 【必传】
FlowParams flowParams = FlowParams.build().flowCode(flowCode);
// 设置办理人唯一标识,保存为流程实例的创建人 【必传】
flowParams.handler(user.getUser().getUserId().toString());
// 流程变量
Map<String, Object> variable = new HashMap<>();
// 流程变量传递业务数据,按实际业务需求传递 【按需传】
variable.put("businessData", applyInfoList);
variable.put("businessType", "applyInfoList");
// 条件表达式替换,判断是否满足某个任务的跳转条件 【按需传】
variable.put("flag", 1);
// 办理人变量表达式替换 【按需传】
variable.put("handler1", Arrays.asList(4, "5", 100L));
variable.put("handler2", 12L);
variable.put("handler3", new Object[]{9, "10", 102L});
variable.put("handler4", "15");
Task task = FlowFactory.newTask().setId(55L);
variable.put("handler5", task);
variable.put("handler6", 77L);
flowParams.variable(variable);
// 新增请假表
Instance instance = insService.start(id, flowParams);
applyInfoList.setInstanceId(instance.getId());
applyInfoList.setNodeCode(instance.getNodeCode());
applyInfoList.setNodeName(instance.getNodeName());
applyInfoList.setNodeType(instance.getNodeType());
applyInfoList.setFlowStatus(instance.getFlowStatus());
applyInfoList.setCreateTime(DateUtils.getNowDate());
applyInfoList.setDeptId(SecurityUtils.getDeptId());
applyInfoList.setDeptName(SecurityUtils.getLoginUser().getUser().getDept().getDeptName());
applyInfoList.setCreateId(SecurityUtils.getLoginUser().getUserId());
applyInfoList.setCreateBy(SecurityUtils.getLoginUser().getUsername());
applyInfoList.setApplyStatus(ApplyListStatusEnum.NEWSAVE.getStatus());
return applyInfoListService.save(applyInfoList);
}
public boolean updateTdApplyInfoList(TdApplyInfoList applyInfoList) {
applyInfoList.setUpdateTime(DateUtils.getNowDate());
applyInfoList.setUpdateBy(SecurityUtils.getLoginUser().getUsername());
return applyInfoListService.saveOrUpdate(applyInfoList);
}
@Transactional(rollbackFor = Exception.class)
public boolean submit(String id) {
// 设置流转参数
TdApplyInfoList applyInfoList = applyInfoListService.lambdaQuery()
.eq(TdApplyInfoList::getApplyId, id).one();
LoginUser user = SecurityUtils.getLoginUser();
// 是通过流程还是退回流程 【必传】
FlowParams flowParams = FlowParams.build().skipType(SkipType.PASS.getKey());
// 作为办理人保存到历史记录表 【必传】
flowParams.handler(user.getUser().getUserId().toString());
// 设置办理人拥有的权限,办理中需要校验是否有权限办理 【必传】
List<SysRole> roles = user.getUser().getRoles();
List<String> permissionList = new ArrayList<>();
if (Objects.nonNull(roles)) {
permissionList = roles.stream().map(role -> "role:" + role.getRoleId()).collect(Collectors.toList());
}
permissionList.add("dept:" + SecurityUtils.getLoginUser().getUser().getDeptId());
permissionList.add(user.getUser().getUserId().toString());
flowParams.permissionFlag(permissionList);
// 流程变量
Map<String, Object> variable = new HashMap<>();
// 流程变量传递业务数据,按实际业务需求传递 【按需传】
variable.put("businessType", "applyInfoList");
// 办理人变量表达式替换 【按需传】
variable.put("flag", 1);
flowParams.variable(variable);
// 更新请假表
Instance instance = insService.skipByInsId(applyInfoList.getInstanceId(), flowParams);
applyInfoList.setNodeCode(instance.getNodeCode());
applyInfoList.setNodeName(instance.getNodeName());
applyInfoList.setNodeType(instance.getNodeType());
applyInfoList.setFlowStatus(instance.getFlowStatus());
applyInfoList.setUpdateTime(DateUtils.getNowDate());
applyInfoList.setApplyStatus(ApplyListStatusEnum.SUBMIT.getStatus());
return applyInfoListService.saveOrUpdate(applyInfoList);
}
@Transactional(rollbackFor = Exception.class)
public boolean handle(TdApplyInfoList applyInfoList, Long taskId, String skipType, String message) {
// 设置流转参数
LoginUser user = SecurityUtils.getLoginUser();
// 是通过流程还是退回流程 【必传】
FlowParams flowParams = FlowParams.build().skipType(skipType);
// 作为办理人保存到历史记录表 【必传】
flowParams.handler(user.getUser().getUserId().toString());
// 作为审批意见保存到历史记录表 【按需传】
flowParams.message(message);
// 流程变量
Map<String, Object> variable = new HashMap<>();
// 流程变量传递业务数据,按实际业务需求传递 【按需传】
variable.put("businessType", "applyInfoList");
// 办理人变量表达式替换 【按需传】
variable.put("flag", 1);
flowParams.variable(variable);
// 请假信息存入flowParams,方便查看历史审批数据 【按需传】
flowParams.hisTaskExt(JSON.toJSONString(applyInfoList));
Instance instance = taskService.skip(taskId, flowParams);
// 更新请假表
applyInfoList.setNodeCode(instance.getNodeCode());
applyInfoList.setNodeName(instance.getNodeName());
applyInfoList.setNodeType(instance.getNodeType());
applyInfoList.setFlowStatus(instance.getFlowStatus());
if ("PASS".equals(skipType)) {
applyInfoList.setApplyStatus(ApplyListStatusEnum.AUDITED.getStatus());
} else {
applyInfoList.setApplyStatus(ApplyListStatusEnum.GOBACK.getStatus());
}
applyInfoList.setUpdateTime(DateUtils.getNowDate());
return applyInfoListService.saveOrUpdate(applyInfoList);
}
public boolean termination(TdApplyInfoList applyInfoList) {
// 设置流转参数
FlowParams flowParams = new FlowParams();
LoginUser user = SecurityUtils.getLoginUser();
// 作为审批意见保存到历史记录表 【按需传】
flowParams.message("终止流程");
// 作为办理人保存到历史记录表 【必传】
flowParams.handler(user.getUserId().toString());
Map<String, Object> variable = new HashMap<>();
// 流程变量传递业务数据,按实际业务需求传递 【按需传】
variable.put("businessType", "applyInfoList");
flowParams.variable(variable);
Instance instance = insService.termination(applyInfoList.getInstanceId(), flowParams);
if (instance == null) {
throw new ServiceException("流程实例不存在");
}
// 更新请假表
applyInfoList.setNodeCode(instance.getNodeCode());
applyInfoList.setNodeName(instance.getNodeName());
applyInfoList.setNodeType(instance.getNodeType());
applyInfoList.setFlowStatus(instance.getFlowStatus());
applyInfoList.setApplyStatus(ApplyListStatusEnum.NEWSAVE.getStatus());
return applyInfoListService.saveOrUpdate(applyInfoList);
}
public int deleteApplyInfoListByIds(String[] applyIds) {
List<String> list = Arrays.asList(applyIds);
List<TdApplyInfoList> applyInfoListList = applyInfoListService.
lambdaQuery().in(TdApplyInfoList::getApplyId, list).list();
if (applyInfoListService.lambdaUpdate().in(TdApplyInfoList::getApplyId, list).remove()) {
List<Long> instanceIds = applyInfoListList.stream().map(TdApplyInfoList::getInstanceId).collect(Collectors.toList());
return insService.remove(instanceIds) ? 1 : 0;
}
return 0;
}
/**
*
*
* @param type
* @return
*/
private String getFlowType(Long type) {
List<SysDictData> leaveType = sysDictTypeService.selectDictDataByType("leave_type");
Map<String, String> map = StreamUtils.toMap(leaveType, SysDictData::getDictValue, SysDictData::getRemark);
return map.get(type.toString());
}
}

@ -0,0 +1,35 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.domain.TdApplyInfoList;
import java.util.List;
/**
* @author Administrator
* @description td_apply_info_list(sm)Mapper
* @createDate 2025-05-14 11:23:04
* @Entity generator.domain.TdApplyInfoList
*/
public interface TdApplyInfoListMapper extends BaseMapper<TdApplyInfoList> {
public List<TdApplyInfoList> selectApplyInfoListList(TdApplyInfoList applyInfoList);
}

@ -0,0 +1,37 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.domain.TdApplyInfoList;
import java.util.List;
/**
* @author Administrator
* @description td_apply_info_list(sm)Service
* @createDate 2025-05-14 11:23:04
*/
public interface TdApplyInfoListService extends IService<TdApplyInfoList> {
public List<TdApplyInfoList> selectApplyInfoListList(TdApplyInfoList applyInfoList);
}

@ -0,0 +1,36 @@
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.system.domain.TdApplyInfoList;
import com.ruoyi.system.mapper.TdApplyInfoListMapper;
import com.ruoyi.system.service.TdApplyInfoListService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author Administrator
* @description td_apply_info_list(sm)Service
* @createDate 2025-05-14 11:23:04
*/
@Service
public class TdApplyInfoListServiceImpl extends ServiceImpl<TdApplyInfoListMapper, TdApplyInfoList>
implements TdApplyInfoListService {
@Resource
private TdApplyInfoListMapper applyInfoListMapper;
@DataScope(deptAlias = "d")
@Override
public List<TdApplyInfoList> selectApplyInfoListList(TdApplyInfoList applyInfoList) {
return applyInfoListMapper.selectApplyInfoListList(applyInfoList);
}
}

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.TdApplyInfoListMapper">
<resultMap id="BaseResultMap" type="TdApplyInfoList">
<id property="applyId" column="apply_id" jdbcType="VARCHAR"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="sex" column="sex" jdbcType="VARCHAR"/>
<result property="nationa" column="nationa" jdbcType="VARCHAR"/>
<result property="applyStatus" column="apply_status" jdbcType="VARCHAR"/>
<result property="appTime" column="app_time" jdbcType="TIMESTAMP"/>
<result property="applyMsg" column="apply_msg" jdbcType="VARCHAR"/>
<result property="authTime" column="auth_time" jdbcType="TIMESTAMP"/>
<result property="createId" column="create_id" jdbcType="BIGINT"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateBy" column="update_by" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<result property="remark" column="remark" jdbcType="VARCHAR"/>
<result property="deptId" column="dept_id" jdbcType="BIGINT"/>
<result property="formerName" column="former_name" jdbcType="VARCHAR"/>
<result property="nationality" column="nationality" jdbcType="VARCHAR"/>
<result property="maritalStatus" column="marital_status" jdbcType="VARCHAR"/>
<result property="political" column="political" jdbcType="VARCHAR"/>
<result property="phone" column="phone" jdbcType="VARCHAR"/>
<result property="cerno" column="cerno" jdbcType="VARCHAR"/>
<result property="address" column="address" jdbcType="VARCHAR"/>
<result property="registeredAuthority" column="registered_authority" jdbcType="VARCHAR"/>
<result property="permanentAddress" column="permanent_address" jdbcType="VARCHAR"/>
<result property="residentBureau" column="resident_bureau" jdbcType="VARCHAR"/>
<result property="positionCapacity" column="position_capacity" jdbcType="VARCHAR"/>
<result property="smPost" column="sm_post" jdbcType="VARCHAR"/>
<result property="smGrade" column="sm_grade" jdbcType="VARCHAR"/>
<result property="photoUrl" column="photo_url" jdbcType="VARCHAR"/>
<result property="leaveMsg" column="leave_msg" jdbcType="VARCHAR"/>
<result property="leaveTime" column="leave_time" jdbcType="TIMESTAMP"/>
<result property="deptName" column="dept_name" jdbcType="VARCHAR"/>
<result property="instanceId" column="instance_id" />
<result property="nodeCode" column="node_code" />
<result property="nodeName" column="node_name" />
<result property="nodeType" column="node_type" />
<result property="flowStatus" column="flow_status" />
</resultMap>
<sql id="Base_Column_List">
apply_id,name,sex,
nationa,apply_status,app_time,
apply_msg,auth_time,create_id,
create_by,create_time,update_by,
update_time,remark,dept_id,
former_name,nationality,marital_status,
political,phone,cerno,
address,registered_authority,permanent_address,
resident_bureau,position_capacity,sm_post,
sm_grade,photo_url,leave_msg,leave_time,dept_name,instance_id, node_code, node_name, node_type, flow_status
</sql>
<select id="selectApplyInfoListList" resultType="com.ruoyi.system.domain.TdApplyInfoList">
select <include refid="Base_Column_List"/> from td_apply_info_list d
<trim prefix="where" prefixOverrides="and|or">
<if test="name!=null and name!=''">
AND name = #{name}
</if>
<if test="nationa!=null and nationa!=''">
AND nationa = #{nationa}
</if>
<if test="sex!=null and sex!=''">
AND sex = #{sex}
</if>
<if test="formerName!=null and formerName!=''">
AND former_name = #{formerName}
</if>
<if test="cerno!=null and cerno!=''">
AND cerno = #{cerno}
</if>
<if test="phone!=null and phone!=''">
AND phone = #{phone}
</if>
<if test="smPost!=null and smPost!=''">
AND sm_post = #{smPost}
</if>
<if test="flowStatus != null and flowStatus != ''">
and flow_status = #{flowStatus}
</if>
AND apply_status in ('0','3')
<!-- 数据范围过滤 -->
${params.dataScope}
</trim>
ORDER BY create_time DESC
</select>
</mapper>
Loading…
Cancel
Save