Flowable & Groovy

1. 操作流程变量

// 获取流程变量
def returnUser = execution.getVariable("returnUser")

// 设置流程变量,如果流程变量已存在,会用新值覆盖老值
execution.setVariable("forwardPayload", message_str)

execution的所有api可以在groovyTask中直接使用

2. 流程变量打包&解析操作

打包操作

import groovy.json.*
def deviceID=execution.getVariable("deviceId")
def alertDesc=execution.getVariable("alertDesc")
def moreinfo=execution.getVariable("moreinfo")
def reasons=execution.getVariable("reasons")
def suggest=execution.getVariable("suggest")
def fixComment=execution.getVariable("fixComment")
def message=[
        deviceID: deviceID,
        alertDesc: alertDesc,
        moreinfo: moreinfo,
        reasons: reasons,
        suggest: suggest,
        fixComment: fixComment
]

// 将对象变为字符串
def message_str=JsonOutput.toJson(message)
execution.setVariable("forwardPayload", message_str);

解析操作

```groovy
import groovy.json.*
def payload_str=execution.getVariable("forwardPayload")
def jsonSlurper = new JsonSlurper()
def payload = jsonSlurper.parseText(payload_str)

payload.each{entry -> 
   //动态设置多个流程变量
  execution.setVariable(entry.key,entry.value)
}

3. 日志打印

org.slf4j.LoggerFactory.getLogger(" it is a message from groovy ").info("after save is returnSum:${newReturnSum}");

4. 定义radio动态数据

// 定义一个三个选项的radio
def radiolist1=["严重","一般","轻微"]
// 要在表单定义中使用 ${dynamicRadio1}定义动态数据来自于流程变量
execution.setVariable("dynamicRadio1", radiolist1)


// 定义包含了两个选项,并且默认值得radio动态数据
def radiolist2=["男","女"]
// 要在表单定义中使用 ${dynamicRadio2}定义动态数据来自于流程变量
execution.setVariable("dynamicRadio2", radiolist2)
// delfaultRadio是表单定义中的组件的key,实现默认值
execution.setVariable("delfaultRadio", "男")

5. 定义select动态数据

// 定义三个选项的drop list,并且value等于label
def dynamicSelect1 = ["第一项","第二项","第三项"]
// 要在表单定义中使用 ${dynamicSelect1}定义动态数据来自于流程变量
execution.setVariable("dynamicSelect1", dynamicSelect1)

// 定义三个选项的drop list,并且制定了默认和
def dynamicSelect2 = ["今天","明天","后天"]
// 要在表单定义中使用 ${dynamicSelect2}定义动态数据来自于流程变量
execution.setVariable("dynamicSelect2", dynamicSelect2)
// defaultSelect是表单定义中的组件的key,实现默认值 
execution.setVariable("delfaultSelect", "后天")

// key与value不同的以及默认值得定义方式
def dynamicSelect3 = [
        [
                label: "矩阵革命",
                value: "revelo"
        ],
        [
                label: "明日帝国",
                value: "tomorrow"
        ],
        [
                label: "神奇女侠",
                value: "ww1984"
        ]

]
execution.setVariable("dynamicSelect3", dynamicSelect3)
execution.setVariable("delfaultSelect3", "ww1984")

6. Http请求

6.1 Get

def employee1 = new URL('http://dcom-http:8080/bj/employee/getCascaderForDisplay').text
// 或者 
def supply2 = 'http://dcom-http:8080/bj/supplier/getCascaderForFlow'.toURL().text
// 如果要使用get带参数,最好将参数内容通过urlencode编码,而且使用new url方式调用,例如
def sendcondLines_text = new URL('http://dcom-http:8080/bj/post/getSecondLineListByProfessionId?professionId='+URLEncoder.encode(professionId,'UTF-8')).text

6.2 Post

import groovyx.net.http.ContentType
import groovyx.net.http.HTTPBuilder
import groovyx.net.http.Method


//开始借出时间,数据来自第一个表单填写
def rawGetUseTime=execution.getVariable("startDateTime");
// 注意格式,后台需要的是long类型,这里转换下

def getUseTimeDate = Date.parse( "yyyy-MM-dd HH:mm:ss",rawGetUseTime);
def getUseTime = getUseTimeDate.getTime();
// 借出人,来自流程的发起人,注意人员的代号不一样,后台程序要处理,转换
def borrowPersion=execution.getVariable("initiator");
// 借出的工具代号,是数组,结果来自第一个表单选择的结果
def toolIds=execution.getVariable("toolsID");
//所有参数
def params = [
"getUseTime": getUseTime,
"borrowPersion": borrowPersion,
"toolIds": toolIds
]
//访问的URL
def path = 'http://dcom-http:8080/bj/tool/rest/putout'

def http = new HTTPBuilder(path)
http.request(Method.POST) {
    requestContentType = ContentType.JSON
    body = params
    response.failure = { resp ->
        // 打印错误日志
        org.slf4j.LoggerFactory.getLogger("--->from groovy ").warn( "Request failed with status ${resp.status}")
    }
}

7. 操作JSON

import groovy.json.*


def jsonSlurper = new JsonSlurper()
def deviceProperty_string=execution.getVariable("scpchange");
// 从流程变量中获得数据,将字符串转换为json对象
def deviceProperty_json = jsonSlurper.parseText(deviceProperty_string)

// 动态构造keyname并读取其值
def key_name="keyname"
def runType_boolean=deviceProperty_json."${key_name}"

// 删除一个属性
deviceProperty_json.remove('removedkey')

// 最后把json转换为字符串
//很奇怪的是一个json 对象转换为字符串需要自己在前后增加双引号,否则提交时解析失败!
def deviceProperty = '"'+new JsonBuilder(deviceProperty_json).toString()+'"'

8. 使用List的json对象

// 后端java定义post的json对象内容为ArrayList时,需要增加注解
public class OnlyNotifyBean {
    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private List<String> uids;  // 多选,通知谁,使用flowable认可的uid,其他信息自己关联查询
    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private List<String> types; // 多选,可选的通知方式,比如电话,短信,APP,微信,钉钉等
    private String message; //具体通知内容
}


// 前端代码示例
import groovyx.net.http.ContentType
import groovyx.net.http.HTTPBuilder
import groovyx.net.http.Method


//需要通知的人员,这里假设是项目经理级别,具体数值前面设定了
def uids=execution.getVariable("managers");



// 要通知的内容
def message='一线人员未能如期处理,已经通知二线人员处理'
//所有参数
def params = [
        "uids": uids, // 可以是多个人
        "types": ["GJ","SMS"],  // 可以有多种通知方式,假设有极光和短信,两种
        "message": message
]
//访问的URL
def path = 'http://dflow-notify:8080/notify'

def http = new HTTPBuilder(path)
http.request(Method.POST) {
    requestContentType = ContentType.JSON
    body = params
    response.failure = { resp ->
        // 打印错误日志
        org.slf4j.LoggerFactory.getLogger("--->from groovy ").warn( "Request failed with status ${resp.status}")
    }
}

9. 发送kafka消息

import org.apache.kafka.clients.producer.KafkaProducer
import org.apache.kafka.clients.producer.ProducerRecord
import org.apache.kafka.common.serialization.Serializer
import org.apache.kafka.common.serialization.StringSerializer

import groovy.json.JsonOutput

class JsonSerializer implements Serializer {
    @Override
    void configure(Map<String, ?> configs, boolean isKey) {
    }

    @Override
    byte[] serialize(String topic, data) {
        JsonOutput.toJson(data).getBytes('UTF-8')
    }

    @Override
    void close() {
    }
}

def props = [
        'bootstrap.servers': 'kafka-svc:9092',
        'key.serializer': StringSerializer,
        'value.serializer': JsonSerializer
]

def topic = 'channeldest'

def producer = new KafkaProducer(props)

def message=[
        desc: "it is desc",
        name: "it is name message"
    ]


    def record = new ProducerRecord(topic, 'starteventkey',message)

    // org.slf4j.LoggerFactory.getLogger("xiao test").info("Record  ${record}");
    def metadata = producer.send(record).get()

    // org.slf4j.LoggerFactory.getLogger("xiao test").info("Record sent to partition ${metadata.partition()}, with offset ${metadata.offset()}");

10. DCOM常用

10.1 生成工单号

def BaseNo = new URL('http://dcom-http:8080/bj/process/v3/getBaseNo?category=GYS').text
execution.setVariable("gysBaseNo", BaseNo);

10.2 供应商评价

import groovy.json.JsonSlurper
import groovyx.net.http.ContentType
import groovyx.net.http.HTTPBuilder
import groovyx.net.http.Method

def jsonSlurper = new JsonSlurper()

// 取出流程变量中的供应商用户ID(流转)
def jjgyslxr = execution.getVariable("jjgyslxr")
// 取出流程变量中的实施人用户Name(显示)
def jjgysssrNEW = execution.getVariable("jjgysssrNEW")

def jjgyslxr_array = []
if (jjgyslxr.class.isArray()) {
    // 是数组,直接复制
    jjgyslxr_array = jjgyslxr
} else {
    // 从流程变量中获得数据,将字符串转换为json对象
    jjgyslxr_array = jsonSlurper.parseText(jjgyslxr).value
}

def jjgysssrNEW_array = []
if (jjgysssrNEW.class.isArray()) {
    // 是数组,直接复制
    jjgysssrNEW_array = jjgysssrNEW
} else {
    // 从流程变量中获得数据,将字符串转换为json对象
    jjgysssrNEW_array = jsonSlurper.parseText(jjgysssrNEW).value
}


def implementer = jjgysssrNEW_array.join(',')
def userID = jjgyslxr_array[0]
org.slf4j.LoggerFactory.getLogger("--->from groovydynamic userID ").info("userID:$userID")

// 查询专业ID
def supplier_JSON = new URL('http://dcom-http:8080/bj/appraise/getSupplier?supplierID=' + userID).text
def supplier = jsonSlurper.parseText(supplier_JSON)

// 定义评价对象
def params = [
        "supplierId"       : supplier.supplierID,
        "supplierName"     : supplier.supplierName,
        "baseNo"           : execution.getVariable("BaseNo"),
        "baseName"         : execution.getVariable("baseName"),
        "closeTime"        : new Date().time,
        "implementer"      : implementer,
        "appraise"         : execution.getVariable("appraise"),
        "appraiseDesc"     : execution.getVariable("jjgysjljyjNEW"),
        "processInstanceId": execution.getVariable("processInstanceId")
]

org.slf4j.LoggerFactory.getLogger("--->from groovydynamic appraise ").info("appraise:$params")


// 保存评价的URL
def path = 'http://dcom-http:8080/bj/appraise/add'

def http = new HTTPBuilder(path)
http.request(Method.POST) {
    requestContentType = ContentType.JSON
    body = params
    response.failure = { resp ->
        // 打印错误日志
        org.slf4j.LoggerFactory.getLogger("--->from groovy ").warn("Save appraise Request failed with status ${resp.status}")
    }
}

10.3 工具领用

10.3.1 出库领用

import groovyx.net.http.ContentType
import groovyx.net.http.HTTPBuilder
import groovyx.net.http.Method
import groovy.json.*

//开始借出时间,数据来自第一个表单填写
def rawGetUseTime = execution.getVariable("startDateTime")
// 注意格式,后台需要的是long类型,这里转换下
def getUseTimeDate = Date.parse("yyyy-MM-dd HH:mm:ss", rawGetUseTime)
def getUseTime = getUseTimeDate.getTime()

// 借出人,来自流程的发起人,注意人员的代号不一样,后台程序要处理,转换
def borrowPersion = execution.getVariable("initiator")

// 借出的工具代号,是数组,结果来自第一个表单选择的结果
def org_toolIds = execution.getVariable("toolsID")

// 以前这里就是一个数组,现在是一个字符串,里面是json对象,对象里包含了label,也包含value,里面分别是显示和数据的数组
// 所以要进行判断和处理
def toolIds = []
if (org_toolIds.class.isArray()) {
    // 是数组,直接复制
    toolIds = org_toolIds
} else {
    // 不是数组,尝试转换为json对象并取得对象的结果
    def jsonSlurper = new JsonSlurper()
    // 从流程变量中获得数据,将字符串转换为json对象
    def toolIds_json = jsonSlurper.parseText(org_toolIds)

    toolIds = toolIds_json.value
    
}

// 保存一个新的流程变量,需要时一个数组,后面的多实例需要使用
execution.setVariable("toolsIDArray", toolIds)

//所有参数
def params = [
        "getUseTime"   : getUseTime,
        "borrowPersion": borrowPersion,
        "toolIds"      : toolIds
]
//访问的URL
def path = 'http://dcom-http:8080/bj/tool/rest/putout'

def http = new HTTPBuilder(path)
http.request(Method.POST) {
    requestContentType = ContentType.JSON
    body = params
    response.failure = { resp ->
        org.slf4j.LoggerFactory.getLogger("--->from groovy ").warn("Request failed with status ${resp.status}")
    }
}

10.3.2 汇总归还情况

returnUser = execution.getVariable("returnUser");
returnDate = execution.getVariable("returnDate");
returnItem = execution.getVariable("returnItem");
returnID = execution.getVariable("returnID");

return_desc=returnUser+" 于 "+returnDate+" 归还 "+returnItem+"\r\n";


returnSum = execution.getVariable("returnSum");
if (returnSum == null){returnSum=""}

org.slf4j.LoggerFactory.getLogger("--->from tools return  multi instance  ").info("returnUser:${returnUser}, returnDate:${returnDate},returnItem:${returnItem},returnID:${returnID},returnSum:${returnSum}");

newReturnSum = "${returnSum}${return_desc}".values;
execution.setVariable("returnSum", newReturnSum);
org.slf4j.LoggerFactory.getLogger("--->from tools return  multi instance  ").info("after save is returnSum:${newReturnSum}");

10.4 SCP变更

import com.fasterxml.jackson.databind.ObjectMapper
import groovyx.net.http.ContentType
import groovyx.net.http.HTTPBuilder
import groovyx.net.http.Method
import groovy.json.*

// scpchange 数据格式
//[{
//    "org": "{\"设备状态(开机:true,关机:false)\":false}",
//    "modify": "{\"设备状态(开机:true,关机:false)\":true}",
//    "label": "消防设备/消防报警系统/消防报警按钮(手报)/1楼消防报警按钮(手报)",
//    "value": "消防报警按钮(手报)/1楼消防报警按钮(手报)"
//}]

def jsonSlurper = new JsonSlurper()


// 解析SCP变更内容
def scpchangeVariable = execution.getVariable("scpchange")
def scpchange_json_array = jsonSlurper.parseText(scpchangeVariable)

scpchange_json_array.each {
    scpchange_json ->
        {
            // 解析设备ID
            def deviceId = scpchange_json.value.split("/")[1]

            // 解析设备状态
            def key_name = "设备状态(开机:true,关机:false)"
            def scpchange =  jsonSlurper.parseText(scpchange_json.modify)
            def runType_boolean = scpchange."${key_name}"
            int runType = runType_boolean ? 1 : 0

            // 解决中文显示unicode编码问题
            scpchange.remove(key_name)
            ObjectMapper mapper = new ObjectMapper();
            def deviceProperty = '"' + mapper.writeValueAsString(scpchange) + '"'

            //所有参数
            def params = [
                    "deviceId"      : deviceId,
                    "runType"       : runType,
                    "deviceProperty": deviceProperty
            ]
            org.slf4j.LoggerFactory.getLogger("------------->from groovy ").info("body ${params}")
            //访问的URL
            def path = 'http://dcom-http:8080/bj/scp/update'

            def http = new HTTPBuilder(path)
            http.request(Method.POST) {
                requestContentType = ContentType.JSON
                body = params
                response.failure = { resp ->
                    org.slf4j.LoggerFactory.getLogger("--->from groovy ").warn("Request failed with status ${resp.status}")
                }
            }
        }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值