date.php 55 KB

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