date.php 56 KB

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