<?php
namespace model\wdzy;
use model\rcaApi;
use model\wdzy;
use CURLFile;
use model\wdzy\factory;
use PhpOffice\PhpSpreadsheet\IOFactory;

class resource extends wdzy
{   
    public $table = 'resource';
    public $key = 'Id';
    /**
     * @param  [type] $params
     * @param  array  $rules
     * @method 通过接口获取资源列表数据
     * @author zhengweihua 
     * @copyright 2025-07-14
     */
    public function getListByApi($params, $rules = [])
	{   
        $filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];
		$this->joinWhere = [];
       
        $postArr =[ 
            'pageIndex'=>$page,
            'pageSize'=>$pagesize,
        ];
        foreach ($params as $field => $val) {
            switch ($field) {
                case 'states':
                    $postArr['states'] = $val;
                    break;
                case 'fileName':
                    $postArr['fileName'] = $val;
                    break;
                case 'supplierName':
                    $postArr['supplierName'] = $val;
                    break;
            }
        }
    
        $rcaApi =  new rcaApi();
        $res = $rcaApi->Get('resources/paging',[],$postArr);
        $arr = [];
        if($res['data'])
        {
            $data = $res['data'];
            $arr['page'] = $page;
            $arr['total'] = ceil($res['totalCount']/$pagesize);
            $arr['records'] = $data['totalCount'];
           
            //处理时间
            foreach ($data['items'] as &$row) {
                $row['resourceProvideTime'] = strtotime($row['resourceProvideTime']) ? date('Y-m-d H:i:s',strtotime($row['resourceProvideTime'])) : '';
            }  
            unset($row);
            $arr['rows'] = $data['items'] ?? [];
        }
		return $arr;
	}

    /**
     * @param  [type] $params
     * @param  array  $rules
     * @method  获取资源列表数据
     * @author zhengweihua 
     * @copyright 2025-07-14
     */
    public function getList($params, $rules = [])
    {
        $filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'desc': $params['sord'];
		$orderby = $params['orderby']?$params['orderby']:'r.CreationTime desc';
		$this->joinWhere = [];
        
        $refiled = [
			
			'CreationTime'=>'r.CreationTime',
			
		];
		$this->set('refiled', $refiled);
		$sidx =  strtr($sidx, $refiled);
      
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr( $field, $this->get('refiled'));
            if($field == 'Id'){
                $field = 'r.Id';
            }
            if($field=='ResourceProviderName'){
                $field = 'user.Name';
            }
            if($field=='CreatorName'){
                $field = 'user1.Name';
            }
            if($field=='ResourceFactoryName'){
                $field = 'fac.Name';
            }
            if($field=='FileName'){
                $field = 'r.FileName';
            }
            if($field=='Remark'){
                $field = 'r.Remark';
            }
            if($field=='ResourceStateDesc'){
                
                $resourceStateArr = [
                    1=>[0, 10, 100],
                    2=>[11, 99, 101],
                    3=>[4, 5, 97, 98, 195, 196, 197, 198],
                    4=>[199],
                    5=>[2,3]
                ];
                if($resourceStateArr[$data])
                {   
                    $field = 'r.ResourceState';
                    $data =  $resourceStateArr[$data];
                }
            }
            if($field=='DataDisableStatusDesc'){
                if($data == 3)
                {   
                    $data = raw('DataDisableStatus not in (1,2)');
                    $op = 'RAW_'.$field.$op;
                }elseif ($data) {
                    $field = 'DataDisableStatus';
                }
            }
            if($field =='FacCode'){
                $factory  = new factory();
                $factoryIds = $factory->db->select('factory','fac_resource_facid',['fac_code'=>$data]);
                $data = raw(sprintf("`r`.ResourceFactoryId IN ('%s')",($factoryIds?implode("','",$factoryIds):0)));
                $op = 'RAW_'.$field.$op;
            }
        });
       
        $factory  = new factory();
        $facids = $factory->db->select('factory','fac_resource_facid',['fac_resource_facid[!]'=>null]);
        if($facids){
            $where['r.ResourceFactoryId'] = $facids;
        }
        
        if($params['FacCode']){
            $factoryIds = $factory->db->select('factory','fac_resource_facid',['fac_code'=>$params['FacCode']]);
            $where['#RAW ResourceFactoryId'] = raw(sprintf("`r`.ResourceFactoryId IN ('%s')",($factoryIds?implode("','",$factoryIds):0)));
        }

        if(\mvc::$cfg['RCAAPI']['tenantId']){
            $where['r.TenantId'] = \mvc::$cfg['RCAAPI']['tenantId'];
        }

        $where['r.isDeleted'] = 0;
        $table = 'resource(r)';
        $join = [
            '[><]resourcefactory(fac)'=>['r.ResourceFactoryId'=>'Id'],
            '[>]file'=>['r.FileId'=>'Id'],
            '[>]abpusers(user)'=>['r.ResourceProviderId'=>'Id'],
            '[>]abpusers(user1)'=>['r.CreatorId'=>'Id']
        ];

        if(!empty($this->joinWhere)){
			$where = array_merge($where, $this->joinWhere);
		}
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
	
		if($page>0 && $pagesize>0){
			$pages = $this->paging($table,$join, '*',$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
        $fields = ['r.*','file.RelativePath(RelativePath)','fac.Name(ResourceFactoryName)','user.Name(ResourceProviderName)','user1.Name(CreatorName)'];  
        $arr = $this->db->select($table,$join,$fields,$where);
       
       
        if($arr)
        {
            $resourceIds = array_column($arr,'Id');
            //查图片数量
            $picCntArr = $this->db->select('resourcepicture',['counts'=>raw('count(*)'),'ResourceId'],['ResourceId'=>$resourceIds,'GROUP'=>'ResourceId']);
            $picCntArr = array_column($picCntArr,'counts','ResourceId');
            //查清洗数据
            $join = [
                '[><]resourcenumber(num)'=>['ncr.ReplaceNumber'=>'FormatNumber'],
                '[><]resource(r)'=>['num.ResourceId'=>'Id']
            ];
            $cleanArr = $this->db->select('numbercleanresult(ncr)',$join,['num'=>raw('count(*)'),'r.Id'],['num.ResourceId'=>$resourceIds,'GROUP'=>'num.ResourceId']);
           
            $cleanArr = $cleanArr?array_column($cleanArr,'num','Id'):[];

            //查当前系统的工厂编码
            $facids = array_column($arr,'ResourceFactoryId');
            $facres = $factory->db->select('factory',['fac_code','fac_resource_facid'],['fac_resource_facid'=>$facids]);
            $facCodeArr =$facres? array_column($facres,'fac_code','fac_resource_facid'):[];
            //另外查号码数量
            $numArr = $this->db->select('resourcenumber',['counts'=>raw('count(distinct Number)'),'ResourceId'],['ResourceId'=>$resourceIds,'GROUP'=>['ResourceId']]);
            $numArr = $numArr?array_column($numArr,'counts','ResourceId'):[];
            $resourceStateArr = [
                '待解析'=>[0, 10, 100],
                '解析中'=>[11, 99, 101],
                '解析异常'=>[4, 5, 97, 98, 195, 196, 197, 198],
                '解析完成'=> [199],
                '已删除'=>[2,3]
            ];
            $DataDisableStatusArr = [
                1=> '已禁用',
                2=> '已启用',
            ];
            foreach ($arr as $key => &$row) {
                $row['FacCode'] = $facCodeArr[$row['ResourceFactoryId']] ?? '';
                $row['NumberCount'] = $numArr[$row['Id']]?:'';
                $row['NumberCleanCount'] = $cleanArr[$row['Id']]?$cleanArr[$row['Id']]:0;
                $row['NumberCleanRateDes'] = $row['NumberCount']?round($row['NumberCleanCount']/$row['NumberCount'],4) *100 .'%':'';
                $row['ResourceProvideTime'] = $row['ResourceProvideTime']?date('Y-m-d H:i:s',strtotime($row['ResourceProvideTime'])):'';
                $row['CreationTime'] = strtotime($row['CreationTime']) ? date('Y-m-d H:i:s',strtotime($row['CreationTime'])) : '';
                $row['PictureCount'] = $picCntArr[$row['Id']] ? $picCntArr[$row['Id']] : '';
                $row['captions']['ResourceState'] = '';
                foreach ($resourceStateArr as  $label=>$states) {
                    if (in_array($row['ResourceState'], $states)) {
                        $row['captions']['ResourceStateDesc'] = $label;    
                        break;
                    }
                }
                $row['captions']['DataDisableStatusDesc'] = $DataDisableStatusArr[$row['DataDisableStatus']]?:"启用中";
            }
            unset($row);
        }
        $data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
    }

    /**
     * @param  Array $params
     * @param  array  $files 废弃
     * @method 创建资源库
     * @author zhengweihua 
     * @copyright 2025-07-16
     */
    public function createResource($params,$files = [])
    {           
        if(!$params['relativePath']) exitJson(-1,'请先上传文件');
        if(!$params['resourceFactoryId']) exitJson(-1,'请选择资源厂家');
        $rcaApi =  new rcaApi();
       
        //调接口获取文件etag
        $sssdata = ['CosKey' => $params['relativePath']];
        //这里是POST请求，header里加Content-Type: application/json无返回数据
        $tagArr = $rcaApi->Get('tencentcos/getobjectetag?'.http_build_query($sssdata),[],['is_form'=>1]);
        if(!isset($tagArr['data']['eTag'])||!$tagArr['data']['eTag']) exitJson(-1,'获取文件etag失败:'.$tagArr['message']);
        $user = new user();
        $resourceProviderId = $user->getApbUserId($params['au_id']);
        //调接口创建资源
        $postArr = [
            "blobType"=>2,
            "relativePath"=>$params['relativePath'],
            "fileName"=>$params['fileName'],
            "fileCrc"=>$tagArr['data']['crc64ecma'] ?? '',
            "eTag"=>$params['eTag'] ?? '',
            "fileSize"=>$params['fileSize'],
            'fiexedPartNameValue'=>$params['fiexedPartNameValue'],
            'headerRowNumber'=>$params['headerRowNumber'] ?? 1,
            "numColumnNumbers"=>$params['colcfg']['numColumnNumbers'] ?implode(',',$params['colcfg']['numColumnNumbers']) :'',
            "partNameColumnNumbers"=>$params['colcfg']['partNameColumnNumbers'] ?implode(',',$params['colcfg']['partNameColumnNumbers']) :'',
            "vehicleColumnNumbers"=>$params['colcfg']['vehicleColumnNumbers'] ?implode(',',$params['colcfg']['vehicleColumnNumbers']) :'',
            "engineColumnNumbers"=>$params['colcfg']['engineColumnNumbers'] ?implode(',',$params['colcfg']['engineColumnNumbers']) :'',
            "makeNameColumnNumbers"=>$params['colcfg']['makeNameColumnNumbers'] ?implode(',',$params['colcfg']['makeNameColumnNumbers']) :'',
            "priceColumnNumbers"=>$params['colcfg']['priceColumnNumbers'] ?implode(',',$params['colcfg']['priceColumnNumbers']) :'',
            "factoryNumberColumnNumbers"=>$params['colcfg']['factoryNumberColumnNumbers'] ?implode(',',$params['colcfg']['factoryNumberColumnNumbers']) :'',
            "remarkColumnNumbers"=>$params['colcfg']['remarkColumnNumbers'] ?implode(',',$params['colcfg']['remarkColumnNumbers']) :'',
            "remark"=>$params['remark'] ?? '',
            "resourceFactoryId"=>$params['resourceFactoryId'],
            "resourceProviderId"=>$resourceProviderId,
            "resourceProvideTime"=>$params['resourceProvideTime']
        ];
        $arr = $rcaApi->Get('resources/create',[],$postArr);
        //更新下接口不提供的字段
        $params['re_au_id'] = $params['re_au_id'] ?:getOpuser();
        $CreatorId = $user->getApbUserId($params['re_au_id']);
        $data = [
            "CreatorId"=>$CreatorId,
            "CreationTime"=>getNowTime(),
        ];
        $res = $this->db->update('resource',$data,['Id'=>$arr['data']['id']]);
        return $arr['data'];
    }

    /**
     * @param  string $id
     * @param  Array $params
     * @method 更新资源库
     * @author zhengweihua 
     * @copyright 2025-07-16
     */
    public function updateResource($id,$params)
    { 
        $arr = $this->db->get('resource','*',['Id'=>$id]);
        if(!$arr) return [];
        $params['re_au_id'] = $params['re_au_id'] ?:getOpuser();
       
        $arr['ExtraProperties'] = json_decode($arr['ExtraProperties'],true);
        $arr['ExtraProperties']['FiexedPartNameValue'] = $params['fiexedPartNameValue'] ?? '';
        //更新下接口不提供的字段
        $user = new user();
        $CreatorId = $user->getApbUserId($params['re_au_id']);
        $resourceProviderId = $user->getApbUserId($params['au_id']);
        $data = [
            "CreatorId"=>$CreatorId,
            "LastModifierId"=>$CreatorId,
            "Remark"=>$params['remark'] ?? '',
            "ResourceFactoryId"=>$params['resourceFactoryId'],
            "ResourceProvideTime"=>$params['resourceProvideTime'],
            "ExtraProperties"=>json_encode($arr['ExtraProperties']),
            "LastModificationTime"=>getNowTime(),
            "resourceProviderId"=>$resourceProviderId
        ];
        $this->db->update('resource',$data,['Id'=>$id]);
        return ['id'=>$id];
    }

    /**
     * @param  string $id
     * @method 获取详情
     * @author zhengweihua 
     * @copyright 2025-07-16
     */
    public function getDetail($id)
    {
        if(empty($id)) return [];

        $table = 'resource(r)';
        $join = [
            '[><]resourcefactory(fac)'=>['r.ResourceFactoryId'=>'Id'],
            '[>]file'=>['r.FileId'=>'Id'],
            '[>]abpusers(user)'=>['r.ResourceProviderId'=>'Id'],
            '[>]abpusers(user1)'=>['r.CreatorId'=>'Id']
        ];
        $res = $this->db->get($table,$join,['r.*','fac.Name(resourceFactoryName)','user.Name(resourceProviderName)','user1.Name(creatorName)'],['r.Id'=>$id]);

        if($res)
        {   
            $data = [];
            
            if($res['ExtraProperties'])
            {
                $res = array_merge($res, json_decode($res['ExtraProperties'],true));
            }

            foreach ($res as $field => $val) {
                $data[lcfirst($field)] = $val;
            }
            //查询本地的user
            $user = new user();
            $data['au_id'] = $user->getAbpUserName($data['resourceProviderId']);
            $data['resourceProvideTime'] = strtotime($data['resourceProvideTime']) ? date('Y-m-d H:i:s',strtotime($data['resourceProvideTime'])) : '';
            if($data['creatorId'])
            {
                $data['re_au_id'] = $user->getAbpUserName($data['creatorId']);
            }
          
            $inputFileName = $data['fileName'];
            //获取一下列头
            $titleArr = [];
            if(in_array(pathinfo($inputFileName, PATHINFO_EXTENSION), ['xlsx', 'xls'])){
                $extData = $this->db->get('resourcedata','ExtraProperties',['ResourceId'=>$id]);
                if($extData){
                    $extraProperties = json_decode($extData,true);
                    $titleArr = array_keys($extraProperties['RowData'][0]);
                }  
            }
            $data['titleArr'] =  $titleArr;
        }
        return $data;
    }  

    /**
     * @param  [type] $params
     * @method 快照列表
     * @author zhengweihua 
     * @copyright 2025-07-15
     */
    public function getSnapShotList($params)
    {
        $filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'desc': $params['sord'];
		$orderby = $params['orderby']?$params['orderby']:'r.CreationTime desc';
		$this->joinWhere = [];
        $join = [
            '[><]file'=>['r.FileId'=>'Id'],
        ];
        $where = [];
        
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
        });
    
        if($params['id']){
            $where['ResourceId']= $params['id'];
        }
    
        $table = 'resourcesnapshot(r)';
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
	
		if($page>0 && $pagesize>0){
			$pages = $this->paging($table,$join, '*',$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
        $fields = '*';  
        $arr = $this->db->select($table,$join,$fields,$where);

        if($arr)
        {   
            $genIndexStateArr = [
                1=>'待解析',
                2=>'解析中',
                3=>'解析中',
                4=>'解析完成',
                5=>'解析异常',
                6=>'取消解析'
            ];
            foreach ($arr as $key => &$row) {
                $row['captions']['GenIndexStateDesc'] = $genIndexStateArr[$row['GenIndexState']] ?? '';
            }
            unset($row);
        }
        $data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
    }

    /**
     * @param  [type] $params
     * @method 号码列表
     * @author zhengweihua 
     * @copyright 2025-07-16
     */
    public function getNumberList($params)
    {
        $filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'desc': $params['sord'];
		$orderby = $params['orderby']?$params['orderby']:'r.CreationTime desc';
		$this->joinWhere = [];
       
        $where = [];

        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
            if($field == 'ReplaceNumbers')
            {   
                if(in_array($op, ['cn', 'bw']))
                {
                    $data = raw(sprintf("r.FormatNumber IN (select FormatNumber from numbercleanresult where ReplaceNumber like '%s%%')",$data));
                }else{
                    $data = raw(sprintf("r.FormatNumber IN (select FormatNumber from numbercleanresult where ReplaceNumber = '%s')",$data));
                }
                $op = 'RAW_'.$field.$op;
            }
            if($field == 'OEMake')
            {
                $data = raw(sprintf("r.FormatNumber IN (select FormatNumber from numbercleanresult where OEMake like '%s%%')",$data));
                $op = 'RAW_'.$field.$op;
            }
            if($field == 'ProName')
            {
                $data = raw(sprintf("r.FormatNumber IN (select FormatNumber from numbercleanresult where ProName like '%s%%')",$data));
                $op = 'RAW_'.$field.$op;
            }
            if($field=='DataDisableStatusDesc'){
                if($data == 3)
                {   
                    $data = raw('DataDisableStatus not in (1,2)');
                    $op = 'RAW_'.$field.$op;
                }elseif ($data) {
                    $field = 'DataDisableStatus';
                }
            }
        });

        if($params['id'])
        {
            $where['r.ResourceId'] = $params['id'];
        }
      
        $table = 'resourcenumber(r)';
        $join = [
            '[><]resourcesnapshot(shot)'=>['r.ResourceSnapshotId'=>'Id'],
        ];

        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
        $where['GROUP'] = 'r.Number';
		if($page>0 && $pagesize>0){
			$pages = $this->paging($table,$join, '*',$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
        $fields = ['r.*','shot.Title'];  
        $arr = $this->db->select($table,$join,$fields,$where);
   
        if($arr)
        {       
            $formatNums = array_column($arr,'FormatNumber');
            $result = $this->db->select('numbercleanresult(ncr)',['ncr.OEMake','ncr.ProName','ncr.FormatNumber','ReplaceNumbers'=>raw('group_concat(DISTINCT ReplaceNumber)')],['FormatNumber'=>$formatNums,'GROUP'=>'FormatNumber']);
            $cleanArr = array_column($result,null,'FormatNumber');
           
            $genIndexStateArr = [1=>'已禁用',2=>'已启用'];
            foreach ($arr as $key => &$row) {
                $row = array_merge($row,$cleanArr[$row['FormatNumber']] ?? []);
                $row['captions']['DataDisableStatusDesc'] = $genIndexStateArr[$row['DataDisableStatus']] ?? '启用中';
            }
            unset($row);
        }
        $data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
    }

    /**
     * @param  [type] $params
     * @method 数据列表
     * @author zhengweihua 
     * @copyright 2025-07-16
     */
    public function getDataList($params)
    {
        $filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'desc': $params['sord'];
		$orderby = $params['orderby']?$params['orderby']:' r.Title desc';
		$this->joinWhere = [];
       
        $where = [];

        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
            if($field=='DataDisableStatusDesc'){
                if($data == 3){   
                    $data = raw('DataDisableStatus not in (1,2)');
                    $op = 'RAW_'.$field.$op;
                }elseif ($data) {
                    $field = 'DataDisableStatus';
                }
            }
            if($field=='ExtractNumber'){
                if(in_array($op, ['cn', 'bw']))
                {
                    $data = raw(sprintf("r.Id IN (select FromId from resourcenumber where ResourceNumberFrom=1 and FormatNumber like '%s%%')",formatNum($data)));
                }else{
                    $data = raw(sprintf("r.Id IN (select FromId from resourcenumber where ResourceNumberFrom=1 and FormatNumber = '%s')",formatNum($data)));
                }
                $op = 'RAW_'.$field.$op;
            }
        });

        if($params['id']){
            $where['r.ResourceId'] = $params['id'];
        }
       
        $table = 'resourcedata(r)';
        $join = [];

        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
	
		if($page>0 && $pagesize>0){
			$pages = $this->paging($table,$join, '*',$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
        $fields = ['r.*'];  
        $arr = $this->db->select($table,$join,$fields,$where);
        if($arr)
        {     
            $dataIdArr = array_column($arr,'Id');  
            //取号码表
            $numberRes = $this->db->select('resourcenumber',['FromId','Number'],['ResourceNumberFrom'=>1,'FromId'=>$dataIdArr]);
            $numberArr = [];
            foreach ($numberRes as $key => $val) {
                $numberArr[$val['FromId']][] = $val['Number'];
            }
            $genIndexStateArr = [1=>'已禁用',2=>'已启用'];
            foreach ($arr as $key => &$row) { 
                $row['ExtractNumber'] = $numberArr[$row['Id']] ? implode('<br/>',$numberArr[$row['Id']]) : '';
                $row['captions']['DataDisableStatusDesc'] = $genIndexStateArr[$row['DataDisableStatus']] ?? '启用中';
            }
            unset($row);
        }
        $data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
    }


    public function initUpload($params)
    {
        $uploadID = empty($params['uploadId']) ? guid() : $params['uploadId'];
        // 获取文件扩展名
		$extname = pathinfo($params['fileName'], PATHINFO_EXTENSION);
        $dir = strtolower(substr($uploadID,0,1).substr($uploadID,-1));
        $RelativePath = $dir.'/'.$uploadID.'.'.$extname;
        $key = $RelativePath ?? '';
        $maxPartNumber = $params['maxPartNumber'] ?? 10000; //默认10000
        $rcaApi = new rcaApi();
        $result = $rcaApi->Get('multipartupload/init',[],['key'=>$key,'maxPartNumber'=>$maxPartNumber]);
        $uploadId = $result['data'];
        return ['uploadId'=>$uploadId,'key'=>$RelativePath];
    }

    public function partUpload($params,$files)
    {   
        $filePath = $files['tmp_name'];
        $handle = fopen($filePath, 'rb');
        $chunk = base64_encode(fread($handle, $files['size']));
        $data = [
            'key'=> $params['filekey'],
            "uploadId"=> $params['uploadId'],
            "partNumber"=> $params['partNumber'],
            "objectData"=> $chunk
        ];
        $rcaApi = new rcaApi();
        $res = $rcaApi->Get('multipartupload/part',[],$data);  
        return $res['data'];
    }

    public function completeUpload($params)
    {
        $data = [
            "uploadId"=> $params['uploadId'],
        ];
        $rcaApi = new rcaApi();
        $res = $rcaApi->Get('multipartupload/complete',[],$data);  
        return $res['data'];
    }

    /**
     * @param  Array $params
     * @param  Files $files
     * @method 分片上传
     * @author zhengweihua 
     * @copyright 2025-07-16
     */
    public function chunk($params,$files)
    {
        //调接口上传文件
        $uploadID = empty($params['uploadId']) ? guid() : $params['uploadId'];
        $fileName = $params['fileName'];
        // 获取文件扩展名
		$extname = pathinfo($fileName, PATHINFO_EXTENSION);
        $dir = strtolower(substr($uploadID,0,1).substr($uploadID,-1));

        $absdir = \mvc::$cfg['dir']['files'].'/resource/tmp';
        $uploadDir = $absdir.'/'.$dir;
        mkdirs($uploadDir);

        $relativePath = $dir.'/'.$uploadID.'.'.$extname;

        // 临时文件路径：使用唯一标识 + 文件名 MD5 避免冲突
        $tmpFilePath = $uploadDir . '/' . $uploadID . '_' . md5($fileName);

        // 流式写入
        $source = fopen($files['tmp_name'], 'rb');
        if (!$source) {
            return exitJson(-1, '无法打开上传文件');
        }

        $dest = fopen($tmpFilePath, 'ab');
        if (!$dest) {
            fclose($source);
            return exitJson(-1, '无法写入临时文件');
        }

        $written = 0;
        $chunkSize = 8192;

        while (!feof($source)) {
            $buffer = fread($source, $chunkSize);
            $bytes = fwrite($dest, $buffer);
            if ($bytes === false) {
                fclose($source);
                fclose($dest);
                exitJson(-1, '写入失败');
            }
            $written += $bytes;
        }

        fclose($source);
        fclose($dest);

        // 校验写入大小是否一致（可选）
        if ($written !== $files['size']) {
            exitJson(-1, '写入大小不一致，可能上传失败');
        }
        return ['uploadId'=>$uploadID, 'fileName'=>$relativePath];
    }

    /**
     * @param  Array $params
     * @method 合并分块文件
     * @author zhengweihua 
     * @copyright 2025-07-16
     */
    public function merge($params)
    {   
        if(!$params['uploadId']){
            exitJson(-1,'请先上传文件');
        }
        $fileName = basename($params['fileName']);
        $extname = pathinfo($fileName, PATHINFO_EXTENSION);

        $uploadID = $params['uploadId'];
        $dir = strtolower(substr($uploadID,0,1).substr($uploadID,-1));
        $absdir = \mvc::$cfg['dir']['files'].'/resource';
        mkdirs($absdir.'/'.$dir);

        $tmpFilePath = $absdir.'/tmp/' . $dir.'/'.$uploadID.'_'.md5($fileName);

        $relativePath = $dir.'/'.$uploadID.'.'.$extname;
        $finalPath =  $absdir.'/' . $relativePath;

        if (file_exists($tmpFilePath)) {
            if (!rename($tmpFilePath, $finalPath)) {

                if(!file_exists($finalPath)) mkdirs($finalPath);
                
                if (!copy($tmpFilePath, $finalPath)) {
                    return exitJson(-1, '大文件上传失败，请重试');
                }
                unlink($tmpFilePath);
            }
        }
        return ['relativePath'=>$relativePath];
    }

    public function deleteResource($ids)
    {
        if(empty($ids)) return [];
        $rcaApi = new rcaApi();
        $res = $rcaApi->Get('resources/delete',[],['ids'=>$ids]);
        return $res['data'];
    }

    /**
     * @param  Array $numArr
     * @method 根据号码查询资源信息
     * @author zhengweihua 
     * @copyright 2025-07-19
     */
    public function getResourcesByNum($numArr,$facids =[])
    {   
        $status =  makeOne(\model\ckv::class)->getKV('edc_status');
        //关闭的话直接返回[]
        if($status == -1) return  [];
        if(empty($numArr)) return [];
        $numArr = is_array($numArr) ? $numArr : explode(',', $numArr);
        //格式化
        $numArr = array_map(function($num) { return formatNum($num); }, $numArr);

        $numstr = implode(',', array_map(function($num) { return "'". formatNum($num)."'"; }, $numArr));
        $owhere = '';
        if($facids){
            $owhere .= sprintf(" AND fac.Id IN ('%s')",implode("','", $facids));
        } 
        $where = sprintf("AND t1.FormatNumber IN (%s) %s",$numstr,$owhere);
        $tableSql = 'SELECT
            rd.Id as id,rd.ResourceId as resourceId,
            rd.Title as title,rd.PartName as partName,rd.FirstNumber as number,
            rd.Vehicle as vehicle,rd.Engine as engine,rd.MakeName as makeName, rd.Price as price,rd.FactoryNumber as factoryNumber,
            rd.Remark as dataRemark,rd.ExtraProperties,
            r.FileName as fileName,
            r.ResourceProviderId as resourceProviderId,
            r.ResourceProvideTime as resourceProvideTime,
            r.CreatorId as creatorId,
            r.CreationTime as creationTime,
            r.LastModifierId as lastModifierId,
            r.LastModificationTime as lastModificationTime,
            r.DeleterId as deleterId,
            r.Remark as remark,
            r.ResourceFactoryId as resourceFactoryId,
            fac.Name as resourceFactoryName,
            fac.ContactName as resourceContactName,
            fac.ContactTel as resourceFactoryContactTel,
            fac.RegisteredCapital as registeredCapital,
            t1.FormatNumber as rnumber
        FROM resourcedata as rd
        JOIN resourcenumber as t1 ON t1.FromId = rd.Id AND t1.ResourceNumberFrom=1
        JOIN resource as r ON rd.ResourceId = r.Id
        JOIN resourceFactory as fac ON r.ResourceFactoryId = fac.Id 
        WHERE t1.isDeleted=0 AND fac.IsDeleted=0 AND r.isDeleted=0 %s ORDER BY resourceProvideTime DESC';
        $sql = sprintf($tableSql,$where);

        $rows1 = $this->db->query($sql)->fetchAll();
        //in查询找不到的数据 like一下
        $unSearchArr = array_diff($numArr,$rows1?array_column($rows1,'rnumber'):[]);
        if($unSearchArr){
            $likeConditions = [];
            foreach ($unSearchArr as $num) {
                if(!$num) continue;
                $likeConditions[] = "t1.FormatNumber LIKE '" . $num . "%'";
            }
            $likeWhere = implode(' OR ', $likeConditions);
            $where = sprintf("AND (%s) %s", $likeWhere, $owhere);
            $sql = sprintf($tableSql,$where);

            $rows2 = $this->db->query($sql)->fetchAll();
        }
        $rows = array_merge($rows1?:[], $rows2?:[]);
        $returnData = [];
        //获取一下这个数据对应的号码
        if($rows)
        {   
            usort($rows, function ($a, $b) {
                return strtotime($b['resourceProvideTime']) - strtotime($a['resourceProvideTime']);
            });

            $dataIdArr = array_column($rows,'id');

            $narr = [];
            $arr = $this->db->select('resourcenumber',['Number(number)','FormatNumber(formatNumber)','FromId(fromid)'],['ResourceNumberFrom'=>1,'FromId'=>$dataIdArr]);
            foreach ($arr as $key => $val) {
                $narr[$val['fromid']][] = [
                    'number'=>$val['number'],
                    'formatNumber'=>$val['formatNumber']
                ];
            }
            foreach ($rows as $rkey => $rval) 
            {       
                $rval['numbers'] = $narr[$rval['id']]??[];
                $extraProp = json_decode($rval['ExtraProperties'], true)?:[];
   
                $rval['rowNumber'] = $extraProp['RowNumber']?:'';
                $rval['rowData'] = $extraProp['RowData']?:[];
                unset($rval['ExtraProperties']);
                $returnData[] = $rval;
            }
        }
        return $returnData;
    }


    public function getFactoryCate()
    {
        if(\mvc::$cfg['RCAAPI']['tenantId']){
            $where['TenantId'] = \mvc::$cfg['RCAAPI']['tenantId'];
        }
        $proCategoryIds = $this->db->get('procategory','Id',$where);
        return $proCategoryIds;
    }

    public function getNumberCnt()
    {   
        $where['RAW_#formatNumber'] = raw(" Number <> '' AND Number IS NOT NULL");
        if(\mvc::$cfg['RCAAPI']['tenantId']){
            $where['TenantId'] = \mvc::$cfg['RCAAPI']['tenantId'];
        }
        $numArr = $this->db->get('resourcenumber',['counts'=>raw('count(distinct ResourceId,Number)')],$where);
        return $numArr['counts'];
    }
}