<?php
/**
 * Created by PhpStorm.
 * User: wuzhenke
 * Date: 2018/11/28
 * Time: 16:43
 */

namespace App\Services\Company;

use App\Exceptions\ResponseException;
use App\Models\Company;
use App\Models\Jobs;
use App\Models\MembersSetmeal;
use App\Models\Tpl;
use App\Repositories\CompanyRepository;
use App\Repositories\JobsRepository;
use App\Repositories\MemberHandselRepository;
use App\Repositories\MemberLogRepository;
use App\Repositories\MemberPointRepository;
use App\Repositories\MembersChargeLogRepository;
use App\Repositories\MemberSetmealRepository;
use App\Repositories\MembersSetmealLogRepository;
use App\Repositories\OrderRepository;
use App\Repositories\PaymentRepository;
use App\Repositories\QueueAutoRefreshRepository;
use App\Repositories\SetmealIncrementsRepository;
use App\Repositories\SetmealRepository;
use App\Repositories\TaskLogRepository;
use App\Repositories\TaskRepository;
use App\Services\Common\MembersSetmealRecordService;
use App\Services\Common\PayService;
use Carbon\Carbon;
use Illuminate\Contracts\Encryption\EncryptException;
use Illuminate\Support\Facades\DB;
use App\Repositories\TplRepository;
use App\Repositories\MemberSetmealRecordRepository;
use Illuminate\Support\Facades\Log;

class ServiceService
{

    protected $taskRepository;
    protected $memberPointRepository;
    protected $taskLogRepository;
    protected $memberHandselRepository;
    protected $memberSetmealRepository;
    protected $jobsRepository;
    protected $setmealRepository;
    protected $paymentRepository;
    protected $orderRepository;
    protected $memberLogRepository;
    protected $membersChargeLogRepository;
    protected $companyRepository;
    protected $membersSetmealLogRepository;
    protected $setmealIncrementsRepository;
    protected $queueAutoRefreshRepository;
    protected $tplRepository;
    protected $memberSetmealRecordRepository;

    /**
     * ServiceService constructor.
     * @param $taskRepository
     * @param $memberPointRepository
     * @param $taskLogRepository
     * @param $memberHandselRepository
     * @param $memberSetmealRepository
     * @param $jobsRepository
     * @param $setmealRepository
     * @param $paymentRepository
     * @param $orderRepository
     * @param $memberLogRepository
     * @param $membersChargeLogRepository
     * @param $companyRepository
     * @param $membersSetmealLogRepository
     * @param $setmealIncrementsRepository
     * @param $queueAutoRefreshRepository
     * @param $tplRepository
     *
     */

    public function __construct(TaskRepository $taskRepository,TplRepository $tplRepository,  QueueAutoRefreshRepository $queueAutoRefreshRepository,  SetmealIncrementsRepository $setmealIncrementsRepository,  MembersSetmealLogRepository $membersSetmealLogRepository,  CompanyRepository $companyRepository,  MembersChargeLogRepository $membersChargeLogRepository,  MemberLogRepository $memberLogRepository,  OrderRepository $orderRepository,  PaymentRepository $paymentRepository,  SetmealRepository $setmealRepository,  JobsRepository $jobsRepository,  MemberSetmealRepository $memberSetmealRepository,  MemberPointRepository $memberPointRepository,  TaskLogRepository $taskLogRepository, MemberHandselRepository $memberHandselRepository,MemberSetmealRecordRepository $memberSetmealRecordRepository,MembersSetmealRecordService $membersSetmealRecordService){
        $this->taskRepository = $taskRepository;
        $this->memberPointRepository = $memberPointRepository;
        $this->taskLogRepository = $taskLogRepository;
        $this->memberHandselRepository = $memberHandselRepository;
        $this->memberSetmealRepository = $memberSetmealRepository;
        $this->jobsRepository = $jobsRepository;
        $this->setmealRepository = $setmealRepository;
        $this->paymentRepository = $paymentRepository;
        $this->orderRepository = $orderRepository;
        $this->memberLogRepository = $memberLogRepository;
        $this->membersChargeLogRepository = $membersChargeLogRepository;
        $this->companyRepository = $companyRepository;
        $this->membersSetmealLogRepository = $membersSetmealLogRepository;
        $this->setmealIncrementsRepository = $setmealIncrementsRepository;
        $this->queueAutoRefreshRepository = $queueAutoRefreshRepository;
        $this->tplRepository = $tplRepository;
        $this->memberSetmealRecordRepository=$memberSetmealRecordRepository;
        $this->membersSetmealRecordService=$membersSetmealRecordService;
    }

    public function index($user)
    {
        $mySetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);//套餐详细
        $condition['company_id'] = $user->id;
        $condition['display'] = 1;
        $condition['valid'] = 1;
        $condition[] = ['audit','<>',3];
        $jobsCount = $this->jobsRepository->jobsTotal($condition);

        $surplus_jobs = $mySetmeal->jobs_meanwhile-$jobsCount;
        $mySetmeal->jobs_meanwhile =$surplus_jobs>0?$surplus_jobs:0;
        if ($mySetmeal->endtime == 0) {
            $mySetmeal->leave_days = '永久';
        } else {
            $tmpday = ceil((strtotime($mySetmeal->endtime) - time())/86400);
            $minus = $tmpday<0?0:$tmpday;
            $mySetmeal->leave_days = intval($minus);
        }
        $setmeal = $this->setmealRepository->findWhere(['display' => 1]);//会员套餐
        foreach ($setmeal as $key => $val) {
            $setmeal[$key]->discount = $this->setmealRepository->getDiscountForSetmealOne($val);
            $setmeal[$key]->long = $val->days == 0 ? '永久' : $this->formatDays($val->days);
        }
        request()->offsetSet('id', $user->id);

        $setmealRecords=$this->membersSetmealRecordService->SetmealRecord(true);

        $this->freeSetmealIsOver($user);

        $result = [
            'user' => $user,
            'mySetmeal' => $mySetmeal,
            'setmeal' => $setmeal,
            'setmealRecord'=>$setmealRecords,
        ];
        return $result;
    }

    /**
     * 免费的会员是否过期了
     */
    public function freeSetmealIsOver($user){
        $mySetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);//套餐详细
        session(["setmeal_message"=>""]);

        if (strtotime($mySetmeal->endtime)<time() && $mySetmeal->endtime!=0){  //现在就判断到期时间了
            if (request('look')!=true){ //通过url来判断是否已经看过
                session(["setmeal_message"=>"提醒:您的套餐已到期,请及时到我的套餐处升级套餐"]);
            }

        }

    }

    /**
     * @param $request
     * @return array
     */
    public function setmealDetail($request, $user)
    {
        $mySetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);//套餐详细
        $condition['company_id'] = $user->id;
        $condition['display'] = 1;
        $condition['valid'] = 1;
        $condition[] = ['audit','<>',3];
        $jobsCount = $this->jobsRepository->jobsTotal($condition);
        $surplus_jobs = $mySetmeal->jobs_meanwhile-$jobsCount;
        $mySetmeal->jobs_meanwhile =$surplus_jobs>0?$surplus_jobs:0;
        if ($mySetmeal->endtime == 0) {
            $mySetmeal->leave_days = '永久';
        } else {
            $tmpday = ceil((strtotime($mySetmeal->endtime) - time())/86400);
            $minus = $tmpday<0?0:$tmpday;
            $mySetmeal->leave_days = intval($minus);
        }
        $setmeal = $this->setmealRepository->findWhere(['display' => 1]);//会员套餐
        foreach ($setmeal as $key => $val) {
            $setmeal[$key]->discount = $this->setmealRepository->getDiscountForSetmealOne($val);
            $setmeal[$key]->long = $val->days == 0 ? '永久' : $this->formatDays($val->days);
        }
        $starttime = isset($request['starttime'])?$request['starttime']:date('Y-m-d', time()-30*86400);
        $endtime = isset($request['endtime'])?$request['endtime']:date('Y-m-d', time());
        $where= [
            ['created_at','>=',$starttime." 23:10:10"],
            ['created_at','<=',$endtime." 23:10:10"],
            ['log_uid','=',$user->id],
            ['log_utype','=',$user->utype],
        ];
        $setmealDetail = $this->membersSetmealLogRepository->membersSetmealLog($where);

        request()->offsetSet('id', $user->id);
        $setmealRecords=$this->membersSetmealRecordService->SetmealRecord(true);

        $result = [
            'user' => $user,
            'mySetmeal' => $mySetmeal,
            'setmeal' => $setmeal,
            'starttime'=>$starttime,
            'endtime'=>$endtime,
            'setmealDetail'=>$setmealDetail,
            'setmealRecord'=>$setmealRecords,
        ];

        return $result;
    }
    /**
     * 获取任务状态。
     */
    public function points($user, $type = 0)
    {
        $task = $this->memberPointRepository->getComTaskById($user->id);

        foreach ($task as $key => $val) {
            if ($key == 'task_logs') {
                $task_id = [];
                $task_id_w = [];
                foreach ($val as $k => $v) {
                    if ($v['once'] != 1) {
                        $task_id[] = $v['task_id'];
                    } else {
                        $task_id_w[] = $v['task_id'];
                    }
                }
            }
        }
        $count = [];
        $task_id = array_unique($task_id);
        foreach ($task_id as $k => $v) {
            $count[$v] = $this->taskLogRepository->getTaskLogCount($user->id, $v, $user->utype);
        }
        $task_info = $this->taskRepository->getTaskById(array_keys($count));
        $finshTask = [];  //已完成任务。
        foreach ($count as $k1 => $v1) {
            foreach ($task_info as $key1 => $val1) {
                if ($k1 == $val1->id) {
                    if ($val1->times != -1) {
                        if ($v1 == $val1->times) {
                            $finshTask[$k1]['id'] = $val1->id;
                            $finshTask[$k1]['title'] = $val1->title;
                            $finshTask[$k1]['points'] = $val1->points;
                            $finshTask[$k1]['type'] = '日常任务';
                            $finshTask[$k1]['status'] = '已完成';
                            $finshTask[$k1]['t_alias'] = $val1->t_alias;
                            $finshTask[$k1]['count'] = '(*' . $v1 . ')';
                        }
                    }
                }
            }
        }
        $task_info_w = $this->taskRepository->getTaskById(($task_id_w));
        foreach ($task_info_w as $ke => $va) {
            $finshTask[$va->id]['id'] = $va->id;
            $finshTask[$va->id]['title'] = $va->title;
            $finshTask[$va->id]['points'] = $va->points;
            $finshTask[$va->id]['type'] = '一次性任务';
            $finshTask[$va->id]['status'] = '已完成';
            $finshTask[$va->id]['t_alias'] = $va->t_alias;
            $finshTask[$va->id]['count'] = '';
        }
        $task_ZZ = $this->taskRepository->getTaskByUtype($user->utype);
        $task_info_z = [];

        $sub_site = '';
        if (get_subsite_id() > 0) {
            $sub_site = 'jkq.';
        }

        foreach ($task_ZZ as $key => $val) {
            if (!in_array($val->id, array_keys($finshTask))) {
                $task_info_z[$val->id]['id'] = $val->id;
                $task_info_z[$val->id]['title'] = $val->title;
                $task_info_z[$val->id]['points'] = $val->points;
                if ($val->once == 1) {
                    $task_info_z[$val->id]['count'] = '';
                    $task_info_z[$val->id]['type'] = '一次性任务';
                } else {
                    $task_info_z[$val->id]['type'] = '日常任务';
                    $hjk = $this->taskLogRepository->getTaskLogCount($user->id, $val->id, $user->utype);
                    if (!$hjk) {
                        $task_info_z[$val->id]['count'] = '';
                    } else {
                        $times = $val->times;
                        $lasT = $times - $hjk;
                        if ($times == -1) {
                            $task_info_z[$val->id]['count'] = '';
                        } else {
                            $task_info_z[$val->id]['count'] = '(*'.$lasT.')';
                        }
                    }
                }
                if ($type) {
                    if ($val->id == 17) {
                        $task_info_z[$val->id]['status'] = '<a href="" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 18) {
                        $task_info_z[$val->id]['status'] = '<a href="javascript:;" url="' . route($sub_site."mobile.firm.sing") . '" data-type="sign" class="ajax_do" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 19) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."mobile.firm.info") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 20) {
                        $task_info_z[$val->id]['status'] = '<a href="' . route($sub_site."mobile.firm.com.img") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 21) {
                        $task_info_z[$val->id]['status'] = '<a href="' . route($sub_site."mobile.resumes") . '" style="text-decoration: none;" target="_blank">去完成</a>';
                    } elseif ($val->id == 22) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."mobile.firm.com.security") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 23) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."mobile.firm.com.security") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 25) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."mobile.firm.com.binding") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 27) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."mobile.firm.info") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 28) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."mobile.firm.resume.apply") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 29) {
//                        $task_info_z[$val->id]['status'] = '<a href="" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 30) {
                        $task_info_z[$val->id]['status'] = '<a href="' . route($sub_site."mobile.firm.com.auth") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 31) {
//                        $task_info_z[$val->id]['status'] = '<a href="" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 32) {
                        $task_info_z[$val->id]['status'] = '<a href="' . route($sub_site."mobile.firm.com.psm.consult") . '" style="text-decoration: none;">去完成</a>';
                    } else {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."mobile.firm.com.binding") . '" style="text-decoration: none;">去完成</a>';
                    }
                } else {
                    if ($val->id == 17) {
                        $task_info_z[$val->id]['status'] = '<a href="" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 18) {
                        $task_info_z[$val->id]['status'] = '<a href="javascript:;" url="' . route($sub_site."com.sign") . '" data-type="sign" class="ajax_do" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 19) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."com.info") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 20) {
                        $task_info_z[$val->id]['status'] = '<a href="' . route($sub_site."com.img") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 21) {
                        $task_info_z[$val->id]['status'] = '<a href="' . route($sub_site."resumes") . '" style="text-decoration: none;" target="_blank">去完成</a>';
                    } elseif ($val->id == 22) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."com.security") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 23) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."com.security") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 25) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."com.security") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 27) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."com.info") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 28) {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."resume.apply") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 29) {
//                        $task_info_z[$val->id]['status'] = '<a href="" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 30) {
                        $task_info_z[$val->id]['status'] = '<a href="' . route($sub_site."com.auth") . '" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 31) {
//                        $task_info_z[$val->id]['status'] = '<a href="" style="text-decoration: none;">去完成</a>';
                    } elseif ($val->id == 32) {
                        $task_info_z[$val->id]['status'] = '<a href="' . route($sub_site."com.pms.consult") . '" style="text-decoration: none;">去完成</a>';
                    } else {
                        $task_info_z[$val->id]['status'] = '<a href=" ' . route($sub_site."com.security") . '" style="text-decoration: none;">去完成</a>';
                    }
                }

                $task_info_z[$val->id]['t_alias'] = $val->t_alias;
            }
        }
        $todayPoints = 0;
        $rs = $this->taskLogRepository->getTodayPoints($user->id, $user->utype);
        if ($rs) {
            $todayPoints = $rs;
        }
        $onPoints = $this->taskLogRepository->getSinglePoints($user->id, $user->utype);
        $dayPoints = $this->taskLogRepository->getDayPoints($user->id, $user->utype);
        $arrAll = $this->taskRepository->getAllPoints($user->utype);
        $allPoints = 0;
        foreach ($arrAll as $key => $val) {
            if ($val->once == 1) {
                $allPoints += $val->points;
            } else {
                $allPoints += (abs($val->times)) * ($val->points);
            }
        }
        $lastPoints = (int)$allPoints - $onPoints - $dayPoints > 0 ? (int)$allPoints - $onPoints - $dayPoints : 0;

        $mySetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);//套餐详细
        return [
            'w_finsh' => $task_info_z,
            'finsh' => $finshTask,
            'content' => $task,
            'todayPoints' => $todayPoints,
            'lastPoints' => $lastPoints,
            'content' => $this->memberPointRepository->getComPointsById($user->id, $user->utype),
            'mySetmeal' => $mySetmeal,
        ];
    }

    /**积分收支明细
     * @return array
     */
    public function pointsDetail($type, $user)
    {
        $getNum = $this->memberHandselRepository->getNum($user, 1);//累计获得
        $useNum = $this->memberHandselRepository->getNum($user, 2);//累计消耗
        $content = $this->memberHandselRepository->getMembersHandsel($user->id, $user->utype, $type);//积分操作记录
        $companyPoint = $this->memberPointRepository->getComPointsById($user->id, $user->utype);
        $points = $this->taskLogRepository->getTodayPoints($user->id, $user->utype);//今天获取积分
        $todayPoints = $points ? $points : 0;

        $onPoints = $this->taskLogRepository->getSinglePoints($user->id, $user->utype);//获取单次积分

        $dayPoints = $this->taskLogRepository->getDayPoints($user->id, $user->utype); //获取日常积分

        $arrAll = $this->taskRepository->getAllPoints($user->utype);
        $allPoints = 0;
        foreach ($arrAll as $key => $val) {
            if ($val->once == 1) {
                $allPoints += $val->points;
            } else {
                $allPoints += (abs($val->times)) * ($val->points);
            }
        }
        $lastPoints = (int)$allPoints - $onPoints - $dayPoints > 0 ? (int)$allPoints - $onPoints - $dayPoints : 0;
        $res = [
            'content' => $content,
            'points' => $todayPoints,
            'lastPoints' => $lastPoints,
            'companyPoint' => $companyPoint,
            'getNum' => $getNum[0]->getTotalPoints,
            'useNum' => $useNum[0]->getTotalPoints,
            'type'=>$type
        ];
        return $res;
    }

    /**套餐升级
     * @param $id
     * @return array
     * @throws ResponseException
     */
    public function setmealAdd($id, $user)
    {
        $setmeal = $this->setmealRepository->find($id);
        if (!$setmeal) {
            throw new ResponseException('请选择正确的套餐', '', 404);
        }
        //  购买套餐优惠
        $setmeal->long = $this->formatDays($setmeal->days);
        $setmeal->discount = $this->setmealRepository->getDiscountForSetmealOne($setmeal);
        $offline = $this->paymentRepository->findWhere(['alias'=>'offline']);
        $online = $this->paymentRepository->findWhere([['alias','<>','offline']]);
        foreach ($offline as $key => &$val) {
            if (!config("aix.system.pay.{$val->alias}.is_on")) {
                unset($offline[$key]);
            }
        }
        foreach ($online as $key => &$val) {
            if (!config("aix.system.pay.{$val->alias}.is_on")) {
                unset($online[$key]);
            }
        }
        $mypoints = $this->memberPointRepository->getPointsById($user->id, $user->utype);
        $result = [
            'user' => $user,
            'setmeal' => $setmeal,
            'offline' => $offline,
            'online' => $online,
            'mypoints' => $mypoints->points,
            'need_points' => $setmeal->expense * config('aix.companyset.points.points_set.payment_rate')
        ];
        return $result;
    }


    public function setmealAddMobile($user)
    {
        //我的套餐
        $mySetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, 1);
        //我的积分
        $myPoints = $this->memberPointRepository->getPointsById($user->id, 1);
        //套餐列表
        $setmeal = $this->setmealRepository->getSetmealList();

        foreach ($setmeal as $key => $val) {
            $setmeal[$key]->long = $val->days==0?'永久':$this->formatDays($val->days);
            $setmeal[$key]['discount'] = $this->setmealRepository->getDiscountForSetmealOne($val);
            if (config('aix.mobile.mobile_set.mobile_set.mobile_setmeal_discount_value')>0) {
                $setmeal[$key]->expense = config('aix.mobile.mobile_set.mobile_set.mobile_setmeal_discount_value_type')==1?$val->expense/100*config('aix.mobile.mobile_set.mobile_set.mobile_setmeal_discount_value'):$val->expense-config('aix.mobile.mobile_set.mobile_set.mobile_setmeal_discount_value');
            }
            $setmeal[$key]->service_points = round($setmeal[$key]->expense*config('aix.companyset.points.points_set.payment_rate'));
        }

        $result = [
            'user'=>$user,
            'mySetmeal'=>$mySetmeal,
            'myPoints'=>$myPoints,
            'setmeal'=>$setmeal,
        ];
        return $result;
    }

    /**设置套餐
     * @param $user
     * @param $setmeal_id
     * @return array
     * @params 用来传递参数,后台修改到期时间,希望设置开始时间维当日期 by 李艳
     * @throws \Prettus\Validator\Exceptions\ValidatorException
     * $params 参数使用地方 app/Admin/Controllers/Company/MembersSetmealController.php@update()
     */
    public function setMembersSetmeal($user, $setmeal_id,$params=null)
    {
        $setmeal = $this->setmealRepository->getOneSetmeal($setmeal_id);

        if (!$setmeal) {
            return ['status'=>0,'msg'=>'请选择正确的套餐'];
        }
        $mysetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);

        /**
         * 9月11日发现BUG
         * 当上个套餐,是免费会员的时候,并且结束时间是0,在此处转成时间戳的时候就会发生令人窒息的1970年
         */
        $before_end_time=$mysetmeal->endtime; //我现在的套餐的到期时间
        if ($before_end_time==0){
            $before_end_time=time();
        }else{ //有老的异常数据,1970年的
            if ($before_end_time<MembersSetmeal::ERROR_TIME){
                $before_end_time=time();//直接开始时间就是现在吧
            }
        }
        $sqlData['starttime']=$before_end_time;


        $sqlData['expire'] = 0;//如果$setmeal->is_free==1,说明是到期自动变为免费会员,标记过期 --- 其他会员降级 到期字段不变
        $sqlData['setmeal_id'] = $setmeal->id;
        $sqlData['setmeal_name'] = $setmeal->setmeal_name;
        $sqlData['days'] = $setmeal->days;


        if (!empty($params) && isset($params['starttime'])){ //传过来的是设置指定的开始时间
            $sqlData['starttime']=$params['starttime'];
        }
        if ($setmeal->days > 0) {
            //如果套餐未到期,判断是否叠加套餐服务时间
            //配置文件开启套餐时间叠被动模式
            if (config('aix.companyset.setmeal_com.setmeal_com_set.is_superposition_time') == 1) {

                $sqlData['endtime'] = strtotime("+{$setmeal->days} day",$sqlData['starttime']);
            } else {
                $sqlData['endtime'] = strtotime("".$setmeal->days." days");
            }
        } else {
            $sqlData['endtime'] = 0;
        }

        $sqlData['expense']=$setmeal['expense'];

        $sqlData['jobs_meanwhile'] = $setmeal->jobs_meanwhile;
        $sqlData['refresh_jobs_free'] = $setmeal->refresh_jobs_free;
        $sqlData['jobfair_num'] = $setmeal->jobfair_num;//招聘会场次
        $sqlData['download_resume'] = $setmeal->download_resume;
        //掠过免费会员
        if ($setmeal_id!=MembersSetmeal::FREE_SetMember){
            if (config('aix.companyset.setmeal_com.setmeal_com_set.is_superposition') == 1) { //如果开通服务时叠加项目,就减掉已发布的职位数
                $map['company_id'] = $user->id;
                $sqlData['download_resume']=$mysetmeal->download_resume+$setmeal->download_resume;
                $sqlData['jobfair_num'] = $mysetmeal->jobfair_num+$setmeal->jobfair_num;//招聘会场次
                $sqlData['jobs_meanwhile'] = $mysetmeal->jobs_meanwhile+$setmeal->jobs_meanwhile;
            }
        }

        $sqlData['download_resume_max'] = $setmeal->download_resume_max;
        $sqlData['added'] = $setmeal->added;
        $sqlData['setmeal_img'] = $setmeal->setmeal_img;
        $sqlData['show_apply_contact'] = $setmeal->show_apply_contact;
        $sqlData['is_free'] = $setmeal->is_free;
        $sqlData['discount_download_resume'] = $setmeal->discount_download_resume;
        $sqlData['discount_sms'] = $setmeal->discount_sms;
        $sqlData['discount_stick'] = $setmeal->discount_stick;
        $sqlData['discount_emergency'] = $setmeal->discount_emergency;
        $sqlData['discount_tpl'] = $setmeal->discount_tpl;
        $sqlData['discount_auto_refresh_jobs'] = $setmeal->discount_auto_refresh_jobs;
        $sqlData['discount_auto_refresh_jobs'] = $setmeal->discount_auto_refresh_jobs;
        $sqlData['discount_auto_refresh_jobs'] = $setmeal->discount_auto_refresh_jobs;
        $sqlData['discount_auto_refresh_jobs'] = $setmeal->discount_auto_refresh_jobs;

        $setmeal_jobs['setmeal_deadline']=$sqlData['endtime'];
        $setmeal_jobs['deadline']=$setmeal_jobs['setmeal_deadline'];
        $setmeal_jobs['setmeal_id']=$sqlData['setmeal_id'];
        $setmeal_jobs['setmeal_name']=$sqlData['setmeal_name'];
        DB::beginTransaction();//检查数据库事务(有错)
        try{
            //检查套餐的开始时间和结束时间是否正常
            if($sqlData["starttime"]<MembersSetmeal::ERROR_TIME ||
              ($sqlData["endtime"]<MembersSetmeal::ERROR_TIME && $sqlData["endtime"]!=0))
            {

                throw new \Exception('系统出现异常!,请联系管理员!');
            }



            if (!$this->memberSetmealRepository->updateSetmeal($sqlData, $mysetmeal->id)) {
                throw new \Exception('更新会员套餐失败!');
            }
            //删除 是否过期 以及套餐图标
            unset($sqlData['expire']);
            unset($sqlData['setmeal_img']);
            unset($sqlData['setmeal_deadline']);

            $sqlData['uid'] = $user->id;
            $sqlData['utype'] = $user->utype;
            //往套餐记录里头添加

            if($this->memberSetmealRecordRepository->create($sqlData)===false){
                throw new \Exception('添加记录失败!');
            }


            //如果套餐有赠送积分,则直接更新用户积分表
            if ($setmeal->set_points) {
                $this->memberPointRepository->reportDeal($user->id, $user->utype, 1, $setmeal->set_points);
                $handsel['uid'] = $user->id;
                $handsel['htype'] = 'setmeal_gifts';
                $handsel['htype_cn'] = '套餐内赠送';
                $handsel['operate'] = 1;
                $handsel['points'] = $setmeal->set_points;
                $this->memberHandselRepository->addNew($handsel);
            }
            //如果套餐有赠送短信,则直接更新用户表的短信条数字段
            //如果开启了服务叠被动模式
            if ($setmeal_id!=1 && config('aix.companyset.setmeal_com.setmeal_com_set.is_superposition') == 1){
                $this->companyRepository->updataSmsNum($user->id, 1, $setmeal->set_sms);
            }else{
                $this->companyRepository->SetSmsNum($user->id,$setmeal->set_sms);
            }

            $this->companyRepository->update(['setmeal_id'=>$setmeal->id, 'setmeal_name'=>$setmeal->setmeal_name], $user->id);
            event_search_update(Company::class, (string)$user->id, 'update');
            $this->jobsRepository->updateMap($user->id, $setmeal_jobs);
            $condition = [['where', 'company_id', $user->id]];
            event_search_update(Jobs::class, $condition, 'update');
            //检查在招职位数是否超出限额,并根据后台配置做关闭处理
            $this->checkJobsMeanwhile($user->id, $setmeal->jobs_meanwhile);

            DB::commit();
            return ['status'=>1];
        }catch (\Exception $exception){
            DB::rollBack();
            return ['status'=>0,'msg'=>$exception->getMessage()];
        }
    }


    /**设置免费会员套餐到期
     * @param $user
     * @param $setmeal_id
     * @return array
     * @throws \Prettus\Validator\Exceptions\ValidatorException
     */
    public function setFreeMembersSetmeal($user)
    {

        $mysetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);

        if (!$this->memberSetmealRepository->updateSetmeal(['expire'=>1], $mysetmeal->id)) {
            return ['status'=>0,'msg'=>'更新会员套餐失败!'];
        }else{
            return ['status'=>1];

        }

    }

    /**处理职位
     * @param $uid
     * @param $num
     */
    public function checkJobsMeanwhile($uid, $num)
    {
        if (config('aix.companyset.setmeal_com.setmeal_com_set.hold_beyond_jobs') == 0) {
            $yid = [];
            $com_ids = [];
            $jobs = $this->jobsRepository->jobsSelect($uid);
            if (count($jobs) >$num) {
                foreach ($jobs as $key => $val) {
                    if ($key >= $num) {
                        $yid[] = $val->id;
                        $com_ids[] = $val->company_id;
                    }
                }
            }
            if (!empty($yid)) {
                $this->jobsRepository->closeJobs($yid);
                $condition = [['whereIn','id', $yid]];
                event_search_update(Jobs::class, $condition, 'update');
                event_search_update(Company::class, [['whereIn','id', $com_ids]], 'update');
            }
        }
    }

    /**更新订单号
     * @param $order_insert_id
     * @param $oid
     * @return mixed
     * @throws \Prettus\Validator\Exceptions\ValidatorException
     */
    public function updateOid($order_insert_id, $oid)
    {
        $data['oid'] = $oid;
        return $this->orderRepository->update($data, $order_insert_id);
    }

    /**支付成功页面
     * @param $oid
     * @return array
     * @throws ResponseException
     */
    public function setmealFinish($oid)
    {
        if (!$oid) {
            throw new ResponseException('订单ID有误', '', 404);
        }
        $user = auth('web-company')->user();
        $order = $this->orderRepository->getOneOder($oid);

        if (!$order) {
            throw new ResponseException('参数错误', '', 404);
        }

        $mysetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);
        if (!$mysetmeal) {
            throw new ResponseException('您的套餐信息有误', '', 404);
        }


        switch ($order->order_type){
            case 1: //套餐升级
                $setmealIncr=$this->setmealRepository->find($order->setmeal);

                $setmealIncrDay=$setmealIncr->days;

                //理因到期时间
                $expireTimeBase=date("Y-m-d h:i:s",strtotime("+{$setmealIncrDay} day",$order->payment_time));

                $res['expireTime']=$expireTimeBase;

                break;

            case 16:case 7:case 14:case 2:case 10:case 5://充值积分 随着会员到期而到期
            $setmealIncrDay="无期限";

            break;

            case 15:

            $setmealIncrDay="无期限";
            break;

            case 8:
            case 9:
            case 12:
            case 13:
                $setmealIncr=$this->setmealIncrementsRepository->find($order->setmeal);
                $setmealIncrDay=$setmealIncr->value;


                //理因到期时间
                $expireTimeBase=date("Y-m-d H:i:s",strtotime("+{$setmealIncrDay} day",$order->payment_time));
                $expireTime=strtotime($expireTimeBase);
                //我会员的结束时间小于套餐的到期时间
                if (strtotime($expireTimeBase)>strtotime($mysetmeal->endtime)) {
                    $expireTime=strtotime($mysetmeal->endtime);
                }

                if($mysetmeal->endtime==0){//免费的
                    $expireTime=strtotime($expireTimeBase);
                }

                $res['expireTime']=date("Y-m-d H:i:s",$expireTime);

                break;
            default:
                $setmealIncrDay="--";
                break;
        }

        $endtime = strtotime($mysetmeal->endtime) == 0?"永久":date('Y-m-d', strtotime($mysetmeal->endtime));
        $res = [
            'mysetmeal'=>$mysetmeal,
            'order'=>$order,
            'endtime'=>$endtime,
            'open_time'=>date("Y-m-d H:i:s",$order->payment_time),
            'setmealIncrDay'=>$setmealIncrDay
        ];
        return $res;
    }



    /**各项增值服务
     * @return array
     */
    public function increment($user)
    {
        $cat = $this->setmealIncrementsRepository->getIncrementCategory();
        $result = [];
        $category = [];
        foreach ($cat as $key => $val) {
            $category[$val->cat] = $val->cat;
            if ($val->cat=='jobs' || $val->cat=='jobfair_num') {
                $result[$val->cat] = 0;
            } else {
                $result[$val->cat] =$this->setmealRepository->getMaxDiscount($val->cat);
            }
        }
        $member_setmeal = 0;
        $memberSetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);
        if($memberSetmeal){
            $member_setmeal = $memberSetmeal->discount_tpl;
        }
//        $result['download_resume'] =$this->setmealRepository->getMaxDiscount('download_resume');
//        $result['sms'] =$this->setmealRepository->getMaxDiscount('sms');
//        $result['jobs_num'] =$this->setmealRepository->getMaxDiscount('jobs_num');
//        $result['jobfair_num'] =$this->setmealRepository->getMaxDiscount('jobfair_num');
//        $result['stick'] =$this->setmealRepository->getMaxDiscount('stick');
//        $result['emergency'] =$this->setmealRepository->getMaxDiscount('emergency');
//        $result['tpl'] =$this->setmealRepository->getMaxDiscount('tpl');
//        $result['auto_refresh_jobs'] =$this->setmealRepository->getMaxDiscount('auto_refresh_jobs');
//        return $result;
        return $res=['result'=>$result,'category'=>$category,'member_setmeal'=>$member_setmeal];
    }

    /**增值服务提示框
     * @return array
     */
    public function confirmPayIncrement($user)
    {
        $user = auth('web-company')->user();
        $mysetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);
        $setmeal_end_days = '永久';
        if (strtotime($mysetmeal->endtime) == 0) {
            $tip = '您当前【'.$mysetmeal->setmeal_name.'】有效期 '.date('Y-m-d', $mysetmeal->starttime).'至永久。增值包有效期与会员有效期一致('.$setmeal_end_days.'),是否继续购买增值包?';
        } else {
            if (strtotime($mysetmeal->endtime) > time()) {
                $sub_day = sub_day(strtotime($mysetmeal->endtime), time());
                $sub_day = preg_replace('/(\d+)/', '<span class="font_yellow">\1</span>', $sub_day);
                $setmeal_end_days = $sub_day.'后到期';
            } else {
                $setmeal_end_days = '已经到期';
            }
            $tip = "您当前【".$mysetmeal->setmeal_name."】有效期".date('Y-m-d', $mysetmeal->starttime)."至".date('Y-m-d', strtotime($mysetmeal->endtime))."。增值包有效期与会员有效期一致(".$setmeal_end_days."),是否继续购买增值包?";
        }
        return ['tip'=>$tip];
    }

    /**单个增值服务包内容
     * @param $cat
     * @param $request
     * @return array
     */
    public function incrementAdd($cat, $request)
    {
        $catData = $this->setmealIncrementsRepository->cate_arr;
        $service_unit = $this->setmealIncrementsRepository->service_unit;
        $user = auth('web-company')->user();
        $mysetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);
        $mypoints = $this->memberPointRepository->getComPointsById($user->id, $user->utype);
        $increment_rule = [
            'jobs'=>config('aix.companyset.business_set.points_set.jobs_num'),
            'jobfair_num'=>config('aix.companyset.business_set.points_set.jobfair_num'),
            'download_resume'=>config('aix.companyset.business_set.points_set.download_resume'),
            'sms'=>config('aix.companyset.business_set.points_set.sms'),
            'stick'=>config('aix.companyset.business_set.points_set.stick'),
            'emergency'=>config('aix.companyset.business_set.points_set.emergency'),
            'tpl'=>config('aix.companyset.business_set.points_set.tpl'),
            'auto_refresh_jobs'=>config('aix.companyset.business_set.points_set.auto_refresh_jobs')
        ];
        $offline = $this->paymentRepository->findWhere(['alias'=>'offline']);
        $online = $this->paymentRepository->findWhere([['alias','<>','offline']]);
        foreach ($offline as $key => &$val) {
            if (!config("aix.system.pay.{$val->alias}.is_on")) {
                unset($offline[$key]);
            }
        }
        foreach ($online as $key => &$val) {
            if (!config("aix.system.pay.{$val->alias}.is_on")) {
                unset($online[$key]);
            }
        }
        if ($cat == 'tpl') {
            $request_tpl = isset($request['tpl_id']) ? $request['tpl_id'] : 0;
            $cate_arr = $this->incrementAddTpl($mysetmeal, $request_tpl);
        } else {
            $cate_arr = $this->incrementAddNormal($cat, $mysetmeal);
        }
        $result = [
            'user'=>$user,
            'mysetmeal'=>$mysetmeal,
            'cate_arr'=>$cate_arr,
            'catData'=>$catData,
            'service_unit'=>$service_unit,
            'cat'=>$cat,
            'increment_rule'=>$increment_rule,
            'online'=>$online,
            'offline'=>$offline,
            'mypoints'=>$mypoints,
        ];
        return $result;
    }

    /**
     * 购买增值包 - 普通增值服务
     */
    protected function incrementAddNormal($cat, $mysetmeal)
    {
        $cate_arr = $this->setmealIncrementsRepository->findByField(['cat'=>$cat]);
        foreach ($cate_arr as $key => $val) {
            //如果是非免费套餐
            if ($mysetmeal->is_free == 0) {
                $discount = $this->setmealRepository->getIncrementDiscountByArray($cat, $mysetmeal);
                //当前基础套餐套餐需要付的价格,如果折扣为0,则价格与原始价格一致
                $cate_arr[$key]->my_price = $discount>0?round($val->price*$discount/10, 2):$val->price;
                //当前基础套餐的对应的折扣
                $cate_arr[$key]->my_discount = $discount;
                //单条价格
                $cate_arr[$key]->my_unit_price = round($cate_arr[$key]->my_price/$val->value, 2);
                //节省的数
                $cate_arr[$key]->my_saved_price = $val->price-$cate_arr[$key]->my_price;
            } else {
                $free_discount = $this->setmealRepository->getIncrementDiscountByArray($cat, $mysetmeal);
                //免费会员需要付的价格
                $cate_arr[$key]->my_price = $free_discount>0?round($val->price*$free_discount/10, 2):$val->price;
                //免费会员单条价格
                $cate_arr[$key]->my_unit_price = round($cate_arr[$key]->my_price/$val->value, 2);
                //VIP会员价格,取出折扣最大的套餐折扣
                $vip_discount = $this->setmealRepository->getMaxDiscount($cat);
                $cate_arr[$key]->vip_price = intval($vip_discount)>0?round($val->price*$vip_discount/10, 2):$val->price;
                //VIP会员单条价格
                $cate_arr[$key]->vip_unit_price = round($cate_arr[$key]->vip_price/$val->value, 2);
            }
            //换算积分
            $cate_arr[$key]->need_points = round($cate_arr[$key]->my_price*config('aix.companyset.points.points_set.payment_rate')); // 原为round()
        }
        $jobs_list = [];
        if ($cat=='stick' || $cat=='emergency' || $cat=='auto_refresh_jobs') {
            $jobs_where['company_id'] = auth('web-company')->user()->id;
            config('aix.companyset.comset.show_set.jobs_display') == 1 ? $jobs_where['audit'] = 1 : $jobs_where[] = ['audit','<>',3];
            $jobs_where['valid'] = 1;
            $jobs_list = $this->jobsRepository->findWhere($jobs_where);
            if ($cat == 'auto_refresh_jobs') {
                foreach ($jobs_list as $key => $val) {
                    $condition['pid'] = $val->id;
                    $condition['type'] = 1;
                    $condition['utype'] = auth('web-company')->user()->utype;
                    $has_auto = $this->queueAutoRefreshRepository->findData($condition);
                    $jobs_list[$key]->auto_refresh = $has_auto?1:0;
                }
            }
        }
        $buy_cn = '';
        switch ($cat) {
            case 'stick':
                $buy_cn = '置顶';
                break;
            case 'emergency':
                $buy_cn = '紧急';
                break;
            case 'jobs':
                $buy_cn = '职位增值包';
                break;
            case 'jobfair_num':
                $buy_cn = '招聘会场次';
                break;
        }
        return [
            'cate_arr'=>$cate_arr,
            'jobs_list'=>$jobs_list,
            'buy_cn'=>$buy_cn,
        ];
    }

    /**购买增值包 - 模版服务
     * @param int $request_tpl
     * @return bool
     */
    public function incrementAddTpl($mysetmeal, $request_tpl = 0)
    {
        if ($request_tpl >0) {
            $condition['id'] = $request_tpl;
        } else {
            $condition['tpl_type'] = 1;
        }
        $cate_arr =$this->tplRepository->findTpl($condition);
        foreach ($cate_arr as $key => $val) {
            $discount = $this->setmealRepository->getIncrementDiscountByArray('tpl', $mysetmeal);
            //当前基础套餐套餐需要付的价格,如果折扣为0,则价格与原始价格一致
            $cate_arr[$key]->my_price = $discount>0?round($val->price/config('aix.companyset.points.points_set.payment_rate')*$discount/10, 2):($val->price/config('aix.companyset.points.points_set.payment_rate'));
            //当前基础套餐的对应的折扣
            $cate_arr[$key]->my_discount = $discount;
            //换算积分
            $cate_arr[$key]->need_points = $discount>0?round($val->price*$discount/10):$val->price; //原为round()
            $cate_arr[$key]->id = $val->id;
//            $cate_arr[$key]->thumb_dir = $val->dir;//模版位置
        }
        return ['cate_arr'=>$cate_arr];
    }


    public function pointsAdd()
    {
        $payment = $this->paymentRepository->get();
        foreach ($payment as $key => $val) {
            if (!config("aix.system.pay.{$val->alias}.is_on")) {
                unset($payment[$key]);
            }
        }
        $result = [
            'payment'=>$payment,
            'payment_rate'=>config('aix.companyset.points.points_set.payment_rate'),
        ];
        return $result;
    }
    /**计算天数
     * @param $days
     * @return string
     */
    protected function formatDays($days)
    {
        if ($days < 30) {
            return $days . '天';
        } else {
            return intval($days / 30) . '个月';
        }
    }
    //添加会员操作日志
    public function writeMembersLog($user, $type, $log_value)
    {
        return $this->memberLogRepository->createLog($user, $type, $log_value);
    }
    //添加积分操作日志
    public function writeMemberHandselLog($data)
    {
        return $this->memberHandselRepository->create($data);
    }
    //清除积分
    public function clearPoint($uid){

        if (config("aix.companyset.points.points_set.clear_points")==1){
            $point=$this->memberPointRepository->getPointsOne($uid,1);
            if (empty($point->points)){ //如果积分就是空,就不清空了
                return null;
            }
            $this->memberPointRepository->updateNew($uid,1,['points'=>0]);

            try{
                //添加消除记录
                $this->memberHandselRepository->addNew(['uid'=>$uid,'utype'=>1,
                    "htype"=>"points_clear",
                    "htype_cn"=>"套餐到期,清空积分",
                    "operate"=>"2","points"=>$point->points]);
            }catch (\Exception $exception){

            }

        }

    }

    //检查套餐到期的问题
    public function checkMemberSetmeal(){
        $condition = [
            ['endtime','>', time()],//到期时间大于当前时间
            ['utype','=',1],
            ['expire','=',1]
        ];
        $or=[
            ['endtime',0],
            ['utype','=',1],
            ['expire','=',1]
        ];
        $list = $this->memberSetmealRepository->checkSetmeals($condition,$or);

        if (!empty($list)){
            foreach ($list as $item) {
                $log=[
                    'item'=>$item,
                    'action'=>"修改了套餐是否到期"
                ];
                $this->memberLogRepository->addDebugLog($log);
                $this->memberSetmealRepository->updateSetmeal(['expire'=>0],$item->id);

            }
        }
        return $list;
    }
}