<?php
	
	namespace app\adminapi\controller\statistics;
	
	use app\adminapi\controller\BaseAdminController;
	use app\common\model\bid\BidBiddingDecision;
	use app\common\model\bid\BidBuyBiddingDocument;
	use app\common\model\bid\BidDocumentExamination;
	use app\common\model\bid\BidResult;
	use app\common\model\bid\BidSecurityRefund;
	use app\common\model\contract\Contract;
	use app\common\model\contract\ContractNegotiation;
	use app\common\model\contract\ProcurementContract;
	use app\common\model\contract\ProcurementContractDetail;
	use app\common\model\contract\SubcontractingContract;
	use app\common\model\contract\SubcontractingContractDetail;
	use app\common\model\contract\SubcontractingContractNegotiation;
	use app\common\model\custom\Custom;
	use app\common\model\custom\CustomerDemand;
	use app\common\model\custom\CustomerDemandSolution;
	use app\common\model\finance\FinanceInvoiceApply;
	use app\common\model\finance\FinancePaymentApply;
	use app\common\model\finance\FinancePaymentPlan;
	use app\common\model\finance\FinanceReceiptRecord;
	use app\common\model\finance\FinanceReturnedMoney;
	use app\common\model\finance\FinanceReturnedRecord;
	use app\common\model\project\Competitor;
	use app\common\model\project\Project;
	use app\common\model\project\ProjectEstimate;
	use app\common\model\project\ProjectFollowUp;
	use app\common\model\project\ProjectTypeSet;
	use think\response\Json;
	
	class StatisticsController extends BaseAdminController
	{
		//客户统计数据
		public function customs(): Json
		{
			$year = $this->request->get('year');
			if(empty($year)){
				$year = date('Y');
			}
			$column = ['1','2','3','4','5','6','7','8','9','10','11','12'];
			$series = [
				'name' => '客户数',
				'data' => []
			];
			foreach($column as &$v){
				$month = $v;
				if($month < 10){
					$month = '0'.$month;
				}
				$series['data'][] = Custom::field('id')->whereMonth('create_time', $year.'-'.$month)->count();
				$v = $v.'月';
			}
			$custom_total = Custom::field('id')->count();
			$this_year_add = Custom::field('id')->whereYear('create_time',date('Y'))->count();
			$result = [
				'column' => $column,
				'series' => $series,
				'custom_total' => $custom_total,
				'this_year_add' => $this_year_add
			];
			return $this->success('success',$result);
		}
		
		//项目立项
		public function projectInitiation(): Json
		{
			//立项总数
			$project_total = Project::field('id')->count();
			//项目跟进
			$follow_total = ProjectFollowUp::field('id')->count();
			//项目需求
			$demand_total = CustomerDemand::field('id')->count();
			//项目方案
			$solution_total = CustomerDemandSolution::field('id')->count();
			//项目概算
			$estimate_total = ProjectEstimate::field('id')->count();
			//竞争对手
			$competitor_total = Competitor::field('id')->count();
			//获取项目类型
			$project_type = ProjectTypeSet::field('id,name')->select()->toArray();
			$data = [];
			foreach($project_type as $v){
				$count = Project::field('id')->where('project_type',$v['id'])->count();
				$data[] = [
					'name' => $v['name'],
					'value' => $count
				];
			}
			$result = compact('project_total','follow_total','demand_total','solution_total','estimate_total','competitor_total');
			$result['data'] = $data;
			return $this->success('success',$result);
		}
		
		//投标统计
		public function bidding(): Json
		{
			//投标决策
			$decision = BidBiddingDecision::field('id')->count();
			//购买标书
			$document = BidBuyBiddingDocument::field('id')->count();
			//标书审查
			$examination = BidDocumentExamination::field('id')->count();
			//中标项目
			$successful = BidResult::field('id')->where('is_successful',1)->count();
			//中标率
			$bidding_rate = !empty($decision) ? number_format($successful / $decision,2) : 0;
			//总的投标保证金金额
			$total_margin_amount = BidBiddingDecision::where('is_margin',1)->sum('margin_amount');
			//已退保证金金额
			$return_margin_amount = BidSecurityRefund::sum('refund_amount');
			//未退保证金金额
			$not_return_margin_amount = ($total_margin_amount - $return_margin_amount) > 0 ? $total_margin_amount - $return_margin_amount : 0;
			//返回
			return $this->success('success',compact('decision','document','examination','successful','bidding_rate','not_return_margin_amount'));
		}
		
		//项目合同
		public function contracts(): Json
		{
			$year = $this->request->get('year');
			if(empty($year)){
				$year = date('Y');
			}
			//合同总数
			$total_num = Contract::field('id')->count();
			//签约总金额
			$sign_total_amount = Contract::sum('amount');
			//洽商金额
			$total_negotiate_amount = ContractNegotiation::sum('negotiation_amount');
			//年度合同总数
			$year_total_num = Contract::field('id')->whereYear('contract_date',$year)->count();
			//年度签约合同总金额
			$year_total_sign_amount = Contract::whereYear('contract_date',$year)->sum('amount');
			//年度签约合同id
			$year_sign_contract_ids = Contract::field('id')->whereYear('contract_date',$year)->column('id');
			//年度洽商金额
			$year_total_negotiate_amount = ContractNegotiation::where('contract_id','in',$year_sign_contract_ids)->sum('negotiation_amount');
			$column = ['1','2','3','4','5','6','7','8','9','10','11','12'];
			$series = [
				'name' => '合同金额',
				'data' => []
			];
			foreach($column as &$v){
				$month = $v;
				if($month < 10){
					$month = '0'.$month;
				}
				$sign_amount = Contract::whereMonth('contract_date', $year.'-'.$month)->sum('amount');
				$contract_ids = Contract::whereMonth('contract_date', $year.'-'.$month)->column('id');
				$negotiate_amount = ContractNegotiation::where('contract_id','in',$contract_ids)->sum('negotiation_amount');
				$series['data'][] = $sign_amount + $negotiate_amount;
				$v = $v.'月';
			}
			$result = [
				'total_num' => $total_num,
				'total_amount' => $sign_total_amount + $total_negotiate_amount,
				'total_negotiate_amount' => $total_negotiate_amount,
				'year_total_num' => $year_total_num,
				'year_total_amount' => $year_total_sign_amount + $year_total_negotiate_amount,
				'column' => $column,
				'series' => $series
			];
			return $this->success('success',$result);
		}
		
		//项目回款
		public function projectRefund(): Json
		{
			$year = $this->request->get('year');
			if(empty($year)){
				$year = date('Y');
			}
			$column = ['1','2','3','4','5','6','7','8','9','10','11','12'];
			//年度开票金额
			$year_invoicing_amount = FinanceInvoiceApply::whereYear('invoicing_date',$year)->sum('invoicing_amount');
			//年度回款计划金额
			$year_refund_plan_amount = FinanceReturnedMoney::whereYear('return_date',$year)->sum('amount');
			//年度回款金额
			$year_refund_amount = FinanceReturnedRecord::whereYear('return_date',$year)->sum('amount');
			$invoice_series = [
				'name' => '开票金额',
				'data' => []
			];
			$refund_plan_series = [
				'name' => '回款计划金额',
				'data' => []
			];
			$refund_series = [
				'name' => '回款金额',
				'data' => []
			];
			foreach($column as &$v){
				$month = $v;
				if($month < 10){
					$month = '0'.$month;
				}
				$invoice_series['data'][] = FinanceInvoiceApply::whereMonth('invoicing_date',$year.'-'.$month)->sum('invoicing_amount');
				$refund_plan_series['data'][] = FinanceReturnedMoney::whereMonth('return_date',$year.'-'.$month)->sum('amount');
				$refund_series['data'][] = FinanceReturnedRecord::whereMonth('return_date',$year.'-'.$month)->sum('amount');
				$v = $v.'月';
			}
			$result = [
				'year_invoicing_amount' => $year_invoicing_amount,
				'year_refund_plan_amount' => $year_refund_plan_amount,
				'year_refund_amount' => $year_refund_amount,
				'invoice_series' => $invoice_series,
				'refund_plan_series' => $refund_plan_series,
				'refund_series' => $refund_series,
				'column' => $column,
			];
			return $this->success('success',$result);
		}
		
		//采购合同
		public function procurementContract(): Json
		{
			$year = $this->request->get('year');
			if(empty($year)){
				$year = date('Y');
			}
			$column = ['1','2','3','4','5','6','7','8','9','10','11','12'];
			//总合同数
			$total_num = ProcurementContract::field('id')->count();
			//总合同金额
			$total_amount = ProcurementContractDetail::sum('amount_including_tax');
			//年度合同数
			$year_total_num = ProcurementContract::field('id')->whereYear('signing_date',$year)->count();
			//年度合同金额
			$year_procurement_contract_ids = ProcurementContract::whereYear('signing_date',$year)->column('id');
			$year_total_amount = ProcurementContractDetail::field('id')->where('contract_id','in',$year_procurement_contract_ids)->sum('amount_including_tax');
			$series = [
				'name' => '合同金额',
				'data' => []
			];
			foreach($column as &$v){
				$month = $v;
				if($month < 10){
					$month = '0'.$month;
				}
				$month_procurement_contract_ids = ProcurementContract::whereMonth('signing_date',$year.'-'.$month)->column('id');
				$series['data'][] = ProcurementContractDetail::field('id')->where('contract_id','in',$month_procurement_contract_ids)->sum('amount_including_tax');
				$v = $v.'月';
			}
			$result = [
				'total_num' => $total_num,
				'total_amount' => $total_amount,
				'year_total_num' => $year_total_num,
				'year_total_amount' => $year_total_amount,
				'column' => $column,
				'series' => $series,
			];
			return $this->success('success',$result);
		}
		
		//分包合同
		public function subcontractingContract(): Json
		{
			$year = $this->request->get('year');
			if(empty($year)){
				$year = date('Y');
			}
			$column = ['1','2','3','4','5','6','7','8','9','10','11','12'];
			//合同总数
			$total_num = SubcontractingContract::field('id')->count();
			//合同签约总金额
			$total_sign_amount = SubcontractingContractDetail::sum('amount_including_tax');
			//合同洽商金额
			$total_negotiation_amount = SubcontractingContractNegotiation::sum('negotiation_amount');
			//合同总金额
			$total_amount = $total_sign_amount + $total_negotiation_amount;
			//年度合同总数
			$year_total_num = SubcontractingContract::field('id')->whereYear('signing_date',$year)->count();
			//年度合同id
			$year_subcontracting_contract_ids = SubcontractingContract::whereYear('signing_date',$year)->column('id');
			//年度合同签约金额
			$year_total_sign_amount = SubcontractingContractDetail::where('contract_id','in',$year_subcontracting_contract_ids)->sum('amount_including_tax');
			//年度合同洽商金额
			$year_total_negotiation_amount = SubcontractingContractNegotiation::where('subcontracting_contract_id','in',$year_subcontracting_contract_ids)->sum('negotiation_amount');
			//年度合同总金额
			$year_total_amount = $year_total_sign_amount + $year_total_negotiation_amount;
			$series = [
				'name' => '合同金额',
				'data' => []
			];
			foreach($column as &$v){
				$month = $v;
				if($month < 10){
					$month = '0'.$month;
				}
				$month_subcontracting_contract_ids = SubcontractingContract::whereMonth('signing_date',$year.'-'.$month)->column('id');
				//月度合同签约金额
				$month_total_sign_amount = SubcontractingContractDetail::where('contract_id','in',$month_subcontracting_contract_ids)->sum('amount_including_tax');
				//月度合同洽商金额
				$month_total_negotiation_amount = SubcontractingContractNegotiation::where('subcontracting_contract_id','in',$month_subcontracting_contract_ids)->sum('negotiation_amount');
				$series['data'][] = $month_total_sign_amount + $month_total_negotiation_amount;
				$v = $v.'月';
			}
			$result = [
				'total_num' => $total_num,
				'total_amount' => $total_amount,
				'total_negotiation_amount' => $total_negotiation_amount,
				'year_total_num' => $year_total_num,
				'year_total_amount' => $year_total_amount,
				'column' => $column,
				'series' => $series,
			];
			return $this->success('success',$result);
		}
		
		//项目付款
		public function projectPayment(): Json
		{
			$year = $this->request->get('year');
			if(empty($year)){
				$year = date('Y');
			}
			$column = ['1','2','3','4','5','6','7','8','9','10','11','12'];
			//年度收票金额
			$year_invoicing_amount = FinanceReceiptRecord::whereYear('invoicing_date',$year)->sum('invoice_amount');
			//年度付款计划金额
			$year_payment_plan_amount = FinancePaymentPlan::whereYear('pay_date',$year)->sum('amount');
			//年度付款金额
			$year_payment_amount = FinancePaymentApply::whereYear('pay_date',$year)->sum('amount');
			$invoice_series = [
				'name' => '收票金额',
				'data' => []
			];
			$payment_plan_series = [
				'name' => '付款计划金额',
				'data' => []
			];
			$payment_series = [
				'name' => '付款金额',
				'data' => []
			];
			foreach($column as &$v){
				$month = $v;
				if($month < 10){
					$month = '0'.$month;
				}
				$invoice_series['data'][] = FinanceReceiptRecord::whereMonth('invoicing_date',$year.'-'.$month)->sum('invoice_amount');
				$payment_plan_series['data'][] = FinancePaymentPlan::whereMonth('pay_date',$year.'-'.$month)->sum('amount');
				$payment_series['data'][] = FinancePaymentApply::whereMonth('pay_date',$year.'-'.$month)->sum('amount');
				$v = $v.'月';
			}
			$result = [
				'year_invoicing_amount' => $year_invoicing_amount,
				'year_payment_plan_amount' => $year_payment_plan_amount,
				'year_payment_amount' => $year_payment_amount,
				'invoice_series' => $invoice_series,
				'payment_plan_series' => $payment_plan_series,
				'payment_series' => $payment_series,
				'column' => $column,
			];
			return $this->success('success',$result);
		}
	}