goods.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. /**
  3. * 任务计划 - 通用任务、促销处理
  4. *
  5. *
  6. *
  7. *
  8. */
  9. defined('InShopNC') or exit('Access Invalid!');
  10. class goodsControl {
  11. public function __construct(){
  12. register_shutdown_function(array($this,"shutdown"));
  13. }
  14. /**
  15. * 更新商品促销到期状态
  16. */
  17. public function promotionOp() {
  18. //满即送过期
  19. Model('p_mansong')->editExpireMansong();
  20. }
  21. /**
  22. * 更新首页的商品价格信息
  23. */
  24. public function web_updateOp(){
  25. Model('web_config')->updateWebGoods();
  26. }
  27. /**
  28. * 执行通用任务
  29. */
  30. public function commonOp(){
  31. //查找待执行任务
  32. $model_cron = Model('cron');
  33. $cron = $model_cron->getCronList(array('exetime'=>array('elt',time())));
  34. if (!is_array($cron)) return ;
  35. $cron_array = array(); $cronid = array();
  36. foreach ($cron as $v) {
  37. $cron_array[$v['type']][$v['exeid']] = $v;
  38. }
  39. foreach ($cron_array as $k=>$v) {
  40. // 如果方法不存是,直接删除id
  41. if (!method_exists($this,'_cron_'.$k)) {
  42. $tmp = current($v);
  43. $cronid[] = $tmp['id'];continue;
  44. }
  45. $result = call_user_func_array(array($this,'_cron_'.$k),array($v));
  46. if (is_array($result)){
  47. $cronid = array_merge($cronid,$result);
  48. }
  49. }
  50. //删除执行完成的cron信息
  51. if (!empty($cronid) && is_array($cronid)){
  52. $model_cron->delCron(array('id'=>array('in',$cronid)));
  53. }
  54. }
  55. /**
  56. * 上架
  57. *
  58. * @param array $cron
  59. */
  60. private function _cron_1($cron = array()){
  61. $condition = array('goods_commonid' => array('in',array_keys($cron)));
  62. $update = Model('goods')->editProducesOnline($condition);
  63. if ($update){
  64. //返回执行成功的cronid
  65. $cronid = array();
  66. foreach ($cron as $v) {
  67. $cronid[] = $v['id'];
  68. }
  69. }else{
  70. return false;
  71. }
  72. return $cronid;
  73. }
  74. /**
  75. * 根据商品id更新商品促销价格
  76. *
  77. * @param array $cron
  78. */
  79. private function _cron_2($cron = array()){
  80. $condition = array('goods_id' => array('in',array_keys($cron)));
  81. $update = Model('goods')->editGoodsPromotionPrice($condition);
  82. if ($update){
  83. //返回执行成功的cronid
  84. $cronid = array();
  85. foreach ($cron as $v) {
  86. $cronid[] = $v['id'];
  87. }
  88. }else{
  89. return false;
  90. }
  91. return $cronid;
  92. }
  93. /**
  94. * 优惠套装过期
  95. *
  96. * @param array $cron
  97. */
  98. private function _cron_3($cron = array()) {
  99. $condition = array('store_id' => array('in', array_keys($cron)));
  100. $update = Model('p_bundling')->editBundlingQuotaClose($condition);
  101. if ($update) {
  102. //返回执行成功的cronid
  103. $cronid = array();
  104. foreach ($cron as $v) {
  105. $cronid[] = $v['id'];
  106. }
  107. } else {
  108. return false;
  109. }
  110. return $cronid;
  111. }
  112. /**
  113. * 推荐展位过期
  114. *
  115. * @param array $cron
  116. */
  117. private function _cron_4($cron = array()) {
  118. $condition = array('store_id' => array('in', array_keys($cron)));
  119. $update = Model('p_booth')->editBoothClose($condition);
  120. if ($update) {
  121. //返回执行成功的cronid
  122. $cronid = array();
  123. foreach ($cron as $v) {
  124. $cronid[] = $v['id'];
  125. }
  126. } else {
  127. return false;
  128. }
  129. return $cronid;
  130. }
  131. /**
  132. * 抢购开始更新商品促销价格
  133. *
  134. * @param array $cron
  135. */
  136. private function _cron_5($cron = array()) {
  137. $condition = array();
  138. $condition['goods_commonid'] = array('in', array_keys($cron));
  139. $condition['start_time'] = array('lt', time());
  140. $condition['end_time'] = array('gt', time());
  141. $groupbuy = Model('groupbuy')->getGroupbuyList($condition);
  142. foreach ($groupbuy as $val) {
  143. Model('goods')->editGoods(array('goods_promotion_price' => $val['groupbuy_price'], 'goods_promotion_type' => 1), array('goods_commonid' => $val['goods_commonid']));
  144. }
  145. //返回执行成功的cronid
  146. $cronid = array();
  147. foreach ($cron as $v) {
  148. $cronid[] = $v['id'];
  149. }
  150. return $cronid;
  151. }
  152. /**
  153. * 抢购过期
  154. *
  155. * @param array $cron
  156. */
  157. private function _cron_6($cron = array()) {
  158. $condition = array('goods_commonid' => array('in', array_keys($cron)));
  159. //抢购活动过期
  160. Model('groupbuy')->editExpireGroupbuy($condition);
  161. return array_keys($cron);
  162. }
  163. /**
  164. * 限时折扣过期
  165. *
  166. * @param array $cron
  167. */
  168. private function _cron_7($cron = array()) {
  169. $condition = array('xianshi_id' => array('in', array_keys($cron)));
  170. //限时折扣过期
  171. Model('p_xianshi')->editExpireXianshi($condition);
  172. return array_keys($cron);
  173. }
  174. /**
  175. * 将缓存中的浏览记录存入数据库中,并删除30天前的浏览历史
  176. */
  177. public function browseOp(){
  178. $model = Model('goods_browse');
  179. //将cache中的记录存入数据库
  180. if (C('cache.type') != 'file'){//如果浏览记录已经存入了缓存中,则将其整理到数据库中
  181. //上次更新缓存的时间
  182. $latest_record = $model->getGoodsbrowseOne(array(),'','browsetime desc');
  183. $starttime = ($t = intval($latest_record['browsetime']))?$t:0;
  184. $monthago = strtotime(date('Y-m-d',time())) - 86400*30;
  185. $model_member = Model('member');
  186. //查询会员信息总条数
  187. $countnum = $model_member->getMemberCount(array());
  188. $eachnum = 100;
  189. for ($i=0; $i<$countnum; $i+=$eachnum){//每次查询100条
  190. $member_list = $model_member->getMemberList(array(), '*', 0, 'member_id asc', "$i,$eachnum");
  191. foreach ((array)$member_list as $k=>$v){
  192. $insert_arr = array();
  193. $goodsid_arr = array();
  194. //生成缓存的键值
  195. $hash_key = $v['member_id'];
  196. $browse_goodsid = rcache($hash_key,'goodsbrowse','goodsid');
  197. if ($browse_goodsid) {
  198. //删除缓存中多余的浏览历史记录,仅保留最近的30条浏览历史,先取出最近30条浏览历史的商品ID
  199. $cachegoodsid_arr = $browse_goodsid['goodsid']?unserialize($browse_goodsid['goodsid']):array();
  200. unset($browse_goodsid['goodsid']);
  201. if ($cachegoodsid_arr){
  202. $cachegoodsid_arr = array_slice($cachegoodsid_arr,-30,30,true);
  203. }
  204. //处理存入数据库的浏览历史缓存信息
  205. $_cache = rcache($hash_key, 'goodsbrowse');
  206. foreach((array)$_cache as $c_k=>$c_v){
  207. $c_v = unserialize($c_v);
  208. if ($c_v['browsetime'] >= $starttime){//如果 缓存中的数据未更新到数据库中(即添加时间大于上次更新到数据库中的数据时间)则将数据更新到数据库中
  209. $tmp_arr = array();
  210. $tmp_arr['goods_id'] = $c_v['goods_id'];
  211. $tmp_arr['member_id'] = $v['member_id'];
  212. $tmp_arr['browsetime'] = $c_v['browsetime'];
  213. $tmp_arr['gc_id'] = $c_v['gc_id'];
  214. $tmp_arr['gc_id_1'] = $c_v['gc_id_1'];
  215. $tmp_arr['gc_id_2'] = $c_v['gc_id_2'];
  216. $tmp_arr['gc_id_3'] = $c_v['gc_id_3'];
  217. $insert_arr[] = $tmp_arr;
  218. $goodsid_arr[] = $c_v['goods_id'];
  219. }
  220. //除了最近的30条浏览历史之外多余的浏览历史记录或者30天之前的浏览历史从缓存中删除
  221. if (!in_array($c_v['goods_id'], $cachegoodsid_arr) || $c_v['browsetime'] < $monthago){
  222. unset($_cache[$c_k]);
  223. }
  224. }
  225. //删除已经存在的该商品浏览记录
  226. if ($goodsid_arr){
  227. $model->delGoodsbrowse(array('member_id'=>$v['member_id'],'goods_id'=>array('in',$goodsid_arr)));
  228. }
  229. //将缓存中的浏览历史存入数据库
  230. if ($insert_arr){
  231. $model->addGoodsbrowseAll($insert_arr);
  232. }
  233. //重新赋值浏览历史缓存
  234. dcache($hash_key, 'goodsbrowse');
  235. $_cache['goodsid'] = serialize($cachegoodsid_arr);
  236. wcache($hash_key,$_cache,'goodsbrowse');
  237. }
  238. }
  239. }
  240. }
  241. //删除30天前的浏览历史
  242. $model->delGoodsbrowse(array('browsetime'=>array('lt',$monthago)));
  243. }
  244. /**
  245. * 执行完成提示信息
  246. *
  247. */
  248. public function shutdown(){
  249. exit("success at ".date('Y-m-d H:i:s',time())."\n");
  250. }
  251. }