根据银行流水批量创建到款认领并根据角色查询所有员工ID并发送CRM消息通知

/**
 * @author 翘楚
 * @codeName 根据银行流水批量创建到款认领
 * @description 是否生成到款认款:否【true、false】
 */
def retSel = Fx.object.find("BankStatementObj",
        FQLAttribute.builder()
                .columns(["_id", "name", "arrival_date", "amount_received", "owner"])
                .queryTemplate(QueryTemplate.AND(["is_related_received_payment": QueryOperator.EQ("false")]))
                .build(),
        SelectAttribute.builder().build()).result() as QueryResult
List dataList = retSel['dataList'] as List
/**
 * @codeName 根据角色查询所有员工ID并发送CRM消息通知
 * @description 根据角色查询所有员工ID并发送CRM消息通知
 * @note 排除合伙人
 * @函数需求编号
 */
List roleCodes = ["00000000000000000000000000000015"]
// 调用方法获取用户信息
def (boolean errorR, List dataR, String messageR) = Fx.auth.user.getUsersByRoleCodes(roleCodes)
if (errorR) {
    // 如果有错误信息,记录日志
    log.info("error: " + messageR)
} else {
    // 记录成功获取的数据
    log.info(dataR)
}
boolean isBj = false
// 定义正则表达式模式 需要过滤的 userId 列表
def bJPattern = ~/^(1186|1187|1188|1189|1050|1075)$/
List userIdList = [];
dataR.each { itemR ->
    String userId = itemR['userId'] as String;
    isBj = bJPattern.matcher(userId).matches();
    if (!isBj) {
        userIdList.add(userId);
    }
}
log.info(userIdList)
List partitionList = Fx.utils.listPartition(dataList, 100)
partitionList.each { item ->
    List formattedList
    formattedList = item.collect { data ->
        def dataMap = data as Map // 将data转换为Map类型
        Date arrDate = dataMap['arrival_date'] as Date;
        Map masterData = [
                "bank_statement_id": dataMap['_id'] as String,
                "name"             : dataMap['name'] as String,
                "arrival_date"     : arrDate.toTimestamp(),
                "amount_received"  : dataMap['amount_received'] as String,
                "owner"            : dataMap['owner'] as List,
        ]
        def (Boolean error2, Map result2, String errorMessage2) = Fx.object.create("ReceivedPaymentObj", masterData, null, true)
        if (error2) {
            log.info(errorMessage2)
        } else {
            String id = result2.data['_id'] as String;
            //自定义接收用户ID
            //def userTest = ["1331", "1332"]
            //List partitionListR = Fx.utils.listPartition(userTest, 1)
            List partitionListR = Fx.utils.listPartition(userIdList, 50)
            partitionListR.each { itemR2 ->
                //根据id分批组装数据
                List userIds = itemR2 as List
                Fx.log.info("当前id分批组装数据条数:" + userIds.size())
                log.info(userIds)
                //Fx.log.info("实际发送的数据条数:" + userIdList.size())
                Notice objectNotify = Notice.objectNotice("ReceivedPaymentObj", id)
                def (Boolean dataErrorR, String dataNoticeR, String errorMessageR) = Fx.message.sendNotice("到款认领", "请确认到款认领", userIds, objectNotify)
                if (dataErrorR) {
                    log.info(errorMessageR)
                } else {
                    log.info(dataNoticeR)
                }
            }
        }
    }
}

参考:
1、Fx.auth.user.getRolesByUsers
Fx.auth | 纷享销客 | 帮助中心
2、Fx.message.sendNotice
Fx.message | 纷享销客 | 帮助中心
3、Fx.object.find
Fx.object | 纷享销客 | 帮助中心 
4、Fx.object.create
Fx.object | 纷享销客 | 帮助中心

混合动力汽车(HEV)模型的Simscape模型(Matlab代码、Simulink仿真实现)内容概要:本文档介绍了一个混合动力汽车(HEV)的Simscape模型,该模型通过Matlab代码和Simulink仿真工具实现,旨在对混合动力汽车的动力系统进行建模与仿真分析。模型涵盖了发动机、电机、电池、传动系统等关键部件,能够模拟车辆在不同工况下的能量流动与控制策略,适用于动力系统设计、能耗优化及控制算法验证等研究方向。文档还提及该资源属于一个涵盖多个科研领域的MATLAB仿真资源包,涉及电力系统、机器学习、路径规划、信号处理等多个技术方向,配套提供网盘下载链接,便于用户获取完整资源。; 适合人群:具备Matlab/Simulink使用基础的高校研究生、科研人员及从事新能源汽车系统仿真的工程技术人员。; 使用场景及目标:①开展混合动力汽车能量管理策略的研究与仿真验证;②学习基于Simscape的物理系统建模方法;③作为教学案例用于车辆工程或自动化相关课程的实践环节;④与其他优化算法(如智能优化、强化学习)结合,实现控制策略的优化设计。; 阅读建议:建议使用者先熟悉Matlab/Simulink及Simscape基础操作,结合文档中的模型结构逐步理解各模块功能,可在此基础上修改参数或替换控制算法以满足具体研究需求,同时推荐访问提供的网盘链接获取完整代码与示例文件以便深入学习与调试。
Camunda流程引擎通过解析BPMN文件中的条件表达式和任务分配配置,动态决定流程的流转路径及后续节点的处理人。在流程定义中,可以通过UEL(Unified Expression Language)表达式定义分支条件,结合流程变量的值在运行时决定流程走向。任务的处理人信息可以在流程定义中静态指定,也可以通过表达式动态计算[^1]。 ### 条件表达式的解析 Camunda在执行流程时,会在排他网关(Exclusive Gateway)或顺序流(Sequence Flow)上评估条件表达式。流程引擎会按照顺序流在BPMN文件中的定义顺序依次判断条件是否为真,一旦找到匹配的条件,流程将沿着该顺序流继续执行。如果没有满足条件的路径,则流程不会继续,除非定义了默认流(default flow)。 例如,在BPMN文件中定义如下条件表达式: ```xml <sequenceFlow id="flow1" sourceRef="exclusiveGateway" targetRef="taskA"> <conditionExpression xsi:type="tFormalExpression"> ${age > 18} </conditionExpression> </sequenceFlow> <sequenceFlow id="flow2" sourceRef="exclusiveGateway" targetRef="taskB"> <conditionExpression xsi:type="tFormalExpression"> ${age <= 18} </conditionExpression> </sequenceFlow> ``` Camunda在运行时会根据传入的`age`变量值判断流程是流转到`taskA`还是`taskB`节点[^1]。 ### 获取后续节点的处理人信息 Camunda支持在BPMN文件中定义任务的处理人信息,可以通过以下方式指定: 1. **静态指定处理人:** ```xml <userTask id="taskA" name="审批任务"> <extensionElements> <camunda:assignee>john</camunda:assignee> </extensionElements> </userTask> ``` 2. **通过表达式动态指定处理人:** ```xml <userTask id="taskA" name="审批任务"> <extensionElements> <camunda:assignee>${assignee}</camunda:assignee> </extensionElements> </userTask> ``` 在这种情况下,流程引擎会在运行时根据传入的`assignee`变量值动态分配任务的处理人。 3. **指定候选人或候选组:** ```xml <userTask id="taskA" name="审批任务"> <extensionElements> <camunda:candidateUsers>user1,user2</camunda:candidateUsers> <camunda:candidateGroups>group1,group2</camunda:candidateGroups> </extensionElements> </userTask> ``` 通过这种方式,任务可以被分配给多个候选人或候选组,用户可以从待办任务列表中认领任务。 Camunda在流程流转时会根据当前流程实例的状态和变量值解析这些配置,确定下一步任务的处理人信息。这些信息存储在运行时任务表`ACT_RU_TASK`中,可以通过Camunda的API查询任务的处理人、候选人或候选组信息。 ### Java代码实现 启动流程实例传入变量: ```java ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("processKey", Variables.putValue("age", 20)); ``` 完成任务更新变量: ```java taskService.complete(taskId, Variables.putValue("assignee", "john")); ``` 查询任务的处理人信息: ```java Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); String assignee = task.getAssignee(); ``` 通过上述方法,Camunda流程引擎可以动态解析流程定义中的条件表达式,结合流程变量的值,决定流程的流转路径,在任务创建根据配置确定处理人信息[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值