<?php
namespace app\workerapi\controller;


use app\adminapi\logic\master_worker\MasterWorkerLogic;
use app\adminapi\logic\works\ServiceWorkLogic;
use app\api\logic\UserCouponLogic;
use app\common\model\works\IssueWork;
use app\common\model\works\ReturnWork;
use app\common\model\works\ServiceWork;
use app\workerapi\lists\HistoryWorkLists;
use app\workerapi\lists\ServiceAssignWorkLists;
use app\workerapi\lists\GoodsFeeStandardsLists;
use app\workerapi\lists\ServiceWorkLists;
use app\workerapi\lists\ServiceWorkSparePartLists;
use app\workerapi\lists\SparePartLists;
use app\workerapi\validate\ServiceWorkValidate;
use app\workerapi\validate\GoodsFeeStandardsValidate;
use Exception;

/**
 * 工单系统
 */
class WorksController extends BaseApiController
{
    /**
     * 首页数量统计
     * @return \think\response\Json
     * @throws \think\db\exception\DbException
     */
    public function statistics()
    {
        $result['service_work_count'] = ServiceWork::where(['master_worker_id'=>$this->userId])->whereIn('service_status','0,1,2')->where('work_status','<>',1)->where('work_pay_status','>',0)->count();
        $result['assign_work_count'] = ServiceWork::where(['master_worker_id'=>$this->userId,'work_status'=>1])->where('work_pay_status','>',0)->count();
        $result['pick_work_count'] = 0;
        $result['return_work_count'] = ReturnWork::where(['master_worker_id'=>$this->userId])->where('return_work_status','<>',4)->count();
        $result['issue_work_count'] = IssueWork::where(['master_worker_id'=>$this->userId])->whereIn('issue_approval','1,2,3')->count();
        $result['review_work_count'] = ServiceWork::where(['master_worker_id'=>$this->userId,'work_status'=>7])->count();
        return $this->data($result);
    }

    /**
     * 服务工单列表-全部
     * @return \think\response\Json
     */
    public function serviceWorkList()
    {
        return $this->dataLists(new ServiceWorkLists());
    }

    /**
     * 派单
     * @return \think\response\Json
     */
    public function assignWorkList()
    {
        return $this->dataLists(new ServiceAssignWorkLists());
    }

    /**
     * 历史工单
     * @return \think\response\Json
     */
    public function historyWorkList()
    {
        return $this->dataLists(new HistoryWorkLists());
    }

    /**
     * 领取服务单
     * @return \think\response\Json
     */
    public function pickWork()
    {
        $params = (new ServiceWorkValidate())->post()->goCheck('pick', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceWorkLogic::pickWork($params);
        if (false === $result) {
            return $this->fail(ServiceWorkLogic::getError());
        }
        // 用户订单被领单通知【给用户的通知】
        $workDetail = ServiceWorkLogic::detail($params);
        event('Notice',  [
            'scene_id' => 114,
            'params' => [
                'user_id' => $workDetail['user_id'],
            ]
        ]);
        return $this->success('领取成功', [], 1, 1);
    }

    /**
     * 工单详情
     * @return \think\response\Json
     */
    public function detail()
    {
        try {
            $params = (new ServiceWorkValidate())->goCheck('detail',[
                'user_id' => $this->userId,
            ]);
            if(empty($params['id']) && empty($params['work_sn'])){
                $this->fail('参数错误');
            }
            $result = ServiceWorkLogic::detail($params);
            if (false === $result) {
                return $this->fail(ServiceWorkLogic::getError());
            }
            return $this->data($result);
        } catch (Exception $e) {
            return $this->fail($e->getMessage());
        }
    }

    /**
     * 获取用户优惠券
     * @return \think\response\Json
     */
    public function getUserCoupons()
    {
        try {
            $params = (new ServiceWorkValidate())->goCheck('detail',[
                'user_id' => $this->userId,
            ]);
            if(empty($params['id'])){
                $this->fail('参数错误');
            }
            $result = ServiceWorkLogic::getUserCouponDetails($params);
            if (false === $result) {
                return $this->fail(ServiceWorkLogic::getError());
            }
            return $this->data($result);
        } catch (Exception $e) {
            return $this->fail($e->getMessage());
        }
    }

    /**
     *
     * @return \think\response\Json
     */
    public function getDetailWorkServiceStatus()
    {
        $params = (new ServiceWorkValidate())->goCheck('detail',[
            'user_id' => $this->userId,
        ]);
        $result = ServiceWorkLogic::getDetailWorkServiceStatus($params);
        if (false === $result) {
            return $this->fail(ServiceWorkLogic::getError());
        }
        return $this->data($result);
    }


    /**
     * 预约上门
     * @return \think\response\Json
     */
    public function appointWork()
    {
        $params = (new ServiceWorkValidate())->post()->goCheck('appoint', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceWorkLogic::appointWork($params);
        if (false === $result) {
            return $this->fail(ServiceWorkLogic::getError());
        }
        // 工程师预约上门通知【给用户的通知】
        $workDetail = ServiceWorkLogic::detail($params);
        $masterDetail = MasterWorkerLogic::detail(['id'=>$workDetail['master_worker_id']]);
        event('Notice',  [
            'scene_id' => 115,
            'params' => [
                'user_id' => $workDetail['user_id'],
                'date' => $workDetail['appointment_time'],
                'tel' => asteriskString($masterDetail['mobile'])
            ]
        ]);
        // 工程师预约上门通知【给工程师的通知，仅限公众号】
        event('Notice',  [
            'scene_id' => 116,
            'params' => [
                'user_id' => $workDetail['master_worker_id'],
                'order_id' => $workDetail['id'],
                'thing5' => $workDetail['title'],
                'time10' => $workDetail['appointment_time'],
                'thing3' => (iconv_strlen($workDetail['address'])>15)?(mb_substr($workDetail['address'],0,15,'UTF-8').'...'):$workDetail['address'],
            ]
        ]);
        return $this->success('预约成功，等待上门', [], 1, 1);
    }

    /**
     * 工程师确认上门
     * @return \think\response\Json
     */
    public function confirmDoor()
    {
        $params = (new ServiceWorkValidate())->post()->goCheck('door', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceWorkLogic::confirmDoor($params);
        if (false === $result) {
            return $this->fail(ServiceWorkLogic::getError());
        }
        return $this->success('操作成功,工程师已上门', [], 1, 1);
    }

    /**
     * 工程师确认报价单
     * @return \think\response\Json
     */
    public function confirmPrice()
    {
        $params = (new ServiceWorkValidate())->post()->goCheck('price', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceWorkLogic::confirmPrice($params);
        if (false === $result) {
            return $this->fail(ServiceWorkLogic::getError());
        }
        return $this->success('操作成功,工程师已填写报价单，等待用户确认中', [], 1, 1);
    }

    /**
     * 工程师确认服务完成
     * @return \think\response\Json
     */
    public function confirmServiceFinish()
    {
        $params = (new ServiceWorkValidate())->post()->goCheck('finished', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceWorkLogic::confirmServiceFinish($params);
        if (false === $result) {
            return $this->fail(ServiceWorkLogic::getError());
        }
        return $this->success('操作成功,工程师已确认服务完成，等待用户确认中', [], 1, 1);
    }

    /**
     * 配件列表
     * @return \think\response\Json
     */
    public function spareList()
    {
        // 查全部可选配件
        return $this->dataLists(new SparePartLists());
    }

    /**
     * 工单配件列表
     * @return \think\response\Json
     */
    public function serviceWorkSpareList()
    {
        // 查该订单的配件
        (new ServiceWorkValidate())->get()->goCheck('spare', [
            'user_id' => $this->userId
        ]);
        return $this->dataLists(new ServiceWorkSparePartLists());
    }

    /**
     * 工单收费标准列表
     * @return \think\response\Json
     */
    public function serviceFeeStandards()
    {
        // 查该订单的配件
        (new GoodsFeeStandardsValidate())->get()->goCheck('standards', [
            'user_id' => $this->userId
        ]);
        return $this->dataLists(new GoodsFeeStandardsLists());
    }

    /**
     * 预约通知确认
     * @return \think\response\Json
     */
    public function appointmentSubmitNotice()
    {
        $params = (new ServiceWorkValidate())->post()->goCheck('submitAppointment', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceWorkLogic::submitAppointment($params);
        if (false === $result) {
            return $this->fail(ServiceWorkLogic::getError());
        }
        // 工程师再次上门通知【给用户的通知】
        $workDetail = ServiceWorkLogic::detail(['work_sn'=>$params['work_sn']]);
        event('Notice',  [
            'scene_id' => 119,
            'params' => [
                'user_id' => $workDetail['user_id'],
            ]
        ]);
        return $this->success('操作成功，已确定新的预约时间', [], 1, 1);
    }

    /**
     * 再次上门
     * @return \think\response\Json
     */
    public function againDoor()
    {
        $params = (new ServiceWorkValidate())->post()->goCheck('againDoor', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceWorkLogic::againDoor($params);
        if (false === $result) {
            return $this->fail(ServiceWorkLogic::getError());
        }
        // 工程师再次上门通知【给用户的通知】
        $workDetail = ServiceWorkLogic::detail(['work_sn'=>$params['work_sn']]);
        event('Notice',  [
            'scene_id' => 119,
            'params' => [
                'user_id' => $workDetail['user_id'],
            ]
        ]);
        return $this->success('操作成功，已确定新的预约时间', [], 1, 1);
    }


}