标签:anti ret table 等于 size oba 总经理 action class


package org.springblade.flow.engine.listener.common;
import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component;
import java.io.Serializable;
//多实例任务节点完成条件
@Component("multiInstance")
public class MultiInstance implements Serializable {
/**
* 一票否决
* 1、如果有驳回操作,则驳回当前任务节点。
* 2、若已审批人数不等于总人数,则多实例任务继续执行
* 3、若已审批人数等于总人数,则结束当前任务节点,进入下一个任务节点。
* @param execution 分配执行实例
*/
public boolean vetoPower(DelegateExecution execution) {
return vetoPower(execution,"pass");
}
public boolean vetoPower(DelegateExecution execution,String agreeFlagText){
//已完成的实例数
int completedInstance = (int) execution.getVariable("nrOfCompletedInstances");
//总实例数
int nrOfInstances = (int) execution.getVariable("nrOfInstances");
//否决判断,一票否决
if (execution.getVariable(agreeFlagText) != null) {
boolean pass = (boolean) execution.getVariable(agreeFlagText);
if (!pass) {
//输出方向为拒绝
//一票否决其他实例没必要做,结束
return true;
}
}
//所有实例任务未全部做完则继续其他实例任务
if (completedInstance != nrOfInstances) {
return false;
} else {
//输出方向为赞同
//所有都做完了没被否决,结束
return true;
}
}
/**
* 一票否决 + 少数服从多数
* 1、如果有驳回操作,则驳回当前任务节点。
* 2、若同意人数比例大于等于0.5,则结束当前任务节点,进入下一个任务节点。
* 3、若不同意人数比例大于0.5,则驳回当前任务节点。
* 4、否则多实例任务继续执行
* @param execution
* @return
*/
public boolean vetoPowerAndObeyMost(DelegateExecution execution) {
return vetoPowerAndObeyMost(execution,"pass","rejectCount","agreeCount",0.5d);
}
public boolean vetoPowerAndObeyMost(DelegateExecution execution,String agreeFlagText,String rejectCountText,String agreeCountText,double agreeRate) {
//否决判断,一票否决
if (execution.getVariable(agreeFlagText) != null) {
boolean pass = (boolean) execution.getVariable(agreeFlagText);
if (!pass) {
//输出方向为拒绝
//一票否决其他实例没必要做,结束
return true;
}
}
//已完成的实例数
int completedInstance = (int) execution.getVariable("nrOfCompletedInstances");
//总实例数
int nrOfInstances = (int) execution.getVariable("nrOfInstances");
//获取不同意的次数
int rejectCount = (int)execution.getVariable(rejectCountText);
//获取同意人的次数
int agreeCount = (int)execution.getVariable(agreeCountText);
//所有实例任务未全部做完则继续其他实例任务
if (completedInstance != nrOfInstances) {
//不同意的人数大于设置比例*总人数
if (rejectCount*1.00/nrOfInstances>(1-agreeRate)){
execution.setVariable(agreeFlagText, false);
return true;
}
if (agreeCount*1.00/nrOfInstances>=agreeRate){
execution.setVariable(agreeFlagText, true);
return true;
}
return false;
} else {
//输出方向为赞同
//所有都做完了没被否决,结束
return true;
}
}
/**
* 少数服从多数
* 1、若同意人数比例大于等于0.5,则结束当前任务节点,进入下一个任务节点。
* 2、若不同意人数比例大于0.5,则驳回当前任务节点。
* 3、否则多实例任务继续执行
* @param execution
* @return
*/
public boolean obeyMost(DelegateExecution execution) {
return obeyMost(execution,"pass","rejectCount","agreeCount",0.5);
}
public boolean obeyMost(DelegateExecution execution,String agreeFlagText,String rejectCountText,String agreeCountText,double agreeRate) {
//已完成的实例数
int completedInstance = (int) execution.getVariable("nrOfCompletedInstances");
//总实例数
int nrOfInstances = (int) execution.getVariable("nrOfInstances");
//获取不同意的次数
int rejectCount = (int)execution.getVariable(rejectCountText);
//获取同意人的次数
int agreeCount = (int)execution.getVariable(agreeCountText);
//所有实例任务未全部做完则继续其他实例任务
if (completedInstance != nrOfInstances) {
//不同意的人数大于设置比例*总人数
if (rejectCount*1.00/nrOfInstances>(1-agreeRate)){
execution.setVariable(agreeFlagText, false);
return true;
}
if (agreeCount*1.00/nrOfInstances>=agreeRate){
execution.setVariable(agreeFlagText, true);
return true;
}
return false;
} else {
//不同意的人数大于设置比例*总人数
if (rejectCount*1.00/nrOfInstances>(1-agreeRate)){
execution.setVariable(agreeFlagText, false);
return true;
}
if (agreeCount*1.00/nrOfInstances>=agreeRate){
execution.setVariable(agreeFlagText, true);
return true;
}
return true;
}
}
public boolean test(DelegateExecution execution,int i,String a){
System.out.println("===========i====="+i);
System.out.println("===========a====="+a);
return false;
}
}
/*
* 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 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.mp.support.Condition;
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.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.entity.PurchaseRequest;
import org.springblade.desk.entity.PurchaseRequestLine;
import org.springblade.desk.entity.SapFormInfo;
import org.springblade.desk.mapper.PurchaseRequestMapper;
import org.springblade.desk.service.IPurchaseRequestService;
import org.springblade.desk.service.ISapFormInfoService;
import org.springblade.desk.utils.DeptUserUtil;
import org.springblade.desk.utils.DeskUtil;
import org.springblade.desk.vo.PurchaseRequestVO;
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.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 服务实现类
*
* @author Chill
*/
@Slf4j
@Service
@AllArgsConstructor
public class PurchaseRequestServiceImpl extends BaseServiceImpl<PurchaseRequestMapper, PurchaseRequest> implements IPurchaseRequestService {
private IFlowClient flowClient;
private PurchaseRequestLineServiceImpl lineService;
private DeptUserUtil deptUserUtil;
private OaSerialServiceImpl oaSerialService;
private OaAttachmentServiceImpl oaAttachmentService;
private ISapFormInfoService infoService;
@Override
@Transactional(rollbackFor = Exception.class)
// @GlobalTransactional
public boolean startProcess(PurchaseRequest bean) {
//是否启动流程
boolean isStartProcess = false;
//是否新增数据
boolean isAdd = false;
String tenantId = "000000";
if(!Func.isEmpty(AuthUtil.getTenantId())){
tenantId = AuthUtil.getTenantId();
}
if(bean!=null){
if(Func.isEmpty(bean.getProcessInstanceId())){
isStartProcess = true;
}
if(Func.isEmpty(bean.getId())){
isAdd = true;
}
//更新业务数据
if(bean.getApplyTime()==null){
bean.setApplyTime(DateUtil.now());
}
if(isStartProcess){
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
String dateStr = format.format(now);
bean.setOrderCode(oaSerialService.getSerial(Func.toStr(AuthUtil.getTenantId(),"000000"),"purchaseRequest",dateStr,dateStr,5));
}
saveOrUpdate(bean);
PurchaseRequestLine lineEntity = new PurchaseRequestLine();
lineEntity.setPurchaseRequestId(bean.getId());
lineService.remove(Condition.getQueryWrapper(lineEntity));
if(bean.getLineList()!=null&&!bean.getLineList().isEmpty()){
List<PurchaseRequestLine> list = new ArrayList<>();
for(PurchaseRequestLine line : bean.getLineList()){
line.setPurchaseRequestId(bean.getId());
line.setNotUsedQuantity(line.getQuantity());
line.setUsedQuantity(new BigDecimal(0));
line.setTenantId(tenantId);
list.add(line);
//lineService.saveOrUpdate(line);
}
if(!Func.isNull(list)){
lineService.saveOrUpdateBatch(list);
}
}
//更新附件信息
oaAttachmentService.saveOrUpdateOaAttachment(bean.getAttachments(),bean.getId(),bean.getProcessInstanceId(),bean.getTenantId(),"purchaseRequest");
}
Long curDeptId = DeskUtil.getCurDeptId(bean.getCreateDept());
/*
//经理
String roleId = deptUserUtil.getRoleId(AuthUtil.getTenantId(),"经理");
List<User> users = deptUserUtil.getUserListByRoleIdAndDeptId(roleId,String.valueOf(curDeptId),true,AuthUtil.getUserId());
Long managerUserId = Func.isEmpty(users)?null:users.get(0).getId();
//总监
roleId = deptUserUtil.getRoleId(AuthUtil.getTenantId(),"总监");
users = deptUserUtil.getUserListByRoleIdAndDeptId(roleId,String.valueOf(curDeptId),true,AuthUtil.getUserId());
Long directorUserId = Func.isEmpty(users)?null:users.get(0).getId();
//总经理
roleId =deptUserUtil.getRoleId(AuthUtil.getTenantId(),"总经理");
users = deptUserUtil.getUserListByRoleIdAndDeptId(roleId,String.valueOf(curDeptId),true,AuthUtil.getUserId());
Long presidentId = Func.isEmpty(users)?null:users.get(0).getId();
//采购主管
Long purchaseManagerUserId ;
if("茶叶".equals(bean.getType())){
roleId = deptUserUtil.getRoleId(AuthUtil.getTenantId(), "采购主管(茶叶)");
}
else{
roleId = deptUserUtil.getRoleId(AuthUtil.getTenantId(), "采购主管(其他)");
}
users = deptUserUtil.getUserListByRoleId(roleId);
purchaseManagerUserId = (users.isEmpty() ||users==null)?null:users.get(0).getId() ;
//IT采购人员
roleId = deptUserUtil.getRoleId(AuthUtil.getTenantId(), "IT(采购申请)");
users = deptUserUtil.getUserListByRoleId(roleId);
Long internetUserId = (users.isEmpty() ||users==null)?null:users.get(0).getId() ;
//上级主管
roleId = deptUserUtil.getRoleId(AuthUtil.getTenantId(),"主管");
boolean isManager = Func.isNotEmpty(AuthUtil.getUserRole())&&AuthUtil.getUserRole().contains("主管")?true:false;
Long lastManagerUserId = null;
if(isManager){
users = deptUserUtil.getUserListByRoleIdAndDeptId(roleId,String.valueOf(curDeptId),true,AuthUtil.getUserId());
lastManagerUserId = Func.isEmpty(users)?null:users.get(0).getId();
}
*/
//总经理
String presidentRoleId =deptUserUtil.getRoleId(tenantId,"总经理");
List<User> users = deptUserUtil.getUserListByRoleIdAndDeptId(presidentRoleId,String.valueOf(curDeptId),true,AuthUtil.getUserId());
Long presidentId = Func.isEmpty(users)?null:users.get(0).getId();
//上级主管
String roleId = deptUserUtil.getRoleId(tenantId,"主管");
boolean isManager = Func.isNotEmpty(AuthUtil.getUserRole())&&AuthUtil.getUserRole().contains("主管")?true:false;
users = deptUserUtil.getUserListByRoleIdAndUntilRoleIdAndDeptId(roleId,presidentRoleId,String.valueOf(curDeptId),true);
List<String> managerUser = new ArrayList<>();
for (User u: users ) {
if(!AuthUtil.getUserId().equals(u.getId()) ){
managerUser.add(TaskUtil.getTaskUser(String.valueOf(u.getId())));
}
}
// 启动流程
Kv variables =DeskUtil.createKV(curDeptId,"采购申请",bean.getOrderCode(),bean.getOrigin(),isManager,bean.getCcUser(),bean.getCcUserName())
.set("type",bean.getType())
.set("managerSkip",Func.isEmpty(managerUser))
.set("managerUser",managerUser)
.set("presidentSkip",Func.isEmpty(presidentId))
.set("presidentUser",TaskUtil.getTaskUser(String.valueOf(presidentId)))
/*
.set("managerSkip",Func.isNull(managerUserId))
.set("managerUser",TaskUtil.getTaskUser(String.valueOf(managerUserId)))
.set("directorSkip",Func.isNull(directorUserId))
.set("directorUser",TaskUtil.getTaskUser(String.valueOf(directorUserId)))
.set("presidentSkip",Func.isEmpty(presidentId))
.set("presidentUser",TaskUtil.getTaskUser(String.valueOf(presidentId)))
.set("purchaseManagerSkip",Func.isEmpty(purchaseManagerUserId))
.set("purchaseManagerUser",TaskUtil.getTaskUser(String.valueOf(purchaseManagerUserId)))
.set("purchaseSkip",Func.isEmpty(bean.getPurchaseUser()))
.set("purchaseUser",TaskUtil.getTaskUser(String.valueOf(bean.getPurchaseUser())))
.set("internetSkip",Func.isEmpty(internetUserId))
.set("internetUser",TaskUtil.getTaskUser(String.valueOf(internetUserId)))
.set("lastManagerSkip",Func.isEmpty(lastManagerUserId))
.set("lastManagerUser",TaskUtil.getTaskUser(String.valueOf(lastManagerUserId)))
*/ ;
//启动流程
if (isStartProcess) {
String businessTable = FlowUtil.getBusinessTable(ProcessConstant.PURCHASE_REQUEST_KEY);
R<BladeFlow> result = new R<>();
if(Func.isEmpty(AuthUtil.getUserId()) || AuthUtil.getUserId() == -1L ){
String processDefinitionId = "";
SapFormInfo SapFormInfo = new SapFormInfo();
SapFormInfo.setName("采购申请单");
SapFormInfo.setIsEnable(1);
List<SapFormInfo> infoList = infoService.list(Condition.getQueryWrapper(SapFormInfo)) ;
if(infoList!=null && infoList.size() > 0 ){
processDefinitionId = infoList.get(0).getProcessDefinitionId() ;
}
result = flowClient.startProcessInstanceByIdDing( !Func.isEmpty(processDefinitionId) ? processDefinitionId: bean.getProcessDefinitionId() ,
FlowUtil.getBusinessKey(businessTable, String.valueOf(bean.getId())),
String.valueOf(bean.getCreateUser()),variables);
}
else{
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(),Func.toStr(bean.getFlow().getComment(),ProcessConstant.PASS_COMMENT),variables);
}
}
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
// @GlobalTransactional
public boolean saveDraft(PurchaseRequest bean) {
//是否新增数据
boolean isAdd = false;
if(bean!=null){
if(Func.isEmpty(bean.getId())){
isAdd = true;
}
//更新业务数据
saveOrUpdate(bean);
PurchaseRequestLine lineEntity = new PurchaseRequestLine();
lineEntity.setPurchaseRequestId(bean.getId());
lineService.remove(Condition.getQueryWrapper(lineEntity));
if(bean.getLineList()!=null&&!bean.getLineList().isEmpty()){
for(PurchaseRequestLine line : bean.getLineList()){
line.setPurchaseRequestId(bean.getId());
line.setNotUsedQuantity(line.getQuantity());
line.setUsedQuantity(new BigDecimal(0));
lineService.saveOrUpdate(line);
}
}
//更新附件信息
oaAttachmentService.saveOrUpdateOaAttachment(bean.getAttachments(),bean.getId(),bean.getProcessInstanceId(),bean.getTenantId(),"purchaseRequest");
}
return true;
}
/**
* 获取草稿列表
*/
@Override
public List<PurchaseRequest> getDraftList(PurchaseRequest bean){
bean.setTenantId(AuthUtil.getTenantId());
return baseMapper.getDraftList(bean);
};
/**
* 列表搜索
* @param bean
* @return
*/
@Override
public List<PurchaseRequestVO> search(PurchaseRequestVO bean){
bean.setTenantId(AuthUtil.getTenantId());
return baseMapper.search(bean);
}
/**
* 同意任务
* @param flow
* @return
*/
@Override
public boolean completeTask(BladeFlow flow,PurchaseRequest bean) {
String taskId = flow.getTaskId();
String processInstanceId = flow.getProcessInstanceId();
String comment = Func.toStr(flow.getComment(), ProcessConstant.PASS_COMMENT);
// 创建变量
Map<String, Object> variables = flow.getVariables();
if (variables == null) {
variables = Kv.create();
}
variables.put(ProcessConstant.PASS_KEY, flow.isPass());
if("purchaseManagerTask".equals(flow.getTaskDefinitionKey())){
PurchaseRequest entity = new PurchaseRequest();
entity.setId( bean.getId());
entity.setPurchaseUser(bean.getPurchaseUser());
entity.setPurchaseUserName(bean.getPurchaseUserName());
updateById(entity);
variables.put("purchaseSkip",Func.isEmpty(bean.getPurchaseUser()));
variables.put("purchaseUser",TaskUtil.getTaskUser(String.valueOf(bean.getPurchaseUser())));
}
flowClient.completeTask(taskId,processInstanceId,comment,variables);
return true;
}
/**
* 获取流程任务信息
* @param taskUser 当前流程用户
* @param processInstanceId 流程实例id
*/
public BladeFlow taskInfo(String taskUser,String processInstanceId){
R<BladeFlow> rFlow = flowClient.taskInfo(taskUser,processInstanceId);
if(rFlow!=null){
return rFlow.getData();
}
return null;
}
/**
* 作废任务
* @param businessId
* @param processInstanceId
* @param reason 作废原因
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean cancellation(String businessId, String processInstanceId, String reason) {
log.info("采购申请单作废businessId===="+businessId+"--processInstanceId===="+processInstanceId+"---reason==="+reason);
boolean flag=removeById(Long.valueOf(businessId));
log.info("flag======"+flag);
if(flag){
flag=flowClient.deleteTask(processInstanceId,reason).isSuccess();
}else {
flag=false;
}
return flag;
}
}
标签:anti ret table 等于 size oba 总经理 action class
原文地址:https://www.cnblogs.com/xianz666/p/14744573.html