• 作者:老汪软件技巧
  • 发表时间: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