馬東紅,鄒黎,許濤,李鵬,孫萬信,李穩(wěn)
(陜西萬方汽車零部件有限公司,陜西 西安 710201)
Activiti 是一種開源的、輕量級、可嵌入的業(yè)務(wù)流程管理軟件和工作流系統(tǒng)引擎,其核心結(jié)構(gòu)是基于BPMN2.0 標(biāo)準(zhǔn)的。它基本實(shí)現(xiàn)BPMN2.0 中的執(zhí)行語義解釋和圖元定義元素,在此基礎(chǔ)上自定義了六個擴(kuò)展元素和十五個擴(kuò)展屬性。Activiti 的核心組件包括:流程引擎(Activiti Engine)、 基于Web 的流程建模器(Activiti Modeler)、基于Eclipse 插件的設(shè)計(jì)器(Activiti Desiger)、基于Web 的管理控制臺(Activiti Explorer)、協(xié)作工具(Activiti Probe)和Spring集成等。其中最重要的部分就是它的流程引擎。
微信公眾平臺主要面向名人、政府、媒體、企業(yè)等機(jī)構(gòu)推出的合作推廣業(yè)務(wù)。微信公眾賬號[1]被分成訂閱號和服務(wù)號,運(yùn)營主體是組織(比如企業(yè)、媒體、公益組織)的,可以申請服務(wù)號,運(yùn)營主體是組織和個人的可以申請訂閱號,但是個人不能申請服務(wù)號。本系統(tǒng)中開發(fā)中使用的是服務(wù)號。
Activiti6.0 自帶的25 張表[2](在本文不做贅述)、user表(表1)、process_list 表(表2)、fans 表(表3);具體如下:
表1 用戶表
表2 業(yè)務(wù)表單表
表3 微信粉絲表
具體配置為:Springboot2.0+mybatis+Maven+activiti 6.0+Eclipse
maven 依賴:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
這里使用RepositoryService 部署流程定義addClasspath Resource 表示從類路徑下加載資源文件,一次只能加載一個文件。
public void deployProcess(){
InputStream inputStreamBpmn = this.getClass(). get Reso-urce AsStream("/repairBill.bpmn");
InputStream inputStreamPng= this.getClass().getResource AsStream("/repairBill.png");
Deployment deployment = repositoryService
.createDeployment()
.addInputStream("LeaveBill.bpmn", inputStreamBpmn)
.addInputStream("LeaveBill.png", inputStreamPng). deploy()}
我們在做工作流的時候一定是需要將我們的業(yè)務(wù)和工作流來關(guān)聯(lián)起來的,而Activiti 給我們提供了一個便利就是Business_key,而這個字段就是專門用來存儲我們的業(yè)務(wù)關(guān)鍵字。例如我們有一個設(shè)備維修的業(yè)務(wù),而我的維修單信息都已經(jīng)編寫到數(shù)據(jù)庫的process_list 表中了,但是我怎么樣把我的維修單信息關(guān)聯(lián)到Activiti 的數(shù)據(jù)庫表中,就是用給定的Activiti 的Business_key[4],而這里有一個小技巧,例如我的javaBean 叫做repairBill,而我的請假信息的ID 為1,那么我就可以讓他寫成repairBill.1。
登錄微信公眾平臺官網(wǎng)后,在公眾平臺后臺管理頁面 -開發(fā)者中心頁,點(diǎn)擊“修改配置”按鈕,填寫服務(wù)器地址(URL)、Token 和EncodingAESKey,其中URL 是開發(fā)者用來接收微信消息和事件的接口URL。Token 可由開發(fā)者可以任意填寫,用作生成簽名(該Token 會和接口URL 中包含的Token 進(jìn)行比對,從而驗(yàn)證安全性)。EncodingAESKey由開發(fā)者手動填寫或隨機(jī)生成,將用作消息體加解密密鑰。
GET 請求:進(jìn)行URL、Tocken 認(rèn)證;
@RequestMapping(value = "/message" , method = Request Method.GET)
public @ResponseBody String lenwx(HttpServletRequest request) throws Exception {
String signature = request.getParameter("signature");//微信加密簽名
String timestamp = request.getParameter("timestamp");//時間戳
String nonce = request.getParameter("nonce");// 隨機(jī)數(shù)
String echostr = request.getParameter("echostr");// 隨機(jī)字符串
//校驗(yàn)成功返回echostr,成功成為開發(fā)者;否則返回error,接入失敗
//校驗(yàn)成功返回echostr,成功成為開發(fā)者;否則返回error,接入失敗
MpAccount mpAccount=new MpAccount();
String token = mpAccount.getToken();//獲取token,進(jìn)行驗(yàn)證
if (SignUtil.validSign(signature, token, timestamp, nonce)){return echostr;
}else {
return null;
} }
POST 請求:進(jìn)行消息處理;需要對用戶關(guān)注事件進(jìn)行獲取,若用戶第一次關(guān)注公眾號,則將用戶信息寫入fans 表中。系統(tǒng)用戶登陸web 系統(tǒng)將自己的open_id 維護(hù)到個人信息。
@RequestMapping(value = "/message", method = Request Method.POST)
public@ResponseBody void doPost(HttpServletRequest request,HttpServletResponse response) throws Exception {
//處理用戶和微信公眾賬號交互消息
Map<String, String> requestMap;
requestMap = MessageUtil.parseXml(request);
String fromUserName = requestMap.get("From User Name");
String toUserName = requestMap.get("ToUserName");
String msgType = requestMap.get("MsgType");
if(msgType.equals(Constants.REQ_MESSAGE_TYPE_EVE NT)){//判斷消息類型是否是事件消息類型
String eventType = requestMap.get("Event");//獲取具體的事件類型
if(eventType.equals(Constants.EVENT_TYPE_SUBSCRIB E)){ //判斷事件是否是關(guān)注事件
MpAccount mpAccount =new MpAccount();
AccountFans fans = WxApiClient.syncAccount Fans(from UserName, mpAccount);
fans.setHeadimgurl("<img src="+fans.getHeadimgurl()+"height='32' width='32'>");
AccountFans acf=accountFansService.getByOpenId(fans.getOpenId());
if(acf==null) {
accountFansService.insertSelective(fans);
} } }
進(jìn)入微信公眾平臺點(diǎn)擊模板信息模塊,直接在模板庫中選擇你需要的消息模板添加就可以了,添加之后就會在我的模板中。會有一個模板id,比如本系統(tǒng)用到的一個這個模板id 在我們發(fā)送消息的時候會用到。
在web 后臺中封裝模板數(shù)據(jù)對應(yīng)的bean 對象,在用戶完成流程任務(wù)的時候調(diào)用鏈接,https://api.weixin.qq.com/cgi -bin/message/template/send?access_token=ACCESS_TOKEN ,向流程的下一節(jié)點(diǎn)辦理人發(fā)送模板信息。在這里整體思路就是用戶關(guān)注公眾號的時候,微信公眾平臺服務(wù)器會向我們的web 程序后臺發(fā)送post 請求,我們通過處理post 請求的用戶關(guān)注事件將用戶微信open_id 以及昵稱等信息寫入fans 表,再將fans 表中的open_id 維護(hù)到user 表中。用戶在進(jìn)行流程審批的時候動態(tài)的選擇user 表中的用戶進(jìn)行任務(wù)辦理,同時調(diào)用微信公眾平臺API 向被選擇的用戶發(fā)送流程待處理模板消息。
public static void sendTemplateMessageforwfsys(String openId,String processId,String processTypeName, String pro-cessName,String processUserName,String applyTime){
try {
MpAccount ma=new MpAccount();
String access_token=WxApi.getAccessToken(ma.get Appid(), ma.getAppsecret()).getAccessToken();
MessageTemplate messageTemplate=new Message Tem-plate();
messageTemplate.setTemplate_id("BXg68T7RIjbabWJuEg O8-R53sTciWTThiKycrMpDUT4");
messageTemplate.setTouser(openId);
messageTemplate.setTopcolor("#173177");
messageTemplate.setUrl("http://amazing.nat123.cc:29596");
Data first = new Data();
first.setValue("您好,有一條系統(tǒng)流程需要您進(jìn)行審批。");
first.setColor("#173177");
Data keyword1 = new Data();
keyword1.setValue(processId);//流程編號
keyword1.setColor("#173177");
Data keyword2 = new Data();
keyword2.setValue(processTypeName);
keyword2.setColor("#173177");
Data keyword3 = new Data();
keyword3.setValue(processName);//標(biāo)題
keyword3.setColor("#173177");
Data keyword4 = new Data();
keyword4.setValue(processUserName);//申請人
keyword4.setColor("#173177");
Data keyword5 = new Data();
keyword5.setValue(applyTime);//申請時間
keyword5.setColor("#173177");
Data remark = new Data();
remark.setValue("請及時處理,謝謝。");
remark.setColor("#173177");
TemplateData templateData = new TemplateData();
templateData.setKeyword1(keyword1);
templateData.setKeyword2(keyword2);
templateData.setKeyword3(keyword3);
templateData.setKeyword4(keyword4);
templateData.setKeyword5(keyword5);
templateData.setRemark(remark);
messageTemplate.setData(templateData);
String jsonString = JSONObject.toJSONString (message Template);
String urlStr = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+access_token;
String result = HttpClientUtils.sendHttpPost(urlStr, json String);
} catch (Exception e) {
// TODO Auto-generated catch blocke.printStackTrace();
}}
結(jié)果如下:(圖1)(圖2)
圖1
圖2
隨著汽車工業(yè)的迅速發(fā)展,工廠信息化以及數(shù)字化也得到迅速的發(fā)展。為了保證信息在各個部門之間實(shí)時準(zhǔn)確的傳遞,根據(jù)我司在處理流程問題中遇到的實(shí)際情況進(jìn)行分析,該文主要結(jié)合軟件行業(yè)前端主流的技術(shù),提供了一種企業(yè)在流程以及信息傳遞方面的實(shí)時高效可行的方案。信息時代,我們希望處理問題和工作方式的思維和方式更簡單快捷。 在此也希望們本文不止提供了一個處理問題的工具,更是一種理念和方向。