Kan.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <?php
  2. namespace addons\shopro\controller\activity;
  3. use addons\shopro\controller\Common;
  4. use think\Db;
  5. class Kan extends Common
  6. {
  7. protected $noNeedLogin = ['kan_productsku_list', 'kan_info'];
  8. protected $noNeedRight = ['*'];
  9. //砍价商品列表
  10. public function kan_productsku_list(){
  11. $category_id = $this->request->param('category_id');
  12. $list = Db::name('shopro_activity_sku_price')->alias('asp')
  13. ->field([
  14. 'asp.activity_id','asp.goods_sku_price_id','asp.goods_id','asp.price','asp.stock',
  15. 'a.rules',
  16. 'g.title','g.image',
  17. 'gsp.goods_sku_text','gsp.image as sku_image','gsp.price as old_price']
  18. )
  19. ->join('shopro_activity a','asp.activity_id = a.id','LEFT')
  20. ->join('shopro_goods g' ,'asp.goods_id = g.id','LEFT')
  21. ->join('shopro_goods_sku_price gsp','asp.goods_sku_price_id = gsp.id','LEFT')
  22. ->where('asp.status','up')
  23. ->where('a.deletetime',NULL)->where('a.type','kan')
  24. ->where('g.deletetime',NULL)->whereIn('g.status', ['up', 'hidden'])
  25. ->where('gsp.status','up');
  26. if(!empty($category_id)){
  27. $list->where('find_in_set(:category_ids,g.category_ids)', ['category_ids' => $category_id]);
  28. }
  29. $list = $list->order('a.end_time asc')->autopage()->select();
  30. $list = list_domain_image($list,['image','sku_image']);
  31. foreach($list as $key => $val){
  32. //sku图片代替主图
  33. if(!empty($val['sku_image'])){
  34. $val['image'] = $val['sku_image'];
  35. }
  36. unset($val['sku_image']);
  37. $val['team_num'] = json_decode($val['rules'],true)['team_num'];//砍价人数上限
  38. unset($val['rules']);
  39. $list[$key] = $val;
  40. }
  41. $this->success('获取成功',$list);
  42. }
  43. //发起砍价
  44. public function kan_newone(){
  45. $user = auth_user();
  46. $nowtime = time();
  47. $goods_id = $this->request->param('goods_id');
  48. $goods_sku_price_id = $this->request->param('goods_sku_price_id');
  49. $activity_id = $this->request->param('activity_id');
  50. //活动
  51. $activity = Db::name('shopro_activity')->where('type','kan')->where('deletetime',NULL)->where('id',$activity_id)->find();
  52. if(empty($activity)){
  53. $this->error('不存在的砍价活动');
  54. }
  55. if($activity['end_time'] < time()){
  56. $this->error('该砍价活动已结束');
  57. }
  58. $rules = json_decode($activity['rules'],true);
  59. //活动商品
  60. $map_sku = [
  61. 'activity_id' => $activity_id,
  62. 'goods_id' => $goods_id,
  63. 'goods_sku_price_id' => $goods_sku_price_id,
  64. 'status' => 'up',
  65. ];
  66. $activity_sku_price = Db::name('shopro_activity_sku_price')->where($map_sku)->find();
  67. if(empty($activity_sku_price)){
  68. $this->error('不存在的活动商品');
  69. }
  70. if($activity_sku_price['sales'] >= $activity_sku_price['stock']){
  71. $this->error('该活动商品已售罄');
  72. }
  73. //限购
  74. $map_can = [
  75. 'user_id' => $user['id'],
  76. 'activity_id' => $activity_id,
  77. 'goods_id' => $goods_id,
  78. 'goods_sku_price_id' => $goods_sku_price_id,
  79. 'status' => ['IN',['ing','finish','finish_fictitious']],
  80. ];
  81. $check = Db::name('shopro_activity_kan')->where($map_can)->count();
  82. if($check >= $rules['limit_num']){
  83. $this->error('当前活动中此商品限制砍价'.$rules['limit_num'].'次');
  84. }
  85. //写入
  86. $data = [
  87. 'user_id' => $user['id'],
  88. 'goods_id' => $goods_id,
  89. 'goods_sku_price_id' => $goods_sku_price_id,
  90. 'activity_id' => $activity_id,
  91. 'num' => $rules['team_num'],
  92. 'current_num' => 0,
  93. 'status' => 'ing',
  94. 'expire_time' => $nowtime + $rules['valid_time']*3600,
  95. 'finish_time' => 0,
  96. 'createtime' => $nowtime,
  97. 'updatetime' => $nowtime,
  98. 'total_kan_price' => 0,
  99. 'activity_sku_price' => $activity_sku_price['price'],
  100. ];
  101. $kan_id = Db::name('shopro_activity_kan')->insertGetId($data);
  102. $this->success('发起成功',$kan_id);
  103. }
  104. //帮好友砍价
  105. public function kan_kan(){
  106. $kan_id = $this->request->param('kan_id',0,'intval');
  107. if(!$kan_id){
  108. $this->error();
  109. }
  110. //
  111. $user = auth_user();
  112. $nowtime = time();
  113. //一人只能砍一次
  114. $map_check = [
  115. 'user_id' => $user['id'],
  116. 'kan_id' => $kan_id,
  117. ];
  118. $check = Db::name('shopro_activity_kan_log')->where($map_check)->find();
  119. if($check){
  120. $this->error('您已经砍过一次了');
  121. }
  122. Db::startTrans();
  123. //此次砍价
  124. $kan = Db::name('shopro_activity_kan')->where('id',$kan_id)->lock(true)->find();
  125. if($kan['user_id'] == $user['id']){
  126. Db::rollback();
  127. $this->error('不能砍自己发起的砍价');
  128. }
  129. if(empty($kan)){
  130. Db::rollback();
  131. $this->error('不存在的砍价活动');
  132. }
  133. if($kan['status'] == 'invalid'){
  134. Db::rollback();
  135. $this->error('此次砍价已过期,不需要再砍啦!');
  136. }
  137. if($kan['status'] != 'ing'){
  138. Db::rollback();
  139. $this->error('此次砍价已完成,不需要再砍啦!');
  140. }
  141. if($kan['current_num'] >= $kan['num']){
  142. Db::rollback();
  143. $this->error('已经达到最高砍价人数,不需要再砍啦!');
  144. }
  145. //商品原价
  146. $goods_sku_price = Db::name('shopro_goods_sku_price')->where('id',$kan['goods_sku_price_id'])->find();
  147. //总差价 = 商品原价 - 活动低价
  148. $cha_price = bcsub($goods_sku_price['price'],$kan['activity_sku_price'],2); if($cha_price <= 0){$cha_price = 0;}
  149. //还能砍的剩余价 = 总差价 - 已经砍掉的价
  150. $remain_price = bcsub($cha_price,$kan['total_kan_price'],2); if($remain_price <= 0){$remain_price = 0;}
  151. //本次能砍掉的价格
  152. $kan_price = 0;
  153. $is_last = 0;
  154. if($kan['num'] - $kan['current_num'] == 1){
  155. //最后一砍
  156. $kan_price = $remain_price;
  157. $is_last = 1;
  158. }else{
  159. //每次砍价的平均数
  160. $pingjun_price = bcdiv($cha_price,$kan['num'],2);
  161. //上下100分钱的浮动
  162. $min = $pingjun_price*100 - 100; if($min <= 0){$min = 0;}
  163. $max = $pingjun_price*100 + 100;
  164. $kan_price = bcdiv(rand($min,$max),100,2);
  165. //一般最后一次的时候 浮动过大,最后一砍,直接强制结束
  166. if($kan_price >= $remain_price){
  167. $kan_price = $remain_price;
  168. $is_last = 1;
  169. }
  170. }
  171. //日志
  172. $log_data = [
  173. 'user_id' => $user['id'],
  174. 'nickname' => $user['nickname'],
  175. 'avatar' => $user['avatar'],
  176. 'kan_id' => $kan_id,
  177. 'activity_id' => $kan['activity_id'],
  178. 'kan_price' => $kan_price,
  179. 'createtime' => $nowtime,
  180. 'updatetime' => $nowtime,
  181. ];
  182. $log_id = Db::name('shopro_activity_kan_log')->insertGetId($log_data);
  183. if(!$log_id){
  184. Db::rollback();
  185. $this->error('砍价失败了');
  186. }
  187. //砍价修改
  188. $update = [
  189. 'current_num' => $kan['current_num'] + 1,
  190. 'updatetime' => $nowtime,
  191. 'total_kan_price' => $kan['total_kan_price'] + $kan_price,
  192. ];
  193. if($is_last == 1){
  194. $update['status'] = 'finish';
  195. $update['finish_time'] = $nowtime;
  196. };
  197. $rs_update = Db::name('shopro_activity_kan')->where('id',$kan_id)->update($update);
  198. if(!$rs_update){
  199. Db::rollback();
  200. $this->error('砍价失败了');
  201. }
  202. Db::commit();
  203. $this->success('砍价成功');
  204. }
  205. //某个已发起的砍价详情
  206. public function kan_info(){
  207. $kan_id = $this->request->param('kan_id',0,'intval');
  208. if(!$kan_id){
  209. $this->error();
  210. }
  211. $user = auth_user();
  212. $kan = Db::name('shopro_activity_kan')->alias('kan')
  213. ->field(['kan.*',
  214. 'g.title','g.image',
  215. 'gsp.goods_sku_text','gsp.image as sku_image','gsp.price as old_price',
  216. ])
  217. ->join('shopro_goods g','kan.goods_id = g.id','LEFT')
  218. ->join('shopro_goods_sku_price gsp','kan.goods_sku_price_id = gsp.id','LEFT')
  219. ->where('kan.id',$kan_id)
  220. ->find();
  221. $kan = info_domain_image($kan,['image','sku_image']);
  222. $kan['expire_seconds'] = $kan['expire_time'] - time(); if($kan['expire_seconds'] < 0){$kan['expire_seconds'] = 0;}
  223. $kan['remain_price'] = bcsub(bcsub($kan['old_price'],$kan['activity_sku_price'],2),$kan['total_kan_price'],2); if($kan['remain_price'] < 0){$kan['remain_price'] = 0;}
  224. $kan['now_buy_price'] = bcsub($kan['old_price'],$kan['total_kan_price'],2); if($kan['now_buy_price'] < 0){$kan['now_buy_price'] = 0;}
  225. if(!empty($kan['sku_image'])){
  226. $kan['image'] = $kan['sku_image'];
  227. }
  228. $kan['is_my'] = $kan['user_id'] == $user['id'] ? 1 : 0;
  229. //砍价记录
  230. $kan_log = Db::name('shopro_activity_kan_log')->where('kan_id',$kan_id)->order('id asc')->select();
  231. $kan_log = list_domain_image($kan_log,['avatar']);
  232. //我有没有砍过
  233. $my_kan = null;
  234. foreach($kan_log as $key => $log){
  235. if($log['user_id'] == $user['id']){
  236. $my_kan = $log;
  237. }
  238. }
  239. $result = [
  240. 'activity' => $kan,
  241. 'log' => $kan_log,
  242. 'my_kan' => $my_kan,
  243. ];
  244. $this->success('获取成功',$result);
  245. }
  246. //我发起的砍价列表
  247. public function kan_my_list(){
  248. $status = $this->request->param('status','','trim');
  249. $user = auth_user();
  250. $map = [
  251. 'kan.user_id' => $user['id'],
  252. ];
  253. if(in_array($status,['invalid','ing','finish'])){
  254. $map['kan.status'] = $status;
  255. }
  256. $list = Db::name('shopro_activity_kan')->alias('kan')
  257. ->field(['kan.*',
  258. 'g.title','g.image',
  259. 'gsp.goods_sku_text','gsp.image as sku_image','gsp.price as old_price',
  260. ])
  261. ->join('shopro_goods g','kan.goods_id = g.id','LEFT')
  262. ->join('shopro_goods_sku_price gsp','kan.goods_sku_price_id = gsp.id','LEFT')
  263. ->where($map)
  264. ->order('kan.id desc')->autopage()->select();
  265. $list = list_domain_image($list,['image','sku_image']);
  266. foreach($list as $key => $kan){
  267. $kan['seconds'] = $kan['expire_time'] - time(); if($kan['seconds'] < 0){$kan['seconds'] = 0;}
  268. $kan['remain_price'] = bcsub(bcsub($kan['old_price'],$kan['activity_sku_price'],2),$kan['total_kan_price'],2); if($kan['remain_price'] < 0){$kan['remain_price'] = 0;}
  269. $kan['now_buy_price'] = bcsub($kan['old_price'],$kan['total_kan_price'],2); if($kan['now_buy_price'] < 0){$kan['now_buy_price'] = 0;}
  270. if(!empty($kan['sku_image'])){
  271. $kan['image'] = $kan['sku_image'];
  272. }
  273. $list[$key] = $kan;
  274. }
  275. $this->success(1,$list);
  276. }
  277. }