加班申请单flowable中
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package org.springblade.desk.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.secure.utils.SecureUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.entity.WorkOvertime;
import org.springblade.desk.entity.WorkOvertimePeople;
import org.springblade.desk.entity.WorkOvertimePeopleApprove;
import org.springblade.desk.entity.WorkOvertimeTotalHours;
import org.springblade.desk.mapper.WorkOvertimeMapper;
import org.springblade.desk.service.IWorkOvertimeService;
import org.springblade.desk.utils.DeptUserUtil;
import org.springblade.flow.core.constant.ProcessConstant;
import org.springblade.flow.core.entity.BladeFlow;
import org.springblade.flow.core.feign.IFlowClient;
import org.springblade.flow.core.utils.FlowUtil;
import org.springblade.flow.core.utils.TaskUtil;
import org.springblade.system.entity.Dept;
import org.springblade.system.user.entity.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 服务实现类 加班申请单
*
* @author*/
@Slf4j
@Service
@AllArgsConstructor
public class WorkOvertimeServiceImpl extends BaseServiceImpl<WorkOvertimeMapper, WorkOvertime> implements IWorkOvertimeService {
private IFlowClient flowClient;
private DeptUserUtil deptUserUtil;
private OaSerialServiceImpl oaSerialService;
private WorkOvertimePeopleServiceImpl workOvertimePeopleServiceImpl;
private WorkOvertimeMapper workOvertimeMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public boolean startProcess(WorkOvertime bean) {
//是否启动流程
boolean isStartProcess = false;
//是否新增数据
boolean isAdd = false;
if(bean!=null){
if(Func.isEmpty(bean.getProcessInstanceId())){
isStartProcess = true;
}
if(Func.isEmpty(bean.getId())){
isAdd = true;
}
//更新业务数据
if(isAdd){
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
String dateStr = format.format(now);
if(Func.isNull(bean.getWorkOvertimeNumber())){
bean.setWorkOvertimeNumber(oaSerialService.getSerial(bean.getTenantId(),"WorkOvertime",dateStr,dateStr,5));
}
}
saveOrUpdate(bean);
//加班人员
if(isAdd){
//新增
savePeople(bean.getWorkOvertimePeopleList(),bean);
}else{
//修改从新发起 修改先删除旧的,插入新的
workOvertimePeopleServiceImpl.removeById(bean.getId());
//插入新的
savePeople(bean.getWorkOvertimePeopleList(),bean);
}
}
//获取经理职位
Long managerUser=null;
String roleId=deptUserUtil.getRoleId(AuthUtil.getTenantId(), "经理");
List<User>users=deptUserUtil.getUserListByRoleIdAndDeptId(roleId,String.valueOf(bean.getProposerDepartmentCode()),false);
if(!Func.isEmpty(users)){
managerUser=users.get(0).getId();
}
log.info("获取经理职位roleId====="+roleId+"------users========================"+users);
//获取部门总监
String majorRoleId=deptUserUtil.getRoleId(AuthUtil.getTenantId(), "总监");
List<User>majordomoUsers=deptUserUtil.getUserListByRoleIdAndDeptId(majorRoleId,String.valueOf(bean.getProposerDepartmentCode()),true);
Long generalManager=null;
if(null!=majordomoUsers && majordomoUsers.size()>0){
generalManager =majordomoUsers.get(0).getId();
}
log.info("获取总监majorRoleId===="+majorRoleId+"-----majordomoUsers========================"+majordomoUsers);
//获取副总
String deputyPostId = deptUserUtil.getPostId("副总经理",bean.getTenantId());
List<User> deputyUsers = deptUserUtil.getUserListByPostIdAndDeptId(deputyPostId,String.valueOf(bean.getProposerDepartmentCode()));
Long presidentUser =null;
if(null!=deputyUsers && deputyUsers.size()>0){
presidentUser =deputyUsers.get(0).getId();
}
log.info("获取副总deputyPostId====="+deputyPostId+"-------deputyUsers========================"+deputyUsers);
//获取总经理
String companyBossPostId=deptUserUtil.getPostId("总经理",bean.getTenantId());
List<User>companyBossUsers=deptUserUtil.getUserListByPostId(companyBossPostId);//总经理不属于某个部门,不用根据部门id查询
Long companyBoss=null;
if(null!=companyBossUsers && companyBossUsers.size()>0){
companyBoss=companyBossUsers.get(0).getId();
}
log.info("获取总经理companyBossPostId====="+companyBossPostId+"-------companyBossUsers========================"+companyBossUsers);
/**
* 判断条件
*/
//如果发起人是总监或者经理不是部门最高领导 没有的职位跳过经理职位
if(null!=managerUser){
if(bean.getProposerCode().longValue()==managerUser.longValue()){
managerUser=null;//经理
}
}
//跳过总监
if(null!=generalManager){
//跳过总监
if(bean.getProposerCode().longValue()==generalManager.longValue()){
//跳过经理
managerUser=null;//经理
//跳过总监职位
generalManager=null;
}
} //根据部门获取部门信息
Dept deptInfo= deptUserUtil.getDeptById(bean.getProposerDepartmentCode());
String isDepartmentHead="0";//0不是最高主管,1是最高主管
String isSell="其他";
String isManager="2";//2上级主管不是最大领导,3是部门最大领导
log.info("根据部门获取部门信息deptInfo================="+deptInfo);
if(!Func.isEmpty(deptInfo)){
if(deptInfo.getManagerUser().longValue()==bean.getProposerCode().longValue()){
isDepartmentHead="1";
}
//判断是不是销售部人员
if(deptInfo.getDeptName().equals("销售部")){
isSell="销售";
}
//判断是不是部门最大领导 申请人编号和部门领导号相同 是部门最大领导
if(deptInfo.getManagerUser().longValue()==bean.getProposerCode()){
isManager="3";
}
}
// 启动流程
Kv variables = Kv.create()
.set(ProcessConstant.TASK_VARIABLE_CREATE_USER, SecureUtil.getUserName())
.set("subject",bean.getProposerName()+","+bean.getProposerName())//主题
.set("orderCode",bean.getWorkOvertimeNumber())//流程编号
.set("taskUser", TaskUtil.getTaskUser(AuthUtil.getUser().getUserId().toString()))
.set("isDepartmentHead",isDepartmentHead)//是不是部门最高领导
.set("isSell",isSell)//是不是销售部人员
.set("isManager",isManager)//2上级主管不是部门最大领导,3是最大领导
.set("overtimeType",bean.getOvertimeType())//申请类型 调休,付薪
.set("managerSkip", Func.isEmpty(managerUser))
.set("managerUser",TaskUtil.getTaskUser(String.valueOf(managerUser==null ? "" : managerUser)))
.set("generalManagerSkip", Func.isEmpty(generalManager))
.set("generalManager", TaskUtil.getTaskUser(String.valueOf(generalManager==null ? "" : generalManager)))
.set("presidentSkip",Func.isEmpty(presidentUser))
.set("presidentUser", TaskUtil.getTaskUser(String.valueOf(presidentUser==null ? "" : presidentUser)))
.set("companyBossSkip",Func.isEmpty(companyBoss))
.set("companyBossUser", TaskUtil.getTaskUser(String.valueOf(companyBoss==null ? "" : companyBoss)))//总经理
.set("pass",true)
.set("_FLOWABLE_SKIP_EXPRESSION_ENABLED",true); //启动流程
if (isStartProcess) {
String businessTable = FlowUtil.getBusinessTable(ProcessConstant.WORK_OVERTIME);
R<BladeFlow> result = flowClient.startProcessInstanceById(bean.getProcessDefinitionId(), FlowUtil.getBusinessKey(businessTable, String.valueOf(bean.getId())), variables);
if (result.isSuccess()) {
log.debug("流程已启动,流程ID:" + result.getData().getProcessInstanceId());
// 返回流程id写入业务表中
bean.setProcessInstanceId(result.getData().getProcessInstanceId());
updateById(bean);
} else {
throw new ServiceException("开启流程失败");
}
}
else{
if(!Func.isEmpty(bean.getFlow())&&!Func.isEmpty(bean.getFlow().getTaskId())&&!Func.isEmpty(bean.getProcessInstanceId())){
variables.put(ProcessConstant.PASS_KEY, true);
flowClient.completeTask(bean.getFlow().getTaskId(),bean.getProcessInstanceId(),bean.getFlow().getComment(),variables);
}
}
return true;
}
/**
* 获取明细
* @param businessId
* @return
*/
@Override
public WorkOvertime getDtail(Long businessId) {
//获取主表信息
WorkOvertime workOvertime=getById(businessId);
Map<String,Object>map=new HashMap<String,Object>();
map.put("id",businessId);
List<WorkOvertimePeople>list=workOvertimePeopleServiceImpl.listByMap(map);
workOvertime.setWorkOvertimePeopleList(list);
return workOvertime;
} /**
* 审批通过后根据流程实例id查询加班申请单信息
* @param processInstanceId
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public boolean getWorkOvertimeServiceInfo(String processInstanceId) {
WorkOvertime workOvertime=workOvertimeMapper.getWorkOvertimeServiceInfo(processInstanceId);
//根据id获取加班人员信息
Map<String,Object>mapId=new HashMap<String,Object>();
mapId.put("id",workOvertime.getId());
List<WorkOvertimePeople>listPerson=workOvertimePeopleServiceImpl.listByMap(mapId);
workOvertime.setWorkOvertimePeopleList(listPerson);
log.info("审批通过后根据流程实例id查询加班申请单信息processInstanceId=================="+processInstanceId+"-----workOvertime========="+workOvertime);
System.out.println(!Func.isEmpty(workOvertime));
if(!Func.isEmpty(workOvertime)){
if(!Func.isEmpty(workOvertime.getWorkOvertimePeopleList())){
String dateTime=new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss:SSS").format(new Date()).toString();
log.info("dateTime=============="+dateTime);
for (WorkOvertimePeople workOvertimePeople : workOvertime.getWorkOvertimePeopleList()){
//人员加班总时长表如果存在 则根据加班类型修改相应的时长,如果不存在则插入 根据用户号
//根据用户号查询人员加班总时长是否已经存在
WorkOvertimeTotalHours workOvertimeTotalHours=workOvertimeMapper.getWorkOvertimeTotalHoursInfo(workOvertimePeople.getUserCode());
//根据用户号查询人员加班总时长不存在
if(Func.isEmpty(workOvertimeTotalHours)){
WorkOvertimeTotalHours totalHoursDetail =new WorkOvertimeTotalHours();
if(workOvertimePeople.getOvertimeType().equals("调休")){
//调休加班总时长
totalHoursDetail.setTotalHours(workOvertimePeople.getDuration());
}
//付薪加班总时长
if(workOvertimePeople.getOvertimeType().equals("付薪")){
totalHoursDetail.setPayTotalHours(workOvertimePeople.getDuration());
}
//人员名称
totalHoursDetail.setUserName(workOvertimePeople.getUserName());
// 人员编号
totalHoursDetail.setUserCode(workOvertimePeople.getUserCode());
//人员部门名称
totalHoursDetail.setDepartmentName(workOvertimePeople.getDepartmentName());
//人员部门编号
totalHoursDetail.setDepartmentCode(workOvertimePeople.getDepartmentCode());
//租户id
totalHoursDetail.setTenantId(workOvertimePeople.getTenantId());
//更新时间到时分秒
totalHoursDetail.setUpdateTime(dateTime);
//信息写入加班总时长表
log.info("totalHoursDetail=============="+totalHoursDetail);
workOvertimeMapper.saveWorkOvertimeTotalHoursInfo(totalHoursDetail); }else{
log.info("用户加班时长已经存在workOvertimeTotalHours============"+workOvertimeTotalHours);
WorkOvertimeTotalHours totalHoursInfo =new WorkOvertimeTotalHours();
//用户加班总时长信息已经存在
if(workOvertimePeople.getOvertimeType().equals("调休")){
//如果调休加班时长为空
if(Func.isEmpty(workOvertimeTotalHours.getTotalHours())){
Double hours=workOvertimePeople.getDuration();
totalHoursInfo.setTotalHours(hours);
}else{
//如果调休加班时长为不为空
Double hours=add(workOvertimeTotalHours.getTotalHours(),workOvertimePeople.getDuration());
totalHoursInfo.setTotalHours(hours);
} }
if(workOvertimePeople.getOvertimeType().equals("付薪")){
//如果付薪时长为空
if(Func.isEmpty(workOvertimeTotalHours.getPayTotalHours())){
Double hours1=workOvertimePeople.getDuration();
totalHoursInfo.setPayTotalHours(hours1);
}else {
//付薪时长不为空
Double hours1=add(workOvertimeTotalHours.getPayTotalHours(),workOvertimePeople.getDuration());
totalHoursInfo.setPayTotalHours(hours1);
} }
totalHoursInfo.setUserCode(workOvertimePeople.getUserCode());
log.info("totalHoursInfo======================"+totalHoursInfo);
workOvertimeMapper.updateWorkOvertimeTotalHoursInfo(totalHoursInfo);
}
//将信息插入员加班明细表
// 将 实体类 转换为 Map
Map<String,Object> maps= JSONObject.parseObject(JSONObject.toJSONString(workOvertimePeople), Map.class);
maps.remove("id");
maps.remove("createTime");
maps.put("updateTime",dateTime);
log.info("将信息插入员加班明细表maps==================="+maps);
//将人员加班信息插入人员加班详情表
workOvertimeMapper.saveWorkOvertimePeopleApprove(maps);
}
}
}
return true;
}
/**
* 根据用户号查询加班总时长详情
* @param userCode
* @return
*/
@Override
public WorkOvertimeTotalHours getWorkOvertimeTotalHoursDetail(Long userCode) {
return workOvertimeMapper.getWorkOvertimeTotalHoursDetail(userCode);
} @Override
public IPage<WorkOvertimePeopleApprove> getWorkOvertimePeopleApprovePage(IPage<WorkOvertimePeopleApprove> page,WorkOvertimePeopleApprove workOvertimePeopleApprove) {
log.info("workOvertimePeopleApprove================"+workOvertimePeopleApprove);
String startTime=workOvertimePeopleApprove.getStartTime();
String endTime=workOvertimePeopleApprove.getEndTime();
String departmentName=workOvertimePeopleApprove.getDepartmentName();
String overtimeType=workOvertimePeopleApprove.getOvertimeType();
String tenantId=workOvertimePeopleApprove.getTenantId();
Long user_code=workOvertimePeopleApprove.getUserCode();
List<WorkOvertimePeopleApprove>list=workOvertimeMapper.getWorkOvertimePeopleApprovePage(page,startTime,endTime,departmentName,overtimeType,tenantId,user_code);
return page.setRecords(list);
} /**
* @Description 两个Double数相加
*
* @param d1
* @param d2
* @return Double
*/
public static Double add(Double d1,Double d2){
BigDecimal b1 = new BigDecimal(d1.toString());
BigDecimal b2 = new BigDecimal(d2.toString());
return b1.add(b2).doubleValue();
} /**
* 保存加班人员
*/
public void savePeople(List<WorkOvertimePeople>list,WorkOvertime bean){
log.info("保存加班人员bean=============="+bean+"-----list======"+list);
if(null!=list && list.size()>0){
for (WorkOvertimePeople workOvertimePeople : list){
//加班时长
workOvertimePeople.setDuration(bean.getDuration());
workOvertimePeople.setStartTime(bean.getStartTime());
workOvertimePeople.setEndTime(bean.getEndTime());
workOvertimePeople.setId(bean.getId());
workOvertimePeople.setWorkOvertimeNumber(bean.getWorkOvertimeNumber());
workOvertimePeople.setOvertimeReason(bean.getOvertimeReason());
workOvertimePeople.setCreateTime(bean.getCreateTime());
workOvertimePeople.setOvertimeType(bean.getOvertimeType());
workOvertimePeopleServiceImpl.save(workOvertimePeople);
}
}
} }
加班申请单flowable中的更多相关文章
- Flowable中的Service
前言 在学习博客[(https://blog.csdn.net/puhaiyang/article/details/79845248)]时,注意到Flowable中的各种Service(如下),进而在 ...
- flowable中传入审批人是list
package org.springblade.flow.engine.listener; import org.flowable.engine.delegate.DelegateExecution; ...
- flowable 中task的相关操作
1 获取任务列表 1)获取候选人的任务列表 TaskService taskService = processEngine.getTaskService(); List<Task> tas ...
- flowable中使用到的一些方法。获取人员部门信息
package org.springblade.desk.utils; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf ...
- Winform开发框架中工作流模块之申请单草稿处理
在我们开发工作流模块的时候,有时候填写申请单过程中,暂时不想提交审批,那么可以暂存为草稿,以供下次继续填写或者提交处理,那么这个草稿的功能是比较实用的,否则对于一些填写内容比较多的申请单,每次要重填写 ...
- WPF开发查询加班小工具
先说一下,我们公司是六点下班,超过7点开始算加班,但是加班的时间是从六点开始计算,以0.5个小时为计数,就是你到了六点半,不算加班半小时,但是加班到七点半,就是加班了一个半小时. 一.打卡记录 首先, ...
- 关于IT行业加班的问题
众所周知,所有行业中,IT行业加班最为严重,国内比较大的IT公司都有加班文化. 为什么要加班?有的时候加班是为了项目上线,因为正在运行的项目,在晚上的时候访问量是最小的,这个时候做系统更新是损失最小的 ...
- Android RxJava 2 的用法 just 、from、map、subscribe、flatmap、Flowable、Function、Consumer ...【转】
先简单说说RxJava的用途与价值 原文出处:Android RxJava 2 的用法 用途: 异步 (也就是开线程跳转) 价值: 面对复杂的逻辑,它依然 简洁 ,代码 易读 RxJava2 与 Rx ...
- flowable学习笔记-简单流程概念介绍
1 Flowable process engine允许我们创建ProcessEngine 对象和使用 Flowable 的API ProcessEngine是线程安全的,他是通过 ProcessEng ...
随机推荐
- 深度学习(一):Python神经网络——手写数字识别
声明:本文章为阅读书籍<Python神经网络编程>而来,代码与书中略有差异,书籍封面: 源码 若要本地运行,请更改源码中图片与数据集的位置,环境为 Python3.6x. 1 import ...
- python将对象写入文件,以及从文件中读取对象
原文地址: http://www.voidcn.com/article/p-fqtqpwxp-wo.html 写入文件代码: >>> import sys, shelve >& ...
- Golang 实现 Redis(8): TCC分布式事务
本文是使用 golang 实现 redis 系列的第八篇, 将介绍如何在分布式缓存中使用 Try-Commit-Catch 方式来解决分布式一致性问题. godis 集群的源码在Github:Godi ...
- Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例
☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...
- 第7.15节 Python中classmethod定义的类方法详解
第7.15节 Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一. 类方法的定义 在类中定 ...
- PyQt(Python+Qt)学习随笔:QScrollArea的alignment属性不起作用的原因
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 Scroll Area滚动区域提供了一个呈现在其他部件上的可滚动区域视图,对应类为QScrollAr ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的locale属性
locale属性用于设置语言环境,包括语言和国家.如果一个部件没有设置语言环境,则使用父对象的语言环境或者默认语言环境(如果这个部件是顶层部件). 可以使用locale()获取部件的语言环境,也可以通 ...
- Flutter · Python AI 弹幕播放器来袭
AI智能弹幕(也称蒙版弹幕):弹幕浮在视频的上方却永远不会挡住人物.起源于哔哩哔哩的web端黑科技,而后分别实现在IOS和Android的app端,如今被用于短视频.直播等媒体行业,用户体验提升显著. ...
- Python Flask后端异步处理(二)
在实际的应用场景中,如用户注册,用户输入了注册信息后,后端保存信息到数据库中,然后跳转至登录界面,这些操作用户需要等待的时间非常短,但是如果是有耗时任务,比如对输入的网址进行漏洞扫描,在后端处理就会花 ...
- sklearn决策树应用及可视化
from sklearn import datasets from sklearn.tree import DecisionTreeClassifier 1.载入iris数据集(from sklear ...