- 作者:老汪软件技巧
- 发表时间:2024-08-27 21:03
- 浏览量:
在工作流系统中,抄送功能类似于电子邮件的抄送功能,其主要目的是让抄送人知晓流程的情况,而不需要他们进行办理或审批。
工作流中的抄送功能通常支持两种模式:固定抄送和临时抄送。
固定抄送是在流程模板设计阶段预先设置好的,当流程流转到抄送任务时自动触发。而临时抄送则是在流程任务办理中,由办理人员根据需要临时选择一个或多个人员发起抄送任务。
抄送模式的应用情况:
审批流程:
- 当一个申请或报告需要经过多个部门的审批时,可以通过抄送功能让相关部门知晓流程进度,即使他们不直接参与审批。
信息共享:
- 在团队或部门间需要共享重要信息或文件时,通过抄送功能可以让相关人员及时了解信息,保证信息传递的透明度。
项目管理:
- 项目经理可以通过抄送功能将项目进度、变更信息同步给项目组成员,即使他们不是流程中的直接处理者。
客户服务:
- 在客户服务流程中,客服人员可以将客户的反馈或处理结果抄送给相关部门,以便团队协作解决问题。
财务管理:
- 财务报销、付款申请等流程中,抄送功能可以让申请人、审批人以及财务部门相关人员都能同步信息,确保流程的透明和效率。
人力资源:
- 在员工入职、离职、升职等流程中,抄送功能可以确保人力资源部门、员工直接上级、财务部门等相关方都能获得必要的信息。
合规监督:
- 对于需要符合特定法规或内部控制要求的流程,抄送功能可以帮助监督部门不直接干预流程的同时,保持对流程的监控。
任务协调:
- 在跨部门协作的任务中,通过抄送功能可以让所有涉及的部门或个人了解任务状态,促进协调工作。
决策记录:
- 在需要记录决策过程的场合,抄送可以作为决策通知的一部分,让所有利益相关人都有决策的记录。
审计追踪:
- 审计时,抄送的历史记录可以作为流程执行的证据,帮助审计人员追踪和验证流程的执行情况。
流程建模
在初审和终审,审批人员可以添加抄送人员信息,在审批结束后将生成抄送记录。
xml内容
"1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1g84ud8" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.10.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.19.0">
<bpmn:process id="Process_0c2xy42" name="请假流程" isExecutable="true">
<bpmn:startEvent id="StartEvent_1" camunda:initiator="start">
<bpmn:outgoing>Flow_0fq95hnbpmn:outgoing>
bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_0fq95hn" sourceRef="StartEvent_1" targetRef="Activity_0rbn70i" />
<bpmn:userTask id="Activity_0rbn70i" name="申请" camunda:assignee="${general}">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="days" label="请假天数" type="long" defaultValue="1" />
<camunda:formField id="reason" label=" 请假理由" type="string" defaultValue="回家" />
<camunda:formField id="type" label="请假类型" type="string" defaultValue="事假" />
<camunda:formField id="d" label="test" type="string" defaultValue="理由">
<camunda:properties />
<camunda:validation />
camunda:formField>
camunda:formData>
bpmn:extensionElements>
<bpmn:incoming>Flow_0fq95hnbpmn:incoming>
<bpmn:outgoing>Flow_01kvxy5bpmn:outgoing>
bpmn:userTask>
<bpmn:sequenceFlow id="Flow_01kvxy5" sourceRef="Activity_0rbn70i" targetRef="Activity_1rht9n2" />
<bpmn:userTask id="Activity_1rht9n2" name="初审" camunda:assignee="${guide}">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="comment" label="评论" type="string" defaultValue="good" />
<camunda:formField id="imageUrl" label="图片" type="string" />
camunda:formData>
<camunda:taskListener class="org.jeecg.modules.camunda.usertask.listener.CopyListener" event="complete" />
bpmn:extensionElements>
<bpmn:incoming>Flow_01kvxy5bpmn:incoming>
<bpmn:outgoing>Flow_1whul4kbpmn:outgoing>
bpmn:userTask>
<bpmn:sequenceFlow id="Flow_1whul4k" sourceRef="Activity_1rht9n2" targetRef="Activity_0n2qyol" />
<bpmn:userTask id="Activity_0n2qyol" name="终审" camunda:assignee="${leader}">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="comment" label="评论" type="string" defaultValue="ok" />
<camunda:formField id="pass" label="通过" type="boolean" defaultValue="true" />
<camunda:formField id="imageUrl" label="图片" type="string" />
camunda:formData>
<camunda:taskListener class="org.jeecg.modules.camunda.usertask.listener.CopyListener" event="complete" />
bpmn:extensionElements>
<bpmn:incoming>Flow_1whul4kbpmn:incoming>
<bpmn:outgoing>Flow_0f4i22kbpmn:outgoing>
bpmn:userTask>
<bpmn:endEvent id="Event_1i65d7z">
<bpmn:incoming>Flow_0f4i22kbpmn:incoming>
bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0f4i22k" sourceRef="Activity_0n2qyol" targetRef="Event_1i65d7z" />
<bpmn:textAnnotation id="TextAnnotation_1vu0v5p">
<bpmn:text>军师bpmn:text>
bpmn:textAnnotation>
<bpmn:association id="Association_07asc3h" sourceRef="Activity_1rht9n2" targetRef="TextAnnotation_1vu0v5p" />
bpmn:process>
bpmn:definitions>
上述建模中,在userTask设置了taskListener用于处理抄送逻辑
<camunda:taskListener class="org.jeecg.modules.camunda.usertask.listener.CopyListener" event="complete" />
CopyListener代码
@Slf4j
public class CopyListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
log.info("copy listener");
// 设置抄送人
Object obj = delegateTask.getVariable("copyUser");
if (obj != null) {
List copyUsers = Arrays.asList(obj.toString().split(","));
for (String user : copyUsers) {
//删除存在的抄送,避免重复抄送
delegateTask.deleteGroupIdentityLink(user, "cc");
delegateTask.addUserIdentityLink(user, "cc");
}
}
}
}
查询抄送给我的查询逻辑
public Page pageQueryMyCopy(LoginUser loginUser, Integer pageNo, Integer pageSize) {
int start = (pageNo - 1) * pageSize;
int offset = pageSize;
long count = historyService.createHistoricIdentityLinkLogQuery().userId(loginUser.getUsername()).type("cc").count();
if (count == 0) {
return new Page<>();
}
List historicIdentityLinkLogs = historyService.createHistoricIdentityLinkLogQuery()
.userId(loginUser.getUsername()).type("cc")
.orderByTime().desc().listPage(start, offset);
// 以上就是查询抄送给我的核心代码逻辑
}
抄送演示
在待我审批的菜单中,找到抄送的操作,将关羽加入抄送人员。然后完成审批动作。
审批通过之后,在我的已办菜单中将看到抄送的信息。
使用关羽的账号登陆系统,点击抄送给我的菜单,便可以看到抄送记录。
至此,完成整个抄送流程演示, 如果疑问请留言。如需要体验,请访问JeecgFlow