馬東紅,鄒黎,許濤,李鵬,孫萬信,李穩
(陜西萬方汽車零部件有限公司,陜西 西安 710201)
Activiti 是一種開源的、輕量級、可嵌入的業務流程管理軟件和工作流系統引擎,其核心結構是基于BPMN2.0 標準的。它基本實現BPMN2.0 中的執行語義解釋和圖元定義元素,在此基礎上自定義了六個擴展元素和十五個擴展屬性。Activiti 的核心組件包括:流程引擎(Activiti Engine)、 基于Web 的流程建模器(Activiti Modeler)、基于Eclipse 插件的設計器(Activiti Desiger)、基于Web 的管理控制臺(Activiti Explorer)、協作工具(Activiti Probe)和Spring集成等。其中最重要的部分就是它的流程引擎。
微信公眾平臺主要面向名人、政府、媒體、企業等機構推出的合作推廣業務。微信公眾賬號[1]被分成訂閱號和服務號,運營主體是組織(比如企業、媒體、公益組織)的,可以申請服務號,運營主體是組織和個人的可以申請訂閱號,但是個人不能申請服務號。本系統中開發中使用的是服務號。
Activiti6.0 自帶的25 張表[2](在本文不做贅述)、user表(表1)、process_list 表(表2)、fans 表(表3);具體如下:

表1 用戶表

表2 業務表單表

表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()}
我們在做工作流的時候一定是需要將我們的業務和工作流來關聯起來的,而Activiti 給我們提供了一個便利就是Business_key,而這個字段就是專門用來存儲我們的業務關鍵字。例如我們有一個設備維修的業務,而我的維修單信息都已經編寫到數據庫的process_list 表中了,但是我怎么樣把我的維修單信息關聯到Activiti 的數據庫表中,就是用給定的Activiti 的Business_key[4],而這里有一個小技巧,例如我的javaBean 叫做repairBill,而我的請假信息的ID 為1,那么我就可以讓他寫成repairBill.1。



登錄微信公眾平臺官網后,在公眾平臺后臺管理頁面 -開發者中心頁,點擊“修改配置”按鈕,填寫服務器地址(URL)、Token 和EncodingAESKey,其中URL 是開發者用來接收微信消息和事件的接口URL。Token 可由開發者可以任意填寫,用作生成簽名(該Token 會和接口URL 中包含的Token 進行比對,從而驗證安全性)。EncodingAESKey由開發者手動填寫或隨機生成,將用作消息體加解密密鑰。
GET 請求:進行URL、Tocken 認證;
@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");// 隨機數
String echostr = request.getParameter("echostr");// 隨機字符串
//校驗成功返回echostr,成功成為開發者;否則返回error,接入失敗
//校驗成功返回echostr,成功成為開發者;否則返回error,接入失敗
MpAccount mpAccount=new MpAccount();
String token = mpAccount.getToken();//獲取token,進行驗證
if (SignUtil.validSign(signature, token, timestamp, nonce)){return echostr;
}else {
return null;
} }
POST 請求:進行消息處理;需要對用戶關注事件進行獲取,若用戶第一次關注公眾號,則將用戶信息寫入fans 表中。系統用戶登陸web 系統將自己的open_id 維護到個人信息。
@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)){ //判斷事件是否是關注事件
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);
} } }
進入微信公眾平臺點擊模板信息模塊,直接在模板庫中選擇你需要的消息模板添加就可以了,添加之后就會在我的模板中。會有一個模板id,比如本系統用到的一個這個模板id 在我們發送消息的時候會用到。
在web 后臺中封裝模板數據對應的bean 對象,在用戶完成流程任務的時候調用鏈接,https://api.weixin.qq.com/cgi -bin/message/template/send?access_token=ACCESS_TOKEN ,向流程的下一節點辦理人發送模板信息。在這里整體思路就是用戶關注公眾號的時候,微信公眾平臺服務器會向我們的web 程序后臺發送post 請求,我們通過處理post 請求的用戶關注事件將用戶微信open_id 以及昵稱等信息寫入fans 表,再將fans 表中的open_id 維護到user 表中。用戶在進行流程審批的時候動態的選擇user 表中的用戶進行任務辦理,同時調用微信公眾平臺API 向被選擇的用戶發送流程待處理模板消息。
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("您好,有一條系統流程需要您進行審批。");
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);//標題
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();
}}
結果如下:(圖1)(圖2)

圖1

圖2
隨著汽車工業的迅速發展,工廠信息化以及數字化也得到迅速的發展。為了保證信息在各個部門之間實時準確的傳遞,根據我司在處理流程問題中遇到的實際情況進行分析,該文主要結合軟件行業前端主流的技術,提供了一種企業在流程以及信息傳遞方面的實時高效可行的方案。信息時代,我們希望處理問題和工作方式的思維和方式更簡單快捷。 在此也希望們本文不止提供了一個處理問題的工具,更是一種理念和方向。