// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\store\model; use app\common\model\UserCoupon as UserCouponModel; use think\facade\Db; /** * 用户优惠券模型 * Class UserCoupon * @package app\store\model */ class UserCoupon extends UserCouponModel { /** * 获取列表记录 * @param array $param * @return mixed */ public function getList(array $param = []) { // 设置查询条件 $filter = $this->getFilter($param); // 获取列表数据 return $this->with(['user.avatar']) ->alias('m') ->field('m.*') ->join('user', 'user.user_id = m.user_id') ->where($filter) ->order(['m.create_time' => 'desc', $this->getPk()]) ->paginate(15); } public function getUseTimeAttr($value) { if ($value > 0 ){ return date('Y-m-d H:i:s',$value); } return ''; } /** * 设置查询条件 * @param array $param * @return array */ private function getFilter(array $param): array { // 设置默认的检索数据 $params = $this->setQueryDefaultValue($param, [ 'userId' => 0, // 会员ID 'couponName' => '', // 优惠券名称 'nickName' => '', // 会员昵称 'betweenTime' => [], // 起止时间 ]); // 检索查询条件 $filter = []; // 用户ID $params['userId'] > 0 && $filter[] = ['m.user_id', '=', $params['userId']]; //优惠券ID $params['couponId'] > 0 && $filter[] = ['m.coupon_id', '=', $params['couponId']]; //用户手机号 !empty($params['mobile']) && $filter[] = ['user.mobile', 'like', '%'.$params['mobile'].'%']; // 会员昵称 !empty($params['couponName']) && $filter[] = ['m.name', 'like', "%{$params['couponName']}%"]; // 会员昵称 !empty($params['nickName']) && $filter[] = ['user.nick_name', 'like', "%{$params['nickName']}%"]; // 起止时间 if (!empty($params['betweenTime'])) { $times = between_time($params['betweenTime']); $filter[] = ['m.create_time', '>=', $times['start_time']]; $filter[] = ['m.create_time', '<', $times['end_time'] + 86400]; } // 使用时间 if (!empty($params['useTime'])) { $times = between_time($params['useTime']); $filter[] = ['m.use_time', '>=', $times['start_time']]; $filter[] = ['m.use_time', '<', $times['end_time'] + 86400]; } if (isset($params['used']) && boolval($params['used'])){ $filter[] = ['m.is_use','=',1]; } return $filter; } /** * 统计优惠券领取数量 * @param $couponId * @param array $where * @return int */ public static function countACouponUser($couponId,$where = []){ $m = self::where('coupon_id',$couponId); if (count($where)){ $m = $m->where($where); } return $m->count('user_coupon_id'); } /** * 统计使用了优惠券的订单实际支付总金额 * @param $couponId * @param array $where * @return int */ public static function countMoneyCouponUser($couponId,$where = []){ $m = self::where('coupon_id',$couponId); if (count($where)){ $m = $m->where($where); } $user_coupon_ids = $m->column('user_coupon_id'); $volume = Order::whereIn('coupon_id',$user_coupon_ids)->field(Db::raw('(sum(pay_price) + sum(rice_card_money)) as volume'))->find(); return $volume->volume??0; } public function getStatisticDetail($param){ // 设置查询条件 $filter = $this->getFilter($param); //dd($filter); // 获取列表数据 return $this ->alias('m') ->field('m.user_coupon_id,m.user_id,m.coupon_id,m.create_time,m.use_time,user.mobile,coupon.name,coupon.coupon_type,coupon.reduce_price, coupon.discount_type,coupon.max_discount_price,coupon.overlay_discount,coupon.discount,m.is_use,m.is_expire,m.expire_time') ->leftJoin('user', 'user.user_id = m.user_id') ->leftJoin('coupon', 'm.coupon_id = coupon.coupon_id') ->where($filter) ->order(['m.create_time' => 'desc', $this->getPk()]) ->paginate(15)->each(function ($item) { $item->overlay_discount = $item->overlay_discount ? explode(',', $item->overlay_discount) : []; $item->overlay_discount_text = '无'; $od_res = []; if (!empty($item->overlay_discount)) { foreach ($item->overlay_discount as $od) { if (isset(Coupon::OVERLAY_DISCOUNT[$od])) { $od_res[] = Coupon::OVERLAY_DISCOUNT[$od]; } } $item->overlay_discount_text = implode(',', $od_res); } $item->discount = $item->discount / 10; }); } }