Kan.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?php
  2. namespace addons\shopro\controller\activity;
  3. use addons\shopro\controller\Common;
  4. use addons\shopro\service\goods\GoodsService;
  5. use addons\shopro\facade\Activity as ActivityFacade;
  6. use think\Db;
  7. class Kan extends Common
  8. {
  9. protected $noNeedLogin = ['index', 'detail'];
  10. protected $noNeedRight = ['*'];
  11. //砍价商品列表
  12. public function kan_productsku_list(){
  13. $category_id = $this->request->param('category_id');
  14. $list = Db::name('shopro_activity_sku_price')->alias('asp')
  15. ->field([
  16. 'asp.activity_id','asp.goods_sku_price_id','asp.goods_id','asp.price',
  17. 'a.rules',
  18. 'g.title','g.image',
  19. 'gsp.goods_sku_text','gsp.image as sku_image','gsp.price as old_price']
  20. )
  21. ->join('shopro_activity a','asp.activity_id = a.id','LEFT')
  22. ->join('shopro_goods g' ,'asp.goods_id = g.id','LEFT')
  23. ->join('shopro_goods_sku_price gsp','asp.goods_sku_price_id = gsp.id','LEFT')
  24. ->where('asp.status','up')
  25. ->where('a.deletetime',NULL)->where('a.type','kan')
  26. ->where('g.deletetime',NULL)->whereIn('g.status', ['up', 'hidden'])
  27. ->where('gsp.status','up');
  28. if(!empty($category_id)){
  29. $list->where('find_in_set(:category_ids,g.category_ids)', ['category_ids' => $category_id]);
  30. }
  31. $list = $list->order('a.end_time asc')->autopage()->select();
  32. $list = list_domain_image($list,['image','sku_image']);
  33. foreach($list as $key => $val){
  34. //sku图片代替主图
  35. if(!empty($val['sku_image'])){
  36. $val['image'] = $val['sku_image'];
  37. }
  38. unset($val['sku_image']);
  39. $val['team_num'] = json_decode($val['rules'],true)['team_num'];//砍价人数上限
  40. unset($val['rules']);
  41. $list[$key] = $val;
  42. }
  43. $this->success('获取成功',$list);
  44. }
  45. //发起砍价
  46. public function kan_newone(){
  47. $user = auth_user();
  48. $nowtime = time();
  49. $goods_id = $this->request->param('goods_id');
  50. $goods_sku_price_id = $this->request->param('goods_sku_price_id');
  51. $activity_id = $this->request->param('activity_id');
  52. //活动
  53. $activity = Db::name('shopro_activity')->where('type','kan')->where('deletetime',NULL)->where('id',$activity_id)->find();
  54. if(empty($activity)){
  55. $this->error('不存在的砍价活动');
  56. }
  57. if($activity['end_time'] < time()){
  58. $this->error('该砍价活动已结束');
  59. }
  60. $rules = json_decode($activity['rules'],true);
  61. //活动商品
  62. $map_sku = [
  63. 'activity_id' => $activity_id,
  64. 'goods_id' => $goods_id,
  65. 'goods_sku_price_id' => $goods_sku_price_id,
  66. 'status' => 'up',
  67. ];
  68. $activity_sku_price = Db::name('shopro_activity_sku_price')->where($map_sku)->find();
  69. if(empty($activity_sku_price)){
  70. $this->error('不存在的活动商品');
  71. }
  72. if($activity_sku_price['sales'] >= $activity_sku_price['stock']){
  73. $this->error('该活动商品已售罄');
  74. }
  75. //限购
  76. $map_can = [
  77. 'user_id' => $user['id'],
  78. 'activity_id' => $activity_id,
  79. 'goods_id' => $goods_id,
  80. 'goods_sku_price_id' => $goods_sku_price_id,
  81. 'status' => ['IN',['ing','finish','finish_fictitious']],
  82. ];
  83. $check = Db::name('shopro_activity_kan')->where($map_can)->count();
  84. if($check >= $rules['limit_num']){
  85. $this->error('当前活动中此商品限制砍价'.$rules['limit_num'].'次');
  86. }
  87. //写入
  88. $data = [
  89. 'user_id' => $user['id'],
  90. 'goods_id' => $goods_id,
  91. 'goods_sku_price_id' => $goods_sku_price_id,
  92. 'activity_id' => $activity_id,
  93. 'num' => $rules['team_num'],
  94. 'current_num' => 0,
  95. 'status' => 'ing',
  96. 'expire_time' => $nowtime + $rules['valid_time']*3600,
  97. 'finish_time' => 0,
  98. 'createtime' => $nowtime,
  99. 'updatetime' => $nowtime,
  100. 'total_kan_price' => 0,
  101. 'activity_sku_price' => $activity_sku_price['price'],
  102. ];
  103. $kan_id = Db::name('shopro_activity_kan')->insertGetId($data);
  104. $this->success('发起成功',$kan_id);
  105. }
  106. //帮好友砍价
  107. public function kan_kan(){
  108. $kan_id = $this->request->param('kan_id');
  109. $kan_id = intval($kan_id);
  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');
  204. $kan = Db::name('shopro_activity_kan')->alias('kan')
  205. ->field(['kan.*',
  206. 'g.title','g.image',
  207. 'gsp.goods_sku_text','gsp.image as sku_image','gsp.price as old_price',
  208. ])
  209. ->join('shopro_goods g','kan.goods_id = g.id','LEFT')
  210. ->join('shopro_goods_sku_price gsp','kan.goods_sku_price_id = gsp.id','LEFT')
  211. ->where('kan.id',$kan_id)
  212. ->find();
  213. //砍价记录
  214. $kan_log = Db::name('shopro_activity_kan_log')->where('kan_id',$kan_id)->order('id asc')->select();
  215. $result = [
  216. 'activity' => $kan,
  217. 'log' => $kan_log,
  218. ];
  219. $this->success('获取成功',$result);
  220. }
  221. }