<?php
	
	namespace app\adminapi\controller\project;
	
	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\BidSecurityApply;
	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\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\ProjectCostBudget;
	use app\common\model\project\ProjectCostBudgetDetail;
	use app\common\model\project\ProjectEquipmentBudgetDetail;
	use app\common\model\project\ProjectEstimate;
	use app\common\model\project\ProjectFollowUp;
	use app\common\model\project\ProjectLaborBudgetDetail;
	use app\common\model\project\ProjectMaterialBudgetDetail;
	use app\common\model\project\ProjectSettlement;
	use app\common\model\project\ProjectSubcontractSettlement;
	use app\common\model\project\ProjectSubpackageBudgetDetail;
	use app\common\model\project\ProjectTotalBudget;
	use think\response\Json;
	
	class ProjectStatisticsController extends BaseAdminController
	{
		//项目商务统计
		public function business(): Json
		{
			$id = $this->request->get('project_id');
			if(empty($id)){
				return $this->fail('缺少必要参数');
			}
			//项目跟进
			$follow_total = ProjectFollowUp::field('id')->where('project_id',$id)->count();
			//项目需求
			$demand_total = CustomerDemand::field('id')->where('project_id',$id)->count();
			//项目方案
			$solution_total = CustomerDemandSolution::field('id')->where('project_id',$id)->count();
			//项目概算
			$estimate_total = ProjectEstimate::field('id')->where('project_id',$id)->count();
			//竞争对手
			$competitor_total = Competitor::field('id')->where('project_id',$id)->count();
			//投标决策
			$decision_total = BidBiddingDecision::field('id')->where('project_id',$id)->count();
			//购买标书
			$document_total = BidBuyBiddingDocument::field('id')->where('project_id',$id)->count();
			//标书审查
			$document_ids = BidBuyBiddingDocument::where('project_id',$id)->column('id');
			$examination_total = BidDocumentExamination::field('id')->where('project_id',$id)->where('buy_bidding_document_id','in',$document_ids)->count();
			//中标项目
			$successful_total = BidResult::field('id')->where('is_successful',1)->count();
			//投标保证金
			$decision_ids = BidSecurityApply::where('project_id',$id)->column('bidding_decision_id');
			$security_amount = BidBiddingDecision::where('id','in',$decision_ids)->sum('margin_amount');
			//已退保证金
			$han_refund_security_amount = BidSecurityRefund::where('project_id',$id)->sum('refund_amount');
			//未退保证金
			$not_refund_security_amount = bcsub($security_amount,$han_refund_security_amount);
			$result = compact('follow_total','demand_total','solution_total','estimate_total','competitor_total','decision_total','document_total','examination_total','successful_total','security_amount','han_refund_security_amount','not_refund_security_amount');
			return $this->success('success',$result);
		}
		
		//项目合同统计
		public function contracts(): Json
		{
			$id = $this->request->get('project_id');
			if(empty($id)){
				return $this->fail('缺少必要参数');
			}
			//项目合同金额
			$project_contract_amount = Contract::where('project_id',$id)->sum('amount');
			//项目合同洽商金额
			$project_negotiation_amount = ContractNegotiation::where('project_id',$id)->sum('negotiation_amount');
			//项目结算金额
			$project_settlement_amount = ProjectSettlement::where('project_id',$id)->sum('settlement_amount');
			//项目已开票金额
			$project_invoicing_amount = FinanceInvoiceApply::where('project_id',$id)->sum('invoicing_amount');
			//项目回款计划金额
			$project_returned_plan_amount = FinanceReturnedMoney::where('project_id',$id)->sum('amount');
			//项目回款金额
			$project_returned_amount = FinanceReturnedRecord::where('project_id',$id)->sum('amount');
			//项目未回款金额
			$project_not_returned_amount = bcsub($project_returned_plan_amount,$project_returned_amount);
			//项目回款比例
			$project_returned_ratio = !empty($project_returned_plan_amount) ? number_format($project_returned_amount / $project_returned_plan_amount,2) : 0;
			/*****************************************************************************************************************************************************************************************************************************************************************/
			
			//分包合同金额
			$subcontracting_contract_ids = SubcontractingContract::where('project_id',$id)->column('id');
			$subcontracting_contract_amount = SubcontractingContractDetail::where('contract_id','in',$subcontracting_contract_ids)->sum('amount_including_tax');
			//分包合同洽商金额
			$subcontracting_negotiation_amount = SubcontractingContractNegotiation::where('project_id',$id)->sum('negotiation_amount');
			//分包合同结算金额
			$subcontracting_settlement_amount = ProjectSubcontractSettlement::where('project_id',$id)->sum('settlement_amount');
			//分包合同收票金额
			$subcontracting_invoicing_amount = FinanceReceiptRecord::where('project_id',$id)->where('contract_type',2)->sum('invoice_amount');
			//分包合同付款计划金额
			$subcontracting_payment_plan_amount = FinancePaymentPlan::where('project_id',$id)->where('contract_type',2)->sum('amount');
			//分包合同付款金额
			$subcontracting_payment_amount = FinancePaymentApply::where('project_id',$id)->where('contract_type',2)->sum('amount');
			//分包合同未付款金额
			$subcontracting_not_payment_amount = bcsub($subcontracting_payment_plan_amount,$subcontracting_payment_amount);
			//分包合同付款比例
			$subcontracting_payment_ratio = !empty($subcontracting_payment_plan_amount) ? number_format($subcontracting_payment_amount / $subcontracting_payment_plan_amount,2) : 0;
			/*****************************************************************************************************************************************************************************************************************************************************************/
			
			//采购合同金额
			$procurement_contract_ids = ProcurementContract::where('project_id',$id)->column('id');
			$procurement_contract_amount = ProcurementContractDetail::where('contract_id','in',$procurement_contract_ids)->sum('amount_including_tax');
			//采购合同收票金额
			$procurement_invoicing_amount = FinanceReceiptRecord::where('project_id',$id)->where('contract_type',1)->sum('invoice_amount');
			//采购合同付款计划金额
			$procurement_payment_plan_amount = FinancePaymentPlan::where('project_id',$id)->where('contract_type',1)->sum('amount');
			//采购合同付款金额
			$procurement_payment_amount = FinancePaymentApply::where('project_id',$id)->where('contract_type',1)->sum('amount');
			//采购合同未付款金额
			$procurement_not_payment_amount = bcsub($procurement_payment_plan_amount,$procurement_payment_amount);
			//采购合同付款比例
			$procurement_payment_ratio = !empty($procurement_payment_plan_amount) ? number_format($procurement_payment_amount / $procurement_payment_plan_amount,2) : 0;
			
			//返回数据
			$result = compact(
				'project_contract_amount', 'project_negotiation_amount','project_settlement_amount','project_invoicing_amount','project_returned_amount','project_not_returned_amount','project_returned_ratio',
				'subcontracting_contract_amount','subcontracting_negotiation_amount','subcontracting_settlement_amount','subcontracting_invoicing_amount','subcontracting_payment_amount','subcontracting_not_payment_amount','subcontracting_payment_ratio',
				'procurement_contract_amount','procurement_invoicing_amount','procurement_payment_amount','procurement_not_payment_amount','procurement_payment_ratio'
			);
			return $this->success('success',$result);
		}
		
		//项目预算统计
		public function budget(): Json
		{
			$id = $this->request->get('project_id');
			if(empty($id)){
				return $this->fail('缺少必要参数');
			}
			$column = ['总预算','材料预算','分包预算','人工预算','费用预算','机具预算'];
			//总预算
			$project_budget = ProjectTotalBudget::field('id,cl_cost,fb_cost,rg_cost,fy_cost,jj_cost')->where('project_id',$id)->findOrEmpty();
			$total_budget = $project_budget['cl_cost'] + $project_budget['fb_cost'] + $project_budget['rg_cost'] + $project_budget['fy_cost'] + $project_budget['jj_cost'];
			//材料清单预算
			$material_budget = ProjectMaterialBudgetDetail::where('project_id',$id)->sum('amount');
			//分包清单预算
			$subpackage_budget = ProjectSubpackageBudgetDetail::where('project_id',$id)->sum('amount');
			//人工清单预算
			$labor_budget = ProjectLaborBudgetDetail::where('project_id',$id)->sum('amount');
			//费用清单预算
			$cost_budget = ProjectCostBudgetDetail::where('project_id',$id)->sum('amount');
			//机具清单预算
			$equipment_budget = ProjectEquipmentBudgetDetail::where('project_id',$id)->sum('amount');
			$series1 = [
				'name' => '成本预算',
				'data' => [$total_budget,$project_budget['cl_cost'],$project_budget['fb_cost'],$project_budget['rg_cost'],$project_budget['fy_cost'],$project_budget['jj_cost']]
			];
			$series2 = [
				'name' => '清单预算',
				'data' => [($material_budget+$subpackage_budget+$labor_budget+$cost_budget+$equipment_budget),$material_budget,$subpackage_budget,$labor_budget,$cost_budget,$equipment_budget]
			];
			$result = [
				'series1' => $series1,
				'series2' => $series2,
				'column' => $column,
			];
			return $this->success('success',$result);
		}
	}