<?php
namespace App\Services\Common;

use Aix\Pay\Data\PayOrder;
use Aix\Sms\Contracts\Smser;
use App\Exceptions\ResponseException;
use App\Models\Category;
use App\Models\Company;
use App\Models\CompanyTpl;
use App\Models\Jobs;
use App\Models\Member;
use App\Models\MembersHandsel;
use App\Models\MembersPoint;
use App\Models\Order;
use App\Models\PersonalServiceStick;
use App\Models\PersonalServiceStickLog;
use App\Models\PersonalServiceTag;
use App\Models\PersonalServiceTagLog;
use App\Models\PersonTpl;
use App\Models\Resume;
use App\Models\Tpl;
use App\Repositories\CompanyRepository;
use App\Repositories\InvoiceCategoryRepository;
use App\Repositories\JobsRepository;
use App\Repositories\MemberLogRepository;
use App\Repositories\MemberPointRepository;
use App\Repositories\MembersChargeLogRepository;
use App\Repositories\InvoiceRepository;
use App\Repositories\MembersSetmealLogRepository;
use App\Repositories\OrderRepository;
use App\Repositories\PaymentRepository;
use App\Repositories\PromotionRepository;
use App\Repositories\QueueAutoRefreshRepository;
use App\Repositories\SetmealRepository;
use App\Services\Company\JobsService;
use App\Services\Company\ServiceService;
use App\Repositories\MemberHandselRepository;
use App\Repositories\SetmealIncrementsRepository;
use App\Repositories\MemberSetmealRepository;
use App\Repositories\MemberRepository;
use App\Repositories\ResumeRepository;
use App\Repositories\CompanyDownResumeRepository;
use Illuminate\Support\Facades\Log;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use App\Http\Controllers\Web\WebBaseController;
/**
 * 订单服务。
 * Class OrderService
 * @package App\Services\Common
 */
class OrderService extends WebBaseController
{
    protected $orderRepository;
    protected $setmealRepository;
    protected $companyRepository;
    protected $memberPointRepository;
    protected $serviceService;
    protected $memberLogRepository;
    protected $membersChargeLogRepository;
    protected $memberHandselRepository;
    protected $setmealIncrementsRepository;
    protected $memberSetmealRepository;
    protected $memberRepository;
    protected $resumeRepository;
    protected $companyDownResumeRepository;
    protected $invoiceRepository;
    protected $paymentRepository;
    protected $invoiceCategoryRepository;
    protected $payService;
    protected $queueAutoRefreshRepository;
    protected $promotionRepository;
    protected $jobsRepository;
    protected $smsService;
    protected $membersSetmealLogRepository;

    protected $order_type =[
        "1"=>"套餐升级",
        "2"=>"充值积分",
        "3"=>"简历置顶",
        "4"=>"醒目标签",
        "5"=>"简历模板",
        "6"=>"简历包",
        "7"=>"短信包",
        "8"=>"职位置顶",
        "9"=>"职位紧急",
        "10"=>"企业模板",
        "12"=>"预约刷新职位",
        "13"=>"职位刷新",
        "14"=>"简历下载",
        "15"=>"简历包",
        "16"=>"招聘会包",
        ];

    /**
     * OrderService constructor.
     * @param $orderRepository
     * @param $setmealRepository
     * @param $companyRepository
     * @param $memberPointRepository
     * @param $serviceService
     * @param $memberLogRepository
     * @param $membersChargeLogRepository
     * @param $memberHandselRepository
     * @param $setmealIncrementsRepository
     * @param $memberSetmealRepository
     * @param $memberRepository
     * @param $resumeRepository
     * @param $companyDownResumeRepository
     * @param $invoiceRepository
     * @param $paymentRepository
     * @param $invoiceCategoryRepository
     * @param $payService
     * @param $queueAutoRefreshRepository
     * @param $promotionRepository
     * @param $jobsRepository
     * @param $smsService
     * @param $membersSetmealLogRepository
     */
    public function __construct(MembersSetmealLogRepository $membersSetmealLogRepository,OrderRepository $orderRepository, SmsService $smsService, JobsRepository $jobsRepository, PromotionRepository $promotionRepository, QueueAutoRefreshRepository $queueAutoRefreshRepository, PayService $payService, InvoiceCategoryRepository $invoiceCategoryRepository, PaymentRepository $paymentRepository, InvoiceRepository $invoiceRepository, MembersChargeLogRepository $membersChargeLogRepository, MemberLogRepository $memberLogRepository, ServiceService $serviceService, MemberPointRepository $memberPointRepository, SetmealRepository $setmealRepository, CompanyRepository $companyRepository, MemberHandselRepository $memberHandselRepository, SetmealIncrementsRepository $setmealIncrementsRepository, MemberSetmealRepository $memberSetmealRepository, MemberRepository $memberRepository, ResumeRepository $resumeRepository, CompanyDownResumeRepository $companyDownResumeRepository)
    {
        $this->orderRepository = $orderRepository;
        $this->setmealRepository = $setmealRepository;
        $this->companyRepository = $companyRepository;
        $this->memberPointRepository = $memberPointRepository;
        $this->serviceService = $serviceService;
        $this->memberLogRepository = $memberLogRepository;
        $this->membersChargeLogRepository = $membersChargeLogRepository;
        $this->memberHandselRepository = $memberHandselRepository;
        $this->setmealIncrementsRepository = $setmealIncrementsRepository;
        $this->memberSetmealRepository = $memberSetmealRepository;
        $this->memberRepository = $memberRepository;
        $this->resumeRepository = $resumeRepository;
        $this->companyDownResumeRepository = $companyDownResumeRepository;
        $this->invoiceRepository = $invoiceRepository;
        $this->paymentRepository = $paymentRepository;
        $this->invoiceCategoryRepository = $invoiceCategoryRepository;
        $this->payService = $payService;
        $this->queueAutoRefreshRepository = $queueAutoRefreshRepository;
        $this->promotionRepository = $promotionRepository;
        $this->jobsRepository = $jobsRepository;
        $this->smsService = $smsService;
        $this->membersSetmealLogRepository=$membersSetmealLogRepository;
    }

    /**订单列表
     * @param $request
     * @return array
     */
    public function orderList($request, $user)
    {
        $order_type_choose = ['setmeal'=>'套餐订单','increment'=>'增值服务订单','points'=>'积分订单'];
        $pay_status_choose = [1=>'未支付',2=>'已完成',3=>'已取消'];
        $type = isset($request['type'])?$request['type']:"";
        $is_pay = isset($request['is_pay'])?$request['is_pay']:0;

        $where = [];
        $map = [];
        switch ($type) {
            case 'setmeal':
                $where = ['1'];
                break;
            case 'increment':
                $where= ['3','4','6','7','8','9','10','12','15','16'];
                break;
            case "points":
                $where = ['2'];
                break;
            default:
                $where = ['1','2','3','4','6','7','8','9','10','12','13','14','15','16'];
        }


        if ($is_pay) {
            $map['is_pay'] = $is_pay;
        }
        $map['uid'] = $user->id;
        $map['utype'] = 1;

        $orderList = $this->orderRepository->orderList($map, $where);
        foreach ($orderList as $key => $value) {
            $orderList[$key]->invoice = $this->invoiceRepository->getOne($value->id, $user);
        }
        $param_array = ['type','is_pay'];
        $params= array();
        if ($request) {
            foreach ($request as $k => $v) {
                if (in_array($k, $param_array)) {
                    $params[$k] = $v;
                }
            }
        }
        $result = [
            'orderList'=>$orderList,
            'params'=>$params,
            'type'=>$type,
            'is_pay'=>$is_pay,
            'order_type_choose'=>$order_type_choose,
            'pay_status_choose'=>$pay_status_choose,
            'order_type'=>$this->order_type,
        ];
        return $result;
    }


    public function orderDetail($id, $user)
    {
        $order_type = [1=>'套餐升级',2=>'充值积分',3=>'简历置顶',4=>'醒目标签',5=>'简历模板',6=>'简历包',7=>'短信包',8=>'职位置顶',9=>'职位紧急',10=>'企业模板',11=>'诚聘通',12=>'预约刷新职位',13=>'职位刷新',14=>'简历下载',15=>'简历包',14=>'招聘会包'];
        if (!$order = $this->orderRepository->getOrder(['id'=>$id,'uid'=>$user->id])) {
            throw new ResponseException('无此订单!');
        }
        if(is_array(unserialize($order->params))){
            $order->params_arr =unserialize($order->params);
        }else{
            $order->params_arr =json_decode(unserialize($order->params),true);
        }
        $order->discount_money =floatval(intval($order->pay_points)/config('aix.companyset.points.points_set.payment_rate'));
        $old_price = $this->getOldPrice($order);
        $order->old_price = $old_price?$old_price:$order->amount;
        $res['user'] = $user;
        $res['order'] = $order;
        $res['open_invoice'] = config('aix.companyset.comset.com_set.open_invoice');
        $res['invoice'] = $this->invoiceRepository->getOneInvoice($id, $user);
        $res['order_type_cn'] = $order_type[$res['order']->order_type];
        $res['mysetmeal'] = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);
        $res['payment_info'] = $this->paymentRepository->findByField(['alias'=>$res['order']->payment]);
        $res['myPoints'] = $this->memberPointRepository->getComPointsById($user->id, 1);
        $res['payment_rate'] = config('aix.companyset.points.points_set.payment_rate');
        $res['points_enough'] = 1;
        if ($res['myPoints']->points < $order->pay_points) {
            $res['points_enough'] = 0;
        }
        if ($res['order']->is_pay == 2 || $res['order']->is_pay == 3) {
            $category = $this->invoiceCategoryRepository->get()->toArray();
            $category_arr = [];
            foreach ($category as $key => $val) {
                $category_arr[$val['id']] = $val;
            }
            $res['category'] = $category_arr;
        }
        $res["orderExplain"]=config("aix.system.pay.offline.service_tel");

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

        //获取买的套餐信息

        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 2:case 10:case 5://充值积分
                $res['expireTime']="无期限";
                break;

            case 7:case 14:case 15:case 16:

                $res['expireTime']="无期限";
                break;

            case 8:
            case 9:
            case 12:
            case 13:
                try{ //因为有那个单个的职位刷新 没有增值服务
                    $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=$mysetmeal->endtime;
                    }

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

                    $res['expireTime']=date("Y-m-d H:i:s",$expireTime);
                }catch (\Exception $exception){
                    $res['expireTime']="--";
                }





            break;
            default:
                $res['expireTime']="--";
                break;
        }
        if($order->is_pay==3){
            $res['expireTime']="--";
            $res['payment_time']="--";
        }


        return $res;
    }


    /**
     * 订单详情页获取原价
     */
    protected function getOldPrice($order)
    {
        $arr = [6,7,8,9,12];
        if (in_array($order->order_type, $arr)) {
            $increment = $this->setmealIncrementsRepository->find($order->setmeal);
            return $increment->price;
        } else {
            return false;
        }
    }

    public function orderPayRepeat($id)
    {
        $user = auth('web-company')->user();
        $orderInfo = $this->orderRepository->find($id);
        $myPoints = $this->memberPointRepository->getComPointsById($user->id, 1);
        if ($orderInfo->pay_points > 0 && $myPoints->points < $orderInfo->pay_points) {
            $back_url = \Illuminate\Support\Facades\URL::previous();
            return $this->showMessage('积分不足,无法完成支付,请重新下单!', $back_url, true, '上一页', '3');
//            throw new ResponseException('积分不足,无法完成支付,请重新下单!');
        }
        if ($orderInfo->payment == 'wechat') {
            $type = 'scan';
        } else {
            $type = 'web';
        }
        $payOrder = new PayOrder();
        $payOrder->trade_no = $orderInfo->oid;
        $payOrder->subject = '购买' . $orderInfo->service_name;
        $payOrder->detail = $orderInfo->description;
        $payOrder->price = $orderInfo->pay_amount;
        $payOrder->callback = "App\Services\Common\OrderService.orderPaySave";
        $result = $this->payService->pay($orderInfo->payment, $type, $payOrder);
        if ($orderInfo->payment == 'wechat') {
            return response()->json([
                'status' => 1,
                'tradeCode' => get_qrcode_html($result->code_url),
                'tradeNo' => $orderInfo->oid,
            ]);
        } else {
            return $result;
        }
    }

    public function mobileOrderPayRepeat($id)
    {
        $user = auth('web-company')->user();
        $orderInfo = $this->orderRepository->find($id);
        $myPoints = $this->memberPointRepository->getComPointsById($user->id, 1);
        if ($orderInfo->pay_points > 0 && $myPoints->points < $orderInfo->pay_points) {
            $back_url = \Illuminate\Support\Facades\URL::previous();
            return $this->showMessage('积分不足,无法完成支付,请重新下单!', $back_url, true, '上一页', '3');
        }
        if ($orderInfo->payment == 'wechat') {
            $type = 'wap';
        } else {
            $type = 'wap';
        }
        $payOrder = new PayOrder();
        $payOrder->trade_no = $orderInfo->oid;
        $payOrder->subject = '购买' . $orderInfo->service_name;
        $payOrder->detail = $orderInfo->description;
        $payOrder->price = $orderInfo->amount;
        $payOrder->callback = "App\Services\Common\OrderService.orderPaySave";
        if ($orderInfo->payment == 'wechat') {
            if (!is_weixin()) {
                $type = 'wap';
            } else {
                //预留
            }
            $payOrder->return_url=route('mobile.common.orderWechat', ['oid'=>$payOrder->trade_no]);
        } else {
            $type = 'wap';
            $payOrder->return_url=route('mobile.firm.service.order.index');
        }
        $result = $this->payService->pay($orderInfo->payment, $type, $payOrder);
        return $result;
    }

    public function orderPaySave(PayOrder $payOrder)
    {
        $trade_no = $payOrder->trade_no;
        $this->orderRepository->updateStatus($trade_no, ['is_pay'=>2, 'payment_time'=>time()]);
    }
    /**订单删除
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     * @throws \ErrorException
     * @throws \Prettus\Validator\Exceptions\ValidatorException
     */
    public function orderDel($id,$user)
    {

        $info = $this->orderRepository->findWhere(['id'=>$id,'uid'=>$user->id])->first();

        if (empty($info)){
            return response()->json(['status'=>0,'msg'=>'没有这个订单']);
        }

        if ($info->is_pay == 2) {
            return response()->json(['status'=>0,'msg'=>'已完成的订单不允许删除!']);
        }
        if (!$this->orderRepository->delete($id)) {
            return response()->json(['status'=>0,'msg'=>'删除订单失败!']);
        }
        $this->memberLogRepository->createLog($user, 9005, [$info->oid]);
        return response()->json(['status'=>1,'msg'=>'删除订单成功!']);
    }

    public function invoiceSave($data, $user)
    {
        $has = $this->invoiceRepository->getOne($data['order_id'], $user);
        if ($has) {
            return response()->json(['status'=>0,'msg'=>"您已经索取过发票了!"]);
        }
        if ($data['title'] == 2) {
            unset($data['organization']);
        }
        $order = $this->orderRepository->find($data['order_id']);
        $data['order_num'] = $data['order_id'];
        $data['oid'] = $order->oid;
        $data['uid'] = $user->id;
        $order_id = $data['order_id'];
        unset($data['order_id']);
        if (!$this->invoiceRepository->create($data)) {
            return response()->json(['status'=>0,'msg'=>"操作失败!"]);
        }
        $this->memberLogRepository->createLog($user, 9003, [$order_id]);
        return array('status'=>1,'msg'=>'索取发票成功!','data'=>$this->invoiceRepository->getOne($data['order_num'], $user));
    }

    /**订单取消
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     * @throws \ErrorException
     * @throws \Prettus\Validator\Exceptions\ValidatorException
     */
    public function orderCancel($id, $user)
    {

        $info = $this->orderRepository->findWhere(['uid'=>$user->id],$id)->first();
        if (!$info) {
            return response()->json(['status'=>0,'msg'=>'没有找到对应的订单!']);
        } elseif ($info->is_pay !=1) {
            return response()->json(['status'=>0,'msg'=>'该订单不允许取消!']);
        }
        if (!$this->orderRepository->update(['is_pay'=>3], $id)) {
            return response()->json(['status'=>0,'msg'=>'取消订单失败!']);
        }
        $this->memberLogRepository->createLog($user, 9004, [$info->oid]);
        return response()->json(['status'=>1,'msg'=>'取消订单成功!']);
    }

    /**
     * 电子票据
     */
//    public function enote($id)
//    {
//
//
//        $result = [];
//        return $result;
//    }

    /**
     * @param PayOrder $payOrder
     */
    public function updateOrder(PayOrder $payOrder)
    {
        $trade_no = $payOrder->trade_no;
        Order::where(['oid'=>$trade_no])->update(['is_pay'=>2,'payment_time'=>time()]);
        $order = Order::where(['oid'=>$trade_no])->first();
        $input = json_decode($order->charge);
        $resume = Resume::where('id', $input->resume_id)->first();
        $uid = $resume->uid;
        $TYPE = $input->type;
        $member = Member::where('id', $uid)->first();
        $uytpe = $member->utype;
        $POINTS = MembersPoint::where(['uid'=>$uid, 'utype'=>$uytpe])->first();
        if ($order->pay_points > 0) {
            $STATUS = $TYPE=='tag' ? '简历标签' : '简历置顶';
            if ($POINTS) {
                if ($POINTS->points>=$order->pay_points) {
                    MembersPoint::where(
                        ['uid'=>$uid,'utype'=>$uytpe]
                    )->decrement('points', $order->pay_points);
                } else {
                    MembersPoint::where(
                        ['uid'=>$uid,'utype'=>$uytpe]
                    )->update(['points'=>0]);
                }
            }
            MembersHandsel::create(
                [
                    'uid'=>$uid,
                    'utype'=>$uytpe,
                    'htype'=>'','htype_cn'=>$STATUS.$input->days.'天',
                    'operate'=>2,'points'=>$order->pay_points
                ]
            );
        }
        if ($TYPE=='tag') {
            $categorys = Category::where('id', $input->tagid)->first();
            $personal_service_tags = PersonalServiceTag::where('days', $input->days)->first();
            $tag_logs = PersonalServiceTagLog::where(['resume_id'=>$input->resume_id,'resume_uid'=>$uid])->first();
            if ($tag_logs) {
                $dat['days']= $input->days;
                $dat['points']= $personal_service_tags->points;
                $dat['tag_id']= $input->tagid;
                $dat['tag_cn']= $categorys->demand;
                $dat['addtime']= time();
                $dat['endtime']= strtotime("+".$input->days." day");
                PersonalServiceTagLog::where(
                    ['resume_id'=>$input->resume_id,'resume_uid'=>$uid]
                )->update($dat);
            } else {
                $dat['resume_id']= $input->resume_id;
                $dat['resume_uid']= $uid;
                $dat['days']= $input->days;
                $dat['points']= $personal_service_tags->points;
                $dat['tag_id']= $input->tagid;
                $dat['tag_cn']= $categorys->demand;
                $dat['addtime']= time();
                $dat['endtime']= strtotime("+".$input->days." day");
                PersonalServiceTagLog::create($dat);
            }
        } else {
            Resume::where('id', $input->resume_id)->update(['stick'=>1,'stime'=>strtotime("+".$input->days." day")]);
            $stick_logs = PersonalServiceStickLog::where(
                ['resume_id'=>$input->resume_id,'resume_uid'=>$uid]
            )->first();
            $personal_service_sticks = PersonalServiceStick::where('days', $input->days)->first();
            if ($stick_logs) {
                $dat['days']= $input->days;
                $dat['points']= $personal_service_sticks->points;
                $dat['addtime']= time();
                $dat['endtime']= strtotime("+".$input->days." day");
                PersonalServiceStickLog::where(
                    ['resume_id'=>$input->resume_id,'resume_uid'=>$uid]
                )->update($dat);
            } else {
                $dat['resume_id']= $input->resume_id;
                $dat['resume_uid']= $uid;
                $dat['days']= $input->days;
                $dat['points']= $personal_service_sticks->points;
                $dat['addtime']= time();
                $dat['endtime']= strtotime("+".$input->days." day");
                PersonalServiceStickLog::create($dat);
            }
        }
        return;
    }

    /**
     * @param $user
     * @param $order_type
     * @param $amount
     * @param $pay_amount
     * @param $pay_points
     * @param $service_name
     * @param $payment
     * @param $payment_cn
     * @param $description
     * @param $is_paid
     * @param $points
     * @param $setmeal
     * @param $payment_time
     * @param $params
     * @param $discount
     * @param $notes
     * @return Order
     */
    public function addOrder($user, $order_type, $amount, $pay_amount, $pay_points, $service_name, $payment, $payment_cn, $description, $is_paid, $points, $setmeal, $payment_time, $params,$my_discount="")
    {
        return $this->orderRepository->addOrder($user, $order_type, $amount, $pay_amount, $pay_points, $service_name, $payment, $payment_cn, $description, $is_paid, $points, $setmeal, $payment_time, $params,$my_discount);
    }

    /**支付成功后回调此函数,修改各表值,生成记录
     * @param PayOrder $payOrder
     * @throws \ErrorException
     * @throws \Prettus\Validator\Exceptions\ValidatorException
     */
    public function updateCompany(PayOrder $payOrder)
    {
        //支付成功后操作== 修改订单表中状态和支付时间
        $trade_no = $payOrder->trade_no;
        $data = [
            'is_pay'=>2,
            'payment_time'=>time(),
        ];

        if ($payOrder->attch) {
            $data['notes'] = $payOrder->attch;
        }

        $this->orderRepository->updateStatus($trade_no, $data);
        $order = $this->orderRepository->getOneOder($trade_no);
        $params = unserialize($order->params);
        $setmeal_id = $params['setmeal_id'];
        $id = $params['company_id'];
        $utype = $params['utype'];
        $username = $params['username'];
        $subsite_id = $params['subsite_id'];
        $setmealInfo = $this->setmealRepository->find($setmeal_id);
        $user =(object)['id'=>$id,'utype'=>$utype,'username'=>$username,'subsite_id'=>$subsite_id];
        $this->serviceService->setMembersSetmeal($user, $setmeal_id);
        switch ($order->pay_type) {
            case 1:
                $paytype = '积分兑换';
                break;
            case 2:
                $paytype = '现金';
                break;
            case 3:
                $paytype = '现金+积分';
                break;
        }
        if ($order->pay_type !=1) {
            $comInfo = $this->companyRepository->find($id, ['mobile']);
            if ($comInfo->mobile) {
                $this->smsService->sendSms($comInfo->mobile, Smser::TEMPLATE_SMS_ORDER, ['sitename'=>config('aix.system.site.site.site_name'),'oid'=>$trade_no,'paymenttpye'=>$order->payment_cn,'amount'=>$order->pay_amount,'sitedomain'=>config('aix.system.site.site.site_domain')]);
            }
        }
        
    }

    /**查询订单ID
     * @param $tradeNo
     * @return \Illuminate\Http\JsonResponse
     */
    public function getOrderbyTradeNo($tradeNo)
    {
        $orderInfo = $this->orderRepository->getOneOder($tradeNo);
        if ($orderInfo->is_pay != 2) {
            return response()->json(['status'=>0]);
        }
        return response()->json(['status'=>1]);
    }

    public function pointsSave(PayOrder $payOrder)
    {
        $trade_no = $payOrder->trade_no;
        $this->orderRepository->updateStatus($trade_no, ['is_pay'=>2, 'payment_time'=>time()]);
        $order = $this->orderRepository->getOneOder($trade_no);
        $user = $this->companyRepository->getCompanyInfo(['id'=>$order->uid]);
        if ($user->mobile) {
            $this->smsService->sendSms($user->mobile, Smser::TEMPLATE_SMS_ORDER, ['sitename'=>config('aix.system.site.site.site_name'),'oid'=>$trade_no,'paymenttpye'=>$order->payment_cn,'amount'=>$order->pay_amount,'sitedomain'=>config('aix.system.site.site.site_domain')]);
        }
        $points = $order->amount*config('aix.companyset.points.points_set.payment_rate');

        //增加积分记录
        $handsel['uid']         = $user->id;
        $handsel['utype']       = $user->utype;
        $handsel['htype']       = 'cash_buy_points';
        $handsel['htype_cn']    = $order->service_name;
        $handsel['operate']     = 1;
        $handsel['points']      = $points;
        $this->memberHandselRepository->create($handsel);
        $this->setPointByOrder($order);//更新邓积分
    }

    //根据传入订单,给积分总量++
    public function setPointByOrder(Order $order){
        if (empty($order) || empty($order->params)){
            throw new \Exception("订单错误!");
        }
        $pointsArr=unserialize($order->params);
        $points=$pointsArr["points"];
        $this->memberPointRepository->reportDeal($order->uid,$order->utype,1,$points);
    }

    /**
     * @param PayOrder $payOrder
     */
    public function incrementSave(PayOrder $payOrder)
    {
        $trade_no = $payOrder->trade_no;
        $data = [
            'is_pay'=>2,
            'payment_time'=>time(),
        ];

        if ($payOrder->attch) {
            $data['notes'] = $payOrder->attch;
        }
        $this->orderRepository->updateStatus($trade_no, $data);
        $order = $this->orderRepository->getOneOder($trade_no);
        $user = $this->companyRepository->getCompanyInfo(['id'=>$order->uid]);
        if ($user->mobile) {
            $this->smsService->sendSms($user->mobile, Smser::TEMPLATE_SMS_ORDER, ['sitename'=>config('aix.system.site.site.site_name'),'oid'=>$trade_no,'paymenttpye'=>$order->payment_cn,'amount'=>$order->pay_amount,'sitedomain'=>config('aix.system.site.site.site_domain')]);
        }
        $this->orderPaidResumeIncrement($order, $user);
    }

    public function orderPaidResumeIncrement($order, $user)
    {
        //处理支付方式
        switch ($order->pay_type) {
            case 1:
                $paytype = '积分抵扣';
                break;
            case 2:
                $paytype = $order->payment_cn;
                break;
            case 3:
                $paytype = $order->payment_cn.'+积分抵扣';
                break;
        }
        //会员日志 - 添加创建增值服务订单
        $this->memberLogRepository->createLog($user, 9001, array($order->oid,$paytype,''));
        //如果有积分抵扣 - 修改会员积分信息
        if ($order->pay_points > 0) {
            $p_rst = $this->memberPointRepository->reportDeal($user->id, $user->utype, 2, $order->pay_points);
            if ($p_rst) {
                //添加会员积分操作日志
                $stime = date('Y-m-d H:i:s', time());
                $handsel['uid']         = $user->id;
                $handsel['utype']       = $user->utype;
                $handsel['htype']       = '';
                $handsel['htype_cn']    = $order->service_name;
                $handsel['operate']     = 2;
                $handsel['points']      = $order->pay_points;
                $this->memberHandselRepository->create($handsel);
            }
        }
        //修改会员套餐相关字段
        try{
            $setmeal_increment =  $this->setmealIncrementsRepository->getIncrementCache('', $order->setmeal);
            if ($setmeal_increment->cat == 'auto_refresh_jobs') { //智能刷新
                $params = unserialize($order->params);
                $days = $params['days'];
                $nowtime = time();
                for ($i=0; $i < $days*4; $i++) {
                    $timespace = 3600*6*$i;
                    $this->queueAutoRefreshRepository->create(['uid'=>$user->id,'pid'=>$params['jobs_id'],'type'=>1,'refreshtime'=>$nowtime+$timespace]);
                }
            } elseif ($setmeal_increment->cat =='sms') { //增加短信
                $this->companyRepository->updataSmsNum($user->id, 1, $setmeal_increment->value);
                event_search_update(Company::class, (string)$user->id, 'update');
            } elseif ($setmeal_increment->cat =='stick' || $setmeal_increment->cat =='emergency') {  //职位置顶和紧急
                $params = unserialize($order->params);
                $data['jobid'] = $params['jobs_id'];
                $data['starttime'] = $params['starttime'];
                $data['endtime'] = $params['endtime'];
                $data['days'] = $params['days'];
                if ($setmeal_increment->cat =='stick') {
                    $data['ptype'] = 1;
                } else {
                    $data['ptype'] = 2;
                }
                $data['companyid'] = $user->id;
                $this->promotionRepository->create($data);

                $stickEmergency[$setmeal_increment->cat] = 1;
                if ($data['ptype'] == 1) {
                    $stickEmergency['deadline'] = $data['starttime'];
                }
                $this->jobsRepository->update($stickEmergency, $params['jobs_id']);
                event_search_update(Jobs::class, (string)$params['jobs_id'], 'update');
            } else { //职位、招聘会、简历
                if ($setmeal_increment->cat == 'jobs') {
                    $setmeal_increment->cat = 'jobs_meanwhile';
                }
                $this->memberSetmealRepository->incrementData(array('uid'=>$user->id), $setmeal_increment->cat, $setmeal_increment->value);
            }
        }catch (\Exception $e){

        }



        $order_type=$order->order_type; //订单类型
        $order_params=unserialize($order->params);Log::info($order_params);
        Log::info($order_type);
        switch ($order_type){
            case "12":
            case "13":
            { //智能刷新
                $this->jobsRepository->jobsRefresh($order_params['jobs_id']);

                break;
            }
        }


        //会员日志 - 开通服务
//        $this->memberLogRepository->createLog($user, 9002, array($order->service_name,$paytype,''));
    }
    public function orderPaid(PayOrder $payOrder)
    {
        //修改订单表中状态和支付时间
        $trade_no = $payOrder->trade_no;
        $this->orderRepository->updateStatus($trade_no, ['is_pay'=>2, 'payment_time'=>time()]);
        $order = $this->orderRepository->getOneOder($trade_no);     //获取订单信息
        //会员信息
        if ($order->utype == 1) {
            $user = $this->companyRepository->getCompanyInfo(array('id'=>$order->uid,'utype'=>1));
            $email_url = route('com.index');
        } else {
            $user = $this->memberRepository->getMemberById($order->uid);
            $email_url = route('person.index');
        }
        $email = $user->email;
        if ($order->amount && $email && $user->email_audit == 1) {
            $emailService = new EmailService;
            $emailService->sendMail($email, 'mail_payment', [], ['sitedomain'=>$email_url]);
        }
        if ($order->order_type == 6) {
            $this->orderPaidResumeIncrement($order, $user);
        } elseif ($order->order_type == 14) {
            $this->orderPaidSingleResumeDownload($order, $user);
        }
    }
    public function orderPaidSingleResumeDownload($order, $user)
    {
        $params = unserialize($order->params);
        $uid = $order->uid;
        $deductible = $order->pay_points;
        $resume_id = $params['resume_id'];
        //有抵扣积分 - 修改会员积分、添加会员积分操作日志
        if ($deductible>0) {
            $p_rst = $this->memberPointRepository->reportDeal($user->id, $user->utype, 2, $deductible);
            if ($p_rst) {
                $stime = date('Y-m-d H:i:s', time());
                $handsel['uid']         = $user->id;
                $handsel['utype']       = $user->utype;
                $handsel['htype']       = '';
                $handsel['htype_cn']    = $order->service_name;
                $handsel['operate']     = 2;
                $handsel['points']      = $deductible;
                $this->memberHandselRepository->create($handsel);
            }
        }
        //获取企业信息
        $company = $this->companyRepository->getCompanyInfo(array('id'=>$user->id));
        //循环操作简历 - 添加简历下载记录
        $resume_arr = $this->resumeRepository->getResumesWithInfo($resume_id);
        if ($resume_arr->toArray()) {
            foreach ($resume_arr as $key => $value) {
                $addarr = array();
                $memberInfo = $value->memberInfos;
                $addarr['resume_id'] = $value->id;
                if ($memberInfo->display_name == "2") {
                    $addarr['resume_name'] = "N" . str_pad($value->id, 7, "0", STR_PAD_LEFT);
                } elseif ($memberInfo->display_name == "3") {
                    if ($memberInfo->sex == 1) {
                        $addarr['resume_name'] = cut_str($memberInfo->realname, 1, 0, "先生");
                    } elseif ($memberInfo->sex == 2) {
                        $addarr['resume_name'] = cut_str($memberInfo->realname, 1, 0, "女士");
                    }
                } else {
                    $addarr['resume_name'] = $memberInfo->realname;
                }
                $addarr["resume_uid"]=$value->uid;
                $addarr["company_uid"]=$company->id;
                $addarr["company_name"]=$company->companyname;
                $addarr['down_addtime'] = time();
                $addarr['is_reply'] = 0;
                $info = $this->companyDownResumeRepository->create($addarr);
                $this->membersSetmealLogRepository->createLog($user,"下载了简历【".$addarr['resume_name']."】");
            }
        }

        //添加会员操作日志 - 开通服务
        if ($deductible>0) {
            $log_payment = $order->payment_cn.'+积分抵扣';
        } else {
            $log_payment = $order->payment_cn;
        }
//        $this->memberLogRepository->createLog($user, '9002', array($order->service_name,$log_payment,''));
    }

    public function incrementTplUpdate(PayOrder $payOrder)
    {
        $trade_no = $payOrder->trade_no;
        $order = Order::where(['oid'=>$trade_no])->first();
        $order->is_pay = 2;
        $order->payment_time = time();
        $order->save();
        $input = json_decode($order->charge);
        $tpl = Tpl::find($input->project_id);
        $points = $input->is_deductible ?  $input->deductible : 0;
        CompanyTpl::create(['uid'=>$input->uid,'tplid'=>$input->project_id]);
        MembersHandsel::create(
            [
                'uid'=>$input->uid,
                'utype'=>$input->utype,
                'htype'=>'increment_tpl',
                'htype_cn'=>'购买企业模板:'.$tpl->name,
                'operate'=>2,
                'points'=>$points
            ]
        );
        if ($points) {
                MembersPoint::where(['uid'=>$input->uid,'utype'=>$input->utype])->decrement('points', $points);
        }
        return;
    }
    
    public function incrementPersonTplUpdate(PayOrder $payOrder)
    {
        $trade_no = $payOrder->trade_no;
        $order = Order::where(['oid'=>$trade_no])->first();
        $order->is_pay = 2;
        $order->payment_time = time();
        $order->save();
        $input = json_decode($order->charge);
        $tpl = Tpl::find($input->tplid);
        PersonTpl::create(['uid'=>$input->uid,'tplid'=>$input->tplid]);
        MembersHandsel::create(
            [
                'uid'=>$input->uid,
                'utype'=>$input->utype,
                'htype'=>'increment_tpl',
                'htype_cn'=>'购买简历模板:'.$tpl->name,
                'operate'=>2,
                'points'=>$input->points,
            ]
        );
        return;
    }

    public function canselOrder()
    {
        $order_id = [];
        $res = $this->orderRepository->canselOrder();
        if($res){
            $order_id = array_column($res,'id');
        }
        return $order_id;
    }


}