<?php
	
	namespace app\middleapi\controller;
	
	use app\adminapi\logic\auth\AdminLogic;
	use app\adminapi\validate\CompanyValidate;
	use app\api\controller\JunziqianController;
	use app\common\controller\BaseLikeAdminController;
	use app\common\logic\CompanyLogic;
	use app\common\logic\contract\ContractLogic;
	use app\common\logic\RedisLogic;
	use app\common\model\auth\Admin;
	use app\common\model\Company;
	use app\common\model\contract\Contract;
	use app\common\model\dict\DictData;
	use app\common\model\task_scheduling\TaskScheduling;
	use app\common\model\user\User;
	use think\facade\Db;
	use think\facade\Log;
	use think\response\Json;
	
	class CompanyController extends BaseLikeAdminController
	{
		//公司列表
		public function lists(): Json
		{
			if(!$this->request->isPost()){
				return $this->fail('请求方式错误');
			}
			$params=$this->request->post(['page_no','page_size','company_name','area_name','street_name','area_manager','company_type','is_contract']);
			$where = [];
			if(!empty($params['company_name'])){
				$where[] = ['company','like','%'.$params['company_name'].'%'];
			}
			if(!empty($params['area_name'])){
				$arr= Db::name('geo_area')->where('area_name','like','%'.$params['area_name'].'%')->column('area_code');
				if($arr){
					$where[]=['area','in',$arr];
				}
			}
			if(!empty($params['street_name'])){
				$arr= Db::name('geo_street')->where('street_name','like','%'.$params['street_name'].'%')->column('street_code');
				if($arr){
					$where[]=['street','in',$arr];
				}
			}
			if(!empty($params['area_manager'])){
				$arr= Admin::where('name','like','%'.$params['area_manager'].'%')->column('id');
				if($arr){
					$where[]=['area_manager','in',$arr];
				}
			}
			if(!empty($params['company_type'])){
				$where[] = ['company_type','=',$params['company_type']];
			}
			if(!empty($params['is_contract'])){
				$where[] = ['is_contract','=',$params['is_contract']];
			}
			$pageNo = !empty($params['page_no']) ? $params['page_no'] : 1;
			$pageSize = !empty($params['page_size']) ? $params['page_size'] : 20;
			$data = Company::where($where)
				->field(['is_authentication','id', 'id contract', 'company_name', 'organization_code', 'city', 'area', 'street', 'company_type', 'master_name', 'master_position', 'master_phone', 'master_email', 'area_manager', 'is_contract', 'deposit', 'company_money', 'shareholder_money', 'deposit_time', 'status', 'face_create_status'])
				->page($pageNo, $pageSize)
				->order(['id' => 'desc'])
				->append(['notes'], true)
				->withAttr('company_type',function($value,$data){
					return Db::name('dict_data')->where('id',$value)->value('name');
				})
				->withAttr('area',function($value,$data){
					return Db::name('geo_area')->where('area_code',$value)->value('area_name');
				})
				->withAttr('street',function($value,$data){
					return Db::name('geo_street')->where('street_code',$value)->value('street_name');
				})
				->withAttr('area_manager',function($value,$data){
					return Db::name('admin')->where('id',$value)->value('name');
				})
				->withAttr('notes',function($value,$data){
					if ($data['is_authentication'] == 1) {
						return Db::name('company_authentication_fail_log')->where('company_id',$data['id'])->where('log_type', 2)->order(['id'=>'desc'])->limit(1)->value('fail_reason');
					} else {
						return Db::name('company_authentication_fail_log')->where('company_id',$data['id'])->where('log_type', 1)->order(['id'=>'desc'])->limit(1)->value('fail_reason');
					}
					
				})->select()->toArray();
			$count = Company::where($where)->count();
			$result = [
				'lists' => $data,
				'count' => $count,
				'page_no' => $pageNo,
				'page_size' => $pageSize
			];
			return $this->success('请求成功',$result);
		}
		
		//公司详情
		public function detail(): Json
		{
			if(!$this->request->isPost()){
				return $this->fail('请求方式错误');
			}
			$params=$this->request->post(['id']);
			if(empty($params['id'])){
				return $this->fail('缺少必要参数');
			}
			$result = CompanyLogic::detail($params);
			return $this->data($result);
		}
		
		//公司删除
		public function delete(): Json
		{
			if(!$this->request->isPost()){
				return $this->fail('请求方式错误');
			}
			$params=$this->request->post(['id']);
			if(empty($params['id'])){
				return $this->fail('缺少必要参数');
			}
			$admin_id = Company::where('id', $params['id'])->value('admin_id');
			User::where('company_id', $params['id'])->update(['delete_time' => time()]);
			TaskScheduling::where('company_id', $params['id'])->update(['delete_time' => time()]);
			AdminLogic::delete(['id' => $admin_id]);
			CompanyLogic::delete($params);
			return $this->success('删除成功', [], 1, 1);
		}
		
		//添加公司
		public function create(): Json
		{
			$params = (new CompanyValidate())->post()->goCheck('add');
			$params['other_contacts'] = json_encode($params['other_contacts']);
			$params['qualification'] = json_encode($params['qualification']);
			if (isset($params['responsible_area'])) {
				$params['responsible_area'] = implode(',', $params['responsible_area']);
			}
			$result = CompanyLogic::add($params);
			if (true === $result) {
				return $this->success('添加成功', [], 1, 1);
			}
			return $this->fail(CompanyLogic::getError());
		}
		
		//修改公司
		public function edit(): Json
		{
			$params = (new CompanyValidate())->post()->goCheck('edit');
			$params['other_contacts'] = json_encode($params['other_contacts']);
			$params['qualification'] = json_encode($params['qualification']);
			if (isset($params['responsible_area'])) {
				$params['responsible_area'] = implode(',', $params['responsible_area']);
			}
			$result = CompanyLogic::edit($params);
			if (true === $result) {
				return $this->success('编辑成功', [], 1, 1);
			}
			return $this->fail(CompanyLogic::getError());
		}
		
		//公司认证
		public function enterpriseCertification(): Json
		{
			if(!$this->request->isPost()){
				return $this->fail('请求方式错误');
			}
			$params=$this->request->post(['id']);
			if(empty($params['id'])){
				return $this->fail('缺少必要参数');
			}
			$company = Db::name('company')->where('id', $params['id'])->find();
			$qualification = json_decode($company['qualification'], true);
			if ($company && $qualification['business_license']) {
				$data = [
					'name' => $company['company_name'],
					'organization_code' => $company['organization_code'],
					'business_license' => 'https://lihai001.oss-cn-chengdu.aliyuncs.com/def/561f8202305171526091317.png', //$qualification['business_license'],
					'master_name' => $company['master_name'],
					'master_email' => $company['master_email'],
					'master_phone' => $company['master_phone'],
					'master_id_card' => $company['master_id_card'],
					'id' => $company['id'],
				];
				$res = app(JunziqianController::class)->EnterpriseCertification($data);
				Log::info(['企业认证同步结果',$res]);
				if ($res->success) {
					if ($company['company_type'] == 30) {
						// 平台公司不用初始化生成合同 合同签约暂不用人脸识别,预留人脸采集状态为已采集
						Db::name('company')->where('id', $params['id'])->update([ 'is_contract'=>1,'face_create_status'=>1]);
					} else {
						Db::name('company')->where('id', $params['id'])->update([ 'face_create_status'=>1]);
					}
					// 加入缓存中,is_callback用于判断是否获取到异步通知
					RedisLogic::getInstance()->set('authentication_company_id_'.$company['id'], json_encode(['company_id'=>$company['id'],'is_callback'=>0, 'timing'=>time()]));
					return $this->success('系统认证中,请稍后刷新页面查看', ['email' => $res->data], 1, 1);
				} else {
					return $this->fail($res->msg);
				}
			} else {
				return $this->fail("公司不存在");
			}
		}
		
		//生成合同
		public function generateContract(): Json
		{
			if(!$this->request->isPost()){
				return $this->fail('请求方式错误');
			}
			$params=$this->request->post(['id','party_a','contract_type']);
			if(empty($params['id']) || empty($params['party_a']) || empty($params['contract_type'])){
				return $this->fail('缺少必要参数');
			}
			$area_manager = Company::where('id', $params['party_a'])->value('area_manager');
			$params['area_manager'] = $area_manager;
			$params['type'] = 1;
			$params['party_b'] = $params['id'];
			unset($params['id']);
			$result = ContractLogic::initiate_contract($params);
			if (!empty($result) && $result['code'] == 1) {
				return $this->success($result['msg'], $result['data'], 1, 1);
			}
			return $this->fail(ContractLogic::getError());
		}
		
		//下属公司
		public function subsidiaryCompany(): Json
		{
			if(!$this->request->isPost()){
				return $this->fail('请求方式错误');
			}
			$params=$this->request->post(['id','page_no','page_size']);
			if(empty($params['id'])){
				return $this->fail('缺少必要参数');
			}
			$pageNo = !empty($params['page_no']) ? $params['page_no'] : 1;
			$pageSize = !empty($params['page_size']) ? $params['page_size'] : 20;
			$ids = Contract::where('party_a', $params['id'])->where('status', 1)->where('type', 1)->column('party_b');
			if ($ids) {
				$result = Company::where('id', 'in', $ids)->field('company_name,id,company_type,company_type company_type_name,area,area area_name,street,street street_name,is_contract,area_manager,area_manager area_manager_name,master_name,master_phone,is_authentication')->page($pageNo,$pageSize)->select();
				$count = Company::where('id', 'in', $ids)->count();
			} else {
				$result = [];
				$count = 0;
			}
			$data = [
				'lists' => $result,
				'count' => $count,
				'page_no' => $pageNo,
				'page_size' => $pageSize
			];
			return $this->success('success', $data);
		}
		
		//公司类型
		public function companyType(): Json
		{
			$data = DictData::where('type_id',6)
				->append(['status_desc'])
				->order(['sort' => 'desc', 'id' => 'desc'])
				->select()
				->toArray();
			return $this->success('请求成功',$data);
		}
		
		//合同类型
		public function contractType(): Json
		{
			$data = DictData::where('type_id',7)
				->append(['status_desc'])
				->order(['sort' => 'desc', 'id' => 'desc'])
				->select()
				->toArray();
			return $this->success('请求成功',$data);
		}
	}