date.php 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199
  1. <?php
  2. /**
  3. * 任务计划 - 天执行的任务
  4. *
  5. *
  6. *
  7. *
  8. */
  9. defined('InShopNC') or exit('Access Invalid!');
  10. require_once(BASE_ROOT_PATH . '/helper/notify_helper.php');
  11. require_once(BASE_ROOT_PATH . '/helper/stat_helper.php');
  12. require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
  13. require_once(BASE_DATA_PATH . '/mobile/omsid.php');
  14. class dateControl extends BaseCronControl
  15. {
  16. /**
  17. * 该文件中所有任务执行频率,默认1天,单位:秒
  18. * @var int
  19. */
  20. const EXE_TIMES = 86400;
  21. /**
  22. * 优惠券即将到期提醒时间,单位:天
  23. * @var int
  24. */
  25. const VOUCHER_INTERVAL = 5;
  26. /**
  27. * 兑换码即将到期提醒时间,单位:天
  28. * @var int
  29. */
  30. const VR_CODE_INTERVAL = 5;
  31. /**
  32. * 订单结束后可评论时间,15天,60*60*24*15
  33. * @var int
  34. */
  35. const ORDER_EVALUATE_TIME = 1296000;
  36. /**
  37. * 每次到货通知消息数量
  38. * @var int
  39. */
  40. const ARRIVAL_NOTICE_NUM = 100;
  41. /**
  42. * 默认方法
  43. */
  44. public function indexOp()
  45. {
  46. //更新订单商品佣金值
  47. $this->_order_commis_rate_update();
  48. //订单超期后不允许评价
  49. $this->_order_eval_expire_update();
  50. //未付款订单超期自动关闭
  51. $this->_order_timeout_cancel();
  52. //增加会员积分和经验值
  53. $this->_add_points();
  54. //自提点中,已经关闭的订单删除
  55. $this->_order_delivery_cancel_del();
  56. //更新订单扩展表收货人所在省份ID
  57. $this->_order_reciver_provinceid_update();
  58. //更新退款申请超时处理
  59. Model('trade')->editRefundConfirm();
  60. //代金券即将过期提醒
  61. $this->_voucher_will_expire();
  62. //虚拟兑换码即将过期提醒
  63. $this->_vr_code_will_expire();
  64. //更新商品访问量
  65. $this->_goods_click_update();
  66. //更新商品促销到期状态
  67. $this->_goods_promotion_state_update();
  68. //更新浏览量
  69. $this->_goods_browse_update();
  70. //缓存订单及订单商品相关数据
  71. $this->_order_goods_cache();
  72. //会员相关数据统计
  73. $this->_member_stat();
  74. $this->_stat_daily();
  75. }
  76. public function nine_clockOp()
  77. {
  78. //订单自动完成
  79. $this->_order_auto_complete();
  80. }
  81. public function ten_clockOp()
  82. {
  83. //已领取但未使用的红包过期通知
  84. $this->bonus_expire_notify();
  85. //商品到货通知提醒
  86. $this->_arrival_notice();
  87. }
  88. public function testOp()
  89. {
  90. $this->_stat_daily();
  91. }
  92. public function omsidOp()
  93. {
  94. $serials = omsid();
  95. $mod_goods = Model('goods');
  96. foreach ($serials as $goods_serial => $omsid)
  97. {
  98. $ret = $mod_goods->where(['goods_serial' => $goods_serial])->update(['oms_id' => $omsid]);
  99. if($ret == false) {
  100. Log::record("cannot update goods_serial = {$goods_serial}",Log::ERR);
  101. }
  102. }
  103. }
  104. public function init_relationOp()
  105. {
  106. $i = 0;
  107. while (true)
  108. {
  109. $start = $i * 1000;
  110. $items = Model()->table('member_relation')->field('member_id,invited_user')->order('member_mobile asc')->limit("{$start},1000")->select();
  111. if(empty($items)) {
  112. return;
  113. }
  114. $i++;
  115. foreach ($items as $item)
  116. {
  117. $member_id = intval($item['member_id']);
  118. if($member_id <= 0) continue;
  119. $invitees = unserialize($item['invited_user']);
  120. if(empty($invitees)) continue;
  121. foreach ($invitees as $userid) {
  122. $this->update_invitee($member_id,$userid);
  123. }
  124. }
  125. }
  126. }
  127. public function skupriceOp()
  128. {
  129. $this->add_sku();
  130. }
  131. private function update_invitee($invitorid,$userid)
  132. {
  133. $mod = Model('member');
  134. $invitee = $mod->where(['member_id' => $userid])->find();
  135. if(empty($invitee)) return false;
  136. $inviter_id = intval($invitee['inviter_id']);
  137. if($inviter_id > 0) return false;
  138. $ret = $mod->editMember(['member_id' => $userid],['inviter_id' => $invitorid]);
  139. if($ret == false) {
  140. Log::record(__METHOD__ . " update {$userid} invitor id err",Log::ERR);
  141. }
  142. else {
  143. Log::record(__METHOD__ . " update {$userid} invitor id success",Log::DEBUG);
  144. }
  145. }
  146. public function init_inviterOp()
  147. {
  148. $path = BASE_DATA_PATH . "/mobile/invitors.txt";
  149. $file = fopen($path,'r');
  150. if(!is_resource($file)) {
  151. Log::record(__METHOD__ . " file is not exist",Log::ERR);
  152. return false;
  153. }
  154. while(!feof($file)) {
  155. $line = fgets($file);
  156. $kv = preg_split('/,/',$line);
  157. if(count($kv) != 2) continue;
  158. $key = trim($kv[0]);
  159. $val = trim($kv[1]);
  160. $this->update_invitor($key,$val);
  161. }
  162. fclose($file);
  163. }
  164. private function update_invitor($invitor,$user)
  165. {
  166. if(empty($invitor)) return false;
  167. $mod = Model('member');
  168. $invitor_info = $mod->where(['member_mobile' => $invitor])->find();
  169. if(empty($invitor_info)) return false;
  170. $member_id = intval($invitor_info['member_id']);
  171. $user_info = $mod->where(['member_mobile' => $user])->find();
  172. if(empty($user_info)) return false;
  173. $inviter_id = intval($user_info['inviter_id']);
  174. if($inviter_id > 0) return false;
  175. $ret = $mod->editMember(['member_mobile' => $user],['inviter_id' => $member_id]);
  176. if($ret == false) {
  177. Log::record(__METHOD__ . " update {$user} invitor id err",Log::ERR);
  178. }
  179. else {
  180. Log::record(__METHOD__ . " update {$user} invitor id success",Log::DEBUG);
  181. }
  182. }
  183. public function available_bonusOp()
  184. {
  185. $mod_member = Model('member');
  186. $i = 0;
  187. while (true)
  188. {
  189. $start = $i * 1000;
  190. $items = Model()->table('member')->field('*')->order('member_id asc')->limit("{$start},1000")->select();
  191. if(empty($items)) {
  192. return;
  193. }
  194. $i++;
  195. foreach ($items as $item)
  196. {
  197. $member_id = $item['member_id'];
  198. $pred = new predeposit_helper($member_id);
  199. $amount = $pred->total_bonus();
  200. $mod_member->editMember(['member_id' => $member_id],['available_bonus' => $amount]);
  201. }
  202. }
  203. }
  204. public function _stat_daily()
  205. {
  206. $cur_date = new DateTime();
  207. $inter = new DateInterval('P1D');
  208. $cur_date->sub($inter);
  209. stat_helper::onDaiyMember($cur_date->getTimestamp());
  210. stat_helper::onDaiyBonus($cur_date->getTimestamp());
  211. stat_helper::onDaiyOrder($cur_date->getTimestamp());
  212. stat_helper::onDailySelfDiscount($cur_date->getTimestamp());
  213. }
  214. public function init_member_bonusOp()
  215. {
  216. stat_helper::onInitSelfDiscount();
  217. }
  218. /**
  219. * 未付款订单超期自动关闭
  220. */
  221. private function _order_timeout_cancel()
  222. {
  223. //实物订单超期未支付系统自动关闭
  224. $_break = false;
  225. $model_order = Model('order');
  226. $logic_order = Logic('order');
  227. $condition = array();
  228. $condition['order_state'] = ORDER_STATE_NEW;
  229. $condition['add_time'] = array('lt',time() - ORDER_AUTO_CANCEL_DAY * self::EXE_TIMES);
  230. //分批,每批处理100个订单,最多处理5W个订单
  231. for ($i = 0; $i < 500; $i++){
  232. if ($_break) {
  233. break;
  234. }
  235. $order_list = $model_order->getOrderList($condition, '', '*', '', 100);
  236. if (empty($order_list)) break;
  237. foreach ($order_list as $order_info)
  238. {
  239. $result = $logic_order->changeOrderStateCancel($order_info,'system','系统','超期未支付系统自动关闭订单',true,false);
  240. if (!$result['state']) {
  241. $this->log('实物订单超期未支付关闭失败SN:'.$order_info['order_sn']); $_break = true; break;
  242. } else {
  243. account_helper::onPredeposit('order_cancel',$order_info['buyer_id'],$order_info['order_sn']);
  244. }
  245. }
  246. }
  247. //虚拟订单超期未支付系统自动关闭
  248. $_break = false;
  249. $model_vr_order = Model('vr_order');
  250. $logic_vr_order = Logic('vr_order');
  251. $condition = array();
  252. $condition['order_state'] = ORDER_STATE_NEW;
  253. $condition['add_time'] = array('lt',time() - ORDER_AUTO_CANCEL_DAY * self::EXE_TIMES);
  254. //分批,每批处理100个订单,最多处理5W个订单
  255. for ($i = 0; $i < 500; $i++){
  256. if ($_break) {
  257. break;
  258. }
  259. $order_list = $model_vr_order->getOrderList($condition, '', '*', '',100);
  260. if (empty($order_list)) break;
  261. foreach ($order_list as $order_info) {
  262. $result = $logic_vr_order->changeOrderStateCancel($order_info,'system','超期未支付系统自动关闭订单',false);
  263. }
  264. if (!$result['state']) {
  265. $this->log('虚拟订单超期未支付关闭失败SN:'.$order_info['order_sn']); $_break = true; break;
  266. }
  267. }
  268. }
  269. /**
  270. * 订单自动完成
  271. */
  272. private function _order_auto_complete()
  273. {
  274. //虚拟订单过使用期自动完成
  275. $_break = false;
  276. $model_order = Model('vr_order');
  277. $logic_order = Logic('vr_order');
  278. $condition = array();
  279. $condition['order_state'] = ORDER_STATE_PAY;
  280. $condition['vr_indate'] = array('lt',time());
  281. //分批,每批处理100个订单,最多处理5W个订单
  282. for ($i = 0; $i < 500; $i++)
  283. {
  284. if ($_break) {
  285. break;
  286. }
  287. $order_list = $model_order->getOrderList($condition, '', 'order_id,order_sn', 'vr_indate asc', 100);
  288. if (empty($order_list)) break;
  289. foreach ($order_list as $order_info) {
  290. $result = $logic_order->changeOrderStateSuccess($order_info['order_id']);
  291. if (!$result['state']) {
  292. $this->log('虚拟订单过使用期自动完成失败SN:'.$order_info['order_sn']); $_break = true; break;
  293. }
  294. }
  295. }
  296. //实物订单发货后,超期自动收货完成
  297. $_break = false;
  298. $model_order = Model('order');
  299. $logic_order = Logic('order');
  300. $condition = array();
  301. $condition['order_state'] = ORDER_STATE_SEND;
  302. $condition['lock_state'] = 0;
  303. $condition['delay_time'] = array('lt',time() - ORDER_AUTO_RECEIVE_DAY * 86400);
  304. //分批,每批处理100个订单,最多处理5W个订单
  305. for ($i = 0; $i < 500; $i++){
  306. if ($_break) {
  307. break;
  308. }
  309. $order_list = $model_order->getOrderList($condition, '', '*', 'delay_time asc', 100);
  310. if (empty($order_list)) break;
  311. foreach ($order_list as $order_info) {
  312. $result = $logic_order->changeOrderStateReceive($order_info,'system','系统','超期未收货系统自动完成订单');
  313. if (!$result['state']) {
  314. $this->log('实物订单超期未收货自动完成订单失败SN:'.$order_info['order_sn']); $_break = true; break;
  315. }
  316. }
  317. }
  318. }
  319. /**
  320. * 自提订单中,已经关闭订单的,删除
  321. */
  322. private function _order_delivery_cancel_del() {
  323. $model_delivery = Model('delivery_order');
  324. $model_order = Model('order');
  325. for($i = 0; $i < 10; $i++) {
  326. $delivery_list = $model_delivery->getDeliveryOrderDefaultList(array(), '*', 0, 'order_id asc', 100);
  327. if (!empty($delivery_list)) {
  328. $order_ids = array();
  329. foreach ($delivery_list as $k => $v) {
  330. $order_ids[] = $v['order_id'];
  331. }
  332. $condition = array();
  333. $condition['order_state'] = ORDER_STATE_CANCEL;
  334. $condition['order_id'] = array('in',$order_ids);
  335. $order_list = $model_order->getOrderList($condition,'','order_id');
  336. if (!empty($order_list)) {
  337. $order_ids = array();
  338. foreach ($order_list as $k => $v) {
  339. $order_ids[] = $v['order_id'];
  340. }
  341. $del = $model_delivery->delDeliveryOrder(array('order_id'=>array('in',$order_ids)));
  342. if (!del) {
  343. $this->log('删除自提点订单失败');
  344. }
  345. } else {
  346. break;
  347. }
  348. } else {
  349. break;
  350. }
  351. }
  352. }
  353. /**
  354. * 更新订单扩展表中收货人所在省份ID
  355. */
  356. private function _order_reciver_provinceid_update()
  357. {
  358. $model_order = Model('order');
  359. $model_area = Model('area');
  360. //每次最多处理5W个订单
  361. $condition = array();
  362. $condition['reciver_province_id'] = 0;
  363. $condition['reciver_city_id'] = array('neq',0);
  364. for($i = 0; $i < 500; $i++)
  365. {
  366. $order_list = $model_order->getOrderCommonList($condition, 'reciver_city_id','order_id desc', 100);
  367. if (!empty($order_list))
  368. {
  369. $city_ids = array();
  370. foreach ($order_list as $v) {
  371. if (!in_array($v['reciver_city_id'],$city_ids)) {
  372. $city_ids[] = $v['reciver_city_id'];
  373. }
  374. }
  375. $area_list = $model_area->getAreaList(array('area_id'=>array('in',$city_ids)),'area_parent_id,area_id');
  376. if (!empty($area_list))
  377. {
  378. foreach ($area_list as $v) {
  379. $update = $model_order->editOrderCommon(array('reciver_province_id'=>$v['area_parent_id']),array('reciver_city_id'=>$v['area_id']));
  380. if (!$update) {
  381. $this->log('更新订单扩展表中收货人所在省份ID失败');break;
  382. }
  383. }
  384. }
  385. }
  386. else {
  387. break;
  388. }
  389. }
  390. }
  391. /**
  392. * 增加会员积分和经验值
  393. */
  394. private function _add_points()
  395. {
  396. return;
  397. $model_points = Model('points');
  398. $model_exppoints = Model('exppoints');
  399. //24小时之内登录的会员送积分和经验值,每次最多处理5W个会员
  400. $model_member = Model('member');
  401. $condition = array();
  402. $condition['member_login_time'] = array('gt',time() - self::EXE_TIMES);
  403. for($i = 0; $i < 50000; $i=$i+100)
  404. {
  405. $member_list = $model_member->getMemberList($condition, 'member_name,member_id',0,'', "{$i},100");
  406. if (!empty($member_list))
  407. {
  408. foreach ($member_list as $member_info)
  409. {
  410. if (C('points_isuse')) {
  411. $model_points->savePointsLog('login',array('pl_memberid'=>$member_info['member_id'],'pl_membername'=>$member_info['member_name']),true);
  412. }
  413. $model_exppoints->saveExppointsLog('login',array('exp_memberid'=>$member_info['member_id'],'exp_membername'=>$member_info['member_name']),true);
  414. }
  415. }
  416. else {
  417. break;
  418. }
  419. }
  420. //24小时之内注册的会员送积分,每次最多处理5W个会员
  421. if (C('points_isuse'))
  422. {
  423. $condition = array();
  424. $condition['member_time'] = array('gt',time() - self::EXE_TIMES);
  425. for($i = 0; $i < 50000; $i=$i+100)
  426. {
  427. $member_list = $model_member->getMemberList($condition, 'member_name,member_id',0,'member_id desc', "{$i},100");
  428. if (!empty($member_list)) {
  429. foreach ($member_list as $member_info) {
  430. $model_points->savePointsLog('regist',array('pl_memberid'=>$member_info['member_id'],'pl_membername'=>$member_info['member_name']),true);
  431. }
  432. } else {
  433. break;
  434. }
  435. }
  436. }
  437. //24小时之内完成了实物订单送积分和经验值,每次最多处理5W个订单
  438. $model_order = Model('order');
  439. $condition = array();
  440. $condition['finnshed_time'] = array('gt',time() - self::EXE_TIMES);
  441. for($i = 0; $i < 50000; $i=$i+100)
  442. {
  443. $order_list = $model_order->getOrderList($condition,'','buyer_name,buyer_id,order_amount,order_sn,order_id','', "{$i},100");
  444. if (!empty($order_list))
  445. {
  446. foreach ($order_list as $order_info) {
  447. if (C('points_isuse')) {
  448. $model_points->savePointsLog('order',array('pl_memberid'=>$order_info['buyer_id'],'pl_membername'=>$order_info['buyer_name'],'orderprice'=>$order_info['order_amount'],'order_sn'=>$order_info['order_sn'],'order_id'=>$order_info['order_id']),true);
  449. }
  450. $model_exppoints->saveExppointsLog('order',array('exp_memberid'=>$order_info['buyer_id'],'exp_membername'=>$order_info['buyer_name'],'orderprice'=>$order_info['order_amount'],'order_sn'=>$order_info['order_sn'],'order_id'=>$order_info['order_id']),true);
  451. }
  452. } else {
  453. break;
  454. }
  455. }
  456. //24小时之内完成了实物订单送积分和经验值,每次最多处理5W个订单
  457. $model_order = Model('vr_order');
  458. $condition = array();
  459. $condition['finnshed_time'] = array('gt',time() - self::EXE_TIMES);
  460. for($i = 0; $i < 50000; $i=$i+100)
  461. {
  462. $order_list = $model_order->getOrderList($condition,'','buyer_name,buyer_id,order_amount,order_sn,order_id','', "{$i},100");
  463. if (!empty($order_list))
  464. {
  465. foreach ($order_list as $order_info) {
  466. if (C('points_isuse')) {
  467. $model_points->savePointsLog('order',array('pl_memberid'=>$order_info['buyer_id'],'pl_membername'=>$order_info['buyer_name'],'orderprice'=>$order_info['order_amount'],'order_sn'=>$order_info['order_sn'],'order_id'=>$order_info['order_id']),true);
  468. }
  469. $model_exppoints->saveExppointsLog('order',array('exp_memberid'=>$order_info['buyer_id'],'exp_membername'=>$order_info['buyer_name'],'orderprice'=>$order_info['order_amount'],'order_sn'=>$order_info['order_sn'],'order_id'=>$order_info['order_id']),true);
  470. }
  471. } else {
  472. break;
  473. }
  474. }
  475. }
  476. /**
  477. * 代金券即将过期提醒
  478. */
  479. private function _voucher_will_expire()
  480. {
  481. $time_start = mktime(0, 0, 0, date("m") , date("d")+self::VOUCHER_INTERVAL, date("Y"));
  482. $time_stop = $time_start + self::EXE_TIMES - 1;
  483. $where = array();
  484. $where['voucher_end_date'] = array(array('egt', $time_start), array('elt', $time_stop), 'and');
  485. $list = Model('voucher')->getVoucherUnusedList($where);
  486. if (!empty($list))
  487. {
  488. foreach ($list as $val) {
  489. $param = array();
  490. $param['code'] = 'voucher_will_expire';
  491. $param['member_id'] = $val['voucher_owner_id'];
  492. $param['param'] = array(
  493. 'indate' => date('Y-m-d H:i:s', $val['voucher_end_date']),
  494. 'voucher_url' => urlShop('member_voucher', 'index')
  495. );
  496. QueueClient::push('sendMemberMsg', $param);
  497. }
  498. }
  499. }
  500. /**
  501. * 虚拟兑换码即将过期提醒
  502. */
  503. private function _vr_code_will_expire() {
  504. $time_start = mktime(0, 0, 0, date("m") , date("d")+self::VR_CODE_INTERVAL, date("Y"));
  505. $time_stop = $time_start + self::EXE_TIMES - 1;
  506. $where = array();
  507. $where['vr_indate'] = array(array('egt', $time_start), array('elt', $time_stop), 'and');
  508. $list = Model('vr_order')->getCodeUnusedList($where);
  509. if (!empty($list)) {
  510. foreach ($list as $val) {
  511. $param = array();
  512. $param['code'] = 'vr_code_will_expire';
  513. $param['member_id'] = $val['buyer_id'];
  514. $param['param'] = array(
  515. 'indate' => date('Y-m-d H:i:s', $val['vr_indate']),
  516. 'vr_order_url' => urlShop('member_vr_order', 'index')
  517. );
  518. QueueClient::push('sendMemberMsg', $param);
  519. }
  520. }
  521. }
  522. /**
  523. * 订单超期后不允许评价
  524. */
  525. private function _order_eval_expire_update() {
  526. //实物订单超期未评价自动更新状态,每次最多更新1000个订单
  527. $model_order = Model('order');
  528. $condition = array();
  529. $condition['order_state'] = ORDER_STATE_SUCCESS;
  530. $condition['evaluation_state'] = 0;
  531. $condition['finnshed_time'] = array('lt',time() - self::ORDER_EVALUATE_TIME);
  532. $update = array();
  533. $update['evaluation_state'] = 2;
  534. $update = $model_order->editOrder($update,$condition,1000);
  535. if (!$update) {
  536. $this->log('更新实物订单超期不能评价失败'); return;
  537. }
  538. //虚拟订单超期未评价自动更新状态,每次最多更新1000个订单
  539. $model_order = Model('vr_order');
  540. $condition = array();
  541. $condition['order_state'] = ORDER_STATE_SUCCESS;
  542. $condition['evaluation_state'] = 0;
  543. $condition['use_state'] = 1;
  544. $condition['finnshed_time'] = array('lt',time() - self::ORDER_EVALUATE_TIME);
  545. $update = array();
  546. $update['evaluation_state'] = 2;
  547. $update = $model_order->editOrder($update,$condition,1000);
  548. if (!$update) {
  549. $this->log('更新虚拟订单超期不能评价失败'); return;
  550. }
  551. }
  552. /**
  553. * 更新商品访问量(redis)
  554. */
  555. private function _goods_click_update() {
  556. $data = rcache('updateRedisDate', 'goodsClick');
  557. foreach ($data as $key => $val) {
  558. Model('goods')->editGoodsById(array('goods_click' => array('exp', 'goods_click +'.$val)), $key);
  559. }
  560. dcache('updateRedisDate', 'goodsClick');
  561. }
  562. /**
  563. * 更新商品促销到期状态(目前只有满即送)
  564. */
  565. private function _goods_promotion_state_update() {
  566. //满即送过期
  567. Model('p_mansong')->editExpireMansong();
  568. }
  569. /**
  570. * 商品到货通知提醒
  571. */
  572. private function _arrival_notice()
  573. {
  574. $strat_time = strtotime("-60 day"); // 只通知最近60天的记录
  575. $mod_anotice = Model('arrival_notice');
  576. // 删除60天之前的记录
  577. $mod_anotice->delArrivalNotice(array('an_addtime' => array('lt', $strat_time), 'an_type' => 1));
  578. $count = $mod_anotice->getArrivalNoticeCount(array());
  579. $times = ceil($count/self::ARRIVAL_NOTICE_NUM);
  580. if ($times == 0) return false;
  581. for ($i = 0; $i <= $times; $i++)
  582. {
  583. $notice_list = $mod_anotice->getArrivalNoticeList(array(), '*', $i.','.self::ARRIVAL_NOTICE_NUM);
  584. if (empty($notice_list)) continue;
  585. // 查询商品是否已经上架
  586. $goodsid_array = array();
  587. foreach ($notice_list as $val) {
  588. $goodsid_array[] = $val['goods_id'];
  589. }
  590. $goodsid_array = array_unique($goodsid_array);
  591. $goods_list = Model('goods')->getGoodsOnlineList(array('goods_id' => array('in', $goodsid_array), 'goods_storage' => array('gt', 0)), 'goods_id');
  592. if (empty($goods_list)) continue;
  593. // 需要通知到货的商品
  594. $goodsid_array = array();
  595. foreach ($goods_list as $val) {
  596. $goodsid_array[] = $val['goods_id'];
  597. }
  598. // 根据商品id重新查询需要通知的列表
  599. $notice_list = $mod_anotice->getArrivalNoticeList(array('goods_id' => array('in', $goodsid_array)), '*');
  600. if (empty($notice_list)) continue;
  601. foreach ($notice_list as $val)
  602. {
  603. $param = array();
  604. $param['code'] = 'arrival_notice';
  605. $param['member_id'] = $val['member_id'];
  606. $param['param'] = array(
  607. 'goods_name' => $val['goods_name'],
  608. 'goods_url' => urlShop('goods', 'index', array('goods_id' => $val['goods_id']))
  609. );
  610. $param['number'] = array('mobile' => $val['an_mobile'], 'email' => $val['an_email']);
  611. $param['sms_param'] = array('goods_name' => $val['goods_name']);
  612. QueueClient::push('sendMemberMsg', $param);
  613. }
  614. // 清楚发送成功的数据
  615. $mod_anotice->delArrivalNotice(array('goods_id' => array('in', $goodsid_array)));
  616. }
  617. }
  618. /**
  619. * 将缓存中的浏览记录存入数据库中,并删除30天前的浏览历史
  620. */
  621. private function _goods_browse_update(){
  622. $model = Model('goods_browse');
  623. //将cache中的记录存入数据库
  624. if (C('cache_open')){//如果浏览记录已经存入了缓存中,则将其整理到数据库中
  625. //上次更新缓存的时间
  626. $latest_record = $model->getGoodsbrowseOne(array(),'','browsetime desc');
  627. $starttime = ($t = intval($latest_record['browsetime']))?$t:0;
  628. $monthago = strtotime(date('Y-m-d',time())) - 86400*30;
  629. $model_member = Model('member');
  630. //查询会员信息总条数
  631. $countnum = $model_member->getMemberCount(array());
  632. $eachnum = 100;
  633. for ($i=0; $i<$countnum; $i+=$eachnum){//每次查询100条
  634. $member_list = $model_member->getMemberList(array(), '*', 0, 'member_id asc', "$i,$eachnum");
  635. foreach ((array)$member_list as $k=>$v){
  636. $insert_arr = array();
  637. $goodsid_arr = array();
  638. //生成缓存的键值
  639. $hash_key = $v['member_id'];
  640. $browse_goodsid = rcache($hash_key,'goodsbrowse','goodsid');
  641. if ($browse_goodsid) {
  642. //删除缓存中多余的浏览历史记录,仅保留最近的30条浏览历史,先取出最近30条浏览历史的商品ID
  643. $cachegoodsid_arr = $browse_goodsid['goodsid']?unserialize($browse_goodsid['goodsid']):array();
  644. unset($browse_goodsid['goodsid']);
  645. if ($cachegoodsid_arr){
  646. $cachegoodsid_arr = array_slice($cachegoodsid_arr,-30,30,true);
  647. }
  648. //处理存入数据库的浏览历史缓存信息
  649. $_cache = rcache($hash_key, 'goodsbrowse');
  650. foreach((array)$_cache as $c_k=>$c_v){
  651. $c_v = unserialize($c_v);
  652. if ($c_v['browsetime'] >= $starttime){//如果 缓存中的数据未更新到数据库中(即添加时间大于上次更新到数据库中的数据时间)则将数据更新到数据库中
  653. $tmp_arr = array();
  654. $tmp_arr['goods_id'] = $c_v['goods_id'];
  655. $tmp_arr['member_id'] = $v['member_id'];
  656. $tmp_arr['browsetime'] = $c_v['browsetime'];
  657. $tmp_arr['gc_id'] = $c_v['gc_id'];
  658. $tmp_arr['gc_id_1'] = $c_v['gc_id_1'];
  659. $tmp_arr['gc_id_2'] = $c_v['gc_id_2'];
  660. $tmp_arr['gc_id_3'] = $c_v['gc_id_3'];
  661. $insert_arr[] = $tmp_arr;
  662. $goodsid_arr[] = $c_v['goods_id'];
  663. }
  664. //除了最近的30条浏览历史之外多余的浏览历史记录或者30天之前的浏览历史从缓存中删除
  665. if (!in_array($c_v['goods_id'], $cachegoodsid_arr) || $c_v['browsetime'] < $monthago){
  666. unset($_cache[$c_k]);
  667. }
  668. }
  669. //删除已经存在的该商品浏览记录
  670. if ($goodsid_arr){
  671. $model->delGoodsbrowse(array('member_id'=>$v['member_id'],'goods_id'=>array('in',$goodsid_arr)));
  672. }
  673. //将缓存中的浏览历史存入数据库
  674. if ($insert_arr){
  675. $model->addGoodsbrowseAll($insert_arr);
  676. }
  677. //重新赋值浏览历史缓存
  678. dcache($hash_key, 'goodsbrowse');
  679. $_cache['goodsid'] = serialize($cachegoodsid_arr);
  680. wcache($hash_key,$_cache,'goodsbrowse');
  681. }
  682. }
  683. }
  684. }
  685. //删除30天前的浏览历史
  686. $model->delGoodsbrowse(array('browsetime'=>array('lt',$monthago)));
  687. }
  688. /**
  689. * 缓存订单及订单商品相关数据
  690. */
  691. private function _order_goods_cache(){
  692. $model = Model('stat');
  693. //查询最后统计的记录
  694. $latest_record = $model->table('stat_ordergoods')->order('stat_updatetime desc,rec_id desc')->find();
  695. $stime = 0;
  696. if ($latest_record){
  697. $start_time = strtotime(date('Y-m-d',$latest_record['stat_updatetime']));
  698. } else {
  699. $start_time = strtotime(date('Y-m-d',strtotime(C('setup_date'))));//从系统的安装时间开始统计
  700. }
  701. for ($stime = $start_time; $stime < time(); $stime = $stime+86400){
  702. $etime = $stime + 86400 - 1;
  703. //避免重复统计,开始时间必须大于最后一条记录的记录时间
  704. $search_stime = $latest_record['stat_updatetime'] > $stime?$latest_record['stat_updatetime']:$stime;
  705. //统计一天的数据,如果结束时间大于当前时间,则结束时间为当前时间,避免因为查询时间的延迟造成数据遗落
  706. $search_etime = ($t = ($stime + 86400 - 1)) > time() ? time() : ($stime + 86400 - 1);
  707. //查询时间段内新订单或者更新过的订单,在缓存表中需要将新订单和更新过的订单进行重新缓存
  708. $where = array();
  709. $where['log_time'] = array('between',array($search_stime,$search_etime));
  710. //查询记录总条数
  711. $countnum_arr = $model->table('order_log')->field('COUNT(DISTINCT order_id) as countnum')->where($where)->find();
  712. $countnum = intval($countnum_arr['countnum']);
  713. for ($i=0; $i<$countnum; $i+=100){//每次查询100条
  714. $orderlog_list = array();
  715. $orderlog_list = $model->table('order_log')->field('DISTINCT order_id')->where($where)->limit($i.',100')->select();
  716. if ($orderlog_list){
  717. //店铺ID数组
  718. $storeid_arr = array();
  719. //商品ID数组
  720. $goodsid_arr = array();
  721. //商品公共表ID数组
  722. $goods_commonid_arr = array();
  723. //订单ID数组
  724. $orderid_arr = array();
  725. //整理需要缓存的订单ID
  726. foreach ((array)$orderlog_list as $k=>$v){
  727. $orderid_arr[] = $v['order_id'];
  728. }
  729. unset($orderlog_list);
  730. //查询订单数据
  731. $field = 'order_id,order_sn,store_id,buyer_id,buyer_name,add_time,payment_code,order_amount,shipping_fee,evaluation_state,order_state,refund_state,refund_amount,order_from';
  732. $order_list_tmp = $model->table('order')->field($field)->where(array('order_id'=>array('in',$orderid_arr)))->select();
  733. $order_list = array();
  734. foreach ((array)$order_list_tmp as $k=>$v){
  735. //判读订单是否计入统计(在线支付订单已支付或者经过退款的取消订单或者货到付款订单订单已成功)
  736. $v['order_isvalid'] = 0;
  737. if ($v['payment_code'] != 'offline' && $v['order_state'] != ORDER_STATE_NEW && $v['order_state'] != ORDER_STATE_CANCEL){//在线支付并且已支付并且未取消
  738. $v['order_isvalid'] = 1;
  739. } elseif ($v['order_state'] == ORDER_STATE_CANCEL && $v['refund_state'] != 0) {//经过退款的取消订单
  740. $v['order_isvalid'] = 1;
  741. } elseif ($v['payment_code'] == 'offline' && $v['order_state'] == ORDER_STATE_SUCCESS) {//货到付款订单,订单成功之后才计入统计
  742. $v['order_isvalid'] = 1;
  743. }
  744. $order_list[$v['order_id']] = $v;
  745. $storeid_arr[] = $v['store_id'];
  746. }
  747. unset($order_list_tmp);
  748. //查询订单扩展数据
  749. $field = 'order_id,reciver_province_id';
  750. $order_common_list_tmp = $model->table('order_common')->field($field)->where(array('order_id'=>array('in',$orderid_arr)))->select();
  751. $order_common_list = array();
  752. foreach ((array)$order_common_list_tmp as $k=>$v){
  753. $order_common_list[$v['order_id']] = $v;
  754. }
  755. unset($order_common_list_tmp);
  756. //查询店铺信息
  757. $field = 'store_id,store_name,grade_id,sc_id';
  758. $store_list_tmp = $model->table('store')->field($field)->where(array('store_id'=>array('in',$storeid_arr)))->select();
  759. $store_list = array();
  760. foreach ((array)$store_list_tmp as $k=>$v){
  761. $store_list[$v['store_id']] = $v;
  762. }
  763. unset($store_list_tmp);
  764. //查询订单商品
  765. $field = 'rec_id,order_id,goods_id,goods_name,goods_price,goods_num,goods_image,goods_pay_price,store_id,buyer_id,goods_type,promotions_id,commis_rate,gc_id';
  766. $ordergoods_list = $model->table('order_goods')->field($field)->where(array('order_id'=>array('in',$orderid_arr)))->select();
  767. foreach ((array)$ordergoods_list as $k=>$v){
  768. $goodsid_arr[] = $v['goods_id'];
  769. }
  770. //查询商品信息
  771. $field = 'goods_id,goods_commonid,goods_price,goods_serial,gc_id,gc_id_1,gc_id_2,gc_id_3,goods_image';
  772. $goods_list_tmp = $model->table('goods')->field($field)->where(array('goods_id'=>array('in',$goodsid_arr)))->select();
  773. foreach ((array)$goods_list_tmp as $k=>$v){
  774. $goods_commonid_arr[] = $v['goods_commonid'];
  775. }
  776. //查询商品公共信息
  777. $field = 'goods_commonid,goods_name,brand_id,brand_name';
  778. $goods_common_list_tmp = $model->table('goods_common')->field($field)->where(array('goods_commonid'=>array('in',$goods_commonid_arr)))->select();
  779. $goods_common_list = array();
  780. foreach ((array)$goods_common_list_tmp as $k=>$v){
  781. $goods_common_list[$v['goods_commonid']] = $v;
  782. }
  783. unset($goods_common_list_tmp);
  784. //处理商品数组
  785. $goods_list = array();
  786. foreach ((array)$goods_list_tmp as $k=>$v){
  787. $v['goods_commonname'] = $goods_common_list[$v['goods_commonid']]['goods_name'];
  788. $v['brand_id'] = $goods_common_list[$v['goods_commonid']]['brand_id'];
  789. $v['brand_name'] = $goods_common_list[$v['goods_commonid']]['brand_name'];
  790. $goods_list[$v['goods_id']] = $v;
  791. }
  792. unset($goods_list_tmp);
  793. //查询订单缓存是否存在,存在则删除
  794. $model->table('stat_ordergoods')->where(array('order_id'=>array('in',$orderid_arr)))->delete();
  795. //查询订单缓存是否存在,存在则删除
  796. $model->table('stat_order')->where(array('order_id'=>array('in',$orderid_arr)))->delete();
  797. //整理新增数据
  798. $ordergoods_insert_arr = array();
  799. foreach ((array)$ordergoods_list as $k=>$v){
  800. $tmp = array();
  801. $tmp['rec_id'] = $v['rec_id'];
  802. $tmp['stat_updatetime'] = $search_etime;
  803. $tmp['order_id'] = $v['order_id'];
  804. $tmp['order_sn'] = $order_list[$v['order_id']]['order_sn'];
  805. $tmp['order_add_time'] = $order_list[$v['order_id']]['add_time'];
  806. $tmp['payment_code'] = $order_list[$v['order_id']]['payment_code'];
  807. $tmp['order_amount'] = $order_list[$v['order_id']]['order_amount'];
  808. $tmp['shipping_fee'] = $order_list[$v['order_id']]['shipping_fee'];
  809. $tmp['evaluation_state'] = $order_list[$v['order_id']]['evaluation_state'];
  810. $tmp['order_state'] = $order_list[$v['order_id']]['order_state'];
  811. $tmp['refund_state'] = $order_list[$v['order_id']]['refund_state'];
  812. $tmp['refund_amount'] = $order_list[$v['order_id']]['refund_amount'];
  813. $tmp['order_from'] = $order_list[$v['order_id']]['order_from'];
  814. $tmp['order_isvalid'] = $order_list[$v['order_id']]['order_isvalid'];
  815. $tmp['reciver_province_id'] = $order_common_list[$v['order_id']]['reciver_province_id'];
  816. $tmp['store_id'] = $v['store_id'];
  817. $tmp['store_name'] = $store_list[$v['store_id']]['store_name'];
  818. $tmp['grade_id'] = $store_list[$v['store_id']]['grade_id'];
  819. $tmp['sc_id'] = $store_list[$v['store_id']]['sc_id'];
  820. $tmp['buyer_id'] = $order_list[$v['order_id']]['buyer_id'];
  821. $tmp['buyer_name'] = $order_list[$v['order_id']]['buyer_name'];
  822. $tmp['goods_id'] = $v['goods_id'];
  823. $tmp['goods_name'] = $v['goods_name'];
  824. $tmp['goods_commonid'] = intval($goods_list[$v['goods_id']]['goods_commonid']);
  825. $tmp['goods_commonname'] = ($t = $goods_list[$v['goods_id']]['goods_commonname'])?$t:'';
  826. $tmp['gc_id'] = intval($goods_list[$v['goods_id']]['gc_id']);
  827. $tmp['gc_parentid_1'] = intval($goods_list[$v['goods_id']]['gc_id_1']);
  828. $tmp['gc_parentid_2'] = intval($goods_list[$v['goods_id']]['gc_id_2']);
  829. $tmp['gc_parentid_3'] = intval($goods_list[$v['goods_id']]['gc_id_3']);
  830. $tmp['brand_id'] = intval($goods_list[$v['goods_id']]['brand_id']);
  831. $tmp['brand_name'] = ($t = $goods_list[$v['goods_id']]['brand_name'])?$t:'';
  832. $tmp['goods_serial'] = ($t = $goods_list[$v['goods_id']]['goods_serial'])?$t:'';
  833. $tmp['goods_price'] = $v['goods_price'];
  834. $tmp['goods_num'] = $v['goods_num'];
  835. $tmp['goods_image'] = $goods_list[$v['goods_id']]['goods_image'];
  836. $tmp['goods_pay_price'] = $v['goods_pay_price'];
  837. $tmp['goods_type'] = $v['goods_type'];
  838. $tmp['promotions_id'] = $v['promotions_id'];
  839. $tmp['commis_rate'] = $v['commis_rate'];
  840. $ordergoods_insert_arr[] = $tmp;
  841. }
  842. $model->table('stat_ordergoods')->insertAll($ordergoods_insert_arr);
  843. $order_insert_arr = array();
  844. foreach ((array)$order_list as $k=>$v){
  845. $tmp = array();
  846. $tmp['order_id'] = $v['order_id'];
  847. $tmp['order_sn'] = $v['order_sn'];
  848. $tmp['order_add_time'] = $v['add_time'];
  849. $tmp['payment_code'] = $v['payment_code'];
  850. $tmp['order_amount'] = $v['order_amount'];
  851. $tmp['shipping_fee'] = $v['shipping_fee'];
  852. $tmp['evaluation_state'] = $v['evaluation_state'];
  853. $tmp['order_state'] = $v['order_state'];
  854. $tmp['refund_state'] = $v['refund_state'];
  855. $tmp['refund_amount'] = $v['refund_amount'];
  856. $tmp['order_from'] = $v['order_from'];
  857. $tmp['order_isvalid'] = $v['order_isvalid'];
  858. $tmp['reciver_province_id'] = $order_common_list[$v['order_id']]['reciver_province_id'];
  859. $tmp['store_id'] = $v['store_id'];
  860. $tmp['store_name'] = $store_list[$v['store_id']]['store_name'];
  861. $tmp['grade_id'] = $store_list[$v['store_id']]['grade_id'];
  862. $tmp['sc_id'] = $store_list[$v['store_id']]['sc_id'];
  863. $tmp['buyer_id'] = $v['buyer_id'];
  864. $tmp['buyer_name'] = $v['buyer_name'];
  865. $order_insert_arr[] = $tmp;
  866. }
  867. $model->table('stat_order')->insertAll($order_insert_arr);
  868. }
  869. }
  870. }
  871. }
  872. /**
  873. * 会员相关数据统计
  874. */
  875. private function _member_stat()
  876. {
  877. $model = Model('stat');
  878. //查询最后统计的记录
  879. $latest_record = $model->getOneStatmember(array(), '', 'statm_id desc');
  880. $stime = 0;
  881. if ($latest_record){
  882. $start_time = strtotime(date('Y-m-d',$latest_record['statm_updatetime']));
  883. } else {
  884. $start_time = strtotime(date('Y-m-d',strtotime(C('setup_date'))));//从系统的安装时间开始统计
  885. }
  886. $j = 1;
  887. for ($stime = $start_time; $stime < time(); $stime = $stime+86400){
  888. //数据库更新数据数组
  889. $insert_arr = array();
  890. $update_arr = array();
  891. $etime = $stime + 86400 - 1;
  892. //避免重复统计,开始时间必须大于最后一条记录的记录时间
  893. $search_stime = $latest_record['statm_updatetime'] > $stime ? $latest_record['statm_updatetime'] : $stime;
  894. //统计一天的数据,如果结束时间大于当前时间,则结束时间为当前时间,避免因为查询时间的延迟造成数据遗落
  895. $search_etime = ($t = ($stime + 86400 - 1)) > time() ? time() : ($stime + 86400 - 1);
  896. //统计订单下单量和下单金额
  897. $field = ' order.order_id,add_time,buyer_id,buyer_name,order_amount';
  898. $where = array();
  899. $where['order.order_state'] = array('neq',ORDER_STATE_NEW);//去除未支付订单
  900. $where['order.refund_state'] = array('exp',"!(order.order_state = '".ORDER_STATE_CANCEL."' and order.refund_state = 0)");//没有参与退款的取消订单,不记录到统计中
  901. $where['order_log.log_time'] = array('between',array($search_stime,$search_etime));//按照订单付款的操作时间统计
  902. //货到付款当交易成功进入统计,非货到付款当付款后进入统计
  903. $where['payment_code'] = array('exp',"(order.payment_code='offline' and order_log.log_orderstate = '".ORDER_STATE_SUCCESS."') or (order.payment_code<>'offline' and order_log.log_orderstate = '".ORDER_STATE_PAY."' )");
  904. $orderlist_tmp = $model->statByOrderLog($where, $field, 0, 0, 'order_id');//此处由于底层的限制,仅能查询1000条,如果日下单量大于1000,则需要limit的支持
  905. $order_list = array();
  906. $orderid_list = array();
  907. foreach ((array)$orderlist_tmp as $k=>$v){
  908. $addtime = strtotime(date('Y-m-d',$v['add_time']));
  909. if ($addtime != $stime){//订单如果隔天支付的话,需要进行统计数据更新
  910. $update_arr[$addtime][$v['buyer_id']]['statm_membername'] = $v['buyer_name'];
  911. $update_arr[$addtime][$v['buyer_id']]['statm_ordernum'] = intval($update_arr[$addtime][$v['buyer_id']]['statm_ordernum'])+1;
  912. $update_arr[$addtime][$v['buyer_id']]['statm_orderamount'] = floatval($update_arr[$addtime][$v['buyer_id']]['statm_orderamount']) + (($t = floatval($v['order_amount'])) > 0?$t:0);
  913. } else {
  914. $order_list[$v['buyer_id']]['buyer_name'] = $v['buyer_name'];
  915. $order_list[$v['buyer_id']]['ordernum'] = intval($order_list[$v['buyer_id']]['ordernum']) + 1;
  916. $order_list[$v['buyer_id']]['orderamount'] = floatval($order_list[$v['buyer_id']]['orderamount']) + (($t = floatval($v['order_amount'])) > 0?$t:0);
  917. }
  918. //记录订单ID数组
  919. $orderid_list[] = $v['order_id'];
  920. }
  921. //统计下单商品件数
  922. if ($orderid_list){
  923. $field = ' add_time,order.buyer_id,order.buyer_name,goods_num ';
  924. $where = array();
  925. $where['order.order_id'] = array('in',$orderid_list);
  926. $ordergoods_tmp = $model->statByOrderGoods($where, $field, 0, 0, 'order.order_id');
  927. $ordergoods_list = array();
  928. foreach ((array)$ordergoods_tmp as $k=>$v){
  929. $addtime = strtotime(date('Y-m-d',$v['add_time']));
  930. if ($addtime != $stime){//订单如果隔天支付的话,需要进行统计数据更新
  931. $update_arr[$addtime][$v['buyer_id']]['statm_goodsnum'] = intval($update_arr[$addtime][$v['buyer_id']]['statm_goodsnum']) + (($t = floatval($v['goods_num'])) > 0?$t:0);
  932. } else {
  933. $ordergoods_list[$v['buyer_id']]['goodsnum'] = $ordergoods_list[$v['buyer_id']]['goodsnum'] + (($t = floatval($v['goods_num'])) > 0?$t:0);
  934. }
  935. }
  936. }
  937. //统计的预存款记录
  938. $field = ' lg_member_id,lg_member_name,SUM(IF(lg_av_amount>=0,lg_av_amount,0)) as predincrease, SUM(IF(lg_av_amount<=0,lg_av_amount,0)) as predreduce ';
  939. $where = array();
  940. $where['lg_add_time'] = array('between',array($stime,$etime));
  941. $predeposit_tmp = $model->getPredepositInfo($where, $field, 0, 'lg_member_id', 0, 'lg_member_id');
  942. $predeposit_list = array();
  943. foreach ((array)$predeposit_tmp as $k=>$v){
  944. $predeposit_list[$v['lg_member_id']] = $v;
  945. }
  946. //统计的积分记录
  947. $field = ' pl_memberid,pl_membername,SUM(IF(pl_points>=0,pl_points,0)) as pointsincrease, SUM(IF(pl_points<=0,pl_points,0)) as pointsreduce ';
  948. $where = array();
  949. $where['pl_addtime'] = array('between',array($stime,$etime));
  950. $points_tmp = $model->statByPointslog($where, $field, 0, 0, '', 'pl_memberid');
  951. $points_list = array();
  952. foreach ((array)$points_tmp as $k=>$v){
  953. $points_list[$v['pl_memberid']] = $v;
  954. }
  955. //处理需要更新的数据
  956. foreach ((array)$update_arr as $k=>$v){
  957. foreach ($v as $m_k=>$m_v){
  958. //查询记录是否存在
  959. $statmember_info = $model->getOneStatmember(array('statm_time'=>$k,'statm_memberid'=>$m_k));
  960. if ($statmember_info){
  961. $m_v['statm_ordernum'] = intval($statmember_info['statm_ordernum']) + $m_v['statm_ordernum'];
  962. $m_v['statm_orderamount'] = floatval($statmember_info['statm_ordernum']) + $m_v['statm_orderamount'];
  963. $m_v['statm_updatetime'] = $search_etime;
  964. $model->updateStatmember(array('statm_time'=>$k,'statm_memberid'=>$m_k),$m_v);
  965. } else {
  966. $tmp = array();
  967. $tmp['statm_memberid'] = $m_k;
  968. $tmp['statm_membername'] = $m_v['statm_membername'];
  969. $tmp['statm_time'] = $k;
  970. $tmp['statm_updatetime'] = $search_etime;
  971. $tmp['statm_ordernum'] = ($t = intval($m_v['statm_ordernum'])) > 0?$t:0;
  972. $tmp['statm_orderamount'] = ($t = floatval($m_v['statm_orderamount']))>0?$t:0;
  973. $tmp['statm_goodsnum'] = ($t = intval($m_v['statm_goodsnum']))?$t:0;
  974. $tmp['statm_predincrease'] = 0;
  975. $tmp['statm_predreduce'] = 0;
  976. $tmp['statm_pointsincrease'] = 0;
  977. $tmp['statm_pointsreduce'] = 0;
  978. $insert_arr[] = $tmp;
  979. }
  980. unset($statmember_info);
  981. }
  982. }
  983. //处理获得所有会员ID数组
  984. $memberidarr_order = $order_list?array_keys($order_list):array();
  985. $memberidarr_ordergoods = $ordergoods_list?array_keys($ordergoods_list):array();
  986. $memberidarr_predeposit = $predeposit_list?array_keys($predeposit_list):array();
  987. $memberidarr_points = $points_list?array_keys($points_list):array();
  988. $memberid_arr = array_merge($memberidarr_order,$memberidarr_ordergoods,$memberidarr_predeposit,$memberidarr_points);
  989. //查询会员信息
  990. $memberid_list = Model('member')->getMemberList(array('member_id'=>array('in',$memberid_arr)), '*', 0);
  991. //查询记录是否存在
  992. $statmemberlist_tmp = $model->statByStatmember(array('statm_time'=>$stime));
  993. $statmemberlist = array();
  994. foreach ((array)$statmemberlist_tmp as $k=>$v){
  995. $statmemberlist[$v['statm_memberid']] = $v;
  996. }
  997. foreach ((array)$memberid_list as $k=>$v){
  998. $tmp = array();
  999. $tmp['statm_memberid'] = $v['member_id'];
  1000. $tmp['statm_membername'] = $v['member_name'];
  1001. $tmp['statm_time'] = $stime;
  1002. $tmp['statm_updatetime'] = $search_etime;
  1003. //因为记录可能已经存在,所以加上之前的统计记录
  1004. $tmp['statm_ordernum'] = intval($statmemberlist[$tmp['statm_memberid']]['statm_ordernum']) + (($t = intval($order_list[$tmp['statm_memberid']]['ordernum'])) > 0?$t:0);
  1005. $tmp['statm_orderamount'] = floatval($statmemberlist[$tmp['statm_memberid']]['statm_orderamount']) + (($t = floatval($order_list[$tmp['statm_memberid']]['orderamount']))>0?$t:0);
  1006. $tmp['statm_goodsnum'] = intval($statmemberlist[$tmp['statm_memberid']]['statm_goodsnum']) + (($t = intval($ordergoods_list[$tmp['statm_memberid']]['goodsnum']))?$t:0);
  1007. $tmp['statm_predincrease'] = (($t = floatval($predeposit_list[$tmp['statm_memberid']]['predincrease']))?$t:0);
  1008. $tmp['statm_predreduce'] = (($t = floatval($predeposit_list[$tmp['statm_memberid']]['predreduce']))?$t:0);
  1009. $tmp['statm_pointsincrease'] = (($t = intval($points_list[$tmp['statm_memberid']]['pointsincrease']))?$t:0);
  1010. $tmp['statm_pointsreduce'] = (($t = intval($points_list[$tmp['statm_memberid']]['pointsreduce']))?$t:0);
  1011. $insert_arr[] = $tmp;
  1012. }
  1013. //删除旧的统计数据
  1014. $model->delByStatmember(array('statm_time'=>$stime));
  1015. $model->table('stat_member')->insertAll($insert_arr);
  1016. }
  1017. }
  1018. private function bonus_expire_notify()
  1019. {
  1020. notify_helper::onBonusExpire(10,5);
  1021. }
  1022. private function send_reward()
  1023. {
  1024. }
  1025. public function update_voteOp()
  1026. {
  1027. $mod_special = Model('mb_special');
  1028. $items = $mod_special->field('*')->where(['from_user' => 1])->limit(false)->select();
  1029. foreach ($items as $item)
  1030. {
  1031. $spid = intval($item['special_id']);
  1032. $params = $item['params'];
  1033. $vote_result = $item['vote_result'];
  1034. if(!empty($params) && !empty($vote_result))
  1035. {
  1036. $params = unserialize($params);
  1037. $vresult = unserialize($vote_result);
  1038. $vote = $params['vote'];
  1039. if(!empty($vote))
  1040. {
  1041. $params['vote'] = [];
  1042. $params['vote'][] = $vote;
  1043. $vote_result = [];
  1044. $vote_result[] = $vresult;
  1045. $mod_special->editUserSpecial($spid,['special_id' =>$spid],['params' => serialize($params),'vote_result' => serialize($vote_result)]);
  1046. }
  1047. }
  1048. }
  1049. }
  1050. private function add_sku()
  1051. {
  1052. $path = BASE_DATA_PATH . "/sales/sku.csv";
  1053. $lines = explode("\r",$this->read_file($path));
  1054. $mod_price = Model('');
  1055. foreach($lines as $line)
  1056. {
  1057. $row = explode(';',$line);
  1058. $omsid = intval($row[0]);
  1059. $market_price = intval($row[1] * 100 + 0.5) / 100;
  1060. $purchase_price = intval($row[2] * 100 + 0.5) / 100;
  1061. $sku_price = intval($row[3] * 100 + 0.5) / 100;
  1062. if($omsid <= 0) continue;
  1063. $val = ['omsid' => $omsid,'purchase_price' => $purchase_price,'market_price' => $market_price,'sku_price' => $sku_price];
  1064. $ret = $mod_price->table('goods_orgprice')->insert($val);
  1065. if($ret == false) {
  1066. Log::record("cannot insert row",Log::DEBUG);
  1067. }
  1068. }
  1069. }
  1070. private function read_file($path)
  1071. {
  1072. $file = fopen($path, "r");
  1073. $datas = '';
  1074. while (!feof($file)) {
  1075. $datas .= fgets($file);
  1076. }
  1077. return $datas;
  1078. }
  1079. }