1 /**
  2  *
  3  * 业务流组件
  4  * @fileOverView core/process
  5  * @author  <a href="mailto:zhang.gd@foxmail.com">Zhang Guangda</a>
  6  * @date    2012-10-25
  7  */
  8  define("core/process", function() {
  9 	/**
 10 	 * 公用储存数据
 11 	 * @type {Object}
 12 	 */
 13 	var processData = {};
 14 
 15 	/**
 16 	 * @class 流程组件
 17 	 */
 18 	$we.process = {
 19 		/**
 20 		 * 设置数据
 21 		 * @param {string} name 数据名称
 22 		 * @param {mixed}  data 数据
 23 		 */
 24 		setData: function(name, data) {
 25 			processData[name] = data;
 26 		},
 27 		/**
 28 		 * 获取数据
 29 		 * @param  {string} name 数据名称
 30 		 * @return {mixed}      数据
 31 		 */
 32 		getData: function(name) {
 33 			return processData[name];
 34 		},
 35 		/**
 36 		 * 清空数据
 37 		 */
 38 		clearData: function() {
 39 			processData = {};
 40 		},
 41 		/**
 42 		 * 通过ajax请求获取需要的业务数据
 43 		 * @param  {array} needData 业务数据的名称,数组
 44 		 * @param  {function} 回调函数
 45 		 */
 46 		getFromAjax: function(needData, cb) {
 47 			if (!$.isArray(needData) || needData.length == 0) {
 48 				cb();
 49 				return;
 50 			}
 51 
 52 			if (this.bGettingFromAjax) return;
 53 			this.bGettingFromAjax = true;
 54 
 55 			var me = this,
 56 				reqData = {
 57 					attr: needData.join(",")
 58 				};
 59 			if ($we.process.getData("sdid")) {
 60 				reqData.sdid = $we.process.getData("sdid");
 61 			}
 62 			$we.utils.request($we.conf.ENV.__ACCOUNT_INFO_API, reqData,
 63 				function(data) {
 64 				var bAllGot = false;
 65 				if (data && typeof data.data == "object") {
 66 					bAllGot = true;
 67 					for (var i=0, len=needData.length; i<len; ++i) {
 68 						if (typeof data.data[needData[i]] != "undefined") {
 69 							$we.process.setData(needData[i], data.data[needData[i]]);
 70 						} else {
 71 							bAllGot = false;
 72 						}
 73 					}
 74 				}
 75 				if (!bAllGot) {
 76 					$we.comp.alert("系统繁忙,请稍后再试!");
 77 					me.bGettingFromAjax = false;
 78 					return;
 79 				}
 80 				cb();
 81 				me.bGettingFromAjax = false;
 82 			}, function(data) {
 83 				$we.comp.alert(data.msg);
 84 				me.bGettingFromAjax = false;
 85 			}, "GET", true);
 86 		},
 87 		/**
 88 		 * 是否是关键流程
 89 		 * @param  {string} url 请求url
 90 		 * @return {boolean}     true/false
 91 		 */
 92 		inKeyProcess: function(url) {
 93 			url = url.replace(/http:\/\/.*?\/([^\?]*)\??.*/, '$1');
 94 			if ($.inArray(url, [
 95 				'ajaxVcode/checkMobile'
 96 			]) !== -1) return true;
 97 			return false;
 98 		},
 99 		/**
100 		 * 使用某个流程
101 		 * @param  {String}   name        流程名称
102 		 * @param  {Object}   data        流程传参
103 		 * @param  {Function} cb          回调函数
104 		 * @param  {Object}   processConf 流程配置
105 		 */
106 		use: function(name, data, cb, processConf) {
107 			if (!$we.process.config[name]) return;
108 			var biz = $.extend(true, {}, $we.process.config[name]),
109 				confInit = biz.init || $we.emptyFunction,
110 				dataNeedsAjax = [];
111 			if (typeof data == "object") {
112 				// 将组件调用时传入的数据写入业务流数据中
113 				for (var i in data) {
114 					if (typeof $we.process.dataConfig[i] != "undefined")
115 						$we.process.setData(i, data[i]);
116 				}	
117 			} else {
118 				data = {};
119 			}
120 			// 多账号体系下传递进来的sdid
121 			if (data.sdid) $we.process.setData("sdid", data.sdid);
122 			// 流程组件的展示方式,默认不传
123 			if (processConf) {
124 				for (var i in processConf) {
125 					biz.config[i] = processConf[i];
126 				}
127 			}
128 
129 			if (typeof cb === "function")
130 				biz.success = cb;
131 
132 			if (!biz.success)
133 				biz.success = $we.emptyFunction;
134 
135 			// 整理一下processes
136 			if ($.isArray(biz.processes)) {
137 				var p_params = biz.processes[biz.processes.length - 1].params;
138 				if (p_params) {
139 					if (!p_params.success) 
140 						p_params.success = function() {biz.success(); };
141 				} else {
142 					biz.processes[biz.processes.length - 1].params = {
143 						success: function() {biz.success(); }
144 					};
145 				}
146 			}
147 
148 			/**
149 			 * 设置流程的id
150 			 */
151 			$we.process.setData("id", $we.conf.RUNTIME.__RANDOMSEED.toString() + (+new Date).toString());
152 			/**
153 			 * 设置流程名称
154 			 */
155 			$we.process.setData("flow", biz.config.flow);
156 			
157 			// 判断所需要的数据中,是否存在 组件未传入,且页面中不存在的数据
158 			// 如果有这种数据,将它列入需要ajax请求获得的数组中
159 			for (var i = 0; i < biz.data.length; ++i) {
160 				if (!data[biz.data[i]] && typeof $we.process.getData(biz.data[i]) == "undefined")
161 					dataNeedsAjax.push(biz.data[i]);
162 			}
163 			
164 			// 请求ajax接口,成功后回调
165 			$we.process.getFromAjax(dataNeedsAjax, function() {
166 				confInit(biz);
167 				$we.widget.add("process.ui", biz.processes, biz.config).start();
168 			});
169 		}
170 	};
171 
172 	/**
173 	 * accountInfo的ajax中支持的数据字段
174 	 * @type {Object}
175 	 */
176 	$we.process.dataConfig = {
177 		"phone": 1,	// 单账号体系下,当前登录账号所绑定的安全手机
178 		"phone_passed": 1, // 单账号体系下,当前登录账号的安全手机是否已经通过验证期
179 		"email": 1, // 单账号体系下,当前登录账号所绑定的邮箱
180 		"safety_verify": 1, // 单账号体系下,当前登录账号是否绑定了安全设备
181 		"new_comer": 1, // 单账号体系下,是否是新来的,(DEPRECATED,不要使用)
182 		"is_mobile_acc": 1, // 单账号体系下,当前登录账号的是否手机账号; 多账号体系下,根据sdid获取该账号是否手机账号
183 		"is_last_account": 1, // 多账号体系下,根据sdid获取该账号是否是该群最后一个账号
184 		"display_name": 1, // 单账号体系下,当前登录账号的display_name; 多账号体系下,根据sdid获取该账号的display_name
185 		"alias": 1, // 单账号体系下,当前登录账号的别名; 多账号体系下,根据sdid获取该账号的别名
186 		"check_change_mobile": 1, // 单账号体系下,是否允许该账号更换手机
187 		"captcha_key": 1, // 风控验证码session key
188 		"group": 1, // 多账号体系下,账号群的手机号码; 多账号体系下,根据sdid获取该账号是否是该群最后的一个账号
189 		"group_check_bind_account": 1, // 多账号体系下,是否允许该群绑定账号
190 		"group_check_change_mobile": 1, // 多账号体系下,是否允许该群更换手机
191 		"volume":1,//SDID下的点劵余额
192 		"group_transfer_upper":1,//SDID所在群的当日转账上限
193 		"group_transfer_quota":1//SDID所在群当日转账剩余额度
194 	};
195 
196 	/**
197 	 * process config
198 	 * @type {Object}
199 	 */
200 	$we.process.config = {};
201 
202 	return $we.process;
203 
204 });