feat(bpm): 新增流程定义使用权限功能
- 在 BpmProcessDefinitionExtDO 中添加 dataScope、dataScopeDeptIds 和 dataScopeUserIds 字段 - 实现流程定义使用权限的更新接口- 修改流程定义列表查询逻辑,根据用户权限进行过滤 -优化流程定义查询接口,返回更详细的信息
This commit is contained in:
parent
d1e94a0d3d
commit
4900d87c40
@ -18,12 +18,14 @@ public enum BpmTaskRuleScriptEnum {
|
||||
LEADER_X1(20L, "流程发起人的一级领导"),
|
||||
LEADER_X2(21L, "流程发起人的二级领导"),
|
||||
LEADER_X3(22L, "流程发起人的三级领导"),
|
||||
LEADER_X4(23L, "审批人的上级领导"),
|
||||
LEADER_X4(23L, "发起人的上级领导"),
|
||||
LEADER_X5(24L, "调岗部门领导"),
|
||||
LEADER_X6(25L, "分配任务的责任人"),
|
||||
LEADER_X7(26L, "入职部门领导"),
|
||||
LEADER_X8(27L, "调薪部门领导"),
|
||||
LEADER_X9(28L, "调薪人上级领导");
|
||||
LEADER_X9(28L, "调薪人上级领导"),
|
||||
LEADER_X10(29L, "所选工厂的领导"),
|
||||
LEADER_X11(30L, "审批人的上级领导");
|
||||
|
||||
/**
|
||||
* 脚本编号
|
||||
|
@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.*;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
|
||||
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
@ -12,6 +14,7 @@ import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -61,4 +64,21 @@ public class BpmProcessDefinitionController {
|
||||
String bpmnXML = bpmDefinitionService.getProcessDefinitionBpmnXML(id);
|
||||
return success(bpmnXML);
|
||||
}
|
||||
|
||||
@PutMapping ("/update-scope")
|
||||
@Operation(summary = "修改流程定义的 Scope")
|
||||
public CommonResult<Boolean> updateProcessDefinitionScope(@Valid @RequestBody DefinitionScopeVO scopeVO) {
|
||||
bpmDefinitionService.updateProcessDefinitionScope(scopeVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping ("/get")
|
||||
@Operation(summary = "获得流程定义")
|
||||
@Parameter(name = "processDefinitionId", description = "流程定义编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
|
||||
public CommonResult<DefinitionScopeVO> getProcessDefinition(@RequestParam("processDefinitionId") String processDefinitionId) {
|
||||
|
||||
BpmProcessDefinitionExtDO definitionExtDO = bpmDefinitionService.getProcessDefinitionExt(processDefinitionId);
|
||||
return success(BeanUtils.toBean(definitionExtDO, DefinitionScopeVO.class));
|
||||
}
|
||||
}
|
||||
|
@ -16,6 +16,9 @@ public class BpmProcessDefinitionRespVO {
|
||||
@Schema(description = "版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
private Integer version;
|
||||
|
||||
@Schema(description = "流程Key")
|
||||
private String key;
|
||||
|
||||
@Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
|
||||
@NotEmpty(message = "流程名称不能为空")
|
||||
private String name;
|
||||
|
@ -0,0 +1,25 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.List;
|
||||
|
||||
@Schema(description = "管理后台 - 流程定义的 ScopeVO")
|
||||
@Data
|
||||
public class DefinitionScopeVO {
|
||||
|
||||
@Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||
@NotNull(message = "流程定义的编号不能为空")
|
||||
private String processDefinitionId;
|
||||
|
||||
@Schema(description = "使用权限范围 | 1全员 2指定部门 3指定用户", example = "1")
|
||||
private Integer dataScope;
|
||||
|
||||
@Schema(description = "使用权限范围 | 指定部门编号数组", example = "1,2,3")
|
||||
private List<Long> dataScopeDeptIds;
|
||||
|
||||
@Schema(description = "使用权限范围 | 指定用户编号数组", example = "1,2,3")
|
||||
private List<Long> dataScopeUserIds;
|
||||
}
|
@ -8,6 +8,8 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAImprestDO;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAImprestService;
|
||||
import cn.iocoder.yudao.module.system.api.bank.BankApi;
|
||||
import cn.iocoder.yudao.module.system.api.bank.dto.BankRespDTO;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@ -38,6 +40,9 @@ public class BpmOAImprestController {
|
||||
@Resource
|
||||
private BankApi bankApi;
|
||||
|
||||
@Resource
|
||||
private DeptApi deptApi;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建请求申请")
|
||||
public CommonResult<Long> createImprest(@Valid @RequestBody BpmOAImprestCreateReqVO createReqVO) {
|
||||
@ -52,14 +57,18 @@ public class BpmOAImprestController {
|
||||
|
||||
BpmOAImprestDO imprest = imprestService.getImprest(id);
|
||||
BpmOAImprestRespVO respVO = BpmOAImprestConvert.INSTANCE.convert(imprest);
|
||||
if (respVO != null && imprest.getBankId() != null) {
|
||||
if (respVO != null) {
|
||||
// 获取收款账号信息
|
||||
BankRespDTO bankRespDTO = bankApi.getBank(imprest.getBankId()).getCheckedData();
|
||||
BankRespDTO bankRespDTO = bankApi.getBank(respVO.getBankId()).getCheckedData();
|
||||
if (bankRespDTO != null) {
|
||||
respVO.setBankName(bankRespDTO.getBankName());
|
||||
respVO.setNickname(bankRespDTO.getNickname());
|
||||
respVO.setBankNo(bankRespDTO.getBankNo());
|
||||
}
|
||||
|
||||
// 获取公司信息
|
||||
DeptRespDTO company = deptApi.getDept(respVO.getCompanyId()).getCheckedData();
|
||||
respVO.setCompanyName(company.getName());
|
||||
}
|
||||
|
||||
return success(respVO);
|
||||
@ -99,6 +108,10 @@ public class BpmOAImprestController {
|
||||
respVO.setNickname(bankRespDTO.getNickname());
|
||||
respVO.setBankNo(bankRespDTO.getBankNo());
|
||||
}
|
||||
|
||||
// 获取公司信息
|
||||
DeptRespDTO company = deptApi.getDept(respVO.getCompanyId()).getCheckedData();
|
||||
respVO.setCompanyName(company.getName());
|
||||
}
|
||||
|
||||
return success(respVO);
|
||||
|
@ -5,7 +5,9 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.loan.BpmOALoanCreateReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.loan.BpmOALoanRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.financialpayment.FinancialPaymentDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALoanDO;
|
||||
import cn.iocoder.yudao.module.bpm.service.financialpayment.FinancialPaymentService;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOALoanService;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.FactoryInfoApi;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.dto.FactoryInfoDTO;
|
||||
@ -31,8 +33,7 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
|
||||
/**
|
||||
@ -64,6 +65,9 @@ public class BpmOALoanController {
|
||||
@Resource
|
||||
private FactoryInfoApi factoryInfoApi;
|
||||
|
||||
@Resource
|
||||
private FinancialPaymentService financialPaymentService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建借支申请")
|
||||
public CommonResult<Long> createLoan(@Valid @RequestBody BpmOALoanCreateReqVO createReqVO) {
|
||||
@ -146,6 +150,10 @@ public class BpmOALoanController {
|
||||
List<BpmOALoanRespVO> respVOS = BeanUtils.toBean(loanList, BpmOALoanRespVO.class);
|
||||
if (CollUtil.isNotEmpty(respVOS)) {
|
||||
|
||||
// 获取支付信息
|
||||
List<String> processInstanceIds = convertList(loanList, BpmOALoanDO::getProcessInstanceId);
|
||||
Map<String, FinancialPaymentDO> financialPayments = convertMap(financialPaymentService.getFinancialPaymentList(processInstanceIds), FinancialPaymentDO::getProcessInstanceId);
|
||||
|
||||
// 获取申请人信息
|
||||
Set<Long> userIds = convertSet(loanList, BpmOALoanDO::getUserId);
|
||||
Map<Long, AdminUserRespDTO> userMap = userApi.getUserMap(userIds);
|
||||
@ -165,6 +173,8 @@ public class BpmOALoanController {
|
||||
item.setSfUserName(loanUserMap.get(item.getSfUserId()).getNickName());
|
||||
// 设置借支用户部门名称
|
||||
item.setFactoryName(factoryMap.get(item.getFactoryId()).getName());
|
||||
// 设置支付状态
|
||||
item.setStatus(financialPayments.containsKey(item.getProcessInstanceId()) ? financialPayments.get(item.getProcessInstanceId()).getStatus() : 2);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -84,6 +84,8 @@ public class BpmOAPaymentController {
|
||||
@Parameter(name = "type", description = "付款类型", required = true, example = "1")
|
||||
public CommonResult<List<BpmOAPaymentRespVO>> getPayment(@RequestParam("type") Integer type) {
|
||||
|
||||
List<BpmOAPaymentRespVO> list = paymentService.getPaymentList(type);
|
||||
|
||||
return success(paymentService.getPaymentList(type));
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,10 @@ public class BpmOAImprestCreateReqVO {
|
||||
@NotNull(message = "费用事由不能为空")
|
||||
private String reason;
|
||||
|
||||
@Schema(description = "付款公司编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "付款公司编号不能为空")
|
||||
private Long companyId;
|
||||
|
||||
@Schema(description = "费用金额", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "费用金额不能为空")
|
||||
private BigDecimal amount;
|
||||
|
@ -44,6 +44,12 @@ public class BpmOAImprestRespVO extends BpmOABaseRespVO {
|
||||
@NotNull(message = "费用事由不能为空")
|
||||
private String reason;
|
||||
|
||||
@Schema(description = "付款公司编号")
|
||||
private Long companyId;
|
||||
|
||||
@Schema(description = "付款公司名称")
|
||||
private String companyName;
|
||||
|
||||
@Schema(description = "费用金额", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "费用金额不能为空")
|
||||
private BigDecimal amount;
|
||||
|
@ -54,4 +54,7 @@ public class BpmOALoanRespVO extends BpmOABaseRespVO {
|
||||
|
||||
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private List<UploadUserFile> fileItems;
|
||||
|
||||
@Schema(description = "支付状态 | 0待支付 1分批支付中 2已支付 3拒绝")
|
||||
private Integer status;
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOABaseRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.cash.BpmOACashRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.payment.BpmOAPaymentRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement.BpmOAReimbursementRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@ -30,11 +31,39 @@ public class BpmOAPrintDataRespVO extends BpmOABaseRespVO {
|
||||
@Schema(description = "流程审批节点信息【包含人员签名地址】")
|
||||
List<BpmTaskRespVO> processTasks ;
|
||||
|
||||
/**
|
||||
* 发起流程的用户
|
||||
*/
|
||||
private User startUser;
|
||||
|
||||
/**
|
||||
* 抄送用户信息
|
||||
*/
|
||||
private List<CCUser> ccUsers;
|
||||
|
||||
@Schema(description = "用户信息")
|
||||
@Data
|
||||
public static class User {
|
||||
|
||||
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
|
||||
private String nickname;
|
||||
|
||||
@Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
private Long deptId;
|
||||
|
||||
@Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部")
|
||||
private String deptName;
|
||||
|
||||
@Schema(description = "公司编号")
|
||||
private Long companyId;
|
||||
|
||||
@Schema(description = "公司名称")
|
||||
private String companyName;
|
||||
}
|
||||
|
||||
@Schema(description = "抄送用户信息")
|
||||
@Data
|
||||
public static class CCUser {
|
||||
|
@ -54,14 +54,21 @@ public class BpmProcessInstanceRespVO {
|
||||
|
||||
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
|
||||
private String nickname;
|
||||
|
||||
@Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
private Long deptId;
|
||||
|
||||
@Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部")
|
||||
private String deptName;
|
||||
|
||||
@Schema(description = "公司编号")
|
||||
private Long companyId;
|
||||
|
||||
@Schema(description = "公司名称")
|
||||
private String companyName;
|
||||
}
|
||||
|
||||
@Schema(description = "流程定义信息")
|
||||
|
@ -97,7 +97,7 @@ public interface BpmProcessInstanceConvert {
|
||||
|
||||
default BpmProcessInstanceRespVO convert2(HistoricProcessInstance processInstance, BpmProcessInstanceExtDO processInstanceExt,
|
||||
ProcessDefinition processDefinition, BpmProcessDefinitionExtDO processDefinitionExt,
|
||||
String bpmnXml, AdminUserRespDTO startUser, DeptRespDTO dept) {
|
||||
String bpmnXml, AdminUserRespDTO startUser, DeptRespDTO dept, DeptRespDTO companyDept) {
|
||||
BpmProcessInstanceRespVO respVO = convert2(processInstance);
|
||||
copyTo(processInstanceExt, respVO);
|
||||
respVO.setBusinessKey(processInstance.getBusinessKey()) ;
|
||||
@ -111,6 +111,12 @@ public interface BpmProcessInstanceConvert {
|
||||
if (dept != null) {
|
||||
respVO.getStartUser().setDeptName(dept.getName());
|
||||
}
|
||||
if (companyDept != null) {
|
||||
// 设置用户所属公司编号
|
||||
respVO.getStartUser().setCompanyId(companyDept.getId());
|
||||
// 设置用户所属公司名称
|
||||
respVO.getStartUser().setCompanyName(companyDept.getName());
|
||||
}
|
||||
}
|
||||
return respVO;
|
||||
}
|
||||
|
@ -90,4 +90,21 @@ public class BpmProcessDefinitionExtDO extends BaseDO {
|
||||
* 流程图标路径地址
|
||||
*/
|
||||
private String processImg ;
|
||||
|
||||
/**
|
||||
* 使用权限范围 | 1全员 2指定部门 3指定用户
|
||||
*/
|
||||
private Integer dataScope;
|
||||
|
||||
/**
|
||||
* 使用权限 指定部门数组
|
||||
*/
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private List<Long> dataScopeDeptIds;
|
||||
|
||||
/**
|
||||
* 使用权限 指定用户数组
|
||||
*/
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private List<Long> dataScopeUserIds;
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ public class FinancialPaymentDO extends BaseDO {
|
||||
*/
|
||||
private String reason;
|
||||
/**
|
||||
* 流程类型 1现金支出 2备用金 3采购付款 4报销 5供应商采购付款 6开支日报
|
||||
* 流程类型 1现金支出 2备用金 3采购付款 4报销 5付款申请 6薪资付款 7借支申请 8供应商采购付款
|
||||
*/
|
||||
private Integer type;
|
||||
/**
|
||||
|
@ -65,6 +65,11 @@ public class BpmOAImprestDO extends BaseDO {
|
||||
*/
|
||||
private String reason;
|
||||
|
||||
/**
|
||||
* 付款公司编号
|
||||
*/
|
||||
private Long companyId;
|
||||
|
||||
/**
|
||||
* 申请金额
|
||||
*/
|
||||
|
@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.payment.BpmOAPaymentPa
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.payment.BpmOAPaymentRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAPaymentDO;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
@ -15,7 +16,9 @@ import java.util.List;
|
||||
@Mapper
|
||||
public interface BpmOAPaymentMapper extends BaseMapperX<BpmOAPaymentDO> {
|
||||
|
||||
List<BpmOAPaymentRespVO> selectPaymentList(@Param("type") Integer type);
|
||||
List<BpmOAPaymentRespVO> selectPaymentList(@Param("type") Integer type,
|
||||
@Param("deptId") Long deptId,
|
||||
@Param("method") Integer method);
|
||||
|
||||
default PageResult<BpmOAPaymentDO> selectTicketsPage(BpmOAPaymentPageReqVO pageReqVO, Long userId) {
|
||||
|
||||
|
@ -0,0 +1,82 @@
|
||||
package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum;
|
||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.runtime.ProcessInstance;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
|
||||
import static java.util.Collections.emptySet;
|
||||
|
||||
/**
|
||||
* 分配给审批人的上级领导 审批的 Script 实现类
|
||||
*/
|
||||
@Component
|
||||
public class BpmTaskAssignLeaderScript implements BpmTaskAssignScript {
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private DeptApi deptApi;
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private AdminUserApi userApi;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmProcessInstanceService bpmProcessInstanceService;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmTaskService bpmTaskService ;
|
||||
|
||||
@Override
|
||||
public Set<Long> calculateTaskCandidateUsers(DelegateExecution execution) {
|
||||
|
||||
ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(execution.getProcessInstanceId());
|
||||
List<BpmTaskRespVO> bpmTaskRespVOs = bpmTaskService.getTaskListByProcessInstanceId(processInstance.getProcessInstanceId());
|
||||
if (CollUtil.isEmpty(bpmTaskRespVOs)) {
|
||||
return emptySet();
|
||||
}
|
||||
|
||||
// 获取最后一个Task任务相关数据
|
||||
BpmTaskRespVO bpmTaskRespVO = bpmTaskRespVOs.get(0) ;
|
||||
Long assigneeUserId = bpmTaskRespVO.getAssigneeUser().getId();
|
||||
|
||||
// 获取审批人部门信息
|
||||
DeptRespDTO dept = getUserDept(assigneeUserId);
|
||||
if (dept == null || dept.getParentId() == null) {
|
||||
return emptySet();
|
||||
}
|
||||
// 获取审批人的上级部门信息
|
||||
DeptRespDTO assignDept = deptApi.getDept(dept.getParentId()).getCheckedData();
|
||||
|
||||
return assignDept != null && assignDept.getLeaderUserId() != null ? asSet(assignDept.getLeaderUserId()) : emptySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BpmTaskRuleScriptEnum getEnum() {
|
||||
return BpmTaskRuleScriptEnum.LEADER_X11;
|
||||
}
|
||||
|
||||
private DeptRespDTO getUserDept(Long userId) {
|
||||
AdminUserRespDTO user = userApi.getUser(userId).getCheckedData();
|
||||
if (user.getDeptId() == null) { // 找不到部门,所以无法使用该规则
|
||||
return null;
|
||||
}
|
||||
return deptApi.getDept(user.getDeptId()).getCheckedData();
|
||||
}
|
||||
}
|
@ -13,9 +13,11 @@ import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.runtime.ProcessInstance;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.awt.event.PaintEvent;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@ -23,18 +25,18 @@ import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
|
||||
import static java.util.Collections.emptySet;
|
||||
|
||||
/**
|
||||
* 分配给审批人的上级领导 审批的 Script 实现类
|
||||
* 分配给发起人的上级领导 审批的 Script 实现类
|
||||
*
|
||||
|
||||
*/
|
||||
@Component
|
||||
public class BpmTaskCurrentAssignLeaderScript extends BpmTaskAssignLeaderAbstractScript {
|
||||
|
||||
@Resource
|
||||
private AdminUserApi userApi;
|
||||
|
||||
@Resource
|
||||
private AdminUserApi adminUserApi;
|
||||
@Resource
|
||||
private DeptApi deptApi;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmProcessInstanceService bpmProcessInstanceService;
|
||||
@ -43,6 +45,10 @@ public class BpmTaskCurrentAssignLeaderScript extends BpmTaskAssignLeaderAbstrac
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmTaskService bpmTaskService ;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
|
||||
@Override
|
||||
public Set<Long> calculateTaskCandidateUsers(DelegateExecution execution) {
|
||||
// 获得发起人
|
||||
@ -51,12 +57,17 @@ public class BpmTaskCurrentAssignLeaderScript extends BpmTaskAssignLeaderAbstrac
|
||||
if (CollUtil.isEmpty(bpmTaskRespVOs)) {
|
||||
return emptySet();
|
||||
}
|
||||
Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId());
|
||||
|
||||
//获取最后一个Task任务相关数据
|
||||
// 获取最后一个Task任务相关数据
|
||||
BpmTaskRespVO bpmTaskRespVO = bpmTaskRespVOs.get(0) ;
|
||||
Long assigneeUserId = bpmTaskRespVO.getAssigneeUser().getId() ;
|
||||
Long assigneeUserId = bpmTaskRespVO.getAssigneeUser().getId();
|
||||
|
||||
// 获取审批节点当前的 审批部门信息
|
||||
String key = "assignee_dept_" + processInstance.getId();
|
||||
String deptId = stringRedisTemplate.opsForValue().get(key);
|
||||
if (deptId == null) {
|
||||
|
||||
Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId());
|
||||
// 获得对应 发起人 的部门
|
||||
DeptRespDTO dept = getUserDept(startUserId);
|
||||
if (dept == null) { // 找不到发起人的部门,所以无法使用该规则
|
||||
@ -81,6 +92,7 @@ public class BpmTaskCurrentAssignLeaderScript extends BpmTaskAssignLeaderAbstrac
|
||||
if (parentDept == null) { // 找不到父级部门,所以只好结束寻找。原因是:例如说,级别比较高的人,所在部门层级比较少
|
||||
return emptySet();
|
||||
}
|
||||
|
||||
if (!parentDept.getLeaderUserId().toString().equals(assigneeUserId.toString())){ //如果发起人上级部门负责人不为当前审批人时
|
||||
|
||||
dept = parentDept;
|
||||
@ -96,20 +108,26 @@ public class BpmTaskCurrentAssignLeaderScript extends BpmTaskAssignLeaderAbstrac
|
||||
}
|
||||
|
||||
return dept.getLeaderUserId() != null ? asSet(dept.getLeaderUserId()) : emptySet();
|
||||
}
|
||||
|
||||
// //获取最后一个Task任务相关数据
|
||||
// BpmTaskRespVO bpmTaskRespVO = bpmTaskRespVOs.get(0) ;
|
||||
// Long assigneeUserId = bpmTaskRespVO.getAssigneeUser().getId() ;
|
||||
// // 获取当前审批用户的部门信息
|
||||
// DeptRespDTO dept = getUserDept(assigneeUserId);
|
||||
// if (dept == null) { // 找不到发起人的部门,所以无法使用该规则
|
||||
// return emptySet();
|
||||
// }
|
||||
// DeptRespDTO parentDept = deptApi.getDept(dept.getParentId()).getCheckedData();
|
||||
// if (parentDept == null) { // 找不到父级部门。原因是:人的所属部门配在了最高节点了
|
||||
// return emptySet();
|
||||
// }
|
||||
// return parentDept.getLeaderUserId() != null ? asSet(parentDept.getLeaderUserId()) : emptySet();
|
||||
DeptRespDTO assigneeDept = deptApi.getDept(Long.valueOf(deptId)).getCheckedData();
|
||||
if (assigneeDept == null) {
|
||||
return emptySet();
|
||||
}
|
||||
|
||||
// 判断当前审批人是不是 当前审批部门的负责人
|
||||
if (!assigneeUserId.equals(assigneeDept.getLeaderUserId())) {
|
||||
return asSet(assigneeDept.getLeaderUserId());
|
||||
}else {
|
||||
|
||||
// 获得上级部门信息
|
||||
DeptRespDTO parentDept = deptApi.getDept(assigneeDept.getParentId()).getCheckedData();
|
||||
if (parentDept != null) {
|
||||
// 更新审批部门缓存
|
||||
stringRedisTemplate.opsForValue().set(key, parentDept.getId().toString());
|
||||
}
|
||||
return parentDept != null && parentDept.getLeaderUserId() != null ? asSet(parentDept.getLeaderUserId()) : emptySet();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -118,7 +136,7 @@ public class BpmTaskCurrentAssignLeaderScript extends BpmTaskAssignLeaderAbstrac
|
||||
}
|
||||
|
||||
private DeptRespDTO getUserDept(Long userId) {
|
||||
AdminUserRespDTO user = adminUserApi.getUser(userId).getCheckedData();
|
||||
AdminUserRespDTO user = userApi.getUser(userId).getCheckedData();
|
||||
if (user.getDeptId() == null) { // 找不到部门,所以无法使用该规则
|
||||
return null;
|
||||
}
|
||||
|
@ -50,20 +50,15 @@ public class BpmTaskEntryLeaderScript implements BpmTaskAssignScript {
|
||||
return emptySet();
|
||||
}
|
||||
|
||||
//根据流程实例ID 取到调岗流程表单
|
||||
//根据流程实例ID 取到入职流程表单
|
||||
BpmOAEntryDO entryDO = entryService.getEntry(Long.valueOf(processInstance.getBusinessKey()));
|
||||
//获取调岗部门ID
|
||||
//获取入职部门ID
|
||||
Long deptId = entryDO.getEntryDeptId();
|
||||
|
||||
//根据部门ID 获取部门信息
|
||||
DeptRespDTO dept = deptApi.getDept(deptId).getCheckedData();
|
||||
if (dept.getLevel() > 3) { //判断部门层级
|
||||
|
||||
String[] flag = dept.getFlag().split("-");
|
||||
dept = deptApi.getDept(Long.valueOf(flag[3])).getCheckedData();
|
||||
}
|
||||
|
||||
return dept.getLeaderUserId() != null ? asSet(dept.getLeaderUserId()) : emptySet();
|
||||
return dept != null && dept.getLeaderUserId() != null ? asSet(dept.getLeaderUserId()) : emptySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -0,0 +1,110 @@
|
||||
package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAExpensesItemDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALoanDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOASalaryDO;
|
||||
import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAExpensesService;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOALoanService;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOASalaryService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.runtime.ProcessInstance;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
|
||||
import static java.util.Collections.emptySet;
|
||||
|
||||
/**
|
||||
* 分配给所选工厂的领导 审批的 Script 实现类
|
||||
*/
|
||||
@Component
|
||||
public class BpmTaskFactoryLeaderScript extends BpmTaskAssignLeaderAbstractScript {
|
||||
|
||||
@Resource
|
||||
private AdminUserApi userApi;
|
||||
|
||||
@Resource
|
||||
private DeptApi deptApi;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmProcessInstanceService bpmProcessInstanceService;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmTaskService bpmTaskService;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmOAExpensesService expensesService;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmOALoanService loanService;
|
||||
|
||||
@Override
|
||||
public Set<Long> calculateTaskCandidateUsers(DelegateExecution execution) {
|
||||
// 获得发起人
|
||||
ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(execution.getProcessInstanceId());
|
||||
List<BpmTaskRespVO> bpmTaskRespVOs = bpmTaskService.getTaskListByProcessInstanceId(processInstance.getProcessInstanceId());
|
||||
if (CollUtil.isEmpty(bpmTaskRespVOs)) {
|
||||
return emptySet();
|
||||
}
|
||||
|
||||
DeptRespDTO dept = null;
|
||||
switch (processInstance.getProcessDefinitionKey()) {
|
||||
case "oa_expenses_2":
|
||||
// 根据流程实例ID 取到开支日报流程表单
|
||||
List<BpmOAExpensesItemDO> expensesItems = expensesService.getExpensesItem(Long.valueOf(processInstance.getBusinessKey()));
|
||||
// 获取开支所属工厂信息
|
||||
if (CollUtil.isNotEmpty(expensesItems)) {
|
||||
|
||||
DeptRespDTO factory = deptApi.getDeptByFactoryId(expensesItems.get(0).getDeptId()).getCheckedData();
|
||||
// 获取工厂上级部门信息
|
||||
dept = deptApi.getDept(factory.getParentId()).getCheckedData();
|
||||
}
|
||||
break;
|
||||
case "oa_loan_2":
|
||||
// 根据流程实例ID 取到借支流程表单
|
||||
BpmOALoanDO loanDO = loanService.getLoan(Long.valueOf(processInstance.getBusinessKey()));
|
||||
|
||||
if (loanDO != null) {
|
||||
// 获取借支工厂信息
|
||||
DeptRespDTO factory = deptApi.getDeptByFactoryId(loanDO.getFactoryId()).getCheckedData();
|
||||
// 获取工厂上级部门信息
|
||||
dept = deptApi.getDept(factory.getParentId()).getCheckedData();
|
||||
}
|
||||
break;
|
||||
case "oa_salary_2":
|
||||
// 获取发起人的部门信息
|
||||
AdminUserRespDTO userRespDTO = userApi.getUser(Long.valueOf(processInstance.getStartUserId())).getCheckedData();
|
||||
DeptRespDTO deptRespDTO = deptApi.getDept(userRespDTO.getDeptId()).getCheckedData();
|
||||
|
||||
// 判断是否是属于工厂部门
|
||||
if (deptRespDTO.getFactoryId() != null) {
|
||||
dept = deptApi.getDept(deptRespDTO.getParentId()).getCheckedData();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return dept != null && dept.getLeaderUserId() != null ? asSet(dept.getLeaderUserId()) : emptySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BpmTaskRuleScriptEnum getEnum() {
|
||||
return BpmTaskRuleScriptEnum.LEADER_X10;
|
||||
}
|
||||
}
|
@ -160,4 +160,10 @@ public interface BpmProcessDefinitionService {
|
||||
* @return 流程定义列表
|
||||
*/
|
||||
List<BpmProcessDefinitionSimpleVO> getProcessDefinitionSimpleList(BpmProcessDefinitionListReqVO reqVO);
|
||||
|
||||
/**
|
||||
* 更新流程定义的权限范围
|
||||
* @param scopeVO 更新信息
|
||||
*/
|
||||
void updateProcessDefinitionScope(DefinitionScopeVO scopeVO);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
||||
import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.*;
|
||||
import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert;
|
||||
@ -14,6 +15,8 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitio
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper;
|
||||
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.converter.BpmnXMLConverter;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
@ -33,10 +36,8 @@ import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH;
|
||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH;
|
||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
|
||||
import static java.util.Collections.emptyList;
|
||||
|
||||
/**
|
||||
@ -66,6 +67,9 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
||||
@Resource
|
||||
private DeptApi deptApi;
|
||||
|
||||
@Resource
|
||||
private AdminUserApi userApi;
|
||||
|
||||
@Override
|
||||
public ProcessDefinition getProcessDefinition(String id) {
|
||||
return repositoryService.getProcessDefinition(id);
|
||||
@ -160,6 +164,24 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProcessDefinitionScope(DefinitionScopeVO scopeVO) {
|
||||
// 校验流程定义是否存在
|
||||
BpmProcessDefinitionExtDO definitionExtDO = processDefinitionMapper.selectByProcessDefinitionId(scopeVO.getProcessDefinitionId());
|
||||
if (definitionExtDO == null) {
|
||||
throw exception(PROCESS_DEFINITION_NOT_EXISTS);
|
||||
}
|
||||
|
||||
BpmProcessDefinitionExtDO updateDO = new BpmProcessDefinitionExtDO();
|
||||
updateDO.setId(definitionExtDO.getId());
|
||||
updateDO.setDataScope(scopeVO.getDataScope());
|
||||
updateDO.setDataScopeDeptIds(scopeVO.getDataScopeDeptIds());
|
||||
updateDO.setDataScopeUserIds(scopeVO.getDataScopeUserIds());
|
||||
|
||||
// 更新
|
||||
processDefinitionMapper.updateById(updateDO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) {
|
||||
// 创建 Deployment 部署
|
||||
@ -288,11 +310,24 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// 获取当前登录用户信息
|
||||
AdminUserRespDTO userRespDTO = userApi.getUser(getLoginUserId()).getCheckedData();
|
||||
|
||||
// 获得 BpmProcessDefinitionDO Map
|
||||
List<BpmProcessDefinitionExtDO> processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds(
|
||||
convertList(processDefinitions, ProcessDefinition::getId));
|
||||
List<BpmProcessDefinitionExtDO> processDefinitionDOs = processDefinitionMapper.selectList(new LambdaQueryWrapperX<BpmProcessDefinitionExtDO>()
|
||||
.inIfPresent(BpmProcessDefinitionExtDO::getProcessDefinitionId, convertList(processDefinitions, ProcessDefinition::getId))
|
||||
.eq(BpmProcessDefinitionExtDO::getDataScope, 1)
|
||||
.or()
|
||||
.like(BpmProcessDefinitionExtDO::getDataScopeDeptIds, userRespDTO.getDeptId())
|
||||
.or()
|
||||
.like(BpmProcessDefinitionExtDO::getDataScopeUserIds, userRespDTO.getId())
|
||||
);
|
||||
Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap = convertMap(processDefinitionDOs,
|
||||
BpmProcessDefinitionExtDO::getProcessDefinitionId);
|
||||
|
||||
// 移除 无权限的流程定义
|
||||
processDefinitions.removeIf(item -> !processDefinitionDOMap.containsKey(item.getId()));
|
||||
|
||||
// 执行查询,并返回
|
||||
return BpmProcessDefinitionConvert.INSTANCE.convertList3(processDefinitions, processDefinitionDOMap);
|
||||
}
|
||||
@ -331,5 +366,4 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
||||
return new PageResult<>(BpmProcessDefinitionConvert.INSTANCE.convertList(processDefinitions, deploymentMap,
|
||||
processDefinitionDOMap, formMap), definitionCount);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,8 +28,9 @@ import cn.iocoder.yudao.module.system.api.auth.AdminOauthUserOtherInfoApi;
|
||||
import cn.iocoder.yudao.module.system.api.auth.dto.AdminOauthUserOtherInfoApiDTO;
|
||||
import cn.iocoder.yudao.module.system.api.auth.vo.AdminOauthUserOtherInfoApiVO;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.loan.LoanApi;
|
||||
import cn.iocoder.yudao.module.system.api.loan.dto.LoanDTO;
|
||||
import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -37,6 +38,7 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@ -70,7 +72,7 @@ public class FinancialPaymentServiceImpl implements FinancialPaymentService {
|
||||
@Resource
|
||||
private SubscribeMessageSendApi subscribeMessageSendApi;
|
||||
@Resource
|
||||
private AdminUserApi userApi;
|
||||
private LoanApi loanApi;
|
||||
@Resource
|
||||
private BpmProcessInstanceExtMapper processInstanceExtMapper;
|
||||
@Resource
|
||||
@ -78,6 +80,15 @@ public class FinancialPaymentServiceImpl implements FinancialPaymentService {
|
||||
@Resource
|
||||
private AdminOauthUserOtherInfoApi adminOauthUserOtherInfoApi;
|
||||
|
||||
@Resource
|
||||
private BpmOALoanMapper loanMapper;
|
||||
|
||||
@Resource
|
||||
private BpmOAPaymentMapper paymentMapper;
|
||||
|
||||
@Resource
|
||||
private BpmOASalaryMapper salaryMapper;
|
||||
|
||||
@Override
|
||||
public Long createFinancialPayment(FinancialPaymentSaveVO vo) {
|
||||
FinancialPaymentItemSaveReqVO createReqVO = vo.getFinancialPaymentItemSaveReqVO();
|
||||
@ -103,16 +114,31 @@ public class FinancialPaymentServiceImpl implements FinancialPaymentService {
|
||||
// TODO: 2024/8/18 - 驳回该流程通过流程实例id 发消息通知发起人 - 更改状态
|
||||
financialPayment.setStatus(3);
|
||||
// -- 修改流程状态
|
||||
if (financialPayment.getType() == 1) {
|
||||
switch (financialPayment.getType()) {
|
||||
case 1:
|
||||
cashMapper.updateById(new BpmOACashDO().setId(financialPayment.getObjectId()).setResult(BpmProcessInstanceResultEnum.BACK.getResult()));
|
||||
} else if (financialPayment.getType() == 2) {
|
||||
break;
|
||||
case 2:
|
||||
imprestMapper.updateById(new BpmOAImprestDO().setId(financialPayment.getObjectId()).setResult(BpmProcessInstanceResultEnum.BACK.getResult()));
|
||||
} else if (financialPayment.getType() == 3) {
|
||||
break;
|
||||
case 3:
|
||||
oAProcurePayMapper.updateById(new BpmOAProcurePayDO().setId(financialPayment.getObjectId()).setResult(BpmProcessInstanceResultEnum.BACK.getResult()));
|
||||
} else if (financialPayment.getType() == 4) {
|
||||
break;
|
||||
case 4:
|
||||
reimbursementMapper.updateById(new BpmOAReimbursementDO().setId(financialPayment.getObjectId()).setResult(BpmProcessInstanceResultEnum.BACK.getResult()));
|
||||
} else if (financialPayment.getType() == 5) {
|
||||
break;
|
||||
case 5:
|
||||
paymentMapper.updateById(new BpmOAPaymentDO().setId(financialPayment.getObjectId()).setResult(BpmProcessInstanceResultEnum.BACK.getResult()));
|
||||
break;
|
||||
case 6:
|
||||
salaryMapper.updateById(new BpmOASalaryDO().setId(financialPayment.getObjectId()).setResult(BpmProcessInstanceResultEnum.BACK.getResult()));
|
||||
break;
|
||||
case 7:
|
||||
loanMapper.updateById(new BpmOALoanDO().setId(financialPayment.getObjectId()).setResult(BpmProcessInstanceResultEnum.BACK.getResult()));
|
||||
break;
|
||||
case 8:
|
||||
supplierPurchasePaymentMapper.updateById(new BpmOASupplierPurchasePaymentDO().setId(financialPayment.getObjectId()).setResult(BpmProcessInstanceResultEnum.BACK.getResult()));
|
||||
break;
|
||||
}
|
||||
BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(financialPayment.getProcessInstanceId())
|
||||
.setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
|
||||
@ -120,6 +146,22 @@ public class FinancialPaymentServiceImpl implements FinancialPaymentService {
|
||||
processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO);
|
||||
}
|
||||
this.updateById(financialPayment);
|
||||
|
||||
// 判断是借支申请时
|
||||
if (financialPayment.getType() == 7 && financialPayment.getStatus() == 2) {
|
||||
|
||||
// 获取借支信息
|
||||
BpmOALoanDO loanDO = loanMapper.selectById(financialPayment.getObjectId());
|
||||
|
||||
// 同步插入借支表中
|
||||
LoanDTO createDO = new LoanDTO()
|
||||
.setUserId(loanDO.getSfUserId())
|
||||
.setDeptId(loanDO.getFactoryId())
|
||||
.setAmount(loanDO.getTotalMoney())
|
||||
.setReturnAmount(BigDecimal.ZERO);
|
||||
loanApi.createLoan(createDO);
|
||||
}
|
||||
|
||||
// -- 获取发起人的openId
|
||||
AdminOauthUserOtherInfoApiVO item = adminOauthUserOtherInfoApi.getByCondition(
|
||||
new AdminOauthUserOtherInfoApiDTO().setUserIds(Collections.singletonList(financialPayment.getUserId()))
|
||||
|
@ -1,7 +1,5 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
|
||||
@ -9,37 +7,29 @@ import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.expenses.BpmOAExpensesCreateReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.expenses.BpmOAExpensesRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAExpensesConvert;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.financialpayment.FinancialPaymentDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAExpensesDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAExpensesItemDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAExpensesItemMapper;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAExpensesMapper;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import cn.iocoder.yudao.module.bpm.service.financialpayment.FinancialPaymentService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.system.api.bank.BankApi;
|
||||
import cn.iocoder.yudao.module.system.api.bank.dto.BankRespDTO;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import org.flowable.engine.runtime.ProcessInstance;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_EXPENSES_NOT_EXISTS;
|
||||
|
||||
@ -66,22 +56,12 @@ public class BpmOAExpensesServiceImpl extends BpmOABaseService implements BpmOAE
|
||||
@Resource
|
||||
private BpmProcessInstanceApi processInstanceApi;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmProcessInstanceService bpmProcessInstanceService;
|
||||
|
||||
@Resource
|
||||
private FinancialPaymentService financialPaymentService;
|
||||
|
||||
@Resource
|
||||
private DeptApi deptApi;
|
||||
|
||||
@Resource
|
||||
private BankApi bankApi;
|
||||
|
||||
@Resource
|
||||
private AdminUserApi userApi;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmHistoryProcessInstanceService historyProcessInstanceService;
|
||||
@ -131,41 +111,6 @@ public class BpmOAExpensesServiceImpl extends BpmOABaseService implements BpmOAE
|
||||
BpmOAExpensesDO expenses = validateLeaveExists(id);
|
||||
|
||||
expensesMapper.updateById(new BpmOAExpensesDO().setId(id).setResult(result));
|
||||
|
||||
// 获取现金支出明细
|
||||
List<BpmOAExpensesItemDO> expensesItemDOs = getExpensesItem(id);
|
||||
|
||||
List<Long> procureIds = new ArrayList<>();
|
||||
//审核通过 (最后节点)
|
||||
if (BpmProcessInstanceResultEnum.APPROVE.getResult().equals(result)) {
|
||||
|
||||
ProcessInstance instance = bpmProcessInstanceService.getProcessInstance(processInstanceId);
|
||||
|
||||
if (instance.isEnded()) {
|
||||
|
||||
String reason = expensesItemDOs.stream()
|
||||
.map(BpmOAExpensesItemDO::getDetail)
|
||||
.filter(StrUtil::isNotEmpty)
|
||||
.collect(Collectors.joining(","));
|
||||
|
||||
BpmProcessInstanceExtDO processInstance = bpmProcessInstanceService.getProcessInstanceDO(processInstanceId);
|
||||
CommonResult<AdminUserRespDTO> user = userApi.getUser(expenses.getUserId());
|
||||
// -- 插入到财务支付表中
|
||||
financialPaymentService.save(new FinancialPaymentDO()
|
||||
.setUserId(expenses.getUserId())
|
||||
.setDeptId(user.getData() == null ? null : user.getData().getDeptId())
|
||||
.setProcessInstanceId(expenses.getProcessInstanceId())
|
||||
.setProcessInstanceName(processInstance.getName())
|
||||
.setReason(reason)
|
||||
.setObjectId(id)
|
||||
.setType(6)
|
||||
.setStatus(0)
|
||||
.setAmountPayable(expenses.getTotalMoney())
|
||||
.setBeginTime(processInstance.getCreateTime())
|
||||
.setEndTime(processInstance.getEndTime())
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private BpmOAExpensesDO validateLeaveExists(Long id) {
|
||||
@ -207,7 +152,8 @@ public class BpmOAExpensesServiceImpl extends BpmOABaseService implements BpmOAE
|
||||
List<BpmOAExpensesItemDO> expensesItemDOs = getExpensesItem(expenses.getId());
|
||||
|
||||
//获取部门信息map
|
||||
Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(expensesItemDOs, BpmOAExpensesItemDO::getDeptId));
|
||||
List<DeptRespDTO> deptList = deptApi.getDeptByFactoryIds(convertSet(expensesItemDOs, BpmOAExpensesItemDO::getDeptId)).getCheckedData();
|
||||
Map<Long, DeptRespDTO> deptMap = convertMap(deptList, DeptRespDTO::getFactoryId);
|
||||
|
||||
// 获取银行卡信息
|
||||
BankRespDTO bankRespDTO = null;
|
||||
|
@ -1,6 +1,7 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
|
||||
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.imprest.BpmOAImprestCreateReqVO;
|
||||
@ -65,7 +66,8 @@ public class BpmOAImprestServiceImpl extends BpmOABaseService implements BpmOAIm
|
||||
public Long createImprest(Long userId, BpmOAImprestCreateReqVO createReqVO) {
|
||||
|
||||
//插入OA 备用金申请
|
||||
BpmOAImprestDO imprest = BpmOAImprestConvert.INSTANCE.convert(createReqVO).setUserId(userId)
|
||||
BpmOAImprestDO imprest = BeanUtils.toBean(createReqVO, BpmOAImprestDO.class)
|
||||
.setUserId(userId)
|
||||
.setStatus(BpmOAImprestDO.FLAG_FALSE)
|
||||
.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
|
||||
imprestMapper.insert(imprest);
|
||||
|
@ -1,25 +1,28 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.loan.BpmOALoanCreateReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.financialpayment.FinancialPaymentDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALoanDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALoanMapper;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import cn.iocoder.yudao.module.bpm.service.financialpayment.FinancialPaymentService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.system.api.loan.LoanApi;
|
||||
import cn.iocoder.yudao.module.system.api.loan.dto.LoanDTO;
|
||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||
import org.flowable.engine.runtime.ProcessInstance;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -51,7 +54,10 @@ public class BpmOALoanServiceImpl extends BpmOABaseService implements BpmOALoanS
|
||||
private BpmHistoryProcessInstanceService historyProcessInstanceService;
|
||||
|
||||
@Resource
|
||||
private LoanApi loanApi;
|
||||
private AdminUserApi userApi;
|
||||
|
||||
@Resource
|
||||
private FinancialPaymentService financialPaymentService;
|
||||
|
||||
|
||||
@Override
|
||||
@ -93,14 +99,24 @@ public class BpmOALoanServiceImpl extends BpmOABaseService implements BpmOALoanS
|
||||
if (BpmProcessInstanceResultEnum.APPROVE.getResult().equals(result)) {
|
||||
|
||||
ProcessInstance instance = processInstanceService.getProcessInstance(processInstanceId);
|
||||
|
||||
if (instance.isEnded()) {
|
||||
|
||||
// 同步插入借支表中
|
||||
LoanDTO createDO = new LoanDTO()
|
||||
.setAmount(loanDO.getTotalMoney())
|
||||
.setReturnAmount(BigDecimal.ZERO);
|
||||
loanApi.createLoan(createDO);
|
||||
BpmProcessInstanceExtDO processInstance = processInstanceService.getProcessInstanceDO(processInstanceId);
|
||||
// -- 插入到财务支付表中
|
||||
CommonResult<AdminUserRespDTO> user = userApi.getUser(loanDO.getUserId());
|
||||
financialPaymentService.save(new FinancialPaymentDO()
|
||||
.setUserId(loanDO.getUserId())
|
||||
.setDeptId(user.getData() == null ? null : user.getData().getDeptId())
|
||||
.setProcessInstanceId(loanDO.getProcessInstanceId())
|
||||
.setReason("")
|
||||
.setObjectId(id)
|
||||
.setType(7)
|
||||
.setStatus(0)
|
||||
.setAmountPayable(loanDO.getTotalMoney())
|
||||
.setProcessInstanceName(processInstance.getName())
|
||||
.setBeginTime(processInstance.getCreateTime())
|
||||
.setEndTime(processInstance.getEndTime())
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.oa;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.iocoder.yudao.framework.common.enums.DeptTypeEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
@ -34,6 +35,7 @@ import java.util.*;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_PAYMENT_FILES_NOT_NULL;
|
||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_PAYMENT_NOT_EXISTS;
|
||||
|
||||
@ -157,7 +159,17 @@ public class BpmOAPaymentServiceImpl extends BpmOABaseService implements BpmOAPa
|
||||
@Override
|
||||
public List<BpmOAPaymentRespVO> getPaymentList(Integer type) {
|
||||
|
||||
return paymentMapper.selectPaymentList(type);
|
||||
int method = 0;
|
||||
// 获取发起人的部门信息
|
||||
AdminUserRespDTO userDTO = userApi.getUser(getLoginUserId()).getCheckedData();
|
||||
DeptRespDTO deptDTO = deptApi.getDept(userDTO.getDeptId()).getCheckedData();
|
||||
|
||||
// 判断财务部门时,查询全部分批记录
|
||||
if (deptDTO != null && deptDTO.getType().equals(DeptTypeEnum.FINANCE_DEPT.getValue())) {
|
||||
method = 1;
|
||||
}
|
||||
|
||||
return paymentMapper.selectPaymentList(type, userDTO.getDeptId(), method);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -161,7 +161,7 @@ public class BpmOASupplierPurchasePaymentServiceImpl extends BpmOABaseService im
|
||||
.setProcessInstanceId(supplierPurchasePaymentDO.getProcessInstanceId())
|
||||
.setReason(supplierPurchasePaymentDO.getRemark())
|
||||
.setObjectId(id)
|
||||
.setType(5)
|
||||
.setType(8)
|
||||
.setStatus(0)
|
||||
.setAmountPayable(supplierPurchasePaymentDO.getTotalMoney())
|
||||
.setProcessInstanceName(processInstance.getName())
|
||||
|
File diff suppressed because one or more lines are too long
@ -13,10 +13,21 @@
|
||||
<select id="selectPaymentList" resultType="cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.payment.BpmOAPaymentRespVO">
|
||||
SELECT
|
||||
a.*,
|
||||
d.name as deptName,
|
||||
bank.nickname as nickname,
|
||||
bank.bank_no as bankNo,
|
||||
bank.bank_name as bankName,
|
||||
COALESCE(SUM( b.payment_ratio ), 0) + COALESCE(a.payment_ratio,0) AS ratio
|
||||
FROM
|
||||
bpm_oa_payment a
|
||||
<if test="method != 1">
|
||||
INNER JOIN system_users u
|
||||
ON u.id = a.user_id
|
||||
AND u.dept_id = #{deptId}
|
||||
</if>
|
||||
LEFT JOIN bpm_oa_payment b ON b.parent_id = a.id AND b.result = 2
|
||||
LEFT JOIN system_dept d ON d.id = a.dept_id
|
||||
LEFT JOIN system_bank bank ON bank.id = a.bank_id
|
||||
WHERE
|
||||
ISNULL( a.parent_id )
|
||||
AND a.result = 2
|
||||
|
Loading…
Reference in New Issue
Block a user