Activiti工作流與業務整合實戰

2020-12-11 全棧技術資源社區

1. 業務背景

項目開發過程中如果均是簡單的數據請求與返回,那麼方法調用和業務邏輯是最容易處理的,根據入參返回數據即可,數據的生命周期始於請求,終於數據返回,沒有其他。

倘若特定需求場景需要多個接口協作完成一件事,數據流轉存在多路由,業務邏輯處理將會呈現複雜化,樸素的數據流控制方式就是定義數據中間態通過硬編碼形式來影響數據流向,這種設計在複雜度不深的情況下總是很容易實現,開發成本和溝通成本較低,也不失為一種非常有效的開發設計方式。而隨著業務場景複雜化,流程變更頻繁,開發人員會在之前得益的簡單設計上發現維護和可拓展性極差,甚至陷入流程泥潭中難以自救,最直接的表現就是接口交互定製化,所有的交互看不到任何業務或故事主線,所有的服務交互都需要最原始的那些開發人員的文檔、

注釋甚至「言傳身教」的指導才可以洞察複雜業務的其中一二,這是軟體開發中的技術負債和不完善,我們急需一個可以引導完整業務流程的體系或者框架來引導服務交互,來驅動業務數據流轉,對數據的出生、中轉、停留及最終消亡進行有效控制和監管,讓服務有源可溯,有序可遵。關於以上概述都是為了引申出下面項目實踐的利器,工作流。

數據流轉依賴硬編碼,面向接口交互,沒有統一司令塔服務進行調度面向業務數據設計,複雜邏輯的業務中,數據流故事主線不清晰,無法監控也無從溯源

2.技術調研

JBPM vs Activiti選型對比

關於工作流開源框架,一般有JBPM和Activiti,簡單檢索了下兩者對比如下:

Activiti持久層通過MyBatis實現、與Spring融合支持事務,與當前項目技術背景較為符合,且上手較為便捷,參考資料廣泛,學習成本較低,加上之前個人項目運用過Activiti前身,對PVM設計模式有一定了解,最終決定採用Activiti作為工作流來進行開發。

Activiti工作流特點

關於Activiti工作流的具體內容這裡不做贅述,本文的核心放在Activiti工作流與業務結合的實踐,下面是Activiti工作流的一些特點:

數據持久化支持鏈式API編程風格,所有的編程參與對象都可通過ProcessEngine獲取到支持流程設計器。可以結合IDEA中的ActiBpm等插件進行可視化流程設計,它最終轉換的是bpm文件,是一個類xml的流程配置文件原生支持Spring分離運行時與歷史數據Activiti是基於單庫單表的持久化3.流程設計

目前負責的項目是一個關於用戶認證相關的業務,簡單描述認證業務流程如下:

工作流起始 工作流的開始和結束,是整個工作流程的起點和重點工作流節點 工作流的核心節點和銜接,每個節點是故事主線的主要構成部分,代表一個聚合的業務邏輯,每個節點根據預定義走向進行數據驅動工作流路由 工作流路由分發,根據前置數據來進行工作流走向的決策,從而影響後續節點的流轉數據中間態 除了開始、結束兩個節點,被虛線包括的部分都是數據的中間態,無論業務數據和工作流數據,此時呈現的最大特點就是數據的不穩定性,業務處理中隨時都可能根據外部業務驅動產生數據和業務流程的向下繼續、向上回溯、分叉決策等,也是工作流中最活躍的部分4.架構設計

Service業務邏輯層

Activiti Service 封裝了工作流基礎API,這裡主要用到Activiti的RepositoryService、RuntimeService、TaskService三個服務類,RepositoryService提供了服務流程部署功能,RuntimeService提供了運行時服務這裡主要涉及任務啟動,TaskService提供了任務完成、任務取消等流程驅動的方法支持。這裡是基於Activiti原生API進行了定製化任務支持,類似一個門面服務,主要是用來融合Activiti原生服務和實際項目業務需求的APIWorkFlowAspect 通過Aop切面將工作流邏輯進行抽離,保證與業務層具體邏輯方法的隔離實現解耦;調用底層Activiti Service是提供的服務接口完成工作流驅動@WorkFlowHandle 通過Spel解析Annotation註解形參,支持Map類型複雜數據結構傳參,結合Aop進行實參映射綁定,解決切面層與業務層參數傳遞問題;通過@Repeatable支持業務方法的重複註解,為工作流作用業務方法的靈活配置的可擴展提供支持Dao數據持久層

水平拆分 根據業務數據的庫表設計進行工作流持久化改造,按照用戶userId進行工作流數據水平拆分事務支持 由於切分鍵一致,使得工作流數據與業務數據分離的同時能夠支持資料庫事務,保證數據完整一致性,減少開發複雜度5.項目實戰

5.1 maven配置

目前Activiti已進入7.0.0+,翻閱了大量網上資料,該版本輸出的時間較少,大部分還集中在5或6,這裡基於可用可操作的思想選用了介紹參考資料詳實的5.22.0進行開發,每個大版本變更差異較大,其他版本根據實踐需要進行升級或取捨

<activiti.version>5.22.0</activiti.version>

<!-- activiti -->

<dependency>

<groupId>org.activiti</groupId>

<artifactId>activiti-engine</artifactId>

<version>${activiti.version}</version>

</dependency>

<artifactId>activiti-spring</artifactId>

5.2 持久化改造

分庫分表

Activiti默認是單庫單表的,而我們現有項目是分庫分表的,路由策略是根據用戶ID進行水平切分的。

對Activiti的持久化存儲進行分庫分表改造基於以下兩點考慮:

業務數據分庫分表,Activiti工作流數據的流轉肯定是要和業務數據做聯動的,按照同樣語義即用戶ID進行水平切換路由可以輕鬆實現資料庫事務,減少實現數據一致性帶來的設計問題。業務表做了分庫分表的原因就是用戶體量大,持久化數據龐大,儘管讀多寫少且寫入量單庫單表在一段時間內不會對業務性能產生絲毫影響,但是為了擴展性更好,也為了規避後續變更難度,決定對Activiti工作流數據持久化也進行水平拆分。欄位及索引長度適配

為了保證數據完整性,Activiti默認創建表存在大量的外鍵約束,在生產環境下可以根據自身開發需要對這些外鍵進行去除,從而提高庫表查詢和處理性能。關於數據完整性可以通過應用程式層面進行保證和處理。Activiti的庫表設計都是基於可用性和普遍適配性進行設計的,個別欄位如存在varchar(4000)來記錄異常信息,根據自身業務存儲及性能考慮進行了部分欄位基於可用性的縮減;還有部分表存在大量的聯合索引,由於欄位長度過長導致聯合索引存儲大於736位元組,這是MySQL官方推薦的索引最大值,超過該值可能會產生性能問題,項目中沒有對MySQL默認限制進行修改,而是根據項目情況縮減了聯合索引欄位的長度。5.3 部署bpmn更新問題

在實際項目環境下,沒有bpmn流程調整我們是不需要頻繁進行bpmn流程部署的,每次新流程部署都會更新刷下流程ID、實例ID等,而且數據也會產生變更調整,而我們的需求是在需要更新的時候更新,不需要更新的時候覆用即可。因此在服務啟動時,我這裡通過時間戳作為版本號,每次啟動Spring服務時進行bpmn部署檢查,如果應用中的版本號未進行變更則不刷新Activiti部署信息保持之前部署快照,否則創建並部署新bpmn流程進行部署創建,更新部署快照信息,下面放一段demo代碼,由於項目是分庫分表的,每次啟動服務會輪詢每個分庫的deploy信息情況。

/**

* @author: guanjian

* @date: 2020/11/24 19:48

* @description: Activiti部署

*/

@Component("activitiDeployServlet")

public class ActivitiDeployServlet {

private final static Logger LOGGER = LoggerFactory.getLogger(ActivitiDeployServlet.class);

@Autowired

private RepositoryService repositoryService;

private BaseDBRouter dbRouter;

* BPMN流程定義部署

*

* @desc <p>

* 1、根據分庫數量(dbRouter.getDbNumber)進行bpmn流程定義部署

* 2、根據WORK_FLOW_DEPLOY進行部署,每次部署進行防重判斷,變更WORK_FLOW_DEPLOY則重新部署即啟用新流程

* WORK_FLOW_DEPLOY一致則不進行重新部署,復用原流程

* <p>

@PostConstruct

public void deploy() {

Optional.ofNullable(dbRouter.getDbKeyArray())

.orElse(Lists.newArrayList())

.forEach(db->{

try {

DBContextHolder.setDBKeyIndex(db);

handleDeployBpmn();

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException("check deploy bpmn error.");

} finally {

DBContextHolder.clearDBKeyIndex();

}

});

private Deployment queryBpmn() {

return repositoryService.createDeploymentQuery()

.deploymentName(ActivitiConstants.Deployment.WORK_FLOW_DEPLOY)

.singleResult();

private void handleDeployBpmn() {

Deployment deployment = queryBpmn();

if (Optional.ofNullable(deployment).isPresent()) {

LOGGER.info("{} bpmn exists.", DBContextHolder.getDBKeyIndex());

} else {

createBpmn();

private void createBpmn() {

repositoryService.createDeployment()

.disableSchemaValidation()

.name(ActivitiConstants.Deployment.WORK_FLOW_DEPLOY)

.addClasspathResource(ActivitiConstants.Deployment.BPMN_RESOURCE_PATH)

.deploy();

LOGGER.info("{} bpmn created.", DBContextHolder.getDBKeyIndex());

5.4 Activiti核心服務

Activiti主要有以下幾個核心服務,我們這裡最重要的是使用到了RepositoryService、RuntimeService、TaskService,RepositoryService用來進行服務部署,RuntimeService用來啟動任務管理任務實例,TaskService用來進行任務的查詢、流轉(完成、取消)等操作。

5.5 整合Spring

與Spring整合後,可以通過Spring來操作配置Activiti

<!-- Activiti processEngineConfiguration -->

<bean id="processEngineConfiguration">

<property name="dataSource" ref="routerTargetDataSource"/>

<property name="transactionManager" ref="routerTransactionManager"/>

<!--

flase:默認值。activiti在啟動時,會對比資料庫表中保存的版本,如果沒有表或者版本不匹配,將拋出異常。(生產環境常用)

true:activiti會對資料庫中所有表進行更新操作。如果表不存在,則自動創建。(開發時常用)

create_drop:在activiti啟動時創建表,在關閉時刪除表(必須手動關閉引擎,才能刪除表)。(單元測試常用)

drop-create:在activiti啟動時刪除原來的舊錶,然後在創建新表(不需要手動關閉引擎)。

-->

<property name="databaseSchemaUpdate" value="true"/>

<property name="history" value="none"/>

</bean>

<!-- Activiti processEngine -->

<bean id="processEngine">

<property name="processEngineConfiguration" ref="processEngineConfiguration"/>

<!-- Activiti Service -->

<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>

<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>

<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>

<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>

<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>

</beans>

5.6 工作流常量定義

private final static String BPMN_DEPLOY_PATH_TEMPLATE = "bpmn/*.bpmn";

* 部署資源

public static class Deployment {

//BPMN流程定義名稱

public final static String WORK_FLOW_KEY = "xxx_workflow";

//BPMN流程版本號(yyyyMMddHHmm)

public final static String WORK_FLOW_VERSION = "v202012031347";

//BPMN流程部署名稱(名稱_版本號)

//每次部署對該變量進行防重判斷,版本號變更則部署新流程進行新部署

public final static String WORK_FLOW_DEPLOY = WORK_FLOW_KEY + Constants.Symbol.LINE + WORK_FLOW_VERSION;

//BPMN文件讀取路徑

public final static String BPMN_RESOURCE_PATH = BPMN_DEPLOY_PATH_TEMPLATE.replace("*", WORK_FLOW_KEY);

* 工作流節點定義

public enum WorkFlowNodeEnum implements SingleItem<String> {

* 起始

//開始

START("START"),

//結束

END("END"),

* 普通節點

NODE_1("NODE_1"),

NODE_2("NODE_2"),

NODE_3("NODE_3"),

* 排他網關

//數據源

XOR_DATA_SOURCE("XOR_dataSource"),

//反饋結果

XOR_CHSI_RESULT("XOR_chsiResult"),

;

private String key;

WorkFlowNodeEnum(String key) {

this.key = key;

@Override

public String getKey() {

return key;

public void setKey(String key) {

* 流程變量

public static class Variables {

//用戶ID

public final static String USER_ID = "userId";

//業務ID

public final static String BIZ_ID = "bizId";

public final static String DATASOURCE = "dataSource";

public final static String RESULT= "result";

* 任務取消原因

public static class CancelReason {

//強制作廢流程

public final static FINISH_FORCE_INVALID = "FINISH_FORCE_INVALID";

* 任務操作枚舉

public enum TaskOperateEnum {

//任務啟動

START,

//任務取消

CANCEL,

//任務完成

COMPLETE,

5.7 工作流註解@WorkFlowHandle & @WorkFlowHandles

@WorkFlowHandle是支持工作流操作的註解,@WorkFlowHandles則是藉助JDK1.8的@Repeatable特性支持重複註解,使得@WorkFlowHandle可以重複作用在業務Service方法上進行工作流操作。

@WorkFlowHandle的定義如下:

這裡的註解欄位定義可以根據具體業務進行抽象和具體,以上僅供參考。

* @date: 2020/12/02 17:14

* @description: 工作流處理

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

@Repeatable(WorkFlowHandles.class)

public @interface WorkFlowHandle {

* 任務委託人

String assignee() default "";

* 業務ID

String bizId() default "";

* 環境變量

String variables() default "";

* 任務操作

ActivitiConstants.TaskOperateEnum taskOperate();

* 取消原因

String cancelReason() default "";

* 任務節點

ActivitiConstants.WorkFlowNodeEnum node() default ActivitiConstants.WorkFlowNodeEnum.END;

public @interface WorkFlowHandles {

WorkFlowHandle[] value();

5.8 工作流切面 WorkFlowAspect

WorkFlowAspect是以切面形式存在的工作流業務,把涉及工作流相關的元素數據抽離到切面中進行集中處理,通過註冊與業務邏輯進行融合,代碼隔離減少了邏輯耦合和混雜,通過以下腳手架的拼接完成了該功能的實現,匯總如下:

5.9 工作流與業務Service融合

@WorkFlowHandle(taskOperate = ActivitiConstants.TaskOperateEnum.START,

assignee = "#req.userId",

bizId = "#req.uuid",

variables = "{userId:'#req.userId',dataSource:'#req.dataSource'}"

)

@WorkFlowHandle(taskOperate = ActivitiConstants.TaskOperateEnum.COMPLETE,

node = ActivitiConstants.WorkFlowNodeEnum.NODE_1

@WorkFlowHandle(taskOperate = ActivitiConstants.TaskOperateEnum.CANCEL,

assignee = "#req.userId"

public Result bizMethod(Req req) {

//業務操作

//do something

return Result.success();

6. 其他

表刪除順序

由於存在外鍵,表刪除需要按照以下順序進行,第一遍沒刪除掉,可以再來一遍就乾淨了,測試環境使用的備記下

DROP TABLE IF EXISTS `ACT_RU_VARIABLE`;

DROP TABLE IF EXISTS `ACT_RU_EXECUTION`;

DROP TABLE IF EXISTS `ACT_RE_PROCDEF`;

DROP TABLE IF EXISTS `ACT_ID_GROUP`;

DROP TABLE IF EXISTS `ACT_GE_BYTEARRAY`;

DROP TABLE IF EXISTS `ACT_RE_DEPLOYMENT`;

DROP TABLE IF EXISTS `ACT_EVT_LOG`;

DROP TABLE IF EXISTS `ACT_GE_PROPERTY`;

DROP TABLE IF EXISTS `ACT_HI_ACTINST`;

DROP TABLE IF EXISTS `ACT_HI_ATTACHMENT`;

DROP TABLE IF EXISTS `ACT_HI_COMMENT`;

DROP TABLE IF EXISTS `ACT_HI_DETAIL`;

DROP TABLE IF EXISTS `ACT_HI_IDENTITYLINK`;

DROP TABLE IF EXISTS `ACT_HI_PROCINST`;

DROP TABLE IF EXISTS `ACT_HI_TASKINST`;

DROP TABLE IF EXISTS `ACT_HI_VARINST`;

DROP TABLE IF EXISTS `ACT_ID_INFO`;

DROP TABLE IF EXISTS `ACT_ID_MEMBERSHIP`;

DROP TABLE IF EXISTS `ACT_ID_USER`;

DROP TABLE IF EXISTS `ACT_PROCDEF_INFO`;

DROP TABLE IF EXISTS `ACT_RE_MODEL`;

DROP TABLE IF EXISTS `ACT_RU_EVENT_SUBSCR`;

DROP TABLE IF EXISTS `ACT_RU_IDENTITYLINK`;

DROP TABLE IF EXISTS `ACT_RU_JOB`;

DROP TABLE IF EXISTS `ACT_RU_TASK`;

相關焦點

  • 業務流程管理基本概念(三)--工作流管理系統(WfMS)
    工作流管理系統,經過對業務、公文流轉過程的分析以及抽象,工作流管理系統圍繞業務交互邏輯、業務處理邏輯以及參與者三個問題進行解決,業務交互邏輯對應的為業務的流轉過程,在工作流管理系統中對應的提出了工作流引擎、工作流設計器、流程操作來解決業務交互邏輯的問題,業務處理邏輯對應業務流轉過程中的表單、文檔等的處理,在工作流管理系統中對應的提出了表單設計器、與表單的集成來解決業務處理邏輯的問題
  • 詳解Visual Studio順序型工作流的創建
    記得在打開任何使用工作流設計器的文件前編譯解決方案。  工作流執行一個業務流程。流程的每一步用一個活動來實現。在這個練習中,你將用Windows Workflow Foundation創建和測試一個簡單的「Hello Workflow」 流程。
  • Gfast 工作流引擎 1.0 正式發布 - OSCHINA - 中文開源技術交流社區
    Gfast管理系統採用go語言開發,基於GF(Go Frame)的後臺管理系統,現增加工作流引擎模塊開源發布,實現工作流引擎與業務解綁
  • 八六三軟體攜手NTT數據 Intra-mart為客戶提供高效的工作流與BPM
    籤約成功河南八六三軟體股份有限公司作為以鄭州為總部,在上海和日本設有子公司(研發交付中心)的高新技術企業,以領先的數字經濟核心服務商、企業數位化綜合服務商為目標,正在新型智慧城市(城市大腦,智慧政務,智慧園區)、工業網際網路、智慧校園、業務流程自動化
  • 整合思考,商業實戰,成就跨越式成長 | G Stream Capstone Project
    這門實戰課需要同學通過小組合作討論、企業訪談等多種形式的溝通與研究,提供相關報告並進行答辯。在導師評審組的指導下,同學們在IMBA的所學所思都將得到嚴格而紮實的檢驗,這也正是Capstone Project的目標所在:為學生提供一個整合知識、技能與經驗,並將其運用到真實商業實踐中的機會。在這長達半年的時間裡,同學們學以致用,真正踐行實戰,經歷了涅槃與蛻變的成長過程。現在讓我們一起走進G Stream,揭曉Capstone Project各小組背後的成長與收穫。
  • 中國平安整合平安付與萬裡通業務
    日前,中國平安宣布,其旗下第三方支付平臺平安付和通用積分平臺萬裡通將進行業務整合。   據介紹,平安付是平安集團旗下第三方支付公司,定位於以滿足金融支付需求為主的支付清算服務和以個人創新金融為核心的壹錢包用戶服務。2015年一季度,通過平安付進行的各類支付交易額達到2024億元。
  • 日立/東芝和三菱重工欲整合核燃料業務
    消息人士稱,日立、東芝公司和三菱重工有限公司正考慮在明年春天整合核燃料業務。三家公司的核業務自2011年福島1號反應堆堆芯熔化事故後萎靡不振。整合核燃料業務可以降低生產成本,加強經營基礎。
  • 日本海運巨頭整合貨櫃業務
    據日本共同社報導,日本三大海運巨頭日本郵船、商船三井和川崎汽船10日公布一項人事任命,來自日本郵船的英國人傑裡米·尼克森(56歲)將出任整合定期貨櫃船業務成立的業務運營公司執行長(CEO)。  據悉,新公司的貨櫃運輸能力居全球第六。
  • 浙富控股:拓展業務格局 重點整合核電業務資源
    董事長孫毅介紹,公司未來的發展思路是:不斷拓展業務格局,凸顯核電業務重點,探索水電業務新模式,努力開拓節能服務新領域。在「大能源」戰略目標的指引下,公司將進一步拓展業務格局,將資源整合的重點放在核電業務上,加大對核電關鍵技術的研發投入,在節能服務市場開拓方面做出新成就。
  • APP「分久必合」 永輝超市加速線上業務整合
    APP「分久必合」 永輝超市加速線上業務整合來源:聯商網2020-03-25 09:14可以看到的是,儘管儘管永輝官方並未證實此傳言,但是通過為「永輝生活APP」一系列引流動作來看,無疑從側面印證了整合傳聞。數據顯示,疫情期間,永輝到家業務實現了大幅增長,2月1日,永輝超市到家服務全國訂單量春節期間首次突破20萬單,銷售額突破2000萬元,2月8日,永輝超市到家服務全國訂單量春節期間再次突破30萬單。
  • 大金進一步整合歐洲製冷業務!
    大金正在採取措施進一步整合其在歐洲的商用製冷業務。  負責16個國家/地區的大金中歐分公司(Daikin Central Europe, DACE),已通過合併大金和AHT業務為其在食品零售和商業製冷業務建立了單一業務鏈條。與此同時,在義大利,由大金空調義大利SpA、扎諾蒂SpA(Zanotti SpA)和義大利AHT組成的團隊將在義大利AHT的領導下成立。
  • 上港集團:物流業務整合布點 國際業務蓄勢待發
    ②目前,世界其他貨櫃大港水水中轉比例都在50%以上,國際業務中轉比例也都在60%左右,新加坡高達85%,而集團貨櫃這一比例分別約為40%和10%,遠低於國際水平。預計政策的實施以及內河疏運體系的完善,將使集團水水中轉的比例每年提升2-3個百分點。  長江戰略、東北亞戰略和國際化戰略「三步走」戰略助推國際化進程。  ①長江戰略旨在擴大國內輻射區域,重在布局。
  • 三菱重工與日立將整合火力發電業務,力爭躋身世界三強
    擁有高效且環保性能出色的發電技術的兩家公司將通過整合業務來提高競爭力,滿足以中國為首的新興市場國家的需求,以進一步擴大業務。 預定進行整合的除了燃氣輪機、蒸汽渦輪、鍋爐及發電機等火力發電系統業務之外,還包括地熱發電系統、環保裝置、燃料電池及其他附帶業務。子公司和關聯公司也屬於整合範圍。 在火力發電領域,兩家公司擁有多種產品。
  • CLPS新加坡子公司整合,助力東南亞業務新發展
    >來源:美通社上海2019年12月23日 /美通社/ CLPS Incorporation(納斯達克代碼:CLPS,以下簡稱「該公司」),一家專注於銀行、保險和金融領域全球領先的信息技術諮詢和解決方案服務提供商,今日公布其近期完成東南亞兩家子公司的業務及管理整合
  • 途家整合攜程、去哪兒公寓民宿業務
    【財新網】(記者 劉曉景)繼今年6月併購螞蟻短租後,公寓民宿預訂平臺途家網再次發起併購,擴大業務規模。10月20日,途家網CEO羅軍以內部信的方式宣布,將併購攜程、去哪兒旗下的公寓、民宿業務,接管攜程、去哪兒該業務的運維團隊、流量、庫存等。
  • 整合航空旅遊板塊 同程航旅大幅調整業務架構
    北京商報訊(記者關子辰)疫情對旅遊行業的衝擊顯而易見,在各家OTA紛紛調整業務板塊之際,同程集團也開啟了整合的大幕。4月20日,同程集團宣布啟動航空與旅行社兩大業務板塊的合併,成立同程航空旅遊服務集團有限公司,這也意味著同程集團下一步藉助航空資源發力旅遊板塊。
  • 平安網際網路金融又一極:平安付萬裡通業務整合
    繼平安普惠之後,近日,中國平安又宣布旗下第三方支付平臺平安付和通用積分平臺萬裡通,進行業務整合。據了解,平安付和萬裡通的業務具有很高的戰略協同性,雙方客戶群相似、業務模式互補,雙方的整合將有利於資源協同,有機結合平安付在交易支付、資金帳戶管理、網際網路理財以及萬裡通在積分管理、消費場景、忠誠度營銷等方面的優勢,產生1+1>3的效果,雙方的核心產品壹錢包、支付插件、積分管理等,都將獲得加速發展,著力打造平安網際網路金融除陸金所、平安好車、平安好房等業務之外的又一極。
  • 諾基亞控股阿朗 兩家公司下周開始整合業務
    原標題:諾基亞控股阿朗 兩家公司下周開始整合業務   1月6日消息,據國外媒體報導,諾基亞當地時間周一宣布,它已經控股阿朗,兩家公司將從下周開始融合業務。   收購阿朗將增強諾基亞競爭力,使它能更好地與愛立信和華為在電信設備市場上競爭。有限的增長和激烈的競爭打壓了電信設備市場的價格。
  • 《新笑傲江湖》神寵教主妖貓實戰測評!各蛻變數量整合來了
    《新笑傲江湖》神寵教主妖貓實戰測評!各蛻變數量整合來了 九遊研究所是九遊APP大神玩家自發組織的團隊,專注熱門資訊跟蹤、遊戲玩法研究,以及個人攻略心得分享,希望每個玩家都能玩得更開心、更省心!
  • 中國郵政儲蓄銀行股份有限公司湖北省分行信用卡業務實戰輔導項目...
    (招標編號:HBT-11190054-210129)  項目所在地區:湖北省,武漢市  一、招標條件  本中國郵政儲蓄銀行股份有限公司湖北省分行信用卡業務實戰輔導項目已由項目審批/核准/備案機關批准,項目資金來源為自籌資金 249萬元,招標人為中國郵政儲蓄銀行股份有限公司湖北省分行。本項目已具備招標條件,現招標方式為公開招標。