Kan.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  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(empty($kan)){
  126. Db::rollback();
  127. $this->error('不存在的砍价活动');
  128. }
  129. if($kan['status'] == 'invalid'){
  130. Db::rollback();
  131. $this->error('此次砍价已过期,不需要再砍啦!');
  132. }
  133. if($kan['status'] != 'ing'){
  134. Db::rollback();
  135. $this->error('此次砍价已完成,不需要再砍啦!');
  136. }
  137. if($kan['current_num'] >= $kan['num']){
  138. Db::rollback();
  139. $this->error('已经达到最高砍价人数,不需要再砍啦!');
  140. }
  141. //商品原价
  142. $goods_sku_price = Db::name('shopro_goods_sku_price')->where('id',$kan['goods_sku_price_id'])->find();
  143. //总差价 = 商品原价 - 活动低价
  144. $cha_price = bcsub($goods_sku_price['price'],$kan['activity_sku_price'],2); if($cha_price <= 0){$cha_price = 0;}
  145. //还能砍的剩余价 = 总差价 - 已经砍掉的价
  146. $remain_price = bcsub($cha_price,$kan['total_kan_price'],2); if($remain_price <= 0){$remain_price = 0;}
  147. //本次能砍掉的价格
  148. $kan_price = 0;
  149. $is_last = 0;
  150. if($kan['num'] - $kan['current_num'] == 1){
  151. //最后一砍
  152. $kan_price = $remain_price;
  153. $is_last = 1;
  154. }else{
  155. //每次砍价的平均数
  156. $pingjun_price = bcdiv($cha_price,$kan['num'],2);
  157. //上下100分钱的浮动
  158. $min = $pingjun_price*100 - 100; if($min <= 0){$min = 0;}
  159. $max = $pingjun_price*100 + 100;
  160. $kan_price = bcdiv(rand($min,$max),100,2);
  161. //一般最后一次的时候 浮动过大,最后一砍,直接强制结束
  162. if($kan_price >= $remain_price){
  163. $kan_price = $remain_price;
  164. $is_last = 1;
  165. }
  166. }
  167. //日志
  168. $log_data = [
  169. 'user_id' => $user['id'],
  170. 'nickname' => $user['nickname'],
  171. 'avatar' => $user['avatar'],
  172. 'kan_id' => $kan_id,
  173. 'activity_id' => $kan['activity_id'],
  174. 'kan_price' => $kan_price,
  175. 'createtime' => $nowtime,
  176. 'updatetime' => $nowtime,
  177. ];
  178. $log_id = Db::name('shopro_activity_kan_log')->insertGetId($log_data);
  179. if(!$log_id){
  180. Db::rollback();
  181. $this->error('砍价失败了');
  182. }
  183. //砍价修改
  184. $update = [
  185. 'current_num' => $kan['current_num'] + 1,
  186. 'updatetime' => $nowtime,
  187. 'total_kan_price' => $kan['total_kan_price'] + $kan_price,
  188. ];
  189. if($is_last == 1){
  190. $update['status'] = 'finish';
  191. $update['finish_time'] = $nowtime;
  192. };
  193. $rs_update = Db::name('shopro_activity_kan')->where('id',$kan_id)->update($update);
  194. if(!$rs_update){
  195. Db::rollback();
  196. $this->error('砍价失败了');
  197. }
  198. Db::commit();
  199. $this->success('砍价成功');
  200. }
  201. //某个已发起的砍价详情
  202. public function kan_info(){
  203. $kan_id = $this->request->param('kan_id',0,'intval');
  204. if(!$kan_id){
  205. $this->error();
  206. }
  207. $kan = Db::name('shopro_activity_kan')->alias('kan')
  208. ->field(['kan.*',
  209. 'g.title','g.image',
  210. 'gsp.goods_sku_text','gsp.image as sku_image','gsp.price as old_price',
  211. ])
  212. ->join('shopro_goods g','kan.goods_id = g.id','LEFT')
  213. ->join('shopro_goods_sku_price gsp','kan.goods_sku_price_id = gsp.id','LEFT')
  214. ->where('kan.id',$kan_id)
  215. ->find();
  216. $kan = info_domain_image($kan,['image','sku_image']);
  217. $kan['seconds'] = $kan['expire_time'] - time(); if($kan['seconds'] < 0){$kan['seconds'] = 0;}
  218. $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;}
  219. if(!empty($kan['sku_image'])){
  220. $kan['image'] = $kan['sku_image'];
  221. }
  222. //砍价记录
  223. $kan_log = Db::name('shopro_activity_kan_log')->where('kan_id',$kan_id)->order('id asc')->select();
  224. $kan_log = list_domain_image($kan_log,['avatar']);
  225. $result = [
  226. 'activity' => $kan,
  227. 'log' => $kan_log,
  228. ];
  229. $this->success('获取成功',$result);
  230. }
  231. //我发起的砍价列表
  232. public function kan_my_list(){
  233. $status = $this->request->param('status','','trim');
  234. $user = auth_user();
  235. $map = [
  236. 'kan.user_id' => $user['id'],
  237. ];
  238. if(in_array($status,['invalid','ing','finish'])){
  239. $map['kan.status'] = $status;
  240. }
  241. $list = Db::name('shopro_activity_kan')->alias('kan')
  242. ->field(['kan.*',
  243. 'g.title','g.image',
  244. 'gsp.goods_sku_text','gsp.image as sku_image','gsp.price as old_price',
  245. ])
  246. ->join('shopro_goods g','kan.goods_id = g.id','LEFT')
  247. ->join('shopro_goods_sku_price gsp','kan.goods_sku_price_id = gsp.id','LEFT')
  248. ->where($map)
  249. ->order('kan.id desc')->autopage()->select();
  250. $list = list_domain_image($list,['image','sku_image']);
  251. foreach($list as $key => $kan){
  252. $kan['seconds'] = $kan['expire_time'] - time(); if($kan['seconds'] < 0){$kan['seconds'] = 0;}
  253. $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;}
  254. if(!empty($kan['sku_image'])){
  255. $kan['image'] = $kan['sku_image'];
  256. }
  257. $list[$key] = $kan;
  258. }
  259. $this->success(1,$list);
  260. }
  261. }