CouponGenRedeemCodes.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. namespace app\store\model\coupon;
  3. use app\common\library\helper;
  4. use app\common\model\coupon\CouponGenRedeemCodes as GenRedeemCodesModel;
  5. use app\common\model\User;
  6. use app\common\model\GoodsSku as GoodsSkuModel;
  7. use app\common\model\Goods as GoodsModel;
  8. use app\store\model\Coupon;
  9. use think\facade\Db;
  10. /**
  11. * 优惠券生成兑换码记录模型
  12. * @package app\common\model
  13. */
  14. class CouponGenRedeemCodes extends GenRedeemCodesModel
  15. {
  16. /**
  17. * 生成兑换码
  18. * @param $data
  19. * @return bool
  20. */
  21. public function addCodes($data){
  22. $bathLength = 2000;
  23. $m = new self();
  24. $new = ['coupon_id'=>$data['couponId'],'amount'=>$data['amount'],'give_type'=>$data['giveType'],'give_channel'=>$data['giveChannel']];
  25. Db::startTrans();
  26. try{
  27. $res = $m->create($new);
  28. $id = $res->id??0;
  29. $codeM = new CouponRedeemCodes();
  30. if ($data['giveType'] == 1){
  31. $codes = [['coupon_id'=>$data['couponId'],'coupon_gen_redeem_codes_id'=>$id,'redeem_code'=>$data['code']]];
  32. $codeM->addBatch($codes);
  33. }elseif ($data['giveType'] == 2){
  34. $remainAmount = $data['amount'];
  35. $times = ceil($remainAmount/$bathLength);
  36. for($i=0;$i<$times;$i++){
  37. $codes = [];
  38. if ($remainAmount >= $bathLength){
  39. //$redeemCodes = gen_rand8($bathLength);
  40. $redeemCodes = gen_rand_number8($bathLength);
  41. for($j=0;$j<$bathLength;$j++){
  42. $codes[] = ['coupon_id'=>$data['couponId'],'coupon_gen_redeem_codes_id'=>$id,'redeem_code'=>$redeemCodes[$j]];
  43. }
  44. $codeM->addBatch($codes);
  45. }
  46. if ($remainAmount > 0 && $remainAmount<$bathLength){
  47. //$redeemCodes = gen_rand8($remainAmount);
  48. $redeemCodes = gen_rand_number8($bathLength);
  49. for($j=0;$j<$remainAmount;$j++){
  50. $codes[] = ['coupon_id'=>$data['couponId'],'coupon_gen_redeem_codes_id'=>$id,'redeem_code'=>$redeemCodes[$j]];
  51. }
  52. $codeM->addBatch($codes);
  53. }
  54. $remainAmount -= $bathLength;
  55. }
  56. }else{
  57. return true;
  58. }
  59. Db::commit();
  60. }catch (\Exception $e) {
  61. // 回滚事务
  62. Db::rollback();
  63. log_record(__METHOD__.$e->getMessage(),'error');
  64. return false;
  65. }
  66. return true;
  67. }
  68. /**
  69. * 兑换详细列表
  70. * @param array $params
  71. * @return mixed
  72. */
  73. public function getAllList(array $params = [])
  74. {
  75. // 检索查询条件
  76. $filter = $this->getQueryFilter($params);
  77. $query = $this->alias('cc');
  78. //券状态
  79. if (isset($params['open_status']) && $params['open_status'] >= 0){
  80. if($params['open_status'] == 1){
  81. $query = $query->where('cp.status',1)->whereRaw('cp.expire_type=10 or (cp.expire_type =20 and unix_timestamp(cp.expire_time) > unix_timestamp(NOW()))');
  82. }else{
  83. $query = $query->whereRaw('cp.status=0 or (cp.expire_type =20 and unix_timestamp(cp.expire_time) < unix_timestamp(NOW()))');
  84. }
  85. }
  86. // 获取数据列表
  87. $query = $query->where($filter)
  88. ->leftJoin('coupon cp', 'cc.coupon_id = cp.coupon_id')
  89. ->field('cc.id,cc.coupon_id,cc.amount,cc.give_type,cc.give_channel,cp.name,cp.coupon_type,cp.reduce_price,cp.min_price,
  90. cp.describe,cp.expire_type,cp.expire_day,cp.expire_time,cp.status,cp.audit_status,
  91. cp.discount_type,cp.max_discount_price,cp.overlay_discount,cp.discount');
  92. return $query->order(['cc.id' => 'desc'])->paginate(15)->each(function($item){
  93. $item->open_status = 0;//券状态
  94. if ($item->status == 1){
  95. if ($item->expire_type == 10){//到期类型(10领取后生效 20固定时间)
  96. $item->open_status = 1;
  97. }elseif ($item->expire_type == 20 && strtotime($item->expire_time) > time()){//
  98. $item->open_status = 1;
  99. }else{
  100. $item->open_status = 0;
  101. }
  102. }
  103. $item->overlay_discount = $item->overlay_discount ? explode(',', $item->overlay_discount) : [];
  104. $item->overlay_discount_text = '无';
  105. $od_res = [];
  106. if (!empty($item->overlay_discount)) {
  107. foreach ($item->overlay_discount as $od) {
  108. if (isset(Coupon::OVERLAY_DISCOUNT[$od])) {
  109. $od_res[] = Coupon::OVERLAY_DISCOUNT[$od];
  110. }
  111. }
  112. $item->overlay_discount_text = implode(',', $od_res);
  113. }
  114. $item->discount = $item->discount / 10;
  115. });
  116. }
  117. //查询
  118. public function getQueryFilter($param){
  119. $filter = [];
  120. if(isset($param['name']) && $param['name']){
  121. $filter[] = ['cp.name','like','%'.$param['name'].'%'];
  122. }
  123. if(isset($param['coupon_id']) && $param['coupon_id']){
  124. $filter[] = ['cc.coupon_id','=',$param['coupon_id']];
  125. }
  126. if(isset($param['coupon_type']) && $param['coupon_type']>=0){
  127. $filter[] = ['cp.coupon_type','=',$param['coupon_type']];
  128. }
  129. if(isset($param['status']) && $param['status']>=0){
  130. $filter[] = ['cp.status','=',$param['status']];
  131. }
  132. if(isset($param['audit_status']) && $param['audit_status']>=0){
  133. $filter[] = ['cp.audit_status','=',$param['audit_status']];
  134. }
  135. return $filter;
  136. }
  137. /**
  138. * 检验优惠券数量是否将要超发
  139. * @param $couponId
  140. * @param int $num
  141. * @return float
  142. * @throws \think\db\exception\DataNotFoundException
  143. * @throws \think\db\exception\DbException
  144. * @throws \think\db\exception\ModelNotFoundException
  145. */
  146. public function sunAmount($couponId,$num=0){
  147. $couponM = new Coupon();
  148. $coupon = $couponM->where('coupon_id',$couponId)->find();
  149. if (!$coupon){
  150. return true;
  151. }
  152. if ($coupon->limit_total_type == 20){//不限数量
  153. return false;
  154. }
  155. $totalNum = $coupon->total_num??0;
  156. $m = new self();
  157. $amount = intval($m->where('coupon_id',$couponId)->sum('amount'));
  158. return ($num + $amount ) > $totalNum;
  159. }
  160. }