// +---------------------------------------------------------------------- use think\facade\Env; use think\facade\Log; use think\Db; // 腾讯云cos - 使用Composer自动加载 // 应用公共文件 function p($a,$flag){ echo "
";
    print_r($a);
    if($flag) die;
}

/* * 根据分类获取数据字典
 * @param $type string
 * @return array
 */

function getdictionary($type) {
    // 暂时去掉缓存
  /*  static $list;
    if (empty($list)) {
        $list = cache('dic_list');
    }*/
    $key = "{$type}";
    /*
    if (isset($list[$key])) {
        $dic = $list[$key];
    } else {
*/
        $info = Db::name('dictionary')->where(['type' => $type, 'status' => 1])->field('code,valname')->order('sort')->select();
        $list[$key] = $info;
        $dic = $list[$key];
        cache('dic_list', $list, 3600);
 //   }
    return $dic;
}

/**
 * 获取数据字典选中值
 * @param string $type
 * @param string $status
 */
function getDictionaryName($type, $status) {
    $res = getdictionary($type);
    $name = '';
    if (!empty($res)) {
        foreach ($res as $k => $v) {
            if ($v['code'] == $status) {
                $name = $v['valname'];
                break;
            }
        }
    }
    return $name;
}

function getDictionaryNameFromDictList($dict_list, $status) {
    $name = '';
    if (!empty($dict_list)) {
        foreach ($dict_list as $k => $v) {
            if ($v['code'] == $status) {
                $name = $v['valname'];
                break;
            }
        }
    }
    return $name;
}

    /**
     * 获取数据字典[Options_automation]选中值
     * @param type $type
     * @param type $status
     */
    function getDictionaryName_opa($type, $status) {
        $res = getdictionary_opa($type);
        $name = '';
        $arr = [];
        if (!empty($res)) {
            if(strstr($status , ',')){
                foreach (explode(',',$status) as $key => $value) {
                    foreach ($res as $k => $v) {
                        if ($v['code'] == $value) {
                            $arr[] = $v['name'];
                            break;
                        }
                    }
                }
                $name = implode(',', $arr);
            }else{
                foreach ($res as $k => $v) {
                    if ($v['code'] == $status) {
                        $name = $v['name'];
                        break;
                    }
                }
            }
        }
        return $name;
    }

/**
 * 获取 Options_automation表里的字段
 *
 * @param [type] $type
 * @return void
 */
function getdictionary_opa($type) {
    static $list;
   
    $key = "{$type}";
    if (isset($list[$key])) {
        $dic = $list[$key];
    } else {
        $info = Db::name('options_automation')->where(['key' => $type])->field('code,name,type')->select();
        $list[$key] = $info;
        $dic = $list[$key];
        cache('options_list', $list, 3600);
    }
    return $dic;
}

/**
 * 获取数据字典code
 * @param type $type
 * @param type $name
 * @return int
 */
function getDictionaryCode($type, $name) {
    return Db::name('dictionary')
        ->where(['type'=>$type,'valname'=>$name])
        ->field('code')
        ->find();
}

/**
 * 批量获取数据字典
 * @param type $arr array
 * @return array
 */
function getdictionarylist($arr) {
    if (is_array($arr)) {
        foreach ($arr as $value) {
            $data[strtolower($value)] = getdictionary($value);
        }
    } else {
        $data[strtolower($arr)] = getdictionary($arr);
    }
    return $data;
}

/**
 * 上传文件到阿里云OSS
 * @param string $object 文件名称(uploads/xxx/xxx)
 * @param string $filePath 绝对路径
 * @return array
 */
function ossUpload_ali($object, $filePath) {
    try {
        $cosClient = new \OSS\OssClient(config('uploadFile.access_key_id'), config('uploadFile.access_key_secret'), config('uploadFile.endpoint'));
        //上传到阿里云
        $cosClient->uploadFile(config('uploadFile.bucket'), $object, $filePath);
        return ['code' => 1];
    } catch (\Exception $e) {
        return ['code' => -1, 'msg' => $e->getMessage()];
    }
}

/**
 * 上传文件到腾讯云COS
 * @param string $object 文件名称(uploads/xxx/xxx)
 * @param string $filePath 绝对路径
 * @return array
 */
function ossUpload($object, $filePath) {
    try {
        // 创建 COS 客户端实例
        $cosClient = new Qcloud\Cos\Client([
            'region' => config('uploadFile.endpoint'),
            'credentials' => [
                'secretId' => config('uploadFile.access_key_id'),
                'secretKey' => config('uploadFile.access_key_secret')
            ]
        ]);


        
        // 上传文件到腾讯云
        $cosClient->putObject([
            'Bucket' => config('uploadFile.bucket'),
            'Key' => $object,
            'Body' => fopen($filePath, 'rb')
        ]);

        return ['code' => 1];
    } catch (\Exception $e) {
        return ['code' => -1, 'msg' => $e->getMessage()];
    }
}

/**
 * Upload file to Tencent Cloud COS storage
 * 
 * @param string $object   The target path and filename in COS bucket
 * @param string $filePath The local file path to upload
 * @return mixed Returns upload result
 */
function ossDetele($object, $filePath) {
    try {
        // 创建 COS 客户端实例
        $cosClient = new Qcloud\Cos\Client([
            'region' => config('uploadFile.endpoint'),
            'credentials' => [
                'secretId' => config('uploadFile.access_key_id'),
                'secretKey' => config('uploadFile.access_key_secret')
            ]
        ]);
        // 删除文件
        $cosClient->deleteObject([
            'Bucket' => config('uploadFile.bucket'),
            'Key' => $object
        ]);
        return ['code' => 1];
    } catch (\Exception $e) {
        return ['code' => -1, 'msg' => $e->getMessage()];
    }
}

/**
 * 下载图片到本地
 * @param $url
 * @param $path
 */
function downLocal($url, $path) {
    try {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);    //获取https图片
        $file = curl_exec($ch);
        curl_close($ch);
        $filename = pathinfo($url, PATHINFO_BASENAME);
        $resource = fopen($path . $filename, 'a');
        fwrite($resource, $file);
        fclose($resource);
        return ['code' => 1, 'path' => $path . $filename];  //返回图片的绝对路径
    } catch (\Exception $e) {
        return ['code' => -1, 'msg' => $e->getMessage()];
    }
}


function getQueryDateTime($field,$start_time,$end_time) {
    $start_time_stamp = strtotime($start_time);
    $end_time_stamp = strtotime($end_time);
    $date_params = '';
    if ($start_time && $end_time) {
        if ($start_time_stamp > $end_time_stamp) {
            $date_params = [$field,'between', [$end_time_stamp, $start_time_stamp + 86400 - 1]];
        } else if ($start_time_stamp < $end_time_stamp) {
            $date_params = [$field,'between', [$start_time_stamp, $end_time_stamp + 86400 - 1]];
        } else {
            $date_params = [$field,'between', [$start_time_stamp, $end_time_stamp + 86400 - 1]];
        }
    } else {
        $start_time && $date_params = [$field,'egt', $start_time_stamp];
        $end_time && $date_params = [$field,'elt', $end_time_stamp + 86400 - 1];
    }
    return $date_params;
}


/**
 * 时间段查询 时间
 */
function getQueryDate($field, $start_time, $end_time) {
    $start_time_stamp = strtotime($start_time);
    $end_time_stamp = strtotime($end_time);
    $date_params = '';
    if ($start_time_stamp && $end_time_stamp) {
        if ($start_time_stamp > $end_time_stamp) {
            $date_params = [$field, 'between', [date('Y-m-d H:i:s', $end_time_stamp), date('Y-m-d 23:59:59', $start_time_stamp)]];
        } else if ($start_time_stamp < $end_time_stamp) {
            $date_params = [$field, 'between', [date('Y-m-d H:i:s', $start_time_stamp), date('Y-m-d 23:59:59', $end_time_stamp)]];
        } else {
            $date_params = [$field, 'between', [date('Y-m-d H:i:s', $start_time_stamp), date('Y-m-d 23:59:59', $start_time_stamp)]];
        }
    } else {
        $start_time_stamp && $date_params = [$field, 'egt', date('Y-m-d H:i:s', $start_time_stamp)];
        $end_time_stamp && $date_params = [$field, 'elt', date('Y-m-d 23:59:59', $end_time_stamp)];
    }
    return $date_params;
}

/**
 * 其他字段区间范围筛选
 */
function getQuery($field, $start_length, $end_length) {
    $date_params = '';
    if ($start_length != null && $end_length != null) {
        if ($start_length > $end_length) {
            $date_params = [$field, 'between', [$end_length, $start_length]];
        } else if ($start_length < $end_length) {
            $date_params = [$field, 'between', [$start_length, $end_length]];
        } else {
            $date_params = [$field, 'between', [$start_length, $end_length]];
        }
    } else {
        ($start_length != null) && $date_params = [$field, 'egt', $start_length];
        ($end_length != null) && $date_params = [$field, 'elt', $end_length];
    }
    return $date_params;
}

/**
 * 导出通用方法
 * @param $list
 * @param $filename
 * @param array $indexKey
 * @param array $indexValue
 * @throws PHPExcel_Exception
 * @throws PHPExcel_Writer_Exception
 */
function exportExcel($list, $filename, $indexKey = [], $indexValue = []){
    $header_arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];

    // 初始化PHPExcel()
    $objPHPExcel = new \PHPExcel();
    $PHPExcel_Cell_DataType =new \PHPExcel_Cell_DataType();

    // 设置保存版本格式
    $objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);

    // 接下来就是写数据到表格里面去
    $objActSheet = $objPHPExcel -> getActiveSheet();
    // 设置当前活动sheet的名称
    $objActSheet->setTitle($filename);

    $i = 1;
    $j = 2;
    //  设置表头
    foreach ( $indexValue as $key => $value ){
        //  这个比较有用,能自适应列宽
        $objActSheet->getColumnDimension($header_arr[$key])->setAutoSize(true);
        $objStyleA5 = $objActSheet->getStyle($header_arr[$key]);
        //设置对齐方式
        $objAlignA5 = $objStyleA5->getAlignment();
        $objAlignA5->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objAlignA5->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
        $objActSheet->setCellValue($header_arr[$key].$i,$value);
    }
    //  设置主要内容
    foreach ($list as $row) {
        foreach ($indexKey as $key => $value){
//            if(!isset($row[$value]))
//                continue;

            //  这里是设置单元格的内容
//            $objActSheet->setCellValueExplicit($header_arr[$key].$j,$row[$value], $PHPExcel_Cell_DataType::TYPE_STRING);
            $objActSheet->setCellValue($header_arr[$key].$j,$row[$value]);
        }
        $j++;
    }

    // 下载这个表格,在浏览器输出就好了
    // header("Pragma: public");
    // header("Expires: 0");
    // header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
    // header("Content-Type:application/force-download");
    // header("Content-Type:application/vnd.ms-execl;charset=UTF-8");
    // header("Content-Type:application/octet-stream");
    // header("Content-Type:application/download");
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition:attachment;filename='.$filename.'.xlsx');
    // header("Content-Transfer-Encoding:binary");
    // header("Access-Control-Expose-Headers:content-disposition");
    $objWriter -> save(ROOT_PATH . 'public' . DS . 'uploads' . DS .$filename.'.xlsx');
    if(file_exists(ROOT_PATH . 'public' . DS . 'uploads' . DS .$filename.'.xlsx')){
        return Env::get('uploadFile.host_url') . '/' . 'uploads' . '/' .$filename.'.xlsx';
    }else{
        return "";
    }

    // 下载这个表格,在浏览器输出就好了
    /*header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
    header("Content-Type:application/force-download");
    header("Content-Type:application/vnd.ms-execl;charset=UTF-8");
    header("Content-Type:application/octet-stream");
    header("Content-Type:application/download");
    header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition:attachment;filename='.$filename.'.xlsx');
    header("Content-Transfer-Encoding:binary");
    header("Access-Control-Expose-Headers:content-disposition");
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    $objWriter -> save('php://output');*/

}

/**
 * 通过excel获得结果集
 * @param mixed $file $this->request->file('file');
 * @param mixed $colname['dbcol'] = [] 数据库表字段名数组
 * @param mixed $colname['excelcol'] = [] Excel表字段名数组
 * @return Array 
 */
function getArrayByExcel( $file,$sheet_index=0 )
{
    if(!$file)
    {
        return [ 'code'=>-1,'msg'=>'文件不存在或文件出错','data'=>null];
    }

    try{
        $excel = PHPExcel_IOFactory::load($file->getRealPath());
        $sheet = $excel->getSheet($sheet_index);
        $rows = $sheet->toArray(null, true, true, true);
    //    var_dump($rows);
    }catch( Exception $e )
    {
       //log( '读取Excel文件出错:'.$e->getMessage() ); 
        return [ 'code'=>-1,'msg'=>'读取Excel文件出错:'.$e->getMessage(),'data'=>null];
    }

    $data = array();
    $i = 0;

    // 第0行是字段描述,不读取
    // 第1行代表字段名 读取数据库表字段名
    $dbFields = array();
    foreach( $rows[2] as $field )
    {
        if( $field == '') 
        {
            break;
        }   
        $dbFields[] = $field;        
    }

    //从第2行读取
    // 获取数据
    $data = array();
    for ($i = 3; $i <= count($rows); $i++)
     {
        $row = array();

        foreach ($dbFields as $j => $field)
        {           
            $value = isset($rows[$i][chr($j+65)]) ? trim($rows[$i][chr($j+65)]) : null;
            if( $j ==0 && ($value == '0' || $value == ''))
            {
                break;
            }           
            $row[$field] = $value;
        }
        if (!empty($row))
         {
            $data[] = $row;
        }
    }

    return[ 'code'=>1,'msg'=>'','data'=>$data];
}


/**
 * 将数值金额转换为中文大写金额
 * @param $amount float 金额(支持到分)
 * @param $type   int   补整类型,0:到角补整;1:到元补整
 * @return mixed 中文大写金额
 */
function convertAmountToCn($amount, $type = 1) {
    $c1 = "零壹贰叁肆伍陆柒捌玖";
    $c2 = "分角元拾佰仟万拾佰仟亿";
    // 确保 $amount 是数值类型
    if (!is_numeric($amount)) {
        $amount = 0;
    }
    $num = round($amount, 2);
    $num = $num * 100;
    // 转换为整数后再转换为字符串
    $num_str = (string)(int)$num;
    if (strlen($num_str) > 14) {
        return "数据太长,检查下";
    }
    $i = 0;
    $c = "";
    $num_int = (int)$num_str;
    while (1) {
        if ($i == 0) {
            $n = substr($num_str, strlen($num_str)-1, 1);
        } else {
            $n = $num_int % 10;
        }
        $p1 = substr($c1, 3 * $n, 3);
        $p2 = substr($c2, 3 * $i, 3);
        if ($n != '0' || ($n == '0' && ($p2 == '亿' || $p2 == '万' || $p2 == '元'))) {
            $c = $p1 . $p2 . $c;
        } else {
            $c = $p1 . $c;
        }
        $i = $i + 1;
        $num_int = $num_int / 10;
        $num_int = (int)$num_int;
        if ($num_int == 0) {
            break;
        }
    }
    $j = 0;
    $slen = strlen($c);
    while ($j < $slen) {
        $m = substr($c, $j, 6);
        if ($m == '零元' || $m == '零万' || $m == '零亿' || $m == '零零') {
            $left = substr($c, 0, $j);
            $right = substr($c, $j + 3);
            $c = $left . $right;
            $j = $j-3;
            $slen = $slen-3;
        }
        $j = $j + 3;
    }

    if (substr($c, strlen($c)-3, 3) == '零') {
        $c = substr($c, 0, strlen($c)-3);
    }
    if (empty($c)) {
        return "人民币零元整";
    }else{
        return "人民币". $c . "整";
    }
    return $result;
}

//数字转大写
function numToWordone($num){
    $chiNum = array('○', '一', '二', '三', '四', '五', '六', '七', '八', '九');
    $chiUni = array('','十');
    $chiStr = '';
    $num_str = (string)$num;
    $count = strlen($num_str);
    $last_flag = true; //上一个 是否为0
    $zero_flag = true; //是否第一个
    $temp_num = null; //临时数字
    $chiStr = '';//拼接结果
    if ($count == 2) {//两位
        $temp_num = $num_str[0];
        $chiStr = $temp_num == 1 ? $chiUni[1] : $chiNum[$temp_num].$chiUni[1];
        $temp_num = $num_str[1];
        $chiStr .= $temp_num == 0 ? '' : $chiNum[$temp_num];
    }else if($count > 2){
        $index = 0;
        for ($i=$count-1; $i >= 0 ; $i--) {
            $temp_num = $num_str[$i];
            $chiStr = $chiNum[$temp_num].$chiStr;
            $index ++;
        }
    }else{
        $chiStr = $chiNum[$num_str[0]];
    }
    return $chiStr;
}


/**
 * 消息提醒公用方法
 *
 * @author           cavan
 *
 * @param       $quot_id                 //询价主表id
 * @param       $type                       //消息归属
 * @param       $message_type               //消息类型
 * @param       $property_cert_info_id          //物业表id
 */
function PublicMessage($quot_id="" ,$type="" , $message_type="", $property_cert_info_id="") {
    if(!$quot_id){
        return array("code"=>0,"msg"=>"缺少必要参数询价主表id");
    }
    if(!$type){
        return array("code"=>0,"msg"=>"缺少必要参数消息归属");
    }
    if(!$message_type){
        return array("code"=>0,"msg"=>"缺少必要参数消息类型");
    }
    if(in_array($message_type,[6,7,8])){
        if(!$property_cert_info_id){
            return array("code"=>0,"msg"=>"缺少必要参数物业表id");
        }
    }
    $where["i.id"] = $quot_id;
    if($property_cert_info_id){
        $where["ii.id"] = $property_cert_info_id;
    }
    $inquiry = Db::name("inquiry")
        ->alias("i")
        ->join('pg_property_cert_info ii','ii.quot_id=i.id','LEFT')
        ->where($where)
        ->group("ii.quot_id")
        ->field("i.order_no,i.user_id,i.user_name,i.type,ii.property_full_name,ii.survey_user_id,ii.survey_user_name,i.is_auto")
        ->find();
    if(empty($inquiry)){
        return array("code"=>0,"msg"=>"未查得相关物业信息");
    }

    $type_arr = array(9,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,32);            //需要用到报告信息的状态
    if(in_array($message_type,$type_arr)){
        //报告编号
        $report = Db::name("report")
            ->where("quot_id",$quot_id)
            ->field("id,report_no,producer_id,producer_name")
            ->find();
        if(empty($inquiry)){
            return array("code"=>0,"msg"=>"未查得相关报告信息");
        }
    }

    //消息内容处理
    $message_content = "";
    $name = "";
    $query = array();
    $apptype = $title = $s_id = "";
    $user_id_arr = array();
    $flag = 1;
    $apiAuth = new app\lib\AuthApi();
    $FbbService = new app\lib\FbbService();
    $where = array();
    switch ($message_type)
    {
        case 1:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'Technical_manager,Deputy_manager,Evaluation_Assistant');         //技术部经理,技术部副经理,评估助理
            $message_content = "单号".$inquiry['order_no']."待询价员回价,请及时处理(物业名称:".$inquiry['property_full_name'].",业务员:".$inquiry['user_name'].")";

//            //前端跳转方法和参数
//            $type1 = ($inquiry['type'] == 1)?"priceReturnAllProjectUrgentProjectHouseList":"priceReturnAllProjectBusinessList";
//            $name = "priceReturn-detail";
//            $query = array(
//                "id"=>$quot_id,
//                "countdownPage"=>true,
//                "isAllowOpenType"=>1,
//                "type"=>1,
//                "status"=>1,
//                "from"=>$type1,
//            );
            if($inquiry['is_auto'] == 1){          //是否自动估价
                //前端跳转方法和参数
                $type1 = "home";
                $name = "priceReturn-detail";
                $query = array(
                    "id"=>$quot_id,
                    "countdownPage"=>true,
                    "isAllowOpenType"=>1,
                    "type"=>1,
                    "status"=>1,
                    "from"=>$type1,
                );
            }else{
                //前端跳转方法和参数
                $type1 = ($inquiry['type'] == 1)?"priceReturnAllProjectUrgentProjectHouseList":"priceReturnAllProjectBusinessList";
                $name = "priceReturn-detail";
                $query = array(
                    "id"=>$quot_id,
                    "countdownPage"=>true,
                    "isAllowOpenType"=>1,
                    "type"=>1,
                    "status"=>1,
                    "from"=>$type1,
                );
            }

            break;
        case 2:
            $apptype = 401;
            $title = "询价员已回价";
            $user_id = $inquiry['user_id'];
            $message_content = "单号".$inquiry['order_no']."询价员已回价,点击查看详情";
            $where = ["message_type"=>1,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $inquiry_details = Db::name('property_cert_info')
                ->alias('a')
                ->join(['pg_return_price' => 'b'], 'b.property_cert_info_id = a.id','left')
                ->whereIn('a.quot_id', $quot_id)
                ->field([
                    'a.id', 'a.city','a.property_full_name', 'a.size','b.eva_unit_price','b.eva_total_value','b.eva_net_value'
                ])
                ->group('a.id')
                ->order('b.create_time', 'desc')
                ->select();

            $name = "businessManage-businessInfo-inquiry-detail";
            $query = array(
                "id"=>$quot_id,
                "order_no"=>$inquiry['order_no'],
                "type"=>$inquiry['type'],
                "inquiry_details"=>json_encode($inquiry_details)
            );

            break;
        case 3:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'Technical_manager,Deputy_manager,Evaluation_Assistant');         //技术部经理,技术部副经理,评估助理
            $message_content = "单号".$inquiry['order_no']."待询价员调价,请及时处理(物业名称:".$inquiry['property_full_name'].",业务员:".$inquiry['user_name'].")";
//            $where = ["message_type"=>2,"quot_id"=>$quot_id];

            //前端跳转方法和参数
//            $type1 = ($inquiry['type'] == 1)?"priceReturnAllProjectUrgentProjectHouseList":"priceReturnAllProjectBusinessList";
            $name = "priceReturn-detail";
            $query = array(
                "id"=>$property_cert_info_id,
                "countdownPage"=>true,
                "isAllowOpenType"=>1,
                "type"=>1,
                "status"=>2,
                "adjust"=>1,
                "from"=>"home",
            );

            break;
        case 4:
            $apptype = 402;
            $title = "询价员已调价";
            $user_id = $inquiry['user_id'];
            $message_content = "单号".$inquiry['order_no']."询价员已调价,点击查看详情";
            $where = ["message_type"=>3,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $inquiry_details = Db::name('property_cert_info')
                ->alias('a')
                ->join(['pg_return_price' => 'b'], 'b.property_cert_info_id = a.id','left')
                ->whereIn('a.quot_id', $quot_id)
                ->field([
                    'a.id', 'a.city','a.property_full_name', 'a.size','b.eva_unit_price','b.eva_total_value','b.eva_net_value'
                ])
                ->group('a.id')
                ->order('b.create_time', 'desc')
                ->select();

            $name = "businessManage-businessInfo-inquiry-detail";
            $query = array(
                "id"=>$quot_id,
                "order_no"=>$inquiry['order_no'],
                "type"=>$inquiry['type'],
                "inquiry_details"=>json_encode($inquiry_details)
            );

            break;
        case 5:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'He_Xikun');         //特殊用户-何喜琨
            $message_content = "单号".$inquiry['order_no']."查勘待派单,请及时处理(物业名称:".$inquiry['property_full_name'].",业务员:".$inquiry['user_name'].")";
            $where = [["message_type","in","2,4"],["quot_id","=",$quot_id]];
            break;
        case 6:
            $apptype = 403;
            $title = "查勘待跟进";
            //app推送消息需要查看表id
            $s_id = Db::name("survey")->where(["order_no"=>$inquiry['order_no'],"property_cert_info_id"=>$property_cert_info_id])->value("id");
            $user_id =Db::name("survey")->where(["order_no"=>$inquiry['order_no'],"property_cert_info_id"=>$property_cert_info_id])->value("user_id");
            $message_content = "单号".$inquiry['order_no']."查勘待跟进,请及时处理(物业名称:".$inquiry['property_full_name'].",业务员:".$inquiry['user_name'].")";
            $where = [["message_type","in","5,8"],["quot_id","=",$quot_id]];

            //前端跳转方法和参数
            $name = "surveyManageSurveyManageSurveyWaitFollowList";
            $query = array();

            break;
        case 7:
            $type2 = Db::name("survey")->where(["order_no"=>$inquiry['order_no'],"property_cert_info_id"=>$property_cert_info_id])->value("survey_type");
            if($type2 == 1){
                $apptype = 404;
                $title = "查勘已完成";
            }else{
                $apptype = 405;
                $title = "查勘已完成";
            }
            //app推送消息需要查看表id
            $s_id = Db::name("survey")->where(["order_no"=>$inquiry['order_no'],"property_cert_info_id"=>$property_cert_info_id])->value("id");
            $user_id = $inquiry['user_id'];
            $message_content = "单号".$inquiry['order_no'].",物业名称:".$inquiry['property_full_name'].",查勘已完成";
            $where = ["message_type"=>6,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $res=Db::name("survey")->alias('survey')
                ->join('property_cert_info ind','survey.property_cert_info_id=ind.id','LEFT')
                ->join('inquiry i','ind.quot_id=i.id','LEFT')
                ->field('ind.id,survey.id as survey_id,i.order_no,ind.city,ind.city_id,ind.property_full_name,i.is_multiple,i.type,survey.id as survey_id,survey.status,survey.create_time,survey.user_name as surver_username,i.user_name,survey.assign_time,survey.complete_time,survey.return_reason,ind.id as property_cert_info_id,survey.area,survey.survey_type,i.status as inquiry_status')
                ->where(["survey.order_no"=>$inquiry['order_no'],"survey.property_cert_info_id"=>$property_cert_info_id])
                ->group('survey.id')
                ->find();
            $name = "surveyManage-surveyCompleteDetail";
            if(!empty($res)){
                $query = array(
                    "id"=>$res['id'],
                    "type"=>$res['type'],
                    "city_id"=>$res['city_id'],
                    "survey_id"=>$res['survey_id'],
                    "order_no"=>$res['order_no'],
                    "survey_type"=>$res['survey_type'],
                    "inquiry_status"=>$res['inquiry_status'],
                    "property_cert_info_id"=>$res['property_cert_info_id'],
                    "from"=>"surveyManage-surveyCompleteList",
                );
            }

            break;
        case 8:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'He_Xikun');         //特殊用户-何喜琨
            $message_content = "单号".$inquiry['order_no']."查勘被退回,待派单,请及时处理(物业名称:".$inquiry['property_full_name'].",业务员:".$inquiry['user_name'].")";
            $where = ["message_type"=>7,"quot_id"=>$quot_id];
            break;
        case 9:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'Assistant_appraiser');         //估计师
            $message_content = "报告编号".$report['report_no']."报告待制作,请及时处理(物业名称:".$inquiry['property_full_name'].")";
            $where = ["message_type"=>7,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $name = "report-detail";
            $query = array(
                "reportid"=>$report['id'],
                "type"=>$inquiry['type'],
                "from"=>'waitMake',
                "isReset"=>true,
            );

            break;
        case 10:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'Review_quality_inspection');         //审查质检
            $message_content = "报告编号".$report['report_no']."报告待审核,请及时处理(物业名称:".$inquiry['property_full_name'].",制作员:".$report['producer_name'].")";
            $where = [["message_type","in","7,9,12"],["quot_id","=",$quot_id]];

            //前端跳转方法和参数
            $name = "report-examineDetail";
            $query = array(
                "reportid"=>$report['id'],
                "type"=>$inquiry['type'],
                "state"=> 'check',
                "from"=>'waitApproval',
                "isReset"=>true,
            );

            break;
        case 11:
            $apptype = 406;
            $title = "报告已完成";
            $user_id = $inquiry['user_id'];
            $message_content = "单号".$inquiry['order_no']."报告已完成";
            $where = [["message_type","in","10,13"],["quot_id","=",$quot_id]];
            break;
        case 12:
            $user_id = $report['producer_id'];
            $message_content = "报告编号".$report['report_no']."报告退回待制作,请及时处理(物业名称:".$inquiry['property_full_name'].")";
            $where = ["message_type"=>11,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $name = "report-examineDetail";
            $query = array(
                "reportid"=>$report['id'],
                "type"=>$inquiry['type'],
                "from"=>'waitMake',
                "isReset"=>true,
            );

            break;
        case 13:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'Review_quality_inspection');         //审查质检
            $message_content = "报告编号".$report['report_no']."报告退回待审核,请及时处理(物业名称:".$inquiry['property_full_name'].")";
//            $where = ["message_type"=>12,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $name = "report-examineDetail";
            $query = array(
                "reportid"=>$report['id'],
                "type"=>$inquiry['type'],
                "state"=> 'check',
                "from"=>'waitApproval',
                "isReset"=>true,
            );

            break;
        case 14:
            $user_id = $inquiry['user_id'];
            $message_content = "报告编号".$report['report_no']."报告待领取";
//            $where = ["message_type"=>13,"quot_id"=>$quot_id];
            break;
        case 15:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'Business_manager');         //待部门经理审批:角色=业务经理的用户
            $refund_type = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_type");
            if($refund_type == 1) {         //申请退费
                $message_content = "报告编号" . $report['report_no'] . "申请退报告费,待部门经理审批,请及时处理(物业名称:" . $inquiry['property_full_name'] . ",业务员:" . $inquiry['user_name'] . ")";
            }else if($refund_type == 2){            //申请优惠
                $message_content = "报告编号" . $report['report_no'] . "申请优惠,待部门经理审批,请及时处理(物业名称:" . $inquiry['property_full_name'] . ",业务员:" . $inquiry['user_name'] . ")";
            }
            $where = ["message_type"=>14,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $refund_id = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_id");
            $name = "costManage-financialManage-detailPage-applySubmitDetail";
            $query = array(
                "id"=>$refund_id,
                "pathName"=>"financialDrawBackManage",
            );

            break;
        case 16:
            $apptype = 407;
            $title = "部门经理审批已通过";
            $user_id = $inquiry['user_id'];
            $refund_type = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_type");
            if($refund_type == 1) {         //申请退费
                $message_content = "报告编号" . $report['report_no'] . "申请退报告费,部门经理审批通过";
            }else if($refund_type == 2){            //申请优惠
                $message_content = "报告编号" . $report['report_no'] . "申请优惠,部门经理审批通过";
            }
            $where = ["message_type"=>15,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $refund_id = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_id");
            $name = "businessManage-detailPage-applyDetail";
            $query = array(
                "id"=>$refund_id
            );

            break;
        case 17:
            $apptype = 407;
            $title = "部门经理审批已驳回";
            $user_id = $inquiry['user_id'];
            $refund_type = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_type");
            if($refund_type == 1) {         //申请退费
                $message_content = "报告编号" . $report['report_no'] . "申请退报告费,部门经理审批驳回";
            }else if($refund_type == 2){            //申请优惠
                $message_content = "报告编号" . $report['report_no'] . "申请优惠,部门经理审批驳回";
            }
            $where = ["message_type"=>15,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $refund_id = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_id");
            $name = "businessManage-detailPage-applyDetail";
            $query = array(
                "id"=>$refund_id
            );

            break;
        case 18:
            $apptype = 407;
            $title = "总经理审批已通过";
            $user_id = $inquiry['user_id'];
            $refund_type = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_type");
            if($refund_type == 1) {         //申请退费
                $message_content = "报告编号" . $report['report_no'] . "申请退报告费,总经理审批通过";
            }else if($refund_type == 2){            //申请优惠
                $message_content = "报告编号" . $report['report_no'] . "申请优惠,总经理审批通过";
            }
            $where = ["message_type"=>32,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $refund_id = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_id");
            $name = "businessManage-detailPage-applyDetail";
            $query = array(
                "id"=>$refund_id
            );

            break;
        case 19:
            $apptype = 407;
            $title = "总经理审批已驳回";
            $user_id = $inquiry['user_id'];
            $refund_type = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_type");
            if($refund_type == 1) {         //申请退费
                $message_content = "报告编号" . $report['report_no'] . "申请退报告费,总经理审批驳回";
            }else if($refund_type == 2){            //申请优惠
                $message_content = "报告编号" . $report['report_no'] . "申请优惠,总经理审批驳回";
            }
            $where = ["message_type"=>32,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $refund_id = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_id");
            $name = "businessManage-detailPage-applyDetail";
            $query = array(
                "id"=>$refund_id
            );

            break;
        case 20:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'Finance_CSPG');         //财务
            $refund_type = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_type");
            if($refund_type == 1) {         //申请退费
                $message_content = "报告编号".$report['report_no']."申请退报告费,待财务审批,请及时处理(物业名称:".$inquiry['property_full_name'].",业务员:".$inquiry['user_name'].")";
            }else if($refund_type == 2){            //申请优惠
                $message_content = "报告编号".$report['report_no']."申请优惠,待财务审批,请及时处理(物业名称:".$inquiry['property_full_name'].",业务员:".$inquiry['user_name'].")";
            }
            $where = [["message_type","in","18,19"],["quot_id","=",$quot_id]];

            //前端跳转方法和参数
            $refund_id = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_id");
            $name = "costManage-financialManage-detailPage-applySubmitDetail";
            $query = array(
                "id"=>$refund_id,
                "pathName"=>"financialDrawBackManage"
            );

            break;
        case 21:
            $apptype = 408;
            $title = "财务审批已通过";
            $user_id = $inquiry['user_id'];
            $refund_type = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_type");
            if($refund_type == 1) {         //申请退费
                $message_content = "报告编号".$report['report_no']."申请退报告费,财务审批通过";
            }else if($refund_type == 2){            //申请优惠
                $message_content = "报告编号".$report['report_no']."申请优惠,财务审批通过";
            }
            $where = ["message_type"=>20,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $refund_id = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_id");
            $name = "businessManage-detailPage-applyDetail";
            $query = array(
                "id"=>$refund_id
            );

            break;
        case 22:
            $apptype = 408;
            $title = "财务审批已驳回";
            $user_id = $inquiry['user_id'];
            $refund_type = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_type");
            if($refund_type == 1) {         //申请退费
                $message_content = "报告编号".$report['report_no']."申请退报告费,财务审批驳回";
            }else if($refund_type == 2){            //申请优惠
                $message_content = "报告编号".$report['report_no']."申请优惠,财务审批驳回";
            }
            $where = ["message_type"=>20,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $refund_id = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_id");
            $name = "businessManage-detailPage-applyDetail";
            $query = array(
                "id"=>$refund_id
            );

            break;
        case 23:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'general_manager');         //魏总
            $message_content = "单号".$inquiry['order_no']."待总经理审批,请及时处理(物业名称:".$inquiry['property_full_name'].",业务员:".$inquiry['user_name'].")";
//            $where = ["message_type"=>18,"quot_id"=>$quot_id];

            //前端跳转方法和参数
//            $refund_id = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_id");
//            $name = "costManage-financialManage-detailPage-applySubmitDetail";
//            $query = array(
//                "id"=>$refund_id,
//                "pathName"=>"waitAuditTicket"
//            );

            $bill_id = Db::name("bill")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("bill_id");
            $name = "costManage-billManage-detailPage-applyChargeDetail";
            $query = array(
                "id"=>$bill_id,
                "type"=>1,
                "pathName"=>"waitAuditTicket"
            );
            break;
        case 24:
            $apptype = 409;
            $title = "总经理审批已通过";
            $user_id = $inquiry['user_id'];
            $message_content = "单号".$inquiry['order_no']."总经理审批通过";
            $where = ["message_type"=>23,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $bill_id = Db::name("bill")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("bill_id");
            $name = "businessManage-detailPage-applyChargeDetail";
            $query = array(
                "id"=>$bill_id,
                "type"=>3,
                "pathName"=>'mineInvoice',
            );

            break;
        case 25:
            $apptype = 409;
            $title = "总经理审批已驳回";
            $user_id = $inquiry['user_id'];
            $message_content = "单号".$inquiry['order_no']."总经理审批驳回";
            $where = ["message_type"=>23,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $bill_id = Db::name("bill")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("bill_id");
            $name = "businessManage-detailPage-applyChargeDetail";
            $query = array(
                "id"=>$bill_id,
                "type"=>3,
                "pathName"=>'mineInvoice',
            );

            break;
        case 26:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'general_manager');         //财务
            $message_content = "单号".$inquiry['order_no']."待财务开票,请及时处理(物业名称:".$inquiry['property_full_name'].",业务员:".$inquiry['user_name'].")";
            $where = [["message_type","in","24,25"],["quot_id","=",$quot_id]];

            //前端跳转方法和参数
            $bill_id = Db::name("bill")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("bill_id");
            $name = "costManage-billManage-detailPage-applyChargeDetail";
            $query = array(
                "id"=>$bill_id,
                "type"=>2,
                "pathName"=>'waitOpenTicket',
            );

            break;
        case 27:
            $apptype = 410;
            $title = "财务已开具票据";
            $user_id = $inquiry['user_id'];
            $message_content = "单号".$inquiry['order_no']."财务已开具票据";
            $where = ["message_type"=>26,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $bill_id = Db::name("bill")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("bill_id");
            $name = "costManage-billManage-detailPage-applyChargeDetail";
            $query = array(
                "id"=>$bill_id,
                "type"=>3,
                "pathName"=>'waitGetTicket',
            );

            break;
        case 28:
            $apptype = 410;
            $title = "财务已驳回";
            $user_id = $inquiry['user_id'];
            $message_content = "单号".$inquiry['order_no']."财务已驳回";
            $where = ["message_type"=>26,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $bill_id = Db::name("bill")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("bill_id");
            $name = "costManage-billManage-detailPage-applyChargeDetail";
            $query = array(
                "id"=>$bill_id,
                "type"=>3,
                "pathName"=>'waitGetTicket',
            );

            break;
        case 29:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'Technical_manager,Deputy_manager,Evaluation_Assistant');         //技术部经理,技术部副经理,评估助理
            $message_content = "单号".$inquiry['order_no']."(简易)待询价员回价,请及时处理(物业名称:".$inquiry['property_full_name'].",业务员:".$inquiry['user_name'].")";
//            $where = ["message_type"=>22,"quot_id"=>$quot_id];
            break;
        case 30:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'Assistant_appraiser,Review_quality_inspection');         //角色=估价师助理 ,审查质检 的用户
            $message_content = "单号".$inquiry['order_no']."(简易)报告待制作,请及时处理(物业名称:".$inquiry['property_full_name'].")";
            $where = ["message_type"=>29,"quot_id"=>$quot_id];

            //前端跳转方法和参数
            $inquiry_details = Db::name('property_cert_info')->alias('a')
                ->join(['pg_return_price' => 'b'], 'b.property_cert_info_id = a.id','left')
                ->whereIn('a.quot_id', $quot_id)
                ->field(['a.id','a.size','a.property_full_name','a.remark','b.eva_unit_price','b.eva_total_value','b.eva_net_value','a.remark'])
                ->group('a.id')
                ->order('b.create_time', 'desc')
                ->select();
            $name = "priceReturn-allProject-simple-detail";
            $query = array(
                "isReset"=>true,
                "from"=>"priceReturnAllProjectSimpleList",
                "quot_id"=>$quot_id,
                "property_cert_info_id"=>!empty($inquiry_details)?$inquiry_details[0]['id']:"",
                "inquiry_details"=>json_encode($inquiry_details)
            );

            break;
        case 31:
            $apptype = 411;
            $title = "报告已完成";

            $user_id = $inquiry['user_id'];
            $message_content = "单号".$inquiry['order_no']."报告已完成";
            $where = ["message_type"=>30,"quot_id"=>$quot_id];
            break;
        case 32:
            $flag = 2;
            $roleCodes = array("roleCodes"=>'general_manager');         //待总经理审批:魏总
            $refund_type = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_type");
            if($refund_type == 1) {         //申请退费
                $message_content = "报告编号" . $report['report_no'] . "申请退报告费,待总经理审批,请及时处理(物业名称:" . $inquiry['property_full_name'] . ",业务员:" . $inquiry['user_name'] . ")";
            }else if($refund_type == 2){            //申请优惠
                $message_content = "报告编号" . $report['report_no'] . "申请优惠,待总经理审批,请及时处理(物业名称:" . $inquiry['property_full_name'] . ",业务员:" . $inquiry['user_name'] . ")";
            }
            $where = [["message_type","in","16,17"],["quot_id","=",$quot_id]];

            //前端跳转方法和参数
            $refund_id = Db::name("refund")->where("order_no",$inquiry['order_no'])->where("report_no",$report['report_no'])->value("refund_id");
            $name = "costManage-financialManage-detailPage-applySubmitDetail";
            $query = array(
                "id"=>$refund_id,
                "pathName"=>"financialDrawBackManage"
            );

            break;
        default:
    }
    $time = time();
    $request = Request::instance();
    if($flag == 1){
        $insert_data = array();
        $insert_data['user_id'] = $user_id;
        $insert_data['quot_id'] = $quot_id;
        $insert_data['name'] = $name;
        $insert_data['query'] = json_encode($query);
        if($property_cert_info_id){
            $insert_data["property_cert_info_id"] = $property_cert_info_id;
        }
        $insert_data['type'] = $type;
        $insert_data['message_type'] = $message_type;
        $insert_data['message_content'] = $message_content;
        $insert_data['create_time'] = date("Y-m-d H:i:s",$time);

        $id = Db::name("message")->insertGetId($insert_data);
        if($id){
            //app推送消息
            if($apptype){
                $params = array();
                $params['oa_user_id'] = $user_id;
                $params['type'] = $apptype;
                $params['unique_id'] = $s_id?$s_id:$quot_id;
                $params['title'] = $title;
                $params['content'] = $message_content;
                $re = $FbbService->addAppBsMessage($params);
            }
        
            //pc推送消息
            sock_post($request->domain() .":".$_SERVER["SERVER_PORT"]. $request->root()."/admin/MessageRemind/messagePush",["user_id"=>$user_id,"message_content"=>$message_content]);
        }
    }else{
        //获取相应的用户列表
        $userinfo = $apiAuth->getUser($roleCodes);
        if($userinfo == "-4001"){
            return array("code"=>0,"msg"=>"获取角色用户失败");
        }else{
            $userinfo = json_decode($userinfo,true);
            if($userinfo['code'] == "0000"){
                $user_id_arr = array_column($userinfo['data'],"oid");
            }
        }

        if(!empty($user_id_arr)){
            foreach ($user_id_arr as $k => $v){
                $insert_data = array();
                $insert_data['user_id'] = $v;
                $insert_data['quot_id'] = $quot_id;
                $insert_data['name'] = $name;
                $insert_data['query'] = json_encode($query);
                if($property_cert_info_id){
                    $insert_data["property_cert_info_id"] = $property_cert_info_id;
                }
                $insert_data['type'] = $type;
                $insert_data['message_type'] = $message_type;
                $insert_data['message_content'] = $message_content;
                $insert_data['create_time'] = date("Y-m-d H:i:s",$time);
                $id = Db::name("message")->insertGetId($insert_data);
                if($id){
                    //app推送消息
                    if($apptype){
                        $params = array();
                        $params['oa_user_id'] = $v;
                        $params['type'] = $apptype;
                        $params['unique_id'] = $s_id?$s_id:$quot_id;
                        $params['title'] = $title;
                        $params['content'] = $message_content;
                        $re = $FbbService->addAppBsMessage($params);
                    }
                    //pc推送消息
                    sock_post($request->domain() . $request->root()."/admin/MessageRemind/messagePush",["user_id"=>$v,"message_content"=>$message_content]);
                }
            }
        }
    }
    if(!empty($where)){         //修改其它未读状态数据状态
        Db::name("message")->where($where)->update(array("status"=>2));
    }

    return array("code"=>1,"msg"=>"操作成功");
}

/**
 * 消息已阅读公用方法
 *
 * @author           cavan
 *
 * @param       $id         //消息表od
 */
function MessageRead($id=""){
    if(!$id){
        return array("code"=>0,"msg"=>"缺少必要参数信息表id");
    }
    $message_type = Db::name("message")->where("id",$id)->value("message_type");
    if($message_type == 31){                //消息为最后一个状态 则处理当前状态的信息为无效数据
        $update_data['issee'] = 1;
        $update_data['status'] = 2;
    }else{
        $update_data['issee'] = 1;
    }
    Db::name("message")->where("id",$id)->update($update_data);
    if($message_type == 14){
        $quot_id = Db::name("message")->where("id",$id)->value("quot_id");
        Db::name("message")->where("quot_id",$quot_id)->where("message_type",14)->update(array("status"=>2));
    }
    return array("code"=>1,"msg"=>"操作成功");
}

/**
 * 推送消息
 * @param array or string $to 用户id
 * @param string $content 消息内容
 */
function sendMessage($to, $content)
{
    if (!$to) {
        return;
    }
    $to = str2arr($to);
    foreach ($to as $uid) {
        $data = [
            'to' => $uid,
            'type' => 'publish',
            'content' => $content
        ];
        $result = curlPostMessage($data);
    }
    return $result;
}

function curlPostMessage($data)
{
    $url = Env::get('push.host') . ':' . Env::get('push.port');
    $ch = curl_init();
    $data = http_build_query($data);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Expect:"));
    $return = curl_exec($ch);
    curl_close($ch);
    Log::write("返回:".$return."--请求:".$ch,'workermanCurl');
    return $return;
}

/** 字符串转数组
 * @param $str 要分割的字符串
 * @param string $glue 分隔符
 * @return array
 */
function str2arr($str, $glue = ',')
{
    return explode($glue, $str);
}

//php 异步执行
function sock_post($url, $query) {
    $_post = strval(null);
    if (!empty($query)) {
        $_post = "query=" . urlencode(json_encode($query));
    }
    $info = parse_url($url);
    $fp = fsockopen($info["host"], 80, $errno, $errstr, 3);
    if (!$fp) {
        echo "$errstr($errno)
\n"; } else { stream_set_blocking($fp, 0); //开启非阻塞模式 stream_set_timeout($fp, 3); //设置超时时间(s) $head = "POST " . $info['path'] . "?" . $_post . " HTTP/1.1\r\n"; $head .= "Host: " . $info['host'] . "\r\n"; $head .= "Referer: http://" . $info['host'] . $info['path'] . "\r\n"; $head .= "Content-type: application/x-www-form-urlencoded\r\n"; $head .= "Content-Length: " . strlen(trim($_post)) . "\r\n"; $head .= "\r\n"; $head .= trim($_post); fwrite($fp, $head); Log::write("fp:".$fp."---head:".$head,'workerman'); fclose($fp); } } //获取当前日期前一天工作日(避开周末) //2022-01-05更新 //因接口调用失效或收费需要废弃重写该方法 /* function getCostDate($date) { $valuation_time = ''; $workday_api = config('serviceConfig.API_WORKDAY_URL'); for ($i = 1; $i <= 30 ; $i++) { $res_date = date('Ymd', strtotime("$date -$i day")); $valuation_time = date('Y-m-d', strtotime("$date -$i day")); $getData = file_get_contents($workday_api. $res_date); $result = json_decode($getData, true); if (!empty($result['workday']) && $result['workday'] == 1) { break; } } return $valuation_time; } */ function getCostDate($date) { $valuation_time = ''; for ($i = 1; $i <= 30 ; $i++) { $res_date = date('Ymd', strtotime("$date -$i day")); $valuation_time = date('Y-m-d', strtotime("$date -$i day")); $result = Db::name('holiday')->where(['holiday_date'=>$res_date])->find(); if ($result) { if ($result['holiday_type']==2) { break; } } elseif (date('N', strtotime("$date -$i day"))<6) { break; } } return $valuation_time; } // 获取系统参数配置 function getSystemConfig($key_name){ return Db::name('system_config')->where(['name'=>$key_name])->value('value'); } function getCity($city_name){ $where[] = ['name|shortname', 'eq', $city_name]; return Db::name('region')->where($where)->field('id,shortname')->find(); } // 获取用户排序权重 function getSort($user_id){ $sorts = ['149'=>100,'178'=>99]; return !empty($sorts[$user_id]) ? $sorts[$user_id] : 0; } /** * 前端控制台打印消息 * @param object $log */ function console($log='') { switch (empty($log)) { case False: $out = json_encode($log); $GLOBALS['console'] .= 'console.log('.$out.');'; break; default: echo ''; } } /** * 过滤Emoji字符串 */ function removeEmoji($text) { // Match Emoticons $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u'; $clean_text = preg_replace($regexEmoticons, '', $text); // Match Miscellaneous Symbols and Pictographs $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u'; $clean_text = preg_replace($regexSymbols, '', $clean_text); // Match Transport And Map Symbols $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u'; $clean_text = preg_replace($regexTransport, '', $clean_text); // Match Miscellaneous Symbols $regexMisc = '/[\x{2600}-\x{26FF}]/u'; $clean_text = preg_replace($regexMisc, '', $clean_text); // Match Dingbats $regexDingbats = '/[\x{2700}-\x{27BF}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); $clean_text = preg_replace_callback( '/./u', function (array $match) { return strlen($match[0]) >= 4 ? '' : $match[0]; }, $clean_text); return trim($clean_text); } /** * 通用cURL请求封装 * * @param string $url 请求地址 * @param string $method 请求方法 (GET|POST|PUT|DELETE|PATCH) * @param mixed $data 请求数据,数组或字符串形式 * @param array $headers 请求头数组,如 ['Content-Type: application/json'] * @param array $files 文件上传数组,格式为 ['field_name' => '/path/to/file'] * @param array $auth 基础认证 ['username' => '', 'password' => ''] * @param int $timeout 超时时间(秒),默认60 * @param bool $verifySSL 是否验证SSL证书,默认false(不验证) * @return array 返回数组包含: * 'code' => HTTP状态码, * 'data' => 响应内容, * 'error' => 错误信息, * 'info' => curl_getinfo信息 */ function curlRequest( string $url, string $method = 'GET', $data = null, array $headers = [], array $files = [], array $auth = [], int $timeout = 60, bool $verifySSL = false ): array { $ch = curl_init(); $method = strtoupper($method); // 1. 基础配置 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_HEADER, false); // 2. SSL配置[2,6](@ref) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $verifySSL); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $verifySSL ? 2 : 0); // 3. 处理文件上传 (优先于普通数据)[8](@ref) if (!empty($files)) { foreach ($files as $field => $filePath) { if (file_exists($filePath)) { $data[$field] = new CURLFile($filePath); } } } // 4. 请求数据处理 if (!empty($data)) { // JSON数据[4](@ref) if (in_array('Content-Type: application/json', $headers)) { $payload = is_array($data) ? json_encode($data) : $data; curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); } // 表单数据/文件上传 else { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } } // 5. Header处理[4,2](@ref) if (!empty($headers)) { curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } // 6. 认证处理[4](@ref) if (!empty($auth['username']) && !empty($auth['password'])) { curl_setopt($ch, CURLOPT_USERPWD, "{$auth['username']}:{$auth['password']}"); } // 7. 执行请求 $response = curl_exec($ch); $error = curl_error($ch); $info = curl_getinfo($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return [ 'code' => $httpCode, 'data' => $response, 'error' => $error ?: null, 'info' => $info ]; } //启动事物 function t_begin() { Db::startTrans(); } //提交事物 function t_commit() { Db::commit(); } //回滚事物 function t_rollback() { Db::rollback(); } /** * * @param type $data * @param type $code */ function apiErrMsg($msg = '请勿异常操作', $code = 99999) { $api = [ 'code' => $code, 'msg' => empty($msg) ? \app\admin\service\ApiService::getMsg($code) : $msg, ]; exit(json_encode($api, JSON_UNESCAPED_UNICODE)); // $response = think\facade\Response::create(compact('code', 'msg'), 'json'); // throw new \think\exception\HttpResponseException($response); } function writeLog($log = '', $level = "writelog") { $logConfig = \think\facade\Config::pull('log'); $logConfig['level'][] = $level; $logConfig['apart_level'][] = $level; \think\facade\Log::init($logConfig); \think\facade\Log::write($log, $level); } /** * 推送消息给所有WebSocket客户端 * @param string $eventName 事件名称 * @param array $data 推送的数据 * @return bool */ function pushToAllClients($eventName, $data) { $socketUrl = 'http://127.0.0.1:2121'; $postData = [ 'type' => 'broadcast', 'event' => $eventName, 'data' => json_encode($data) ]; $options = [ 'http' => [ 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($postData), 'timeout' => 5 ] ]; $context = stream_context_create($options); $result = file_get_contents($socketUrl, false, $context); writeLog("Push result - event: $eventName, data: " . json_encode($data) . ", result: '$result'", 'push_log'); return $result === 'ok'; } /** * 推送未回价数量更新 * @param int $count 未回价数量 * @return bool */ function pushUnreturnedPriceCount($count) { return pushToAllClients('updateUnreturnedCount', ['count' => $count]); } /** * 获取未回价数量 * @return int */ function getUnreturnedPriceCount() { $Inquiry = new \app\model\Inquiry(); return $Inquiry->where('return_price_status', 2)->where('status', 1)->count(); } /** * 获取未回价数量并推送给所有客户端 * @return bool */ function fetchAndPushUnreturnedPriceCount() { $count = getUnreturnedPriceCount(); return pushUnreturnedPriceCount($count); } $GLOBALS['console'] = '';