1361 lines
		
	
	
		
			59 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			1361 lines
		
	
	
		
			59 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						||
namespace app\controller\api;
 | 
						||
 | 
						||
use app\exception\RepositoryException;
 | 
						||
use app\model\Account;
 | 
						||
use app\model\Coupon as CouponModel;
 | 
						||
use app\model\CouponBill;
 | 
						||
use app\model\CouponMain;
 | 
						||
use app\model\CouponType as CouponTypeModel;
 | 
						||
use app\model\Deduction;
 | 
						||
use app\model\Redpack;
 | 
						||
use app\model\Business as BusinessModel;
 | 
						||
use app\model\Score;
 | 
						||
use app\model\UsingRule;
 | 
						||
use app\repository\AccountRepository;
 | 
						||
use app\repository\BusinessRepository;
 | 
						||
use app\repository\CouponRepository;
 | 
						||
use app\service\wx\WechatPay;
 | 
						||
use app\validate\CouponRelease;
 | 
						||
use app\validate\CouponUsingRule;
 | 
						||
 | 
						||
use think\Exception;
 | 
						||
use think\facade\Config;
 | 
						||
use think\facade\Db;
 | 
						||
use think\facade\Log;
 | 
						||
 | 
						||
/**
 | 
						||
 * 优惠卷相关
 | 
						||
 * Class Coupon
 | 
						||
 * @package app\controller\api
 | 
						||
 */
 | 
						||
class Coupon extends Base
 | 
						||
{
 | 
						||
    protected $noNeedLogin = [];
 | 
						||
 | 
						||
    /**
 | 
						||
     * 我的优惠卷列表
 | 
						||
     *
 | 
						||
     * type in ['', 'notUsed', 'normal', 'used']
 | 
						||
     */
 | 
						||
    public function getCouponList()
 | 
						||
    {
 | 
						||
        $page       = $this->request->param('page/d', 1);
 | 
						||
        $size       = $this->request->param('size/d', 10);
 | 
						||
        //$type       = $this->request->param('type', '');
 | 
						||
 | 
						||
        $page       = $page < 1 ? 1 : $page;
 | 
						||
        $size       = $size < 1 ? 10 : $size;
 | 
						||
        $accountCode    = $this->request->user['user_code'] ?? '';
 | 
						||
 | 
						||
 | 
						||
        try {
 | 
						||
            $whereMap   = [];
 | 
						||
            $sortOrder  = ['is_verificated'=>'asc','id' => 'desc'];
 | 
						||
            $fields     = [
 | 
						||
                'id',
 | 
						||
                'is_verificated as isVerificated',
 | 
						||
                'type_name',
 | 
						||
                'money',
 | 
						||
                'name as couponName',
 | 
						||
                'business_code',
 | 
						||
                'business_code as businessCode',
 | 
						||
                'coupon_id',
 | 
						||
                'end_time as endTime',
 | 
						||
                'consumer_name as consumerName',
 | 
						||
                'verificate_time as verificateTime',
 | 
						||
                '(end_time > NOW()) as sort_weight'];
 | 
						||
 | 
						||
            $whereMap[] = ['consumer_code', '=', $accountCode];
 | 
						||
 | 
						||
 | 
						||
//            switch ($type) {
 | 
						||
//                case 'all':
 | 
						||
//                    // 全部持有签到券
 | 
						||
//                    $sortOrder  = ['sort_weight' => 'desc', 'end_time' => 'asc'];
 | 
						||
//                    break;
 | 
						||
//                case 'notUsed':
 | 
						||
//                    // 未使用(包含已过期)
 | 
						||
//                    $whereMap[] = ['is_verificated', '=', self::BOOL_FALSE];
 | 
						||
//                    $sortOrder  = ['sort_weight' => 'desc', 'end_time' => 'asc'];
 | 
						||
//                    break;
 | 
						||
//                case 'normal':
 | 
						||
//                    // 未使用且未过期
 | 
						||
//                    $whereMap[] = ['is_verificated', '=', self::BOOL_FALSE];
 | 
						||
//                    $whereMap[] = ['end_time', '> TIME', date('Y-m-d H:i:s')];
 | 
						||
//                    break;
 | 
						||
//                case 'used':
 | 
						||
//                    // 已使用
 | 
						||
//                    $whereMap[] = ['is_verificated', '=', self::BOOL_TRUE];
 | 
						||
//                    $sortOrder  = ['verificate_time' => 'desc'];
 | 
						||
//                    break;
 | 
						||
//            }
 | 
						||
 | 
						||
 | 
						||
            $res    = CouponRepository::getInstance()->findList($whereMap, $fields, $page, $size,function ($q){
 | 
						||
                    return $q->with([
 | 
						||
                        "couponMain" => function ($q) {
 | 
						||
                            $q->field("id,name,image_url,type_name");
 | 
						||
                        },
 | 
						||
                        "scoreModel",
 | 
						||
                        "business" => function ($q) {
 | 
						||
                            $q->field("code,id,business_name,business_subtitle");
 | 
						||
                        }
 | 
						||
                    ])
 | 
						||
                        ->where(function ($q){
 | 
						||
                        $notUsedWhereMap    = [];//未过期 未使用
 | 
						||
                        $notUsedWhereMap[]  = ['is_verificated', '=', self::BOOL_FALSE];
 | 
						||
                        $notUsedWhereMap[]  = ['end_time', '> TIME', date('Y-m-d H:i:s')];
 | 
						||
 | 
						||
                        $usedWhereMap       = [];//已使用 7天内
 | 
						||
                        $usedWhereMap[]     = ['is_verificated', '=', self::BOOL_TRUE];
 | 
						||
                        $usedWhereMap[]     = ['verificate_time', '> TIME', date('Y-m-d H:i:s',time() - (7 * 86400)) ];
 | 
						||
 | 
						||
                        $beOverdueWhereMap      = [];//未使用 已过期7天内
 | 
						||
                        $beOverdueWhereMap[]    = ['is_verificated', '=', self::BOOL_FALSE];
 | 
						||
                        $beOverdueWhereMap[]    = ['end_time', '> TIME', date('Y-m-d H:i:s',time() - (7 * 86400))];;
 | 
						||
 | 
						||
 | 
						||
                        $q->whereOr(function ($q)use($notUsedWhereMap){
 | 
						||
                            $q->where($notUsedWhereMap);
 | 
						||
                        })//未使用未过期
 | 
						||
 | 
						||
                        ->whereOr(function ($q)use($usedWhereMap){
 | 
						||
                            $q->where($usedWhereMap);
 | 
						||
                        })//已使用 7天内
 | 
						||
 | 
						||
 | 
						||
                        ->whereOr(function ($q)use($usedWhereMap){
 | 
						||
                            $q->where($usedWhereMap);
 | 
						||
                        });//已过期
 | 
						||
                     })
 | 
						||
                    //->fetchSql(true)
 | 
						||
                    ;
 | 
						||
            }, $sortOrder);
 | 
						||
 | 
						||
            $time = time();
 | 
						||
            $res['list'] ->each(function ($item) use($time){
 | 
						||
                //重置签到券名称
 | 
						||
                if(isset($item->couponMain) && $item->couponMain){
 | 
						||
                    $item->couponName =  $item->couponMain->name;
 | 
						||
                    $item->image_url = $this->request->domain() . $item->couponMain->image_url;
 | 
						||
                }else{
 | 
						||
                    $item->image_url = $this->request->domain() . '';
 | 
						||
                }
 | 
						||
                //是否已经打分过了
 | 
						||
                if(isset($item->scoreModel) && $item->scoreModel){
 | 
						||
                    $item->scored   =  true;
 | 
						||
                    $item->score    =  $item->scoreModel->score;
 | 
						||
                }else{
 | 
						||
                    $item->scored   =  false;
 | 
						||
                    $item->score    =  Score::COMMON_OFF;
 | 
						||
                }
 | 
						||
 | 
						||
 | 
						||
                //到期状态
 | 
						||
                //$expirationStr = '';
 | 
						||
                $status     = CouponModel::status_success;//默认未使用
 | 
						||
                $endTime    = strtotime($item->endTime);
 | 
						||
                $ExpirationTime = abs(($endTime - $time) / 86400);
 | 
						||
                if (($endTime > $time) ) {
 | 
						||
                    $expirationStr  = "还有".ceil($ExpirationTime)."天过期";
 | 
						||
                } else {
 | 
						||
                    $status         = CouponModel::status_be_overdue;
 | 
						||
                    $expirationStr  = "已过期" . ceil($ExpirationTime) . "天";
 | 
						||
                }
 | 
						||
                $item->expirationStr    = $expirationStr;
 | 
						||
                if($item->isVerificated == CouponModel::is_verificated_on){
 | 
						||
                    $status             = CouponModel::status_used;
 | 
						||
                }
 | 
						||
 | 
						||
                $item->status           = $status;
 | 
						||
 | 
						||
 | 
						||
                //商家简称
 | 
						||
                if(!empty($item->business)){
 | 
						||
                    $item->business_subtitle = $item->business->business_subtitle;
 | 
						||
                }else{
 | 
						||
                    $item->business_subtitle = '';
 | 
						||
                }
 | 
						||
 | 
						||
                //图片
 | 
						||
                if(!empty($item->business)){
 | 
						||
                    $item->business_subtitle = $item->business->business_subtitle;
 | 
						||
                }else{
 | 
						||
                    $item->business_subtitle = '';
 | 
						||
                }
 | 
						||
 | 
						||
            });
 | 
						||
 | 
						||
            $res['list']    = multiTwoArrayKeysExcludeFilter($res['list']->toArray(), ['sort_weight']);
 | 
						||
            return $this->json(0, 'success', $res);
 | 
						||
        } catch (RepositoryException | \Exception $e) {
 | 
						||
            return $this->json(5001, '优惠卷查询失败!');
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * 我的优惠卷列表  指定商家  未验证
 | 
						||
     *
 | 
						||
     */
 | 
						||
    public function getCouponListByBusinessCode()
 | 
						||
    {
 | 
						||
        $page           = $this->request->param('page/d', 1);
 | 
						||
        $size           = $this->request->param('size/d', 10);
 | 
						||
        $businessCode   = $this->request->param('business_code/s', '');
 | 
						||
 | 
						||
 | 
						||
        $page           = $page < 1 ? 1 : $page;
 | 
						||
        $size           = $size < 1 ? 10 : $size;
 | 
						||
        $accountCode    = $this->request->user['user_code'] ?? '';
 | 
						||
        $time           = time();
 | 
						||
 | 
						||
        try {
 | 
						||
            $whereMap   = [];
 | 
						||
            $fields     = [
 | 
						||
                'id',
 | 
						||
                'coupon_id',
 | 
						||
                'business_code',
 | 
						||
                'is_verificated as isVerificated',
 | 
						||
                'money',
 | 
						||
                'name as couponName',
 | 
						||
                'business_code as businessCode',
 | 
						||
                'end_time as endTime',
 | 
						||
                'consumer_name as consumerName',
 | 
						||
                'verificate_time as verificateTime',
 | 
						||
                '(end_time > NOW()) as sort_weight'];
 | 
						||
 | 
						||
            $whereMap[] = ['consumer_code', '=', $accountCode];
 | 
						||
            $whereMap[] = ['business_code', '=', $businessCode];
 | 
						||
            $whereMap[] = ['is_verificated', '=', CouponModel::is_verificated_off];
 | 
						||
            $whereMap[] = ['end_time', '> TIME', date("Y-m-d H:i:s")];
 | 
						||
            $sortOrder  = ['sort_weight' => 'desc', 'end_time' => 'asc'];
 | 
						||
 | 
						||
            $res    = CouponRepository::getInstance()->findList($whereMap, $fields, $page, $size,function ($q){
 | 
						||
                return $q->with(
 | 
						||
                    [
 | 
						||
                        "couponMain" => function ($q) {
 | 
						||
                            $q->field("id,name,image_url,type_name");
 | 
						||
                        },
 | 
						||
                        "scoreModel",
 | 
						||
                        "business" => function ($q) {
 | 
						||
                            $q->field("id,code,business_name,business_subtitle");
 | 
						||
                        }
 | 
						||
                ]);
 | 
						||
            }, $sortOrder);
 | 
						||
 | 
						||
            $res['list'] ->each(function ($item) use($time){
 | 
						||
 | 
						||
                //重置过期时间
 | 
						||
                $item->endTimeText = date("Y-m-d",strtotime($item->endTime));
 | 
						||
 | 
						||
                $status     = CouponModel::status_success;//默认未使用
 | 
						||
                $endTime    = strtotime($item->endTime);
 | 
						||
                $ExpirationTime = abs(($endTime - $time) / 86400);
 | 
						||
                if (($endTime > $time) ) {
 | 
						||
                    $expirationStr  = "还有".ceil($ExpirationTime)."天过期";
 | 
						||
                } else {
 | 
						||
                    $status         = CouponModel::status_be_overdue;
 | 
						||
                    $expirationStr  = "已过期" . ceil($ExpirationTime) . "天";
 | 
						||
                }
 | 
						||
                $item->expirationStr    = $expirationStr;
 | 
						||
                if($item->isVerificated == CouponModel::is_verificated_on){
 | 
						||
                    $status             = CouponModel::status_used;
 | 
						||
                }
 | 
						||
 | 
						||
                $item->status           = $status;
 | 
						||
 | 
						||
                //重置签到券名称
 | 
						||
                if(isset($item->couponMain) && $item->couponMain){
 | 
						||
                    $item->couponName =  $item->couponMain->name;
 | 
						||
                    $item->image_url = $this->request->domain() . $item->couponMain->image_url;
 | 
						||
                }else{
 | 
						||
                    $item->image_url = $this->request->domain() . '';
 | 
						||
                }
 | 
						||
 | 
						||
            });
 | 
						||
 | 
						||
            $res['list']    = multiTwoArrayKeysExcludeFilter($res['list']->toArray(), ['sort_weight']);
 | 
						||
            return $this->json(0, 'success', $res);
 | 
						||
        } catch (RepositoryException | \Exception $e) {
 | 
						||
            return $this->json(5001, '优惠卷查询失败!');
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * 领取签到券
 | 
						||
     * */
 | 
						||
    public function receiveCoupon()
 | 
						||
    {
 | 
						||
        $accountId              = $this->request->user['user_id'] ?? 0;
 | 
						||
        $lat                    = input("lat/f",0);
 | 
						||
        $lng                    = input("lng/f",0);
 | 
						||
        $distributionUserCode   = input("distribution_user_code/s",'');
 | 
						||
        $account = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						||
            return $q->with(['business', 'parent']);
 | 
						||
        });
 | 
						||
        if(empty($account)){
 | 
						||
            return $this->json(6001,"无效的用户");
 | 
						||
        }
 | 
						||
 | 
						||
        if ($lat <= 0 || $lng <= 0) {
 | 
						||
            return $this->json(4001, "请授权定位");
 | 
						||
        }
 | 
						||
 | 
						||
        $couponMainId = input("couponId/d", 0);
 | 
						||
        $couponMain = CouponMain::findOne(["id" => $couponMainId],[],function ($q){
 | 
						||
            //执行领取 开启锁
 | 
						||
            return $q->with("business")->lock(true);
 | 
						||
        });
 | 
						||
        if(!isset($couponMain->business)||empty($couponMain->business)){
 | 
						||
            return $this->json(4001, "签到券所属商家不存在");
 | 
						||
        }
 | 
						||
 | 
						||
        if($couponMain->business->enable != BusinessModel::COMMON_OFF){
 | 
						||
            return $this->json(4001, "商家已禁用");
 | 
						||
        }
 | 
						||
 | 
						||
        try {
 | 
						||
            //检查签到券状态
 | 
						||
           CouponRepository::getInstance()->checkCouponMainReceiveStatus($couponMain);
 | 
						||
        }catch (RepositoryException $e){
 | 
						||
            return $this->json(4001,$e->getMessage());
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        try {
 | 
						||
            //检查是否可以领取  0可领取 1已领取
 | 
						||
           AccountRepository::getInstance()->getCouponReceiveStatusText($account,$couponMain);//领取状态
 | 
						||
        }catch (RepositoryException $e){
 | 
						||
            return $this->json(4001,$e->getMessage());
 | 
						||
        }
 | 
						||
 | 
						||
        //检查通过 执行领取
 | 
						||
        $time = time();
 | 
						||
        Db::startTrans();
 | 
						||
        try {
 | 
						||
            //1写入领取记录
 | 
						||
            $data = [
 | 
						||
                "coupon_id"                 =>$couponMain->id,
 | 
						||
                "name"                      =>$couponMain["name"],
 | 
						||
                "type_id"                   =>$couponMain->type,
 | 
						||
                "type_name"                 =>$couponMain->type_name,
 | 
						||
                "business_code"             =>$couponMain->business_code,
 | 
						||
                "business_name"             =>$couponMain->business?$couponMain->business->business_name:'',
 | 
						||
                "consumer_code"             =>$account->user_code,
 | 
						||
                "consumer_name"             =>$account->nick_name,
 | 
						||
                "money"                     => $couponMain->money,
 | 
						||
                "content"                   => createUuid(),//未知作用
 | 
						||
                "received_time"             => date("Y-m-d H:i:s",$time),
 | 
						||
                "lat"                       => $lat,
 | 
						||
                "lng"                       => $lng,
 | 
						||
                "end_time"                  => date($couponMain->end_time . " 00:00:00"),
 | 
						||
                "edition"                   => couponMain::COMMON_ON,//版本  未知作用
 | 
						||
                "is_verificated"            => couponMain::COMMON_OFF,//是否验证
 | 
						||
            ];
 | 
						||
            //如果商家指派了渠道商  分销人重新定义为空
 | 
						||
            if ($couponMain->business->is_assign  ==  BusinessModel::COMMON_ON){
 | 
						||
                $data["is_distribution_coupon"]    = couponMain::COMMON_OFF;//是否是分销签到券
 | 
						||
                $data["distribution_user_code"]    = '';//分销人user_code
 | 
						||
            }else{
 | 
						||
                $data["is_distribution_coupon"]    = couponMain::COMMON_ON;//是否是分销签到券
 | 
						||
                $data["distribution_user_code"]    = $distributionUserCode;//分销人user_code
 | 
						||
            }
 | 
						||
 | 
						||
            $couponMain->save(["received_count"=>Db::raw("received_count + 1")]);
 | 
						||
 | 
						||
            $receiveCoupon =  CouponRepository::getInstance()->receiveCoupon($data);
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            Db::commit();
 | 
						||
            return $this->json();
 | 
						||
        }catch (RepositoryException $e){
 | 
						||
            Log::error("签到券领取失败RepositoryException:".$e->getMessage());
 | 
						||
            Db::rollback();
 | 
						||
            return $this->json(5001,"领取失败");
 | 
						||
        }catch (Exception $e){
 | 
						||
            Log::error("签到券领取失败:".$e->getMessage());
 | 
						||
            Db::rollback();
 | 
						||
            return $this->json(5001,"领取失败");
 | 
						||
        }
 | 
						||
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * 核验签到券  程序----核心操作----
 | 
						||
     * */
 | 
						||
    public function verification()
 | 
						||
    {
 | 
						||
        $accountId      =   $this->request->user['user_id'] ?? 0;
 | 
						||
        $lat            =   input("lat/f",0);
 | 
						||
        $lng            =   input("lng/f",0);
 | 
						||
        $couponId       =   input("couponId/d",0);
 | 
						||
        $userTimeStamp  =   input("userTimeStamp/d",0);
 | 
						||
        $account        =   AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						||
            return $q->with(['business', 'parent']);
 | 
						||
        });
 | 
						||
        $time           = time();
 | 
						||
        if(empty($account)){
 | 
						||
            return $this->json(6001,"无效的用户");
 | 
						||
        }
 | 
						||
 | 
						||
        if ($lat <= 0 || $lng <= 0) {
 | 
						||
            return $this->json(4001, "请授权定位");
 | 
						||
        }
 | 
						||
 | 
						||
        $coupon = CouponRepository::getInstance()->findById($couponId,[],function ($q){
 | 
						||
            return $q->with(["couponMain","redpack"])->lock(true);
 | 
						||
        });
 | 
						||
 | 
						||
        if(empty($coupon)){
 | 
						||
            return $this->json(4001, "签到券不存在");
 | 
						||
        }
 | 
						||
        if($coupon->consumer_code != $account->user_code ){
 | 
						||
            return $this->json(4001, "参数错误");
 | 
						||
        }
 | 
						||
        if($coupon->is_verificated != CouponModel::is_verificated_off){
 | 
						||
            return $this->json(4001, "签到券已验证");
 | 
						||
        }
 | 
						||
        if($coupon->status != CouponMain::status_on){
 | 
						||
            return $this->json(4001, "签到券已停用");
 | 
						||
        }
 | 
						||
        if($coupon->on_shelf != CouponMain::on_shelf_on){
 | 
						||
            return $this->json(4001, "签到券下架");
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        if(!isset($coupon->couponMain) || empty($coupon->couponMain)){
 | 
						||
            return $this->json(4001, "商家签到券信息错误");
 | 
						||
        }
 | 
						||
        if(strtotime($coupon->couponMain->end_time) < $time){
 | 
						||
            return $this->json(4001, "签到券已过期");
 | 
						||
        }
 | 
						||
        //$usingRule = UsingRule::findOne(["coupon_id"=>$coupon->couponMain->id]);
 | 
						||
        //if(empty($usingRule)){
 | 
						||
        //    return $this->json(4001, "商家签到券使用规则信息错误");
 | 
						||
        //}
 | 
						||
 | 
						||
        //一天的开始时间
 | 
						||
        //if(strtotime(date("Y-m-d " . $usingRule->day_start_time)) > $time){
 | 
						||
        //    return $this->json(4001, "请在当天{$usingRule->day_start_time}-{$usingRule->day_start_time}使用");
 | 
						||
        //}
 | 
						||
        //一天的结束时间
 | 
						||
        //if(strtotime(date("Y-m-d ".$usingRule->day_end_time)) < $time){
 | 
						||
        //    return $this->json(4001, "请在当天{$usingRule->day_start_time}-{$usingRule->day_start_time}使用");
 | 
						||
        //}
 | 
						||
 | 
						||
        //使用周期 周一到周天
 | 
						||
        //$newW = date("w");
 | 
						||
        //if(!in_array($newW,$usingRule->cycle)){
 | 
						||
        //    return $this->json(4001, "请在".encodeCouponCycle($usingRule->cycle)."使用");
 | 
						||
        //}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        Config::load('extra/wechat', 'wechat');
 | 
						||
        $signDistance   = config('wechat.signDistance') ?? 0;
 | 
						||
        $signTimeStamp  = config('wechat.signTimeStamp') ?? 0;
 | 
						||
        $msectime       = msectime();//毫秒时间戳
 | 
						||
 | 
						||
        //签到距离
 | 
						||
        if($signDistance > 0 ){
 | 
						||
                $distance =   get_distance($coupon->couponMain->lat,$coupon->couponMain->lng,$lat,$lng);
 | 
						||
                if($distance > $signDistance){
 | 
						||
                    if ($distance >= 1000) {
 | 
						||
                        $distanceText = round($distance / 1000, 2) . "千米";
 | 
						||
                    } else {
 | 
						||
                        $distanceText = $distance . "米";
 | 
						||
                    }
 | 
						||
                    return $this->json(4001, "您距离商家位置距离超过规定距离{$distanceText}");
 | 
						||
                }
 | 
						||
        }
 | 
						||
 | 
						||
        //签到时间戳
 | 
						||
        if($signTimeStamp > 0 ){
 | 
						||
            if(abs($userTimeStamp - $msectime)  > $signTimeStamp){
 | 
						||
                //.abs($userTimeStamp - $msectime)
 | 
						||
                return $this->json(4001, "时间戳验证失败");
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        $business =  BusinessRepository::getInstance()->getModel()
 | 
						||
            ->with(["agency"])
 | 
						||
            ->where(["code"=>$coupon->couponMain->business_code])
 | 
						||
            ->lock(true)
 | 
						||
            ->find();
 | 
						||
        if(empty($business)){
 | 
						||
            return $this->json(4001, "商家不存在");
 | 
						||
        }
 | 
						||
 | 
						||
        if($business->enable != BusinessModel::COMMON_OFF){
 | 
						||
            return $this->json(4001, "商家已禁用");
 | 
						||
        }
 | 
						||
 | 
						||
        $businessModel = $business["model"];
 | 
						||
        // 指定时间段内发布的签到券个数
 | 
						||
        $TimeListModeReleaseCount = BusinessRepository::getInstance()
 | 
						||
            ->getTimeListModeReleaseCount($business["code"],$business["time_limit_start"],$business["time_limit_end"]);
 | 
						||
 | 
						||
        if (
 | 
						||
            $business["model"] == BusinessModel::model_ordinary
 | 
						||
            ||
 | 
						||
            (
 | 
						||
                $business["model"] == BusinessModel::model_time_limit
 | 
						||
                &&
 | 
						||
                (
 | 
						||
                    strtotime($business["time_limit_end"]) < $time
 | 
						||
                    ||
 | 
						||
                    $TimeListModeReleaseCount >= $business["time_limit_release_count"]
 | 
						||
                )
 | 
						||
            )
 | 
						||
        ) {
 | 
						||
            $businessModel = BusinessModel::model_ordinary;
 | 
						||
        }
 | 
						||
 | 
						||
        if ($business['balance'] < $coupon->couponMain->deduction_money) {
 | 
						||
            return $this->json(4001, "商家余额不足");
 | 
						||
        }
 | 
						||
 | 
						||
        $deductionMoney     = $coupon->couponMain->deduction_money;
 | 
						||
 | 
						||
        $returnConsumerMoney = 0;//需要返回提示的金额
 | 
						||
 | 
						||
        //未开启分销状态
 | 
						||
        $agencyMoney            =  (($deductionMoney/100) * $coupon->couponMain->commission_agency);
 | 
						||
        $adminMoney             =  (($deductionMoney/100) * $coupon->couponMain->commission_admin);
 | 
						||
        $consumerMoney          =  (($deductionMoney/100) * $coupon->couponMain->commission_consumer);
 | 
						||
        $agencyMoney            = round($agencyMoney,2);        //四舍五入 精确到分
 | 
						||
        $adminMoney             = round($adminMoney,2);         //四舍五入 精确到分
 | 
						||
        $consumerMoney          = round($consumerMoney,2);      //四舍五入 精确到分
 | 
						||
 | 
						||
 | 
						||
        //开启分销状态
 | 
						||
        $disAdminMoney                  =  (($deductionMoney/100) * $coupon->couponMain->commission_dis_admin);
 | 
						||
        $disDistributionMoney           =  (($deductionMoney/100) * $coupon->couponMain->commission_dis_distribution);
 | 
						||
        $disDistributedMoney            =  (($deductionMoney/100) * $coupon->couponMain->commission_dis_distributed);
 | 
						||
        $disAgencyMoney                 =  0 ;//渠道商就没得钱
 | 
						||
 | 
						||
        $disAdminMoney                  = round($disAdminMoney,2);        //四舍五入 精确到分
 | 
						||
        $disDistributionMoney           = round($disDistributionMoney,2); //四舍五入 精确到分
 | 
						||
        $disDistributedMoney            = round($disDistributedMoney,2);  //四舍五入 精确到分
 | 
						||
 | 
						||
        $consumerRedpackUser        =  $account;
 | 
						||
        $distributionRedpackUser    = [];
 | 
						||
        $agencyRedpackUser          = [];
 | 
						||
 | 
						||
        //开启了分销
 | 
						||
        if(
 | 
						||
            $business->is_assign == BusinessModel::COMMON_OFF
 | 
						||
            ||
 | 
						||
            (!empty($coupon->distribution_user_code)&&$coupon->is_distribution_coupon == CouponMain::COMMON_ON)
 | 
						||
        ){
 | 
						||
            $distributionRedpackUser   = Account::findOne([["user_code","=",$coupon->distribution_user_code]]);
 | 
						||
            //如果没有分销人  就全是平台 和分销人的
 | 
						||
            if(empty($distributionRedpackUser)){
 | 
						||
                $confirmAdminMoney                  =  $disAdminMoney + $disDistributionMoney;
 | 
						||
                $confirmDistributionMoney           =  0;
 | 
						||
                $confirmDistributedMoney            =  $disDistributedMoney;
 | 
						||
                $confirmAgencyMoney                 =  $disAgencyMoney;
 | 
						||
            }else{//存在分销人 就走分销人
 | 
						||
                $confirmAdminMoney                  =  $disAdminMoney;
 | 
						||
                $confirmDistributionMoney           =  $disDistributionMoney;
 | 
						||
                $confirmDistributedMoney            =  $disDistributedMoney;
 | 
						||
                $confirmAgencyMoney                 =  $disAgencyMoney;
 | 
						||
            }
 | 
						||
 | 
						||
        }else{
 | 
						||
            $confirmAdminMoney                  =  $adminMoney;
 | 
						||
            $confirmDistributionMoney           =  0;
 | 
						||
            $confirmDistributedMoney            =  $consumerMoney;
 | 
						||
            $confirmAgencyMoney                 =  $agencyMoney;
 | 
						||
            if(isset($business->agency) && $business->agency){
 | 
						||
                $agencyRedpackUser              =   Account::findOne([
 | 
						||
                    ["business_code","=",$business->agency->code],
 | 
						||
                    ["type","=",Account::type_business],
 | 
						||
                ]);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        //开始数据操作
 | 
						||
        Db::startTrans();
 | 
						||
        try {
 | 
						||
            // 1. 修改签到券状态
 | 
						||
            $coupon->save([
 | 
						||
                "is_verificated"        => CouponModel::is_verificated_on,
 | 
						||
                "used_time"             => date("Y-m-d H:i:s" ,$time),
 | 
						||
                "verificate_time"       => date("Y-m-d H:i:s" ,$time),
 | 
						||
            ]);
 | 
						||
            $coupon->couponMain->save([
 | 
						||
                "verification_count"    => Db::raw("verification_count + 1"),//已验证数量+1
 | 
						||
                "using_count"           => Db::raw("using_count - 1"),//进行中数量-1
 | 
						||
            ]);
 | 
						||
 | 
						||
 | 
						||
 | 
						||
//            $couponBill = CouponBill::getUserOne($account->user_code,$coupon->couponMain->id,$coupon->id);
 | 
						||
//            if(empty($couponBill)){
 | 
						||
            //2. 写入签到券流水
 | 
						||
            $couponBillData = [
 | 
						||
                "coupon_main_id"            => $coupon->couponMain->id,
 | 
						||
                "coupon_id"                 => $coupon->id,
 | 
						||
                "user_code"                 => $account->user_code,
 | 
						||
                "business_code"             => $business->code,
 | 
						||
                "agency_code"               => $business->agency_code,
 | 
						||
                "commission_agency"         => $coupon->couponMain->commission_agency,
 | 
						||
                "commission_admin"          => $coupon->couponMain->commission_admin,
 | 
						||
                "commission_consumer"       => $coupon->couponMain->commission_consumer,
 | 
						||
                "commission_dis_admin"      => $coupon->couponMain->commission_dis_admin,
 | 
						||
                "commission_dis_distribution"   => $coupon->couponMain->commission_dis_distribution,
 | 
						||
                "commission_dis_distributed"    => $coupon->couponMain->commission_dis_distributed,
 | 
						||
                "money"                     => $coupon->couponMain->money,
 | 
						||
                "agency_money"              => $confirmAgencyMoney,
 | 
						||
                "admin_money"               => $confirmAdminMoney,
 | 
						||
                "consumer_money"            => $confirmDistributedMoney,
 | 
						||
                "distribution_money"        => $confirmDistributionMoney,
 | 
						||
                "lat"                       => $lat,
 | 
						||
                "lng"                       => $lng,
 | 
						||
                "create_time"               => date("Y-m-d H:i:s" ,$time),
 | 
						||
            ];
 | 
						||
            $couponBill = CouponBill::create($couponBillData);
 | 
						||
//            }else{
 | 
						||
//                $couponBillData = [
 | 
						||
//                    "agency_money"              => $agencyMoney,
 | 
						||
//                    "admin_money"               => $adminMoney,
 | 
						||
//                    "consumer_money"            => $consumerMoney,
 | 
						||
//                    "lat"                       => $lat,
 | 
						||
//                    "lng"                       => $lng,
 | 
						||
//                ];
 | 
						||
//                $couponBill->save($couponBillData);
 | 
						||
//            }
 | 
						||
 | 
						||
 | 
						||
            // 3.  写入商家扣费记录
 | 
						||
            $deductionData = [
 | 
						||
                "money"                 => $deductionMoney,
 | 
						||
                "user_code"             => $account->user_code,
 | 
						||
                "business_code"         => $business->code,
 | 
						||
                "business_name"         => $business->business_name,
 | 
						||
                "balance"               => $business->balance - $deductionMoney,
 | 
						||
                "reason"                => sprintf("[%s]验证签到券[%s]扣除[%s]",$account->nick_name, $coupon->couponMain->name,$deductionMoney),
 | 
						||
                "coupon_main_id"        =>  $coupon->couponMain->id,
 | 
						||
                "coupon_id"             =>  $coupon->id,
 | 
						||
                "bill_id"               =>  $couponBill->id,
 | 
						||
                "create_time"           => date("Y-m-d H:i:s",$time),
 | 
						||
            ];
 | 
						||
            Deduction::create($deductionData);
 | 
						||
 | 
						||
 | 
						||
            //4. 商家扣钱  所有模式商家都要扣钱
 | 
						||
            $businessSaveData = [
 | 
						||
                "balance" => Db::raw("balance - " . $deductionMoney,),
 | 
						||
            ];
 | 
						||
            //是否要变更模式
 | 
						||
            if ($businessModel == BusinessModel::model_ordinary) {
 | 
						||
                $businessSaveData["model"] = BusinessModel::model_ordinary;
 | 
						||
            }
 | 
						||
            $business->save($businessSaveData);
 | 
						||
 | 
						||
 | 
						||
            $payment = WechatPay::getInstance();
 | 
						||
 | 
						||
            //5. 渠道商加钱  【只要指派了渠道商 并且没有分销人  渠道商才能加钱 红包方式直接打款 成功失败不管】
 | 
						||
            //$business->agency->inc("balance",$agencyMoney)->update();
 | 
						||
            //修改成直接大款到关联的用户
 | 
						||
            if($confirmAgencyMoney > 0 && !empty($agencyRedpackUser)) {
 | 
						||
                $agencyRedpack = Redpack::getDistributionRedpack( Redpack::userTypeAgency,$agencyRedpackUser->user_code,$coupon->id);
 | 
						||
                //如果付款过一次了  就用同一个订单号发起
 | 
						||
                if(!empty($agencyRedpack)){
 | 
						||
                    $mch_billno     = $agencyRedpack->mch_billno;
 | 
						||
                }else{
 | 
						||
                    $mch_billno     = createUuid();
 | 
						||
                }
 | 
						||
 | 
						||
                $agencyPayAmount             = $confirmAgencyMoney * 100 ;
 | 
						||
 | 
						||
                $agencyToBalanceData  = [
 | 
						||
                    'partner_trade_no'      => $mch_billno,// 商户订单号,需保持唯一性(只能是字母或者数字,不能包含有符号)
 | 
						||
                    'openid'                => $agencyRedpackUser->open_id,
 | 
						||
                    'check_name'            => 'NO_CHECK',// NO_CHECK:不校验真实姓名, FORCE_CHECK:强校验真实姓名
 | 
						||
                    'amount'                => $agencyPayAmount ,  //单位为分,不小于300
 | 
						||
                    'desc'                  => '用户核销签到券,渠道商奖励',
 | 
						||
                ];
 | 
						||
 | 
						||
                // 写入红包
 | 
						||
                $agencyRedpackData = [
 | 
						||
                    "coupon_id"                     => $coupon->id,
 | 
						||
                    "mch_billno"                    => $mch_billno,
 | 
						||
                    "openid"                        => $agencyRedpackUser->open_id,
 | 
						||
                    "user_code"                     => $agencyRedpackUser->user_code,
 | 
						||
                    "money"                         => $agencyPayAmount, //单位为分,不小于300
 | 
						||
                    "create_time"                   => date("Y-m-d H:i:s",$time),
 | 
						||
                    "pay_time"                      => '0000-00-00 00:00:00',
 | 
						||
                    "user_type"                     => Redpack::userTypeAgency,
 | 
						||
                ];
 | 
						||
 | 
						||
                //发起支付
 | 
						||
                $agencyResult  =  $payment->transfer->toBalance($agencyToBalanceData);
 | 
						||
                //付款成功才提交!!!!!伪装成功
 | 
						||
                if( isset($agencyResult['payment_no'])   ){
 | 
						||
                    $agencyRedpackData['pay_time']  = date("Y-m-d H:i:s",$time);
 | 
						||
                }else{
 | 
						||
                    $agencyRedpackData['failure_reason'] = json_encode($agencyResult,JSON_UNESCAPED_UNICODE);
 | 
						||
                    //否则失败  记录失败原因
 | 
						||
                    Log::info("企业发起付款【渠道商红包】失败:" . json_encode($agencyResult,JSON_UNESCAPED_UNICODE));
 | 
						||
                }
 | 
						||
                // 不管成功还是失败 都要写入
 | 
						||
                if(empty($agencyRedpack)){
 | 
						||
                    Redpack::create($agencyRedpackData);
 | 
						||
                }else{
 | 
						||
                    $agencyRedpack->save($agencyRedpackData);
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
            //6. 核销用户提现到零钱  写入红包记录
 | 
						||
            if($confirmDistributedMoney > 0 && !empty($consumerRedpackUser)){
 | 
						||
                $distributedRedpack = Redpack::getDistributionRedpack( Redpack::userTypeDistributed,$consumerRedpackUser->user_code,$coupon->id);
 | 
						||
                //如果付款过一次了  就查询付款状态
 | 
						||
                if(!empty($distributedRedpack)){
 | 
						||
                    $consumerMchBillno     = $distributedRedpack->mch_billno;
 | 
						||
                }else{
 | 
						||
                    $consumerMchBillno     = createUuid();
 | 
						||
                }
 | 
						||
 | 
						||
                $consumerAmount         = $confirmDistributedMoney * 100;
 | 
						||
 | 
						||
                $consumerToBalanceData  = [
 | 
						||
                    'partner_trade_no'      => $consumerMchBillno,// 商户订单号,需保持唯一性(只能是字母或者数字,不能包含有符号)
 | 
						||
                    'openid'                => $consumerRedpackUser->open_id,
 | 
						||
                    'check_name'            => 'NO_CHECK',// NO_CHECK:不校验真实姓名, FORCE_CHECK:强校验真实姓名
 | 
						||
                    'amount'                => $consumerAmount,  //单位为分,不小于300
 | 
						||
                    'desc'                  => '验证签到券签到奖励',
 | 
						||
                ];
 | 
						||
 | 
						||
                // 写入红包
 | 
						||
                $consumerRedpackData = [
 | 
						||
                    "coupon_id"     =>  $coupon->id,
 | 
						||
                    "mch_billno"    =>  $consumerMchBillno,
 | 
						||
                    "openid"        =>  $consumerRedpackUser->open_id,
 | 
						||
                    "user_code"     =>  $consumerRedpackUser->user_code,
 | 
						||
                    "money"         =>  $consumerAmount, //单位为分,不小于300
 | 
						||
                    "create_time"   =>  date("Y-m-d H:i:s",$time),
 | 
						||
                    "pay_time"      => '0000-00-00 00:00:00',
 | 
						||
                ];
 | 
						||
 | 
						||
 | 
						||
                //发起支付
 | 
						||
                $consumerResult  =  $payment->transfer->toBalance($consumerToBalanceData);
 | 
						||
                //付款成功才提交!!!!!伪装成功
 | 
						||
                if( isset($consumerResult['payment_no'])   ){
 | 
						||
                    $returnConsumerMoney                =     $confirmDistributedMoney;
 | 
						||
                    $consumerRedpackData['pay_time']    = date("Y-m-d H:i:s",$time);
 | 
						||
                }else{
 | 
						||
                    $consumerRedpackData['failure_reason'] = json_encode($consumerResult,JSON_UNESCAPED_UNICODE);
 | 
						||
                    //否则失败  记录失败原因
 | 
						||
                    Log::info("企业发起付款【渠道商红包】失败:" . json_encode($consumerResult,JSON_UNESCAPED_UNICODE));
 | 
						||
                }
 | 
						||
 | 
						||
                if(empty($distributedRedpack)){
 | 
						||
                    Redpack::create($consumerRedpackData);
 | 
						||
                }else{
 | 
						||
                    $distributedRedpack->save($consumerRedpackData);
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            //7 分销者用户提现到零钱  写入红包记录
 | 
						||
            if($confirmDistributionMoney  > 0 && !empty($distributionRedpackUser)){
 | 
						||
 | 
						||
                $distributionRedpack = Redpack::getDistributionRedpack( Redpack::userTypeDistribution,$distributionRedpackUser->user_code,$coupon->id);
 | 
						||
                //如果付款过一次了  就用同一个订单号发起
 | 
						||
                if(!empty($distributionRedpack)){
 | 
						||
                    $distributionMchBillno     = $distributionRedpack->mch_billno;
 | 
						||
                }else{
 | 
						||
                    $distributionMchBillno     = createUuid();
 | 
						||
                }
 | 
						||
 | 
						||
                $distributionToBalanceData  = [
 | 
						||
                    'partner_trade_no'      => $distributionMchBillno,// 商户订单号,需保持唯一性(只能是字母或者数字,不能包含有符号)
 | 
						||
                    'openid'                => $distributionRedpackUser->open_id,
 | 
						||
                    'check_name'            => 'NO_CHECK',// NO_CHECK:不校验真实姓名, FORCE_CHECK:强校验真实姓名
 | 
						||
                    'amount'                => $confirmDistributionMoney * 100,  //单位为分,不小于300
 | 
						||
                    'desc'                  => '签到券分销奖励',
 | 
						||
                ];
 | 
						||
 | 
						||
                // 写入红包
 | 
						||
                $distributionRedpackData = [
 | 
						||
                    "coupon_id"                     => 0,
 | 
						||
                    "mch_billno"                    => $distributionMchBillno,
 | 
						||
                    "openid"                        => $distributionRedpackUser->open_id,
 | 
						||
                    "user_code"                     => $distributionRedpackUser->user_code,
 | 
						||
                    "money"                         => $confirmDistributionMoney * 100, //单位为分,不小于300
 | 
						||
                    "create_time"                   => date("Y-m-d H:i:s",$time),
 | 
						||
                    "pay_time"                      => '0000-00-00 00:00:00',
 | 
						||
                    "user_type"                     => Redpack::userTypeDistribution,
 | 
						||
                ];
 | 
						||
 | 
						||
 | 
						||
                //发起支付
 | 
						||
                $distributionResult  =  $payment->transfer->toBalance($distributionToBalanceData);
 | 
						||
 | 
						||
                //var_dump($result);
 | 
						||
 | 
						||
                //付款成功才提交!!!!!伪装成功
 | 
						||
                if( isset($distributionResult['payment_no'])   ){
 | 
						||
                    $distributionRedpackData['pay_time']  = date("Y-m-d H:i:s",$time);
 | 
						||
                    if(empty($distributionRedpack)){
 | 
						||
                        Redpack::create($distributionRedpackData);
 | 
						||
                    }else{
 | 
						||
                        $distributionRedpack->save($distributionRedpackData);
 | 
						||
                    }
 | 
						||
 | 
						||
                }else{
 | 
						||
                    $distributionRedpackData['failure_reason'] = json_encode($distributionResult,JSON_UNESCAPED_UNICODE);
 | 
						||
                    //否则失败  记录失败原因
 | 
						||
                    Log::info("企业发起付款【领券分销者红包】失败:" . json_encode($distributionResult,JSON_UNESCAPED_UNICODE));
 | 
						||
                    //默认回滚
 | 
						||
                    Db::rollback();
 | 
						||
                    //失败也要写入红包记录
 | 
						||
                    if(empty($distributionRedpack)){
 | 
						||
                        Redpack::create($distributionRedpackData);
 | 
						||
                    }else{
 | 
						||
                        $distributionRedpack->save($distributionRedpackData);
 | 
						||
                    }
 | 
						||
                    return $this->json(5003, "领取失败");
 | 
						||
                }
 | 
						||
 | 
						||
            }
 | 
						||
 | 
						||
            Db::commit();
 | 
						||
            return $this->json(
 | 
						||
                0,
 | 
						||
                "签到券签到使用成功,您获得{$returnConsumerMoney}元红包,已存入您的零钱",
 | 
						||
                [
 | 
						||
                    "redpack" =>$returnConsumerMoney,
 | 
						||
                    "user_coupon_id" =>$couponId,
 | 
						||
                ]);
 | 
						||
 | 
						||
        }catch (RepositoryException $e){
 | 
						||
            Db::rollback();
 | 
						||
            return $this->json(5001, "Repository服务器错误");
 | 
						||
        }catch (\Exception $e){
 | 
						||
            Log::error('核销签到券失败:'.$e->getMessage());
 | 
						||
            Db::rollback();
 | 
						||
            return $this->json(5002, "服务器错误");
 | 
						||
        }
 | 
						||
    }
 | 
						||
    /**
 | 
						||
     * 发布签到券
 | 
						||
     * */
 | 
						||
    public function add()
 | 
						||
    {
 | 
						||
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						||
        $account = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						||
            return $q->with(['business'=>function($q){
 | 
						||
                $q->lock(true);
 | 
						||
            }, 'parent']);
 | 
						||
        });
 | 
						||
        if(empty($account)){
 | 
						||
            return  $this->json(6001,"登录失效");
 | 
						||
        }
 | 
						||
        if ($account->type == Account::type_consumer) {
 | 
						||
            return $this->json(4001, "您不是商家");
 | 
						||
        }
 | 
						||
 | 
						||
        if (!isset($account->business) || empty($account->business)) {
 | 
						||
            return $this->json(4001, "商家信息错误");
 | 
						||
        }
 | 
						||
        if($account->business->enable != BusinessModel::COMMON_OFF){
 | 
						||
            return $this->json(4001, "商家已禁用");
 | 
						||
        }
 | 
						||
        $data = input();
 | 
						||
        $time = time();
 | 
						||
 | 
						||
        Config::load("extra/distribution_proportion","distribution_proportion");
 | 
						||
        Config::load("extra/distribution_proportion_user","distribution_proportion_user");
 | 
						||
        $distributionProportion     = config("distribution_proportion");
 | 
						||
        $distributionProportionUser = config("distribution_proportion_user");
 | 
						||
 | 
						||
        $totalC = $distributionProportion['agency'] + $distributionProportion['admin'] + $distributionProportion['consumer'];
 | 
						||
        if ($totalC != 100) {
 | 
						||
            return $this->json(4002, "系统设置分配比例总和不等于100,不能发布");
 | 
						||
        }
 | 
						||
 | 
						||
        //持有限量
 | 
						||
        Config::load("extra/wechat","wechat");
 | 
						||
        $hasCouponMax = config("wechat.hasCouponMax")??0;
 | 
						||
        if ($hasCouponMax > 0) {
 | 
						||
            $hasCouponCount = CouponRepository::getInstance()->getBusinessOnShelfOnCount($account->business->code);
 | 
						||
            if ($hasCouponCount > $hasCouponMax) {
 | 
						||
                return $this->json(4001, "商家持有签到券不能超过{$hasCouponMax}");
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        //验证通过  不管是商家还是工作人员  都可以发布签到券
 | 
						||
        $couponMain = [
 | 
						||
            "name"                          => $data['name'] ?? '',
 | 
						||
            "business_code"                 => $account->business->code,
 | 
						||
            //"money"                 => $data['money'] ?? 0,
 | 
						||
            "type"                          => $data['type'] ?? 0,
 | 
						||
            "count"                         => $data['count'] ?? 0,
 | 
						||
            "type_name"                     => $data['type_name'] ?? '',
 | 
						||
            "start_time"                    => $data['start_time'] ?? '',
 | 
						||
            "end_time"                      => $data['end_time'] ?? '',
 | 
						||
            "deduction_money"               => $data['deduction_money'] ?? '',
 | 
						||
            "image_url"                     => $data['image_url'] ?? '',
 | 
						||
            "intro"                         => $data['intro'] ?? '',
 | 
						||
            "content"                       => $data['content'] ?? '',
 | 
						||
            "white_list"                    => $data['white_list'] ?? '',
 | 
						||
            "status"                        => CouponMain::status_on,
 | 
						||
            "on_shelf"                      => CouponMain::on_shelf_off,//默认下架  后台审核上架
 | 
						||
            "on_screen"                     => CouponMain::on_screen_yes,
 | 
						||
            "is_distribution"               =>
 | 
						||
 | 
						||
                //根据是否指派了渠道商  判断是否开启分销   指派了渠道商就不能开启分销
 | 
						||
                ($account->business->is_assign == BusinessModel::COMMON_ON)
 | 
						||
                    ?
 | 
						||
                    CouponMain::COMMON_OFF
 | 
						||
                    :
 | 
						||
                    CouponMain::COMMON_ON,
 | 
						||
 | 
						||
            //下面是分配比例
 | 
						||
            "commission_agency"             => $distributionProportion['agency'],
 | 
						||
            "commission_admin"              => $distributionProportion['admin'],
 | 
						||
            "commission_consumer"           => $distributionProportion['consumer'],
 | 
						||
            "commission_dis_admin"          => $distributionProportionUser['admin'],
 | 
						||
            "commission_dis_distribution"   => $distributionProportionUser['distribution'],
 | 
						||
            "commission_dis_distributed"    => $distributionProportionUser['distributed'],
 | 
						||
        ];
 | 
						||
 | 
						||
        //$usingRule = input("using_rule/a");
 | 
						||
        $businessModel = $account->business["model"];
 | 
						||
        // 指定时间段内发布的签到券个数
 | 
						||
        $TimeListModeReleaseCount = BusinessRepository::getInstance()
 | 
						||
            ->getTimeListModeReleaseCount($account->business["code"],$account->business["time_limit_start"],$account->business["time_limit_end"]);
 | 
						||
 | 
						||
        if($account->business["model"] == BusinessModel::model_time_limit){
 | 
						||
            //如果到了时间 或者发布数量到达规定 更改商家模式
 | 
						||
            if( strtotime($account->business["time_limit_end"] ) < $time
 | 
						||
                ||
 | 
						||
                (($TimeListModeReleaseCount ) >= $account->business["time_limit_release_count"])
 | 
						||
            ){
 | 
						||
                $businessModel = BusinessModel::model_ordinary;
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        $validate       = new CouponRelease();
 | 
						||
 | 
						||
        //普通商家要验证扣除金额
 | 
						||
        if (!$validate->scene(($businessModel == BusinessModel::model_ordinary )? "ordinary" : "")->check($couponMain)) {
 | 
						||
            return $this->json(4001, $validate->getError());
 | 
						||
        }
 | 
						||
 | 
						||
        //$usingRuleValidate = new CouponUsingRule();
 | 
						||
        //if (!$usingRuleValidate->check($usingRule)) {
 | 
						||
        //   return $this->json(4001, $usingRuleValidate->getError());
 | 
						||
        //}
 | 
						||
 | 
						||
        //检查类型
 | 
						||
        if(CouponTypeModel::checkType($couponMain['type']) !== true){
 | 
						||
            return $this->json(4001, '签到券类型不存在');
 | 
						||
        }
 | 
						||
        $type                           = CouponRepository::getInstance()->getCouponTypeAll();
 | 
						||
        $type                           = array_column($type->toArray(), null, "id");
 | 
						||
        $couponMain['type_name']              = $type[$couponMain['type']]['name'];
 | 
						||
 | 
						||
        //验证通过
 | 
						||
        $couponMain['business_type']            = $account->business['type'];
 | 
						||
        $couponMain['business_name']            = $account->business['business_name'];
 | 
						||
        $couponMain['lng']                      = $account->business['lng'];
 | 
						||
        $couponMain['lat']                      = $account->business['lat'];
 | 
						||
        $couponMain['business_circle_id']       = $account->business['business_circle_id'];
 | 
						||
        $couponMain['create_time']              = date("Y-m-d H:i:s");
 | 
						||
 | 
						||
        //保留两位小数
 | 
						||
        $couponMain['deduction_money'] = floor($couponMain['deduction_money'] * 100) / 100;
 | 
						||
        $totalMoney = $couponMain['deduction_money'] * $couponMain['count'];
 | 
						||
 | 
						||
        //如果开启了分销
 | 
						||
        //if($couponMain['commission_dis_distributed'] < $couponMain['commission_dis_distribution']){
 | 
						||
            //检测 【核销分销者】部分是否最少0.3元
 | 
						||
            $distributedMoney = ($couponMain['commission_dis_distributed'] / 100) * $couponMain['deduction_money'];
 | 
						||
            if ($distributedMoney != 0 && $distributedMoney < CouponMain::min_redpack_money) {
 | 
						||
                return $this->json(4002,
 | 
						||
                    "扣除金额最低"
 | 
						||
                    . (CouponMain::min_redpack_money * (100 / ($couponMain['commission_dis_distributed'])))
 | 
						||
                    . "元");
 | 
						||
            }
 | 
						||
        //}else{
 | 
						||
            //检测 【领券分销者】部分是否最少0.3元
 | 
						||
            $distributionMoney = ($couponMain['commission_dis_distribution'] / 100) * $couponMain['deduction_money'];
 | 
						||
            if ($distributionMoney != 0 && $distributionMoney < CouponMain::min_redpack_money) {
 | 
						||
                return $this->json(4002,
 | 
						||
                    "扣除金额最低"
 | 
						||
                    . (CouponMain::min_redpack_money * (100 / ($couponMain['commission_dis_distribution'])))
 | 
						||
                    . "元");
 | 
						||
            }
 | 
						||
        //}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        //if($couponMain['commission_consumer'] < $couponMain['commission_agency']){
 | 
						||
            //检测 【消费者】部分是否最少0.3元
 | 
						||
            $consumerMoney = ($couponMain['commission_consumer']/100) * $couponMain['deduction_money'];
 | 
						||
            if ($consumerMoney != 0 && $consumerMoney < CouponMain::min_redpack_money) {
 | 
						||
                return $this->json(4002,
 | 
						||
                    "扣除金额最低"
 | 
						||
                    . (CouponMain::min_redpack_money * (100 / ($couponMain['commission_consumer'])))
 | 
						||
                    . "元");
 | 
						||
            }
 | 
						||
        //}else{
 | 
						||
            //检测 【渠道商】部分是否最少0.3元
 | 
						||
            $agencyMoney = ($couponMain['commission_agency']/100) * $couponMain['deduction_money'];
 | 
						||
            if ($agencyMoney != 0 && $agencyMoney < CouponMain::min_redpack_money) {
 | 
						||
                return $this->json(4002,
 | 
						||
                    "扣除金额最低"
 | 
						||
                    . (CouponMain::min_redpack_money * (100 / ($couponMain['commission_agency'])))
 | 
						||
                    . "元");
 | 
						||
            }
 | 
						||
        //}
 | 
						||
 | 
						||
 | 
						||
        //未领取的签到券
 | 
						||
        $NotClaimedMoney = CouponRepository::getInstance()->getBusinessNotClaimedCoupon($account->business["code"]);
 | 
						||
//        if(
 | 
						||
//            $account->business["model"] == BusinessModel::model_ordinary
 | 
						||
//            ||
 | 
						||
//            (
 | 
						||
//                $account->business["model"] == BusinessModel::model_time_limit
 | 
						||
//                &&
 | 
						||
//                (
 | 
						||
//                    (strtotime($account->business["time_limit_end"]) < $time)
 | 
						||
//                    ||
 | 
						||
//                    ($TimeListModeReleaseCount >= $account->business["time_limit_release_count"])
 | 
						||
//                )
 | 
						||
//            )
 | 
						||
//        ) {
 | 
						||
//            if ($account->business["balance"] < ($totalMoney + $NotClaimedMoney)) {
 | 
						||
//                return $this->json(4001, '商家余额不足');
 | 
						||
//            }
 | 
						||
//        }
 | 
						||
 | 
						||
        if ($account->business["balance"] < ($totalMoney + $NotClaimedMoney)) {
 | 
						||
            return $this->json(4001, '商家余额不足');
 | 
						||
        }
 | 
						||
 | 
						||
        Db::startTrans();
 | 
						||
        try {
 | 
						||
            //CouponRepository::getInstance()->releaseCouponMain($couponMain, $totalMoney, $usingRule);
 | 
						||
            CouponRepository::getInstance()->releaseCouponMain($couponMain);
 | 
						||
 | 
						||
 | 
						||
            if($account->business["model"] == BusinessModel::model_time_limit){
 | 
						||
                //如果到了时间 或者发布数量到达规定 更改商家模式
 | 
						||
                if( strtotime($account->business["time_limit_end"] ) < $time
 | 
						||
                    ||
 | 
						||
                    (($TimeListModeReleaseCount + 1) >= $account->business["time_limit_release_count"])
 | 
						||
                ){
 | 
						||
                    $account->business->save(["model"=>BusinessModel::model_ordinary]);
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            Db::commit();
 | 
						||
            return $this->json();
 | 
						||
        } catch (RepositoryException $e) {
 | 
						||
            Db::rollback();
 | 
						||
            return $this->json(5001, "发布失败" . $e->getMessage());
 | 
						||
        } catch (\think\Exception $e) {
 | 
						||
            Db::rollback();
 | 
						||
            return $this->json(5002, "发布失败" . $e->getMessage());
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * 修改签到券
 | 
						||
     * */
 | 
						||
    public function edit()
 | 
						||
    {
 | 
						||
        $accountId      = $this->request->user['user_id'] ?? 0;
 | 
						||
        $couponMainId   = input("couponMainId/d");
 | 
						||
        $account        = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						||
            return $q->with(['business'=>function($q){
 | 
						||
                $q->lock(true);
 | 
						||
            }, 'parent']);
 | 
						||
        });
 | 
						||
        if(empty($account)){
 | 
						||
            return  $this->json(6001,"登录失效");
 | 
						||
        }
 | 
						||
        if ($account->type == Account::type_consumer) {
 | 
						||
            return $this->json(4001, "您不是商家");
 | 
						||
        }
 | 
						||
 | 
						||
        if (!isset($account->business) || empty($account->business)) {
 | 
						||
            return $this->json(4001, "商家信息错误");
 | 
						||
        }
 | 
						||
 | 
						||
        $couponMain = CouponMain::findById($couponMainId,[]);
 | 
						||
        if (empty($couponMain)) {
 | 
						||
            return $this->json(4001, "签到券不存在");
 | 
						||
        }
 | 
						||
        //if (!isset($couponMain->usingRule)||empty($couponMain->usingRule)) {
 | 
						||
        //    return $this->json(4001, "签到券信息错误");
 | 
						||
        //}
 | 
						||
        $data = input();
 | 
						||
 | 
						||
        //验证通过  不管是商家还是工作人员  都可以修改签到券  只能修改指定字段
 | 
						||
        $couponMainData = [
 | 
						||
            "name"                  => $data['name'] ?? '',
 | 
						||
            "type"                  => $data['type'] ?? 0,
 | 
						||
            "type_name"             => $data['type_name'] ?? '',
 | 
						||
            "start_time"            => $data['start_time'] ?? '',
 | 
						||
            "end_time"              => $data['end_time'] ?? '',
 | 
						||
            "image_url"             => $data['image_url'] ?? '',
 | 
						||
            "intro"                 => $data['intro'] ?? '',
 | 
						||
            "content"               => $data['content'] ?? '',
 | 
						||
            "white_list"            => $data['white_list'] ?? '',
 | 
						||
            "on_screen"             => $data['on_screen'] ?? 1,
 | 
						||
        ];
 | 
						||
 | 
						||
        //$usingRule = input("using_rule/a");
 | 
						||
 | 
						||
        $validate = new CouponRelease();
 | 
						||
        if (!$validate->scene("api_edit")->check($couponMainData)) {
 | 
						||
            return $this->json(4001, $validate->getError());
 | 
						||
        }
 | 
						||
 | 
						||
        //$usingRuleValidate = new CouponUsingRule();
 | 
						||
        //if (!$usingRuleValidate->check($usingRule)) {
 | 
						||
        //    return $this->json(4001, $usingRuleValidate->getError());
 | 
						||
        //}
 | 
						||
 | 
						||
        //检查类型
 | 
						||
        if(CouponTypeModel::checkType($couponMainData['type']) !== true){
 | 
						||
            return $this->json(4001, '签到券类型不存在');
 | 
						||
        }
 | 
						||
        $type                           = CouponRepository::getInstance()->getCouponTypeAll();
 | 
						||
        $type                           = array_column($type->toArray(), null, "id");
 | 
						||
        $couponMainData['type_name']    = $type[$data['type']]['name'];
 | 
						||
 | 
						||
        //验证通过
 | 
						||
        Db::startTrans();
 | 
						||
        try {
 | 
						||
            $couponMain->save($couponMainData);
 | 
						||
            //$couponMain->usingRule->save($usingRule);
 | 
						||
            CouponRepository::getInstance()->getModel()->where("coupon_id",$couponMain->id)->update(["end_time"=>$couponMainData["end_time"]." 00:00:00"]);
 | 
						||
            Db::commit();
 | 
						||
            return $this->json();
 | 
						||
        } catch (RepositoryException $e) {
 | 
						||
            Db::rollback();
 | 
						||
            return $this->json(5001, "修改失败失败" );
 | 
						||
        } catch (\think\Exception $e) {
 | 
						||
            Db::rollback();
 | 
						||
            return $this->json(5002, "修改失败500" );
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * 商家管理签到券
 | 
						||
     * */
 | 
						||
    public function getPageList()
 | 
						||
    {
 | 
						||
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						||
        $account = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						||
            return $q->with(['business', 'parent']);
 | 
						||
        });
 | 
						||
        if(empty($account)){
 | 
						||
            return  $this->json(6001,"登录失效");
 | 
						||
        }
 | 
						||
        if ($account->type == Account::type_consumer) {
 | 
						||
            return $this->json(4001, "您不是商家");
 | 
						||
        }
 | 
						||
 | 
						||
        if (!isset($account->business) || empty($account->business)) {
 | 
						||
            return $this->json(4001, "商家信息错误");
 | 
						||
        }
 | 
						||
 | 
						||
        $page       = $this->request->param('page/d', 1);
 | 
						||
        $size       = $this->request->param('rows/d', 10);
 | 
						||
        $page       = $page < 1 ? 1 : $page;
 | 
						||
        $size       = $size < 1 ? 10 : $size;
 | 
						||
        $keyword    = $this->request->param('key/s',"");
 | 
						||
        $businessCode    = $account->business_code;
 | 
						||
 | 
						||
        try {
 | 
						||
            $whereMap   = [];
 | 
						||
            $sortOrder  = ['sort' => 'desc'];
 | 
						||
            $whereMap[] = ["business_code" ,"=", $businessCode ];
 | 
						||
            if(!empty($keyword)){
 | 
						||
                $whereMap[] = ["name" ,"like", "%{$keyword}%" ];
 | 
						||
            }
 | 
						||
            $res    = CouponRepository::getInstance(new CouponMain())->findList($whereMap, [], $page, $size,function ($q){
 | 
						||
                return $q->with(["couponType"]);
 | 
						||
            }, $sortOrder);
 | 
						||
            $time = time();
 | 
						||
            $res['list'] ->each(function ($item) use($time){
 | 
						||
                //已使用张数
 | 
						||
                $item->usingCount = CouponRepository::getInstance()->getCouponMainUsingCount($item->id);
 | 
						||
                if($item->on_shelf === 0 && strtotime($item->start_time) <= $time && strtotime($item->end_time) >= $time){
 | 
						||
                    $item->conduct   = true;
 | 
						||
                }else{
 | 
						||
                    $item->conduct   = false;
 | 
						||
                }
 | 
						||
 | 
						||
            });
 | 
						||
 | 
						||
            return $this->json(0, 'success', $res);
 | 
						||
        } catch (RepositoryException | \Exception $e) {
 | 
						||
            echo $e->getMessage();
 | 
						||
            return $this->json(5001, '优惠卷查询失败!');
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * 签到券的领取  使用记录列表
 | 
						||
     * */
 | 
						||
    public function getShopCouponList()
 | 
						||
    {
 | 
						||
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						||
        $keyword = input("key/s");
 | 
						||
        $account = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						||
            return $q->with(['business', 'parent']);
 | 
						||
        });
 | 
						||
        if(empty($account)){
 | 
						||
            return  $this->json(6001,"登录失效");
 | 
						||
        }
 | 
						||
        if ($account->type == Account::type_consumer) {
 | 
						||
            return $this->json(4001, "您不是商家");
 | 
						||
        }
 | 
						||
 | 
						||
        if (!isset($account->business) || empty($account->business)) {
 | 
						||
            return $this->json(4001, "商家信息错误");
 | 
						||
        }
 | 
						||
 | 
						||
        $couponMainId  = input("couponId/d");
 | 
						||
 | 
						||
        $couponMain = CouponMain::findById($couponMainId);
 | 
						||
 | 
						||
        if(empty($couponMain)){
 | 
						||
            return $this->json(4001, "签到券不存在");
 | 
						||
        }
 | 
						||
        if($couponMain->business_code != $account->business->code){
 | 
						||
            return $this->json(4001, "签到券参数信息错误");
 | 
						||
        }
 | 
						||
 | 
						||
        $page       = $this->request->param('page/d', 1);
 | 
						||
        $size       = $this->request->param('rows/d', 10);
 | 
						||
        $type       = $this->request->param('type/s', 10);
 | 
						||
        $page       = $page < 1 ? 1 : $page;
 | 
						||
        $size       = $size < 1 ? 10 : $size;
 | 
						||
        $sortOrder      = ["id"=>"desc"];
 | 
						||
        $whereMap = [
 | 
						||
            ["coupon_id","=",$couponMainId]
 | 
						||
        ];
 | 
						||
        if(!empty($keyword)){
 | 
						||
            $whereMap[] = ["consumer_name", "like", "%{$keyword}%"];
 | 
						||
        }
 | 
						||
        switch ($type) {
 | 
						||
            case 'all':
 | 
						||
                // 全部持有签到券
 | 
						||
                $sortOrder  = [ 'end_time' => 'asc'];
 | 
						||
                break;
 | 
						||
            case 'notUsed':
 | 
						||
                // 未使用(包含已过期)
 | 
						||
                $whereMap[] = ['is_verificated', '=', self::BOOL_FALSE];
 | 
						||
                $sortOrder  = ['end_time' => 'asc'];
 | 
						||
                break;
 | 
						||
            case 'normal':
 | 
						||
                // 未使用且未过期
 | 
						||
                $whereMap[] = ['is_verificated', '=', self::BOOL_FALSE];
 | 
						||
                $whereMap[] = ['end_time', '< TIME', date('Y-m-d H:i:s')];
 | 
						||
                break;
 | 
						||
            case 'used':
 | 
						||
                // 已使用
 | 
						||
                $whereMap[] = ['is_verificated', '=', self::BOOL_TRUE];
 | 
						||
                $sortOrder  = ['verificate_time' => 'desc'];
 | 
						||
                break;
 | 
						||
        }
 | 
						||
        $field = ["is_verificated","received_time","verificate_time","consumer_code","consumer_name","id"];
 | 
						||
        $data  = CouponRepository::getInstance()->findList($whereMap,$field,$page,$size,function($q){
 | 
						||
            return $q->withjoin(["account"=>function($q){
 | 
						||
                $q->field(["nick_name","avatar_url","gender","user_code"]);
 | 
						||
            }]);
 | 
						||
        },$sortOrder);
 | 
						||
 | 
						||
        //所有
 | 
						||
        $data["allNum"]     = CouponRepository::getInstance()->getModel()->where(["coupon_id"=>$couponMainId])->count();
 | 
						||
        //未使用
 | 
						||
        $data["unUsedNum"]  = CouponRepository::getInstance()->getModel()->where(['is_verificated' => self::BOOL_FALSE,"coupon_id"=>$couponMainId])->count();
 | 
						||
        //已使用
 | 
						||
        $data["usedNum"]    = CouponRepository::getInstance()->getModel()->where(['is_verificated' => self::BOOL_TRUE ,"coupon_id"=>$couponMainId])->count();
 | 
						||
 | 
						||
        return $this->json(0,"success",$data);
 | 
						||
 | 
						||
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * 获取签到券详情
 | 
						||
     * */
 | 
						||
    public function getCouponMainInfo()
 | 
						||
    {
 | 
						||
        $couponMainId = input("couponMainId/d");
 | 
						||
        $couponMain = CouponMain::findById($couponMainId,[],function ($q){
 | 
						||
            return $q->with(["business"=>function($q){
 | 
						||
                $q->field("code,business_subtitle");
 | 
						||
            }]);
 | 
						||
        });
 | 
						||
        if(empty($couponMain)){
 | 
						||
            return $this->json(4001,"签到券不存在");
 | 
						||
        }
 | 
						||
 | 
						||
        return $this->json(0,"success",$couponMain->toArray());
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * 已使用签到券 评分
 | 
						||
     * */
 | 
						||
    public function score()
 | 
						||
    {
 | 
						||
        $accountId      = $this->request->user['user_id'] ?? 0;
 | 
						||
        $couponId       =  input("couponId/d",0);
 | 
						||
        $score       =  input("score/d",5);
 | 
						||
 | 
						||
        if($score > 5|| $score <= 0){
 | 
						||
            return $this->json(4001, "参数错误");
 | 
						||
        }
 | 
						||
        $account        = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						||
            return $q->with(['business', 'parent']);
 | 
						||
        });
 | 
						||
 | 
						||
        if(empty($account)){
 | 
						||
            return $this->json(6001,"无效的用户");
 | 
						||
        }
 | 
						||
 | 
						||
        $coupon = CouponRepository::getInstance()->findById($couponId,[],function ($q){
 | 
						||
            return $q->with(["scoreModel"]);
 | 
						||
        });
 | 
						||
 | 
						||
        if($coupon->consumer_code != $account->user_code ){
 | 
						||
            return $this->json(4001, "参数错误");
 | 
						||
        }
 | 
						||
 | 
						||
        if(isset($score->scoreModel) && $score->scoreModel){
 | 
						||
            return $this->json(4001, "已经评论过了");
 | 
						||
        }
 | 
						||
        try {
 | 
						||
            $coupon->scoreModel()->save([
 | 
						||
                "user_code"=>$account->user_code,
 | 
						||
                "business_code"=>$coupon->business_code,
 | 
						||
                "score"=>$score,
 | 
						||
                "coupon_id"=>$coupon->id,
 | 
						||
                "create_time"=>date("Y-m-d H:i:s"),
 | 
						||
            ]);
 | 
						||
            return $this->json();
 | 
						||
        }catch (RepositoryException| \Exception $e){
 | 
						||
            return $this->json(4001, "评分失败");
 | 
						||
        }
 | 
						||
 | 
						||
    }
 | 
						||
} |