<?php

class CrmFinance extends CrmBase
{

    public function addOneContract($ctrId, $conArr, $conUserId, $conSerArr,$PayArr = [])
    {
        $ctrId = LibFc::Int($ctrId);
        $conUserId = LibFc::Int($conUserId);
        if ($ctrId < 0  || empty($conArr) || $conUserId < 0 || empty($conSerArr)) {
            return LibFc::ReturnData(false, '参数错误');
        }
        $B2cBase =  new B2cBase();
        $res = $B2cBase->get('an_user',['au_uid,au_name'],sprintf(" AND au_uid=%d",$conUserId),true);
        $auName = $res['data']['au_name'];
        //检测项目金额
        $time = time();
        $conArr['basic']['fct_ctr_id'] = $ctrId;
        $conArr['basic']['fct_money'] = 0;
        $conArr['basic']['fct_modified'] = $time;
        foreach ($conSerArr as $k => $v) {
            $conSerArr[$k]['fsl_money'] = sprintf("%.2f", $v['fsl_money']);
            $conArr['basic']['fct_money'] += $conSerArr[$k]['fsl_money'];
        }

        //判断分期是否准确
        $tempMoney = 0;
        foreach ($conArr['pay'] as $k => $v) {
            $conArr['pay'][$k]['pay_money'] = sprintf("%.2f", $v['pay_money']);
            if ($conArr['pay'][$k]['pay_money'] > 0) {
                $tempMoney += $conArr['pay'][$k]['pay_money'];
                $conArr['pay'][$k]['pay_pay_time'] = strtotime($v['pay_pay_time']);
            } else {
                unset($conArr['pay'][$k]);
            }
        }
        if ($tempMoney != $conArr['basic']['fct_money']) {
            return LibFc::ReturnData(false, '分期付款金额和总金额不相符。');
        }

        $facConData = [
            'fct_ctr_id' => $conArr['basic']['fct_ctr_id'],
            'fct_title' => $conArr['basic']['fct_title'],
            'fct_money' => $conArr['basic']['fct_money'],
            'fct_remark' => $conArr['basic']['fct_remark'] ?: '',
            'fct_status' => 0,
            'fct_pay' => 0,
            'fct_modified' => $conArr['basic']['fct_modified']
        ];

        $res =  $this->get('crm_customer',['ctr_id,ctr_uid'],sprintf(" and ctr_id=%d",$conArr['basic']['fct_ctr_id']),true);
        $ctrUid = $res['data']['ctr_uid'];
        $this->CRMDb->Begin();
        $res = $this->add('fad_contract', $facConData);
        $conId = $res['data'];
        $linData =  ['duc_usr_id' => $conUserId, 'duc_fct_id' => $conId];
        $res = $this->add('fad_link_fct_usr', $linData);
        $arr = [];
        $AdsPla = new AdsPla();
        foreach ($conSerArr as $k => $v) {
            $v['fsl_fct_id'] = $conId;

            $v['fsl_btime'] = !empty($v['fsl_btime']) ? strtotime($v['fsl_btime']) : $time;
            $v['fsl_etime'] = !empty($v['fsl_etime']) ? strtotime($v['fsl_etime']) : 0;
            if ($v['fsl_etime'] < 0 || $v['fsl_etime'] < $v['fsl_btime']) {
                $v['fsl_etime'] = 0;
            }
            unset($v['ser_des']);
            $serLinkIres =  $this->add('fad_link_fct_sve', $v);

            $serLinkId = $serLinkIres['data'];
            if ($v['fsl_des_id'] > 0) {

                $res = $AdsPla->get('pj_place_ads join pj_user_ads ON pla_ads_id = ads_id ',['*'],sprintf(" AND pla_id=%d", $v['fsl_des_id']),true);
                if($res['data']){
                    $pla_ads_id = $res['data']['pla_ads_id'];
                    $adsData = [
                        'pla_con_id' => $conId,
                        'pla_ser_link_id' => $serLinkId,
                        'pla_sales'=>$auName,
                        'pla_au_uid'=>$conUserId
                    ];
                    $AdsPla->set('pj_place_ads', $adsData, sprintf(" AND pla_id=%d", $v['fsl_des_id']));
                    $adsArr = [
                        'ads_u_id'=>$ctrUid
                    ];
                    if ($res['data']['ads_show_style']=='im') {
                        $LibYpApi = new LibYpApi();
                        $res = $LibYpApi->get('user/getUserById', ['uid' => $ctrUid]);
                        $adsArr['ads_ims'] = json_encode(['uid' => $res['data']['u_id'], 'u_name' => $res['data']['u_name'], 'u_nickname' => $res['data']['u_nickname']], JSON_UNESCAPED_UNICODE);
                    } else {
                        $adsArr['ads_ims'] = '{}';
                    }
                    $AdsPla->set('pj_user_ads',$adsArr,sprintf(" AND ads_id=%d",$pla_ads_id));
                }
                
            }
        }


        //付款计划
        foreach ($conArr['pay'] as $k => $v) {
            $Arr = array('pay_fct_id' => $conId, 'pay_status' => 0, 'pay_create_time' => $time);
            $this->add('fad_pay_money', array_merge($v, $Arr));
        }
        if($PayArr && $PayArr['fae_money']>0 && $PayArr['fae_proof']){
            $PayDataArr = $PayArr;
            $PayDataArr['fae_text'] = $conArr['basic']['fct_title'].'-付款合同';
            $PayDataArr['fae_create_usr'] = $_SESSION['_username'];
            $PayDataArr['fae_create_time'] = time();
            $PayDataArr['fae_status'] = 0;
            $PayDataArr['fae_ctr_id'] = $ctrId;
            $PayDataArr['fae_fct_id'] = $conId;
            $PayDataArr['fae_spare_money'] = 0;
            $this->addPayMoney($PayDataArr);
        }
        $this->CRMDb->End();

        return LibFc::ReturnData(true, $conId);
    }

    public function setOneContract($conId, $conArr, $conSerArr,$usr_id='')
    {
        $conId = LibFc::Int($conId);
        if ($conId > 0) {
            $time = time();
            $this->CRMDb->Begin();
            $res = $this->get('fad_contract join fad_link_fct_usr on duc_fct_id =fct_id ',['*'],sprintf(" AND fct_id=%d",$conId),true);
            $ctrId = $res['data']['fct_ctr_id'];
            $B2cBase =  new B2cBase();
            //业务员不一样则更新
            $duc_usr_id = $res['data']['duc_usr_id'];
            if($usr_id && $res['data']['duc_usr_id']!=$usr_id)
            {
                $duc_usr_id = $usr_id;
                $this->set('fad_link_fct_usr',['duc_usr_id'=>$usr_id],sprintf(" AND duc_fct_id=%d",$conId));   
            }
            $res = $B2cBase->get('an_user',['au_uid,au_name'],sprintf(" AND au_uid=%d",$duc_usr_id),true);
            $auName = $res['data']['au_name'];
            $res =  $this->get('crm_customer',['ctr_id,ctr_uid'],sprintf(" and ctr_id=%d",$ctrId),true);
            $ctrUid = $res['data']['ctr_uid'];
            if (!empty($conSerArr)) {
                $AdsPla = new AdsPla();
                //查询被删除的服务
                $res = $this->GetConSer(array('fsl_id', 'fsl_sve_id', 'fsl_des_id'), sprintf(" AND fsl_fct_id = %d AND fsl_id NOT IN (%s)", $conId, implode(',', array_keys($conSerArr))));
                if (!empty($res['data'])) {
                    $delSlid = array();
                    $DelDesid = array();
                    foreach ($res['data'] as $v) {
                        $delSlid[] = $v['fsl_id'];
                        if ($v['fsl_des_id'] > 0 && $v['fsl_sve_id'] == 7) $DelDesid[] = $v['fsl_des_id'];
                    }
                    $this->del('fad_link_fct_sve', sprintf(" AND fsl_id IN (%s)", implode(',', $delSlid)));
                }
                //查询已存在的服务
                $oldSer = [];
                $res = $this->GetConSer(array('fsl_id', 'fsl_sve_id', 'fsl_des_id','fsl_btime','fsl_etime'), sprintf(" AND fsl_fct_id = %d AND fsl_id IN (%s)", $conId, implode(',', array_keys($conSerArr))));
                if(!empty($res['data'])){
                    $oldSer = [];
                    foreach ($res['data'] as $key => $val) {
                        $oldSer[$val['fsl_id']] = $val;
                    }
                }
                $conArr['basic']['fct_money'] = 0;
                $force = false;
                foreach ($conSerArr as $k => $v) {
                    $v['fsl_btime'] = !empty($v['fsl_btime']) ? strtotime($v['fsl_btime']) : $time;
                    $v['fsl_etime'] = !empty($v['fsl_etime']) ? strtotime($v['fsl_etime']) : 0;
                    if ($v['fsl_etime'] < 0 || $v['fsl_etime'] < $v['fsl_btime']) {
                        $v['fsl_etime'] = 0;
                    }

                    $conArr['basic']['fct_money'] += $v['fsl_money'];

                    unset($v['ser_des']);
                    if ($k > 0) {
                        if ($v['fsl_sve_id'] != 7) {
                            $v['fsl_des_id'] = 0;
                        }
                        // else if($v['fsl_des_id'] > 0)
                        // {//删除
                        //     $Ads->DelAdsLink(' AND al_id='.$v['fsl_des_id']);

                        //     $v['fsl_des_id'] = 0;
                        // }
                        //时间变动、服务类型变动也改为强制变更状态
                        if($oldSer[$k]['fsl_btime']!=$v['fsl_btime']||$oldSer[$k]['fsl_etime']!=$v['fsl_etime']||$v['fsl_sve_id']!=$oldSer[$k])
                        {
                            $force = true;
                        }

                        $this->set('fad_link_fct_sve', $v, ' AND fsl_id=' . $k);
                        $pla_ser_link_id = $k;
                    } else {
                        $v['fsl_fct_id'] = $conId;
                        $res = $this->add('fad_link_fct_sve', $v);
                        $pla_ser_link_id = $res['data'];
                        $force = true;
                    }
                    if($v['fsl_des_id']>0 && $v['fsl_sve_id']==7){
                        $res = $AdsPla->get('pj_place_ads join pj_user_ads ON pla_ads_id = ads_id ',['*'],sprintf(" AND pla_id=%d", $v['fsl_des_id']),true);
                        if($res['data']){
                            $pla_ads_id = $res['data']['pla_ads_id'];
                            $adsData = [
                                'pla_con_id' => $conId,
                                'pla_ser_link_id' => $pla_ser_link_id??($res['data']['pla_ser_link_id']),
                                'pla_sales'=>$auName,
                                'pla_au_uid'=>$duc_usr_id
                            ];
                            $AdsPla->set('pj_place_ads', $adsData, sprintf(" AND pla_id=%d", $v['fsl_des_id']));
    
                            $adsArr = [
                                'ads_u_id'=>$ctrUid
                            ];
                            if ($res['data']['ads_show_style']=='im') {
                                $LibYpApi = new LibYpApi();
                                $res = $LibYpApi->get('user/getUserById', ['uid' => $ctrUid]);
                                $adsArr['ads_ims'] = json_encode(['uid' => $res['data']['u_id'], 'u_name' => $res['data']['u_name'], 'u_nickname' => $res['data']['u_nickname']], JSON_UNESCAPED_UNICODE);
                            } else {
                                $adsArr['ads_ims'] = '{}';
                            }
                            $AdsPla->set('pj_user_ads',$adsArr,sprintf(" AND ads_id=%d",$pla_ads_id));
                        }
                    }
                   
                }
            }

            if (!empty($conArr['pay'])) {
                foreach ($conArr['pay'] as $k => $v) {
                    if ($v['pay_money'] == 0) {
                        unset($conArr['pay'][$k]);
                    }
                }
                if($conArr['pay']){
                    $this->del('fad_pay_money', sprintf(" AND pay_fct_id = %d AND pay_id NOT IN (%s)", $conId, implode(',', array_keys($conArr['pay']))));
                    foreach ($conArr['pay'] as $k => $v) {
                        $v['pay_pay_time'] = strtotime($v['pay_pay_time']);
                        if ($k > 0) {
                            $this->set('fad_pay_money', $v, ' AND pay_id=' . $k);
                        } else {
                            $Arr = array('pay_fct_id' => $conId, 'pay_status' => 0, 'pay_create_time' => $time);
                            $this->add('fad_pay_money', array_merge($v, $Arr));
                        }
                    }
                }
               
               
            } else {
                $this->del('fad_pay_money', sprintf(" AND pay_fct_id = %d", $conId));
            }

            if (!empty($conArr['basic'])) {
                $this->set('fad_contract', $conArr['basic'], ' AND fct_id=' . $conId);
            }

            if ($conArr['basic']['fct_money'] != 0 ) {
                //如果有新增的项目就强制为待审核
                if($force){
                    $conArr['basic']['fct_status'] =0;  
                }
                $this->setConStatus($conId,false,$conArr['basic']['fct_status']??100);
            }

            //更新支付计划状态
            $table = 'fad_pay_money AS a 
            JOIN fad_contract AS b ON a.pay_fct_id = b.fct_id';
            $res = $this->get($table, array('pay_id'), ' AND pay_fct_id=' . $conId);
            $PayPlanArr = $res['data'];
            foreach ($PayPlanArr as $v) {
                $this->setPayPlanStatus($v['pay_id']);
            }
            $this->CRMDb->End();
            return LibFc::ReturnData(true);
        }
        return LibFc::ReturnData(false, 'SetOneContract 提供的参数不正确。');
    }

    public function getPayLnkByWhere($fieldArr, $where, $oneRow = false)
    {
        $table = 'fad_link_pay as a
			JOIN fad_contract as b ON a.fff_fct_id=b.fct_id
			JOIN fad_finance as c ON c.fae_id=a.fff_fae_id';
        $res = $this->get($table, $fieldArr, $where, $oneRow);
        return LibFc::ReturnData(true, $res['data']);
    }

    public function setPayPlanStatus($payId)
    {
        $payId = LibFc::Int($payId);
        if ($payId > 0) {
            $table = 'fad_pay_money AS a 
            JOIN fad_contract AS b ON a.pay_fct_id = b.fct_id';
            $res = $this->get($table, array('pay_money'), ' AND pay_id =' . $payId, true);
            if (!empty($res['data'])) {
                $PlanMoney = $res['data']['pay_money'];
                //查看客户这些付款计划付款情况
                $res = $this->getPayLnkByWhere(array('sum(fff_pay_money) as has_pay'), ' AND fff_pay_id=' . $payId, true);
                $HasPay = !empty($res['data']) ? sprintf('%.2f', $res['data']['has_pay']) : 0;
                $this->CRMDb->Begin();
                $status = ($PlanMoney - $HasPay) <= 0 ? 1 : 0;
                $this->set('fad_pay_money', array('pay_status' => $status), ' AND pay_id =' . $payId);
                $this->CRMDb->End();
                return LibFc::ReturnData(true, $status);
            }
        }
        return LibFc::ReturnData(false, '提供的计划付款ID不正确。');
    }

    /**
     * @param  [type] $conId
     * @param  bool   $isOk
     * @param  int $status 合同状态
     * @method 设置合同状态
     * @author zhengweihua 
     * @copyright 2024-02-23
     */
    public function setConStatus($conId, $isOk = false,$editStatus =100)
    {
        $conId = LibFc::Int($conId);
        if ($conId > 0) {
            $table = 'fad_contract AS a
            JOIN fad_link_fct_usr AS b ON a.fct_id=b.duc_fct_id
            JOIN crm_customer AS d ON d.ctr_id=a.fct_ctr_id';
            $res = $this->get($table, array('*'), sprintf(" AND fct_id =%d", $conId), true);
            if (!empty($res['data'])) {
                $conArr = $res['data'];
                $oldStatus = $conArr['fct_status'];

                if($editStatus ==100)
                {
                    //合同是否完成付款
                    $res = $this->getPayLnkByWhere(array('sum(fff_pay_money) as has_pay'), ' AND fff_fct_id=' . $conId, true);
                    $hasPay = (float) $res['data']['has_pay'];
                    if ($hasPay > 0 || $isOk) {
                        $conArr['fct_status'] = 1;
                        if (($conArr['fct_money'] - $hasPay) <= 0) {
                            $conArr['fct_status'] = 2;
                        }
                    }
                    if ($conArr['fct_money'] > 0 && $hasPay == 0 && $oldStatus == 2) {
                        $conArr['fct_status'] = 1;
                    }

                    if ($conArr['fct_money'] == 0 && $oldStatus == 1) $conArr['fct_status'] = 2;

                    $conArr['fct_status'] = $conArr['fct_status'] == 0 && $isOk ? 1 : $conArr['fct_status'];
                }else{
                    $conArr['fct_status'] = $editStatus;
                }
                
                $this->CRMDb->Begin();
                $setArr = array('fct_status' => $conArr['fct_status']);
                if ($oldStatus != $conArr['fct_status'] && ($conArr['fct_status'] == 1 || $isOk)) {
                    $setArr['fct_chk_user'] = $_SESSION['_username'];
                }
                $res = $this->set('fad_contract', $setArr, ' AND fct_id =' . $conId);

                if(in_array($editStatus,[-1,0]))
                {
                    $res = $this->get('fad_link_pay',['fff_fae_id'],sprintf(" AND fff_fct_id=%d",$conId)); 
                    if($res['data']){
                        $this->del('fad_link_pay',sprintf(" AND fff_fct_id=%d",$conId));
                        $faeIds =  array_column($res['data'],'fff_fae_id');
                        $this->set('fad_finance',['fae_status'=>0],sprintf(" AND fae_id IN (%s)",implode(',', $faeIds)));
                    } 
                    
                }

                $res = $this->get('fad_link_fct_sve', ['fsl_id'], sprintf(" AND fsl_fct_id=%d AND fsl_sve_id=7 AND fsl_des_id!=0", $conId));
                   
                if ($res['data']) {
                    //审核通过-更新广告状态
                    if ($conArr['fct_status'] >= 1) {
                        $pla_status = 1;
                    }else{
                        $pla_status = 0;
                    }
                    $fslArr = array_column($res['data'], 'fsl_id');
                    $AdsBase = new AdsBase();
                    $AdsBase->set('pj_place_ads', ['pla_status' => $pla_status], sprintf(" AND pla_status=0 AND pla_con_id = %d AND pla_ser_link_id IN (%s)", $conId, implode(',', $fslArr)));
                    //续费广告 自动驳回那些锁定的广告记录 start
                    $table = 'pj_place_ads 
                    LEFT JOIN pj_place_ads_time ON pat_pla_id = pla_id
                    LEFT JOIN pj_user_ads ON pla_ads_id = ads_id';
                    $res = $AdsBase->get($table,['*'],sprintf(" AND pla_con_id = %d AND pla_ser_link_id IN (%s)", $conId, implode(',', $fslArr)));
                    
                    foreach ($res['data'] as $key => $val) {
                        if(in_array($val['pla_pa_id'],[84,86])){

                            if($val['pat_modpc']){
                                //找是否是自己续费
                               $res2=  $AdsBase->get($table,['*'],sprintf(" AND pla_au_uid='%s' AND ads_u_id=%d AND pat_btime<%d AND pat_etime>%d AND pat_keyword='%s' AND pat_modpc=%d  AND pat_pc_id=%d",$val['pla_au_uid'],$conArr['ctr_uid'],time(),time(),$val['pat_keyword'],$val['pat_modpc'],$val['pat_pc_id']),true);
                               if($res2['data']){
                                    //找是否有其他人锁定
                                    $res3 = $this->get('crm_ads_lock',['*'],sprintf(" AND cal_check=1 AND cal_au_uid!=%d AND cal_pla_id=%d 
                                    AND cal_pa_id=%d AND cal_type='%s' AND cal_pc_id=%d",$conArr['duc_usr_id'],$res2['data']['pla_id'],$res2['data']['pla_pa_id'],'pc',$res2['data']['pat_pc_id']));
                                    if($res3['data']){
                                        $res3 = $this->set('crm_ads_lock',['cal_check'=>-1],sprintf(" AND cal_check=1 AND cal_au_uid!=%d AND cal_pla_id=%d 
                                    AND cal_pa_id=%d AND cal_type='%s' AND cal_pc_id=%d",$conArr['duc_usr_id'],$res2['data']['pla_id'],$res2['data']['pla_pa_id'],'pc',$res2['data']['pat_pc_id']));  
                                    }
                                }
                            }
                            if($val['pat_modcv']){
                                 //找是否是自己续费
                                $res2= $AdsBase->get($table,['*'],sprintf(" AND pla_au_uid='%s' AND ads_u_id=%d AND pat_btime<%d AND pat_etime>%d AND pat_keyword='%s' AND pat_modcv=%d  AND pat_pc_id=%d",$val['pla_au_uid'],$conArr['ctr_uid'],time(),time(),$val['pat_keyword'],$val['pat_modcv'],$val['pat_pc_id']),true);
                                if($res2['data']){
                                    $res3 = $this->get('crm_ads_lock',['*'],sprintf(" AND cal_check=1 AND cal_au_uid!=%d AND cal_pla_id=%d 
                                    AND cal_pa_id=%d AND cal_type='%s' AND cal_pc_id=%d",$conArr['duc_usr_id'],$res2['data']['pla_id'],$res2['data']['pla_pa_id'],'cv',$res2['data']['pat_keyword']));
                                    //找是否有其他人锁定
                                    if($res3['data']){
                                        $res3 = $this->set('crm_ads_lock',['cal_check'=>-1],sprintf(" AND cal_check=1 AND cal_au_uid!=%d AND cal_pla_id=%d 
                                    AND cal_pa_id=%d AND cal_type='%s' AND cal_pc_id=%d",$conArr['duc_usr_id'],$res2['data']['pla_id'],$res2['data']['pla_pa_id'],'cv',$res2['data']['pat_keyword']));   
                                    }
                                }
                            }
                        }else{
                            //找是否是自己续费
                            $res2=$AdsBase->get($table,['*'],sprintf(" AND pla_au_uid='%s' AND ads_u_id=%d AND pat_btime<%d AND pat_etime>%d AND pat_keyword='%s' AND pat_pc_id=%d",$val['pla_au_uid'],$conArr['ctr_uid'],time(),time(),$val['pat_keyword'],$val['pat_pc_id']),true);  
                            if($res2['data']){
                                $res3 = $this->get('crm_ads_lock',['*'],sprintf(" AND cal_check=1 AND cal_au_uid!=%d AND cal_pla_id=%d 
                                AND cal_pa_id=%d AND cal_type='%s' AND cal_pc_id=%d",$conArr['duc_usr_id'],$res2['data']['pla_id'],$res2['data']['pla_pa_id'],'all',$res2['data']['pat_pc_id']));
                                //找是否有其他人锁定
                                if($res3['data']){
                                    $res3 = $this->set('crm_ads_lock',['cal_check'=>-1],sprintf(" AND cal_check=1 AND cal_au_uid!=%d AND cal_pla_id=%d 
                                AND cal_pa_id=%d AND cal_type='%s' AND cal_pc_id=%d",$conArr['duc_usr_id'],$res2['data']['pla_id'],$res2['data']['pla_pa_id'],'all',$res2['data']['pat_pc_id']));   
                                }
                            }
                        }
                    }
                    //续费广告 自动驳回那些锁定的广告记录 end
                }
                $this->CRMDb->End();
                //变更客户状态
				$LibYpApi = new LibYpApi();
				$getArr = ['ctr_id'=>$conArr['ctr_id']];
				$res = $LibYpApi->Get('crm/initCtrStatus', $getArr, []);
                return LibFc::ReturnData(true, $conArr['fct_status']);
            }
        }
        return LibFc::ReturnData(false, '提供的合同ID不正确。');
    }

    public function autoSetConFileStatus($conId)
    {
        $conId = LibFc::Int($conId);
        if ($conId > 0) {
            $res =  $this->get('fad_contract_file', ['count(*) as count'], sprintf(' AND fcf_iscon = 1 AND fcf_fct_id=%d', $conId), true);
            $count = (int) $res['data']['count'];
            $dataArr['fct_has_con_file'] = $count > 0 ? 1 : 0;
            $this->CRMDb->Begin();
            $this->set('fad_contract', $dataArr, ' and fct_id=' . $conId);
            $this->CRMDb->End();
            return LibFc::ReturnData(true, $dataArr['fct_has_con_file']);
        }
        return LibFc::ReturnData(false, 'AutoSetConFileStatus提供的客户ID不正确。');
    }


    public function getConSer($fieldArr = ['*'], $where = '')
    {

        $table = 'fad_link_fct_sve AS a
        JOIN fad_service AS b ON b.sve_id = a.fsl_sve_id
        JOIN fad_contract AS c ON c.fct_id = a.fsl_fct_id
        JOIN fad_link_fct_usr AS d ON a.fsl_fct_id=d.duc_fct_id
        JOIN crm_customer AS e ON e.ctr_id=c.fct_ctr_id';

        $res =  $this->get($table, $fieldArr, $where);
        return LibFc::ReturnData(true, $res['data']);
    }

    public function getContract($fieldArr, $where, $oneRow = false)
    {
        $table = 'fad_contract AS a
				JOIN fad_link_fct_usr AS b ON a.fct_id=b.duc_fct_id
				JOIN crm_customer AS d ON d.ctr_id=a.fct_ctr_id
                LEFT JOIN crm_customer_admin AS c ON b.duc_usr_id=c.cca_au_uid AND a.fct_ctr_id=c.cca_ctr_id AND c.cca_level_id = 5';
        $res = $this->get($table, $fieldArr, $where, $oneRow);
        return LibFc::ReturnData(true, $res['data']);
    }

    public function delFinance($aFae)
    {
        $aFae = LibFc::Int($aFae);
        if ($aFae > 0) {
            $table = 'fad_finance AS a
			JOIN crm_customer AS c ON c.ctr_id = a.fae_ctr_id
			LEFT JOIN fad_contract AS d ON d.fct_id = a.fae_fct_id';
            $Res = $this->get($table, array('fae_status', 'fae_ctr_id', 'fae_fct_id'), sprintf(' AND fae_id=%d', $aFae), true);
            $FaeArr = $Res['data'];
            if (empty($FaeArr)) {
                return LibFc::ReturnData(true, '删除成功~ DelFinance');
            }

            # 开启事物
            $this->CRMDb->Begin();

            $Res = $this->getPayLnkByWhere(array('fff_pay_id', 'fff_pay_money'), ' AND fff_fae_id=' . $aFae);
            $PayIdArr = array();
            foreach ($Res['data'] as $V) {
                if ($V['fff_pay_money'] > 0) {
                    $PayIdArr[$V['fff_pay_id']] = $V['fff_pay_id'];
                }
            }
            if (!empty($PayIdArr)) {
                $this->set('fad_pay_money', array('pay_status' => 0), sprintf(" and pay_id IN (%s)", implode(',', $PayIdArr)));
            }

            # 删除打款记录
            $res =  $this->del('fad_finance', sprintf(" and fae_id in (%s)", $aFae));

            if (false == $res['status']) {
                return LibFc::ReturnData(false, '删除失败~ DelFinance');
            }

            # 删除余额记录
            $res =  $this->del('fad_ctr_spare_money', sprintf(" and clp_fae_id in (%s)", $aFae));

            if (false == $res['status']) {
                return LibFc::ReturnData(false, '删除失败~ DelFinance');
            }

            $this->setConStatus($FaeArr['fae_fct_id']);

            $this->CRMDb->End();
            return LibFc::ReturnData(true, '删除成功~ DelFinance');
        }
        return LibFc::ReturnData(false, '传入参数失败~DelFinance');
    }

    public function delContract($conId, $Flag = false)
    {
        $conId = LibFc::Int($conId);
        if ($conId > 0) {
            if (!$Flag) {
                $Res = $this->getPayLnkByWhere(array('sum(fff_pay_money) as has_pay'), ' AND fff_fct_id=' . $conId, true);
                $HasPay = (float) $Res['data']['has_pay'];
                if ($HasPay > 0) {
                    return LibFc::ReturnData(false, '合同ID:' . $conId . '已经有成功支付记录，不允许删除');
                }
            }

            $Res = $this->getContract(array('fct_ctr_id', 'duc_usr_id'), ' AND fct_id =' . $conId, true);
            $ConCtr  = $Res['data'];

            # 开启事物
            $this->CRMDb->Begin();

            //是否使用余额付款
            $table = 'fad_finance AS a
			JOIN crm_customer AS c ON c.ctr_id = a.fae_ctr_id
			LEFT JOIN fad_contract AS d ON d.fct_id = a.fae_fct_id';
            $Res = $this->get($table, array('fae_id'), sprintf(' AND fae_fct_id=%d', $conId));
            $faeIdArr = array();
            foreach ($Res['data'] as $V) {
                $this->delFinance($V['fae_id']);
            }

            # 删除广告
            $AdsPla = new AdsPla();
            $AdsPla->del('pj_place_ads', sprintf(" and pla_con_id in (%s)", $conId));
            # 删除关联业务员
            $sUsrWhere = sprintf(' and duc_fct_id in (%s)', $conId);
            $aDelUsr   = $this->del('fad_link_fct_usr', $sUsrWhere);
            if (false == $aDelUsr['status']) {
                return LibFc::ReturnData(false, $aDelUsr['data']);
            }

            # 删除合同关联服务明细
            $sSveWhere = sprintf(' and fsl_fct_id in (%s)', $conId);
            $aDelSve   = $this->del('fad_link_fct_sve', $sSveWhere);
            if (false == $aDelSve['status']) {
                return LibFc::ReturnData(false, $aDelSve['data']);
            }

            # 删除合同计划还款
            $sPayWhere = sprintf('and pay_fct_id in (%s)', $conId);
            $aDelPay   = $this->del('fad_pay_money', $sPayWhere);
            if (false == $aDelPay['status']) {
                return LibFc::ReturnData(false, $aDelPay['data']);
            }

            # 删除合同还款明细
            $sLnkWhere = sprintf('and fff_fct_id in (%s)', $conId);
            $aDelPayLnk = $this->del('fad_link_pay', $sLnkWhere);
            if (false == $aDelPayLnk['status']) {
                return LibFc::ReturnData(false, $aDelPayLnk['data']);
            }

            $res = $this->del('fad_contract', sprintf(" and fct_id in (%s)", $conId));

            if (false == $res['status']) {
                return LibFc::ReturnData(false, '删除失败~ DelContract');
            }
            $res = $this->del('fad_finance', sprintf(" and fae_fct_id in (%s)", $conId));

            if (false == $res['status']) {
                return LibFc::ReturnData(false, '删除失败~ DelContract');
            }

            $CrmContract = new CrmContract();
            $CrmContract->delCon([], ' AND fcf_fct_id =' . $conId, 2);            
            $this->CRMDb->End();
            return LibFc::ReturnData(true, '删除成功~ DelContract');
        }
        return LibFc::ReturnData(false, '传入参数失败~DelContract');
    }

    public function getFinance($fieldArr, $where, $oneRow = false)
    {
        $table = 'fad_finance AS a
        Left JOIN ypb2c.an_user AS b ON b.au_uid = a.fae_create_usr_id
        JOIN crm_customer AS c ON c.ctr_id = a.fae_ctr_id
        LEFT JOIN fad_contract AS d ON d.fct_id = a.fae_fct_id';
        $res = $this->get($table, $fieldArr, $where, $oneRow);
        return LibFc::ReturnData(true, $res['data']);
    }

    public function getPayMoney($fieldArr, $where, $oneRow = false)
    {
        $table =  'fad_pay_money AS a 
        JOIN fad_contract AS b ON a.pay_fct_id = b.fct_id';
        $res = $this->get($table, $fieldArr, $where, $oneRow);
        return LibFc::ReturnData(true, $res['data']);
    }

    public function addPayMoney($dataArr)
    {
        $Res = $this->getContract(array('fct_money', 'duc_usr_id'), ' AND fct_id=' . $dataArr['fae_fct_id'], true);
        if (empty($Res['data'])) {
            return LibFc::ReturnData(false, '合同不存在！');
        }
        $dataArr['fae_create_usr_id'] = $Res['data']['duc_usr_id'];
        if (isset($dataArr['fae_spare_money'])) {
            //合同金额 计算剩余款
            $ConMoney = $Res['data']['fct_money'];
            if ($dataArr['fae_spare_money'] > $ConMoney) {
                return LibFc::ReturnData(false, '余额支付款比合同款多，请重新申请付款！');
            }
        }

        $res = $this->add('fad_finance', $dataArr);
        return LibFc::ReturnData(true, $res['data']);
    }

    public function chkApplyPay($faeId)
    {
        $faeId = LibFc::Int($faeId);
        if ($faeId > 0) {
            $Res = $this->getFinance(array('fae_id', 'fae_ctr_id', 'fae_fct_id', 'fae_text', 'fae_money', 'fae_spare_money'), ' AND fae_id=' . $faeId, true);
            if (!empty($Res['data'])) {
                $FaeArr = $Res['data'];

                //合同金额 计算剩余款
                $Res = $this->getContract(array('fct_money','fct_status'), ' AND fct_id=' . $FaeArr['fae_fct_id'], true);
                if (empty($Res['data'])) {
                    return LibFc::ReturnData(false, '合同不存在！');
                }
                if($Res['data']['fct_status']<1){
                    return LibFc::ReturnData(false, '请先审核合同');
                }
                $ConMoney = $Res['data']['fct_money'];

                //未完成的客户付款计划
                $Res = $this->getPayMoney(array('pay_id', 'pay_fct_id', 'pay_money'), ' AND pay_fct_id=' . $FaeArr['fae_fct_id'] . ' AND pay_status < 1 ORDER BY pay_pay_time');
                $PayPlanArr = array();
                foreach ($Res['data'] as $V) {
                    $PayPlanArr[$V['pay_id']] = $V;
                }

                if (!empty($PayPlanArr)) {
                    //查看客户这些付款计划付款情况
                    $Res = $this->getPayLnkByWhere(array('fff_pay_id', 'fff_pay_money'), sprintf(" AND fff_pay_id IN (%s)", implode(',', array_keys($PayPlanArr))));
                    foreach ($Res['data'] as $V) {
                        $PayPlanArr[$V['fff_pay_id']]['pay_money'] -= $V['fff_pay_money'];
                    }
                }

                $this->CRMDb->Begin();
                $PayMoneyTotal = 0;


                //打款支付
                if ($FaeArr['fae_money'] > 0) {
                    $TempPayMoney = $FaeArr['fae_money'];
                    foreach ($PayPlanArr as $K => $V) {
                        if ($V['pay_money'] <= 0) {
                            continue;
                        }
                        $TempPayMoney -= $V['pay_money'];
                        $NeedPay = $TempPayMoney < 0 ? $TempPayMoney + $V['pay_money'] : $V['pay_money'];
                        if ($NeedPay > 0) {
                            $PayMoneyTotal += $NeedPay;
                            $DataArr = array('fff_fct_id' => $V['pay_fct_id'], 'fff_fae_id' => $FaeArr['fae_id'], 'fff_pay_id' => $V['pay_id'], 'fff_pay_money' => $NeedPay, 'fff_remark' => $FaeArr['fae_remark'],'fff_pay_time'=>time());
                            $this->add('fad_link_pay', $DataArr);
                        }
                        if ($TempPayMoney <= 0) {
                            break;
                        }
                    }
                }

                $ConArr = array();
                foreach ($PayPlanArr as $K => $V) {
                    $this->setPayPlanStatus($K);
                    $ConArr[$V['pay_fct_id']] = $V['pay_fct_id'];
                }
                foreach ($ConArr as $V) {
                    $this->setConStatus($V);
                }

                $this->setFinanceStatus($faeId);


                $this->CRMDb->End();
                return LibFc::ReturnData(true);
            }
        }
        return LibFc::ReturnData(false, '提供的付款ID不正确。');
    }

    public function setFinanceStatus($FaeId)
    {
        $FaeId = LibFc::Int($FaeId);
        if ($FaeId > 0) {
            $Res = $this->getFinance(array('fae_money', 'fae_status', 'fae_spare_money', 'fae_fct_id'), ' AND fae_id=' . $FaeId, true);
            if (!empty($Res['data'])) {
                $FaeArr = $Res['data'];
                $Res = $this->getPayLnkByWhere(array('sum(fff_pay_money) as use_money'), sprintf(" AND fff_fae_id=%d", $FaeId));
                $SumMoney = (float) $Res['data'][0]['use_money'];
                if ($SumMoney > 0) { //该款有使用，证明$Status = 1
                    $FaeArr['fae_status'] = 1;
                }
                $this->CRMDb->Begin();
                $this->set('fad_finance', array('fae_status' => $FaeArr['fae_status']), 'AND  fae_id=' . $FaeId);
                $this->CRMDb->End();
                return LibFc::ReturnData(true);
            }
        }
        return LibFc::ReturnData(false, '提供的付款ID不正确。');
    }

    /**
     * @param  int $conId
     * @method 检测广告位是否存在冲突
     * @author zhengweihua 
     * @copyright 2024-03-14
     */
    public function chkAdsConflict($conId)
    {
        $table = 'fad_link_fct_sve join fad_contract on fct_id=fsl_fct_id';
        $sveres = $this->get($table, ['*'], sprintf(" AND fct_id=%d AND fsl_sve_id =%d", $conId, 7));
        if ($sveres['data']) 
        {
            $arr = array_column($sveres['data'], 'fsl_des_id');
            //获取当前广告关联的广告位信息
            $AdsBase = new AdsBase();
            $table = 'pj_place_ads 
            join pj_place on pa_id = pla_pa_id
            join pj_place_ads_time on pat_pla_id=pla_id
            join pj_user_ads on pla_ads_id = ads_id';
            $res = $AdsBase->get($table, ['*'], sprintf(" and pla_id in (%s)", implode(',', $arr)));
            $errorArr = [];
            foreach ($res['data'] as $val) 
            {	
                $hasres = $AdsBase->get($table, ['*'], sprintf(" and pla_status!=-1 and pla_id!=%d and pla_pa_id=%d and pat_keyword=%d 
                and pat_pc_id=%d and pat_etime>%d order by pal_shoufei ASC",$val['pla_id'],
                $val['pla_pa_id'],$val['pat_keyword'],$val['pat_pc_id'],time()));	

                //是否超额度
                if ($val['pa_max'] == 1) {

                    foreach ($hasres['data'] as $kk => $vv) {
                        $result =  $this->timePeriodsOverlap($vv['pat_btime'],$vv['pat_etime'],$val['pat_btime'],$val['pat_etime']);
                        if (in_array($val['pla_pa_id'], [84, 86])) {
                            
                            if($val['pat_modcv'] && $vv['pat_modcv'] && $result){
                                $errorArr[$val['pla_id']] = '业务员:'.$vv['pla_sales'].'-'.$vv['ads_name'];
                            }	
                            if($val['pat_modpc'] && $vv['pat_modpc'] && $result ){
                                $errorArr[$val['pla_id']] = '业务员:'.$vv['pla_sales'].'-'.$vv['ads_name'];
                            }	
                        }else{
                            if($result){
                                $errorArr[$val['pla_id']] = '业务员:'.$vv['pla_sales'].'-'.$vv['ads_name'];
                            }	
                        }
                    }
                
                } elseif($val['pa_max']>1) {
    
                    //已上架广告
                    $currentAds = [];
                    //预上架广告
                    $preAds = [];
                    foreach ($hasres['data'] as $vv) 
                    {
                        if($vv['pat_btime']>time()){
                            $preAds[] = $vv;
                        }else{
                            $currentAds[] = $vv;   
                        }
                    }
                    $conflicts = [];
                    //如果当前广告是待上的
                    if ($val['pat_btime'] > time()) {
                        foreach ($preAds as $vv) {
                            $result = $this->timePeriodsOverlap($vv['pat_btime'],$vv['pat_etime'],$val['pat_btime'],$val['pat_etime']);
                            if($result){
                                $conflicts[] = $vv;
                            }
                        } 
                    }else{
                        foreach ($currentAds as $vv) {
                            $result = $this->timePeriodsOverlap($vv['pat_btime'],$vv['pat_etime'],$val['pat_btime'],$val['pat_etime']);
                            if($result){
                                $conflicts[] = $vv;
                            }
                        }
                    }

                    if (count($conflicts) + 1 > $val['pa_max']) {
                       
                        usort($conflicts, function($a, $b) {
                            return $a['pal_shoufei'] == -1 ? ($b['pal_shoufei'] == -1 ? 0 : -1) : 1;
                        });
                        $errorArr = [];
                        foreach ($conflicts as $vv) {
                            $errorArr[] = '业务员:'.$vv['pla_sales'].'-'.$vv['ads_name'];
                        }
                    }  
                }
            }
            if($errorArr){
                return LibFc::ReturnData(false,'<span class="red">'.implode("<br/>", $errorArr)."</span><br />时间冲突,请通知业务员及时调整!");
            }
        }
        return LibFc::ReturnData(true,[]);
    }

    /**
     * @param  int $start1 时间段1开始
     * @param  int $end1 时间段2结束
     * @param  int $start2 时间段2开始
     * @param  int $end2 时间段2结束
     * @method 判断两个时间段是否存在交叉重叠
     * @author zhengweihua 
     * @copyright 2024-07-10
     */
    public function timePeriodsOverlap($start1, $end1, $start2, $end2)
    {
        // 如果时间段2的开始时间在时间段1的开始时间和结束时间之间，则重叠
        if ($start2 >= $start1 && $start2 <= $end1) {
            return true;
        }
        // 如果时间段2的结束时间在时间段1的开始时间和结束时间之间，则重叠
        else if ($end2 >= $start1 && $end2 <= $end1) {
            return true;
        }
        // 如果时间段1完全包含时间段2，则重叠
        else if ($start1 <= $start2 && $end1 >= $end2) {
            return true;
        }
        // 如果时间段2完全包含时间段1，则重叠
        else if ($start2 <= $start1 && $end2 >= $end1) {
            return true;
        }

        return false;
    }

    /**
     * @param  Array 客户ctr_id $ctrArr
     * @param  int 业务员au_id $ctrYwy
     * @method 变更客户的归属业务员
     * @author zhengweihua 
     * @copyright 2025-07-04
     */
    public function changeCtrYwy($uid,$ctrArr,$ctrYwy)
    {
      
        $table = 'crm_customer_admin';
        $ctrIds = implode(',', $ctrArr);
        $res = $this->get($table,['cca_ctr_id,cca_au_uid,cca_id'],sprintf(" AND cca_ctr_id IN (%s)",$ctrIds));
        if($res['data'])
        {       
            $exitsArr = array_column($res['data'],'cca_au_uid','cca_ctr_id');
            $this->CRMDb->Begin();
            
            $newIds = implode(',',array_column($res['data'],'cca_id'));
            $res = $this->set('crm_customer_admin', ['cca_au_uid' => $ctrYwy], sprintf(" AND cca_id IN (%s)",$newIds));

            if($res['status'])
            {
                foreach ($exitsArr as  $ctr_id=> $au_id) {
                    $this->add('crm_customer_logs', [
                        'ccl_ctr_id' => $ctr_id,
                        'ccl_type' => 'set',
                        'ccl_remark' => '客户更改业务员：'.$au_id.' 变更为 '.$ctrYwy,
                        'ccl_by_uid' => $uid,
                        'ccl_atime'=>time(),
                    ]);
                }
                
            }else{
                LibFc::ReturnData(false,'变更失败');
            }
            $this->CRMDb->End();

            return LibFc::ReturnData(true,$res['data']);
            
        }else{
            LibFc::ReturnJson(true);
        }
    }
}
