<?php


namespace App\Http\Services;


//后台用户相关信息服务
use App\Http\Transformers\SupplierShareApplyTransformer;
use App\Model\SupplierChannelModel;
use App\Model\SupplierShareApplyModel;

//用于判断是否已经查看的服务
class SupplierShareApplyService
{
    public function getSupplierShareApplyList($userId)
    {
        $applyModel = new SupplierShareApplyModel();
        $limit = request()->get('limit', 10);
        $query = $applyModel::with([
            'supplier' => function ($q) {
                $q->select(['supplier_name', 'supplier_id']);
            },
            'department',
            'apply_department'
        ])->where('create_uid', $userId)->orderBy('id', 'desc');
        $list = $query->paginate($limit)->toArray();
        $transformer = new SupplierShareApplyTransformer();
        $list['data'] = $transformer->transformList($list['data']);
        return $list;
    }

    //获取申请可以选择的部门
    /*
    不同部门的情况还不同,因为线上的数据错乱了,不同部门的分级有问题
    比如运营老大被分在了顶级部门(运营部),联营采购老大和自营采购老大被分在了二级部门
    但是联营采购老大的部下,在三级部门,而且自营采购老大的部下,在二级部门,和自己同一个部门
    但是目前用这个供应商系统的,只会有这三个部门,所以要找出一个合理的处理方法
    所以这边的方法如下 :
    运营和联营采购无脑找上一级.
    因为运营老大在顶级,找不到上一级,那就取顶级即可
    联营采购本来向上找一级就是对的(除了被查找的人是联营采购的老大....那就不要往上找了)
    自营采购比较特殊,因为领导和部下都在这一个层级,所以不能往上找,往上找就是顶级的采购部了,顶级采购部是找不到人的(没有用户的部门id是顶级采购部id)
    以上所说的情况,都是建立在部门架构不变以及部门老大维持层级不变的前提下进行的
    */
    public function getApplyCanUseDepartments($supplier)
    {
        $supplier = $supplier->toArray();
        //找出采购,开发员,创建者所属部门,一个供应商可能和多个部门相关,因为采购可能有自营或者联营的
        $purchaseUid = $supplier['purchase_uid'];
        $channelUids = explode(',', $supplier['channel_uid']);
        $createUid = $supplier['create_uid'];
        $departmentService = new DepartmentService();
        $adminService = new AdminUserService();

        $purchaseUser = $adminService->getAdminUserInfoByCodeId($purchaseUid);
        $purchaseDepartment = $departmentService->getUpperDepartmentByUserIdForShareApply($purchaseUser['userId']);
        $createDepartment = $departmentService->getUpperDepartmentByUserIdForShareApply($createUid);
        $allDepartments = [];
        if (!empty($purchaseDepartment)) {
            $allDepartments[] = $purchaseDepartment;
        }
        if (!in_array($createDepartment, $allDepartments)) {
            $allDepartments[] = $createDepartment;
        }
        if (!empty($channelUids)) {
            foreach ($channelUids as $channelUid) {
                $channelUser = $adminService->getAdminUserInfoByCodeId($channelUid);
                $channelDepartment = $departmentService->getUpperDepartmentByUserIdForShareApply($channelUser['userId']);
                //为什么不判断只要有三个部门就跳出,因为以后可能会有其它部门的人当采购
                if (!in_array($channelDepartment, $allDepartments) && !empty($channelDepartment)) {
                    $allDepartments[] = $channelDepartment;
                }
            }
        }
        $allDepartments = array_filter($allDepartments, function ($department) {
            return !empty($department);
        });
        return $allDepartments;
    }

    //保存申请
    public function saveSupplierShareApply($map)
    {
        $data = $map;
        $data['status'] = 0;
        $data['create_time'] = time();
        $data['create_uid'] = request()->user->userId;
        $departmentService = new DepartmentService();
        $department = $departmentService->getUpperDepartmentByUserIdForShareApply($data['create_uid']);
        $data['department_id'] = $department['department_id'];
        $applyModel = new SupplierShareApplyModel();
        return $applyModel->insert($data);
    }

    //校验是否已经有存在的申请
    public function checkHasNoFinishApply($map)
    {
        $applyModel = new SupplierShareApplyModel();
        $count = $applyModel->where('supplier_id', $map['supplier_id'])
            ->where('apply_code_id', $map['apply_code_id'])->where('apply_department_id', $map['apply_department_id'])
            ->whereNotIn('status', [$applyModel::STATUS_AUDIT_REJECT, $applyModel::STATUS_REVIEW_REJECT])->count();
        return $count;
    }

    public function getAuditSupplierShareApplyList($userId)
    {
        //1.先获取自己的部门ID
        $departmentService = new DepartmentService();
        $topDepartment = $departmentService->getUpperDepartmentByUserIdForShareApply($userId);
        $departmentId = $topDepartment['department_id'];

        $applyModel = new SupplierShareApplyModel();
        $query = $applyModel::with([
            'supplier' => function ($q) {
                $q->select(['supplier_name', 'supplier_id']);
            },
            'department',
            'apply_department',
            'apply_user'
        ])->where(function ($q) use ($departmentId) {
            //当要判断申请者所在部门的时候,要审核人为空,因为审核这一步是所在部门的人审核的
            $q->where('department_id', $departmentId)->where('audit_uid', 0);
        })->orWhere(function ($q) use ($departmentId) {
            //当要判断申请者申请的部门的时候,要复审人为空,因为复审这一步是被申请部门的人审核的
            $q->where('apply_department_id', $departmentId)->where('review_uid', 0)->where('audit_uid', '!=', 0)
                ->where('status', SupplierShareApplyModel::STATUS_NEED_REVIEW);
        })->orderBy('id', 'desc');
        $limit = request()->get('limit', 20);
        $list = $query->paginate($limit)->toArray();
        $transformer = new SupplierShareApplyTransformer();
        $list['data'] = $transformer->transformList($list['data']);
        return $list;
    }

    //审核供应商共用申请
    public function auditSupplierShareApply($id, $userId, $statusName)
    {
        //先找出这个审核id对应的审核状态
        //如果是初审(审核),就要处理初审,通过的话进入复审,而不是直接通过
        $applyModel = new SupplierShareApplyModel();
        $apply = $applyModel->where('id', $id)->first()->toArray();
        //初审
        if ($apply['status'] == $applyModel::STATUS_PENDING) {
            $apply['status'] = $statusName == 'pass' ? $applyModel::STATUS_NEED_REVIEW : $applyModel::STATUS_AUDIT_REJECT;
            $apply['audit_uid'] = $userId;
            $apply['audit_time'] = time();
        } else {
            //复审
            $apply['status'] = $statusName == 'pass' ? $applyModel::STATUS_PASS : $applyModel::STATUS_REVIEW_REJECT;
            $apply['review_time'] = time();
            $apply['review_uid'] = $userId;
            //还要去将当前请求人的内部编码写到采购里面去
            if ($statusName == 'pass') {
                $contactService = new SupplierContactService();
                $contactService->createContactByChannelUid($apply['supplier_id'], $apply['apply_code_id']);
                //然后自动转正
                $supplierModel = new SupplierChannelModel();
                $supplier = $supplierModel->where('supplier_id', $apply['supplier_id'])->first()->toArray();
                $supplierService = new SupplierService();
                $supplierService->autoChangeIsType($supplier);
                //最后同步到erp
                $syncService = new SyncSupplierService();
                $syncService->syncSupplierToErp($apply['supplier_id']);
            }
        }

        return $applyModel->where('id', $id)->update($apply);
    }
}