MjSendActivity.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <?php
  2. namespace app\api\model\mj;
  3. use app\api\model\Goods as GoodsModel;
  4. use app\api\model\GoodsSku as GoodsSkuModel;
  5. use app\api\model\ShopGoodsSku;
  6. use app\common\enum\goods\GoodsType;
  7. use app\common\enum\order\DeliveryType as DeliveryTypeEnum;
  8. use app\common\library\helper;
  9. use app\common\model\mj\MjSendActivity as MjSendActivityModel;
  10. /**
  11. * 满件送赠品活动模型
  12. * @package app\store\model\coupon
  13. */
  14. class MjSendActivity extends MjSendActivityModel
  15. {
  16. /**
  17. * 获取列表
  18. * @param $goodsId
  19. * @return mixed
  20. * @throws \think\db\exception\DataNotFoundException
  21. * @throws \think\db\exception\DbException
  22. * @throws \think\db\exception\ModelNotFoundException
  23. */
  24. public static function validActivity($goodsId)
  25. {
  26. // 检索查询条件
  27. $now = date('Y-m-d H:i:s');
  28. $filter[] = ['ac.start_time','<',$now];
  29. $filter[] = ['ac.end_time','>',$now];
  30. $filter[] = ['ac.audit_status','=',1];
  31. $filter[] = ['ac.status','=',1];
  32. $filter[] = ['g.goods_id','=',$goodsId];
  33. // 执行查询
  34. $list = self::field('ac.*')
  35. ->with(['goodsExcept','giftGoods'])
  36. ->alias('ac')
  37. ->leftJoin('mj_send_goods g','g.mj_send_activity_id = ac.id')
  38. ->where($filter)
  39. ->find();
  40. // dd(self::getLastSql());
  41. // dd($list['giftGoods']);
  42. if (!$list)return null;
  43. $list = $list->toArray();
  44. //判断商品还能不能使用活动
  45. if ($list['goodsExcept']['goods_id']==$goodsId){
  46. if($list['goodsExcept']['residue_stock']<=0){
  47. return null;
  48. }else{
  49. $mj_props = array_values(array_sort($list['mj_props'], 'value'));
  50. if($mj_props[0]['value']>$list['goodsExcept']['residue_stock']){
  51. return null;
  52. }
  53. }
  54. }
  55. $list['empty_gifts'] = false;//当所有的赠品库存都是0:true
  56. $giftsGoods = null;
  57. $count = count($list['giftGoods']);
  58. foreach ($list['giftGoods'] as $key=>$g){
  59. if ($g['goods_info']['stock_total'] < 1){
  60. $count--;
  61. }else{
  62. $giftsGoods[] = $g;//库存大于0的才展示这个赠品
  63. }
  64. }
  65. unset($list['giftGoods']);
  66. if ($count == 0){//
  67. $list['empty_gifts'] = true;
  68. }
  69. $list['gift_goods'] = $giftsGoods;
  70. $list['remain_secs'] = strtotime($list['end_time']) - time();
  71. return $list;
  72. }
  73. /**
  74. * 获取确认订单满件送活动赠送商品列表
  75. * @param $orderGoodList
  76. * @return mixed
  77. * @throws \think\db\exception\DataNotFoundException
  78. * @throws \think\db\exception\DbException
  79. * @throws \think\db\exception\ModelNotFoundException
  80. */
  81. public static function validActivityList(&$orderGoodList,&$order)
  82. {
  83. // $order['is_mj_send'] = 0;
  84. // $order['mj_send_activity_id'] = 0;
  85. $mjSendGoodList = []; //满件送商品数量列表
  86. $giveGoodList = [];//满就送+全场满件送+满件送商品数量总和
  87. // 检索查询条件
  88. $now = date('Y-m-d H:i:s');
  89. $filter[] = ['start_time','<',$now];
  90. $filter[] = ['end_time','>',$now];
  91. $filter[] = ['status','=',1];
  92. $filter[] = ['audit_status','=',1];
  93. // 执行查询
  94. $lists = self::with(['goodsExcept','giftGoods'])->where($filter)->select();
  95. if (!$lists) return $mjSendGoodList;
  96. $lists = $lists->toArray();
  97. // 整理当前订单所有商品ID集
  98. $orderGoodsIds = helper::getArrayColumn($orderGoodList, 'goods_id');
  99. foreach ($orderGoodList as $good){
  100. $good['is_mj_send'] = 0;
  101. $good['mj_send_activity_id'] = 0;
  102. $good['mj_send_num'] = 0;
  103. $good['mj_send_count'] = 0;
  104. $good['mj_send_use_count'] = 0;
  105. $good['mj_send_goods_list'] = [];
  106. $mjSendGoodList[$good['goods_id']] = 0;
  107. if($good['goods_type']==GoodsType::GIFT){
  108. if(isset($giveGoodList[$good['goods_id']])){
  109. $giveGoodList[$good['goods_id']] += $good['total_num'];
  110. }else{
  111. $giveGoodList[$good['goods_id']] = $good['total_num'];
  112. }
  113. }
  114. }
  115. foreach ($lists as $list){ //循环多个满件送活动
  116. $exceptGoodsId = $list['goodsExcept']['goods_id'];//每个满件送活动只能选择一个商品
  117. $goodsIds = array_intersect($orderGoodsIds,[$exceptGoodsId]);
  118. if(empty($goodsIds)){//如果没有满件送商品,那就终止
  119. continue;//跳出本次循环
  120. }
  121. $is_mj = 0;
  122. $set_count = 0; //赠送当前几套赠品数量
  123. $mj_props = array_values(array_sort($list['mj_props'], 'value', true));
  124. // dd($mj_props);
  125. // 获取当前商品列表的订单金额
  126. foreach ($orderGoodList as $good){
  127. if(in_array($good['goods_id'],$goodsIds)){
  128. //如果使用了会员折扣又不叠加会员折扣
  129. if($good['is_user_member']>0 && stripos($list['overlay_type'],'2') !== false){
  130. continue;
  131. }
  132. //如果使用了优惠券又不叠加优惠券
  133. if($good['coupon_id']>0 && stripos($list['overlay_type'],'1') !== false){
  134. continue;
  135. }
  136. //如果使用了推荐官专属折扣又不叠加专属折扣
  137. if($good['is_user_distributor']>0 && stripos($list['overlay_type'],'3') !== false){
  138. continue;
  139. }
  140. //使用了N件X折活动并且不能叠加满件送
  141. if($good['is_activity_discount']==1 && stripos($good['activity_discount_overlay'],'3') === false){
  142. $is_mj = 1;
  143. break;//终止循环
  144. }
  145. //如果库存没有
  146. $good_num = $good['total_num'];
  147. if($list['goodsExcept']['goods_id']==$good['goods_id']){
  148. if($list['goodsExcept']['residue_stock']<$good['total_num']){
  149. $good_num = $list['goodsExcept']['residue_stock'];
  150. }
  151. }
  152. if($list['type']==1){
  153. foreach ($mj_props as $arr){
  154. if($good_num<$arr['value']){//商品数量小于当前活动满件送的最小数量
  155. $is_mj = 1;
  156. break;//终止循环
  157. }else{
  158. $set_count = floor($good_num/$arr['value']);
  159. break;//终止循环
  160. }
  161. }
  162. }else{
  163. foreach ($mj_props as $arr){
  164. if($good_num<$arr['value']){//商品数量小于当前活动满件送的最小数量
  165. continue;
  166. }else{
  167. $set_count = $arr['count'];
  168. break;//终止循环
  169. }
  170. }
  171. }
  172. $good['is_mj_send'] = 1;
  173. $good['mj_send_activity_id'] = $list['id'];
  174. $good['mj_send_num'] = $mj_props[0]['value'];
  175. $good['mj_send_count'] = $set_count;
  176. $good['mj_send_use_count'] = $good_num;
  177. }
  178. }
  179. if($is_mj){
  180. continue;//跳出本次循环
  181. }
  182. if(empty($set_count)){//如果没有送的赠品
  183. continue;//跳出本次循环
  184. }
  185. //获取赠送商品ID集
  186. $giftGoodsIds = helper::getArrayColumn($list['giftGoods'], 'goods_id');
  187. $model = new GoodsModel;
  188. $goodsList = $model->getListByIdsFromApi($giftGoodsIds);
  189. // 隐藏冗余的属性
  190. $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images']));
  191. // 返回商品处理
  192. $orderGoodListNew = [];
  193. foreach ($goodsList as &$item) {
  194. // 商品sku信息
  195. $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], 0);//赠品都是单规格,sku=0
  196. // 商品单价
  197. $item['skuInfo']['goods_price'] = 0.00;
  198. $item['goods_price'] = $item['skuInfo']['goods_price'];
  199. $item['goods_type'] = 20;
  200. // 商品赠送数量
  201. $item['total_num'] = (int)$set_count;
  202. // 商品SKU索引
  203. $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id'];
  204. // 商品购买总金额
  205. $item['total_price'] = helper::bcmul($item['goods_price'], 1);
  206. $item['staffUserId'] = 0;
  207. $item['shopId'] = 0;
  208. $item['distributorRadio'] = 0;
  209. if(isset($giveGoodList[$item['goods_id']])){
  210. $giveGoodList[$item['goods_id']] += $set_count;
  211. }else{
  212. $giveGoodList[$item['goods_id']] = $set_count;
  213. }
  214. if($order['delivery'] == DeliveryTypeEnum::SHOPS_DELIVERY){//门店自提
  215. $ShopGoodsSku = ShopGoodsSku::get(['goods_id'=>$item['goods_id'],'goods_sku_id'=>0,'shop_id'=>$order['shopInfo']['shop_id']]);
  216. if(!empty($ShopGoodsSku) && $ShopGoodsSku['stock_num'] && $giveGoodList[$item['goods_id']]<=$ShopGoodsSku['stock_num']){//赠品有库存才出现在确认订单,或者赠品库存不足
  217. $orderGoodListNew[] = $item;
  218. }
  219. }else{
  220. if($item['skuInfo']['stock_num'] && $giveGoodList[$item['goods_id']]<=$item['skuInfo']['stock_num']){//赠品有库存才出现在确认订单
  221. $orderGoodListNew[] = $item;
  222. }
  223. }
  224. if(in_array($item['goods_id'],$orderGoodsIds)){
  225. $mjSendGoodList[$item['goods_id']] = $giveGoodList[$item['goods_id']];
  226. }
  227. }
  228. foreach ($orderGoodList as $good){
  229. if(in_array($good['goods_id'],$goodsIds)){
  230. $good['mj_send_goods_list'] = $orderGoodListNew;
  231. }
  232. }
  233. }
  234. return $mjSendGoodList;
  235. }
  236. }