coupon-admin/app/traits/CouponMainTrait.php

274 lines
9.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\traits;
use app\exception\RepositoryException;
use app\model\CouponMain;
use app\model\Member as MemberModel;
use app\model\UsingRule;
use app\model\Coupon;
use think\Collection;
use think\facade\Db;
trait CouponMainTrait
{
/**
* 检查签到券状态是否可以领取
* @param CouponMain $couponMain
* @return bool
*/
public function checkCouponMainReceiveStatus(CouponMain $couponMain){
if (empty($couponMain)) {
throw new RepositoryException("签到券不存在");
}
if ($couponMain->status != CouponMain::status_on) {
throw new RepositoryException("签到券已停用");
}
if ($couponMain->on_shelf != CouponMain::on_shelf_on) {
throw new RepositoryException("签到券已下架");
}
$time = time();
if (strtotime($couponMain->start_time) > $time) {
throw new RepositoryException("签到券还未到开始使用时间");
}
if (strtotime($couponMain->end_time) < $time) {
throw new RepositoryException("签到券已结束使用");
}
if ($couponMain->using_count <= 0) {
throw new RepositoryException("签到券已经被领完了");
}
return true;
}
/**
* 统计这个签到券已经使用了多少张了
* @param $couponMainId
* @return int
*/
public function getCouponMainUsingCount($couponMainId)
{
return Coupon::where("coupon_id",$couponMainId)
->where("is_verificated",Coupon::is_verificated_on)
->count();
}
/**
* 获取商户没有被领取的签到券 需要扣除多少钱
* */
public function getBusinessNotClaimedCoupon($businessCode)
{
$date = date("Y-m-d");
$totalDeductionMoney = 0;
$couponMain = CouponMain::where("business_code", $businessCode)
->where("status", CouponMain::status_on)
->where("on_shelf", CouponMain::on_shelf_on)
->whereTime("start_time", "<=", $date)
->whereTime("end_time", ">=", $date)
->whereRaw(" verification_count < count ")
->field("id,(deduction_money * (count - verification_count)) as total_deduction_money")
->select()
->toArray();
foreach ($couponMain as $item) {
$totalDeductionMoney += $item["total_deduction_money"];
}
return $totalDeductionMoney;
}
/**
* 获取 发布签到券的统计
* 每条数据都走一遍
*
* */
public function getReleaseStatistics($startTime,$endTime,$agencyCode)
{
return CouponMain::alias("a")
->join("business b","a.business_code =b.code")
->whereTime("a.start_time", ">=", $startTime)
->whereTime("a.end_time", "<=", $endTime)
->when(!empty($agencyCode), function ($q) use ($agencyCode) {
$q->where("b.agency_code", $agencyCode);
})
->field("a.id,a.create_time")
->withAttr("create_time",function ($value){
return date("Y-m-d",strtotime($value));
})
->order(["a.id" => "desc"])
->select()
->toArray()
;
}
/**
* 获取 验证签到券的统计
* 每条数据都走一遍
*
* */
public function getSignStatistics($startTime,$endTime,$agencyCode)
{
return Coupon::alias("a")
->join("business b","a.business_code =b.code")
->whereTime("a.verificate_time", ">=", $startTime)
->whereTime("a.verificate_time", "<=", $endTime)
->where("a.is_verificated", "=", Coupon::is_verificated_on)
->when(!empty($agencyCode), function ($q) use ($agencyCode) {
$q->where("b.agency_code", $agencyCode);
})
->field("a.id,a.verificate_time")
->withAttr("verificate_time",function ($value){
return date("Y-m-d",strtotime($value));
})
->order(["a.id" => "desc"])
->select()
->toArray()
;
}
/**
* 获取 验证签到券的统计
* 每条数据都走一遍
*
* */
public function getReceiveStatistics($startTime,$endTime,$agencyCode)
{
return Coupon::alias("a")
->join("business b","a.business_code =b.code")
->whereTime("a.received_time", ">=", $startTime)
->whereTime("a.received_time", "<=", $endTime)
->when(!empty($agencyCode), function ($q) use ($agencyCode) {
$q->where("b.agency_code", $agencyCode);
})
->field("a.id,a.received_time")
->withAttr("received_time",function ($value){
return date("Y-m-d",strtotime($value));
})
->order(["a.id" => "desc"])
->select()
->toArray()
;
}
/**
* 获取商家商家的签到券
* */
public function getBusinessOnShelfOnCount($businessCode)
{
return CouponMain::where("business_code",$businessCode)
->where("on_shelf",CouponMain::on_shelf_on)
->count();
}
/**
* 统计商家优惠卷情况
*
* @param $businessCode
* @param int $daySize 最近($daySize + 1天内的领取量 0表示当日领取量
*/
public function getCountBusinessOnShelf($businessCode, $daySize = 29)
{
$whereMap = [
['business_code', '=', $businessCode],
['on_shelf', '=', CouponMain::on_shelf_on]
];
$totalSize = CouponMain::where($whereMap)->count();
$totalCountSize = CouponMain::where($whereMap)->sum('count');
$verificationSize = Coupon::alias('c')
->leftJoin('coupon_main m', 'c.coupon_id = m.id')
->where([
['m.business_code', '=', $businessCode],
['m.on_shelf', '=', CouponMain::on_shelf_on],
['c.is_verificated', '=', Coupon::is_verificated_on]
])
->count('c.id');
$unVerificationSize = $totalCountSize - $verificationSize;
$unVerificationSize = $unVerificationSize > 0 ? $unVerificationSize : 0;
$lastReceivedSize = Coupon::alias('c')
->leftJoin('coupon_main m', 'c.coupon_id = m.id')
->where([
['m.business_code', '=', $businessCode],
])
->when($daySize >= 0, function ($q) use ($daySize) {
$startDay = date('Y-m-d 00:00:00', strtotime('- '.$daySize.' day'));
$q->whereTime('c.received_time', '>=', $startDay);
})
->count('c.id');
$effectiveSize = CouponMain::where($whereMap)
->whereTime('start_time', '<=', date('Y-m-d H:i:s'))
->whereTime('end_time', '>=', date('Y-m-d H:i:s'))
->sum(Db::raw('(`count` - `received_count`)'));
return [
// 发行总次数
'totalSize' => $totalSize,
// 发行优惠卷总数量
'totalCountSize' => $totalCountSize,
// 累计已核销数量
'verificationSize' => $verificationSize,
// 剩余未核销量
'unVerificationSize' => $unVerificationSize,
// 最近($daySize + 1天内的领取量
'lastReceivedSize' => $lastReceivedSize,
// 有效的(进行中且未被领取)
'effectiveSize' => $effectiveSize,
];
}
/**
* 签到券列表
* @param $whereMap
* @param $page
* @param $size
* @param $orders
* @param $auth
* @return array
*/
public function couponMainList($whereMap,$page,$size,$orders,$auth)
{
$data = [
'total' => 0,
'current' => $page,
'size' => $size,
'list' => new Collection(),
];
$rep = CouponMain::alias("a")
->join("business b", "a.business_code = b.code")
->where($whereMap)
->when(MemberModel::is_agency($auth['roles'] ), function ($q)use($auth) {
$q->where('b.agency_code', '=', $auth['business_code']);
})
->field("a.*,b.business_name,b.business_subtitle")
;
$data["total"] = $rep->count();
$data["list"] = $rep->order($orders)->select();
return $data;
}
/**
* 获取指定商圈的签到券 大屏使用
* */
public function screen($circle_id)
{
$whereMap = [];
$nowDate = date('Y-m-d H:i:s');
$whereMap[] = ['a.status', '=', CouponMain::status_on];
$whereMap[] = ['a.on_shelf', '=', CouponMain::on_shelf_on];
//$whereMap[] = ['start_time', '< TIME', $nowDate];
$whereMap[] = ['a.end_time', '> TIME', $nowDate];
$whereMap[] = ['a.using_count', '>', 0];
$whereMap[] = ['a.on_screen', '=', CouponMain::on_screen_yes];
return CouponMain::alias("a")
->join("business b" ,"a.business_code = b.code")
->where("b.business_circle_id",$circle_id)
->where($whereMap)
->field("a.business_code,a.id,a.image_url,a.name,b.business_name")
->order("a.id desc")
->select()
->toArray();
}
}