微信小程序对接php通过stream流式输出AI大模型结果

php端代码参考(调用豆包)

<?php

header('Content-Type: text/event-stream'); // 以事件流的形式告知浏览器进行显示
header('Cache-Control: no-cache'); // 告知浏览器不进行缓存
header('X-Accel-Buffering: no'); //关闭加速缓冲
header('Connection: keep-alive');

$keyword = '你是谁';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $input = json_decode(file_get_contents('php://input'), true);
    if (isset($input['message'])) {
        $message = $input['message'];
    }
}

$url="https://ark.cn-beijing.volces.com/api/v3/chat/completions";
$json='{
"model":"doubao-seed-2-0-pro-260215",
"messages": [
    {
        "role": "system",
        "content": "请回答用户提出的植物名称或其他相关问题,如果提问仅包含植物名称则结合百度百科返回植物相关信息信息,删除返回结果中的citation代码内容,需包含:植物中文名称、别名、外文名、分布区域、功能特征、形态特征、生长环境及习性、病虫防治事项、栽培技术、松针腐植土是否适合种植等信息。如果用户提出的非植物相关问题,则正常输出结果。返回结果为html模式,支持的标签包含<p><strong><br/><b>等,不要使用复杂的css样式。以下是用户提问:"
    },
    {
        "content": "'.$message.'",
        "role": "user"
    }
],
"thinking": {"type": "disabled"},
"stream":true
}';
$arr=json_decode($json,true);
$header=['Authorization: Bearer ark-xxx','Content-Type: application/json'];

/**
    * 示例回调函数,用于处理接收到的数据并返回给客户端
    *
    * @param string $data 接收到的数据片段
    */
function handleResponseData($data) {
    // 在这里,你可以将数据写入输出缓冲区或直接发送给客户端-例如,使用 echo 或 SSE 发送数据
    //sleep(3);
    echo $data; // 假设这里直接将数据发送给客户端
    echo "\n";
    //刷新输出缓冲区---把数据输出给浏览器
    ob_flush();
    flush();
}
// 使用示例
$res=curlStreamRequest(
    $url, // 替换为实际的 API URL
    json_encode($arr), // 替换为实际的 POST 数据(如果需要)
    $header, // 替换为实际的请求头
    //直接传递闭包函数
    function($data) {
        handleResponseData($data);
    }
    //'handleResponseData' // 传递回调函数名作为字符串(如果回调函数在全局作用域中)
);

/**
 * 流式请求--通过 cURL 发起流式请求并处理响应
 *
 * @param string $url 请求的 URL
 * @param array $headers 请求头数组
 * @param array|string|null $postData POST 数据
 * @param callable $callback 处理响应数据的回调函数
 * @throws Exception 如果回调函数不是有效的 Callable
 */
function curlStreamRequest(string $url,$postData = null, array $headers = [],  callable $callback) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); // 不将响应保存为字符串,直接处理
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 注意:在生产环境中应启用 SSL 验证
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 注意:同上
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_POST, is_array($postData) || !empty($postData));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $data) use ($callback) {
        // 调用回调函数处理数据
        $callback($data);
        return strlen($data); // 返回接收到的数据长度
    });

    // 执行请求并获取响应
    curl_exec($ch);

    // 检查是否有错误发生
    if (curl_errno($ch)) {
        throw new \Exception(curl_error($ch));
    }

    // 关闭 cURL 句柄
    curl_close($ch);
}

微信小程序端代码

export default {
    data() {
        return {
            searchValue: '',
            searchResult: '',
            currentRequest: null, // 请求任务对象
        };
    },
    methods: {
        //搜索
        async searchBut() {
            let that = this;
            if (that.searchValue.length > 0) {
                //发起流式请求
                uni.showLoading({
                    title: '检索中'
                })
                await this.streamChat(that.searchValue)
            } else {
                return this.$util.Tips({
                    title: '请输入要搜索的内容',
                    icon: 'none',
                    duration: 1000,
                    mask: true,
                });
            }
        },

        // 流式聊天
        streamChat(message) {
            this.searchValue = '';
            this.searchResult = '';
            
            return new Promise((resolve, reject) => {
                const requestTask = wx.request({
                    url: "https://xxx/stream.php",
                    method: 'POST',
                    data: { message: message },
                    header: {
                        'Content-Type': 'application/json',
                        'Accept': 'text/event-stream'
                    },
                    responseType: 'text',
                    enableChunked: true, // 启用分块传输
                    success: (res) => {
                        this.finishStreaming()
                    },
                    fail: (err) => {
                        console.error('SSE请求失败', err)
                        this.handleStreamError('网络请求失败,请重试')
                    }
                })

                // 监听chunked数据(流式数据接收)
                let buffer = ''  // 数据缓冲区
                // 注意:小程序需要基础库2.20.1以上支持onChunkReceived
                requestTask.onChunkReceived((res) => {
                    uni.hideLoading();
                    // res.data 是ArrayBuffer,需要转为字符串
                    const chunk = this.arrayBufferToString(res.data)
                    buffer += chunk
                    
                    // 按行分割处理SSE格式数据
                    const lines = buffer.split('\n')
                    // 保留最后一个不完整的行
                    buffer = lines.pop() || ''
                    for (const line of lines) {
                        if (line.startsWith('data: ')) {
                            const dataStr = line.slice(6)
                            if (dataStr === '[DONE]') {
                                // 流结束标记
                                this.finishStreaming()
                                return
                            }
                            try {
                                const data = JSON.parse(dataStr)
                                if (data.choices && data.choices[0] && data.choices[0].delta && data.choices[0].delta.content) {
                                    // 追加内容到当前AI消息
                                    this.searchResult += data.choices[0].delta.content;
                                }
                            } catch (e) {
                                // 如果不是JSON格式,直接作为纯文本追加
                                this.searchResult += dataStr
                            }
                        } else if (line.trim() === '') {
                            // 空行忽略
                            continue
                        }
                    }
                })
                
                // 存储requestTask以便可能的中断
                this.currentRequest = requestTask
            })
        },
        // ArrayBuffer 转字符串
        arrayBufferToString(buffer) {
            // 微信小程序环境下的转换方法
            const dataView = new DataView(buffer)
            let result = ''
            for (let i = 0; i < dataView.byteLength; i++) {
                result += String.fromCharCode(dataView.getUint8(i))
            }
            // 如果是UTF-8编码,需要使用decodeURIComponent(escape(result))
            // 简单处理:如果乱码可尝试以下转换
            try {
                return decodeURIComponent(escape(result))
            } catch (e) {
                return result
            }
        },
        // 完成流式接收
        finishStreaming() {
            console.log('done')
            this.currentRequest = null
        },

        // 错误处理
        handleStreamError(errorMsg) {
            wx.showToast({
                title: errorMsg,
                icon: 'none',
                duration: 2000
            })
            this.currentRequest = null
        },
        
        abortStream() {
            if (this.currentRequest) {
                this.currentRequest.abort()
                this.currentRequest = null
            }
        },
    },
    onUnload() {
        this.abortStream()
    }
};

附:html页面处理流式输出

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>火山引擎AI模型流式输出演示</title>
    <style>
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        
        body {
            font-family: Arial, sans-serif;
            line-height: 1.6;
            background-color: #f5f5f5;
            padding: 20px;
        }
        
        .container {
            max-width: 800px;
            margin: 0 auto;
            background-color: white;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
            padding: 20px;
        }
        
        h1 {
            text-align: center;
            color: #333;
            margin-bottom: 20px;
        }
        
        .input-section {
            margin-bottom: 20px;
        }
        
        textarea {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px;
            resize: vertical;
            min-height: 100px;
            font-size: 16px;
        }
        
        button {
            display: block;
            width: 100%;
            padding: 10px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 4px;
            font-size: 16px;
            cursor: pointer;
            margin-top: 10px;
        }
        
        button:hover {
            background-color: #0069d9;
        }
        
        button:disabled {
            background-color: #6c757d;
            cursor: not-allowed;
        }
        
        .output-section {
            border: 1px solid #ddd;
            border-radius: 4px;
            padding: 15px;
            min-height: 300px;
            background-color: #f9f9f9;
            white-space: pre-wrap;
            font-size: 16px;
        }
        
        .loading {
            display: inline-block;
            width: 20px;
            height: 20px;
            border: 3px solid rgba(0, 123, 255, 0.3);
            border-radius: 50%;
            border-top-color: #007bff;
            animation: spin 1s ease-in-out infinite;
        }
        
        @keyframes spin {
            to { transform: rotate(360deg); }
        }
        
        .status {
            margin-top: 10px;
            font-size: 14px;
            color: #666;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>火山引擎AI模型流式输出演示</h1>
        
        <div class="input-section">
            <textarea id="userInput" placeholder="请输入您的问题..."></textarea>
            <button id="sendBtn" onclick="sendRequest()">发送请求</button>
        </div>
        
        <div class="status" id="status">
            <span id="statusText">就绪</span>
            <span id="loading" class="loading" style="display: none;"></span>
        </div>
        
        <div class="output-section" id="output"></div>
    </div>
    
    <script>
        async function sendRequest() {
            const userInput = document.getElementById('userInput').value;
            const output = document.getElementById('output');
            const sendBtn = document.getElementById('sendBtn');
            const statusText = document.getElementById('statusText');
            const loading = document.getElementById('loading');
            
            if (!userInput.trim()) {
                alert('请输入问题');
                return;
            }
            
            // 重置状态
            output.textContent = '';
            sendBtn.disabled = true;
            statusText.textContent = '处理中...';
            loading.style.display = 'inline-block';
            
            try {
                // 发送请求到PHP后端
                const response = await fetch('doubao.php', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify({ keyword: userInput })
                });
                
                if (!response.ok) {
                    throw new Error(`HTTP error! status: ${response.status}`);
                }
                
                const reader = response.body.getReader();
                const decoder = new TextDecoder();
                
                while (true) {
                    const { done, value } = await reader.read();
                    if (done) break;
                    
                    const chunk = decoder.decode(value, { stream: true });
                    const lines = chunk.split('\n');
                    
                    for (const line of lines) {
                        if (line.trim() === '') continue;
                        
                        if (line === 'data: [DONE]') {
                            statusText.textContent = '完成';
                            loading.style.display = 'none';
                            sendBtn.disabled = false;
                            break;
                        }
                        
                        if (line.startsWith('data: ')) {
                            const jsonStr = line.substring(6);
                            try {
                                const data = JSON.parse(jsonStr);
                                if (data.choices && data.choices[0] && data.choices[0].delta && data.choices[0].delta.content) {
                                    output.textContent += data.choices[0].delta.content;
                                    // 滚动到底部
                                    output.scrollTop = output.scrollHeight;
                                }
                            } catch (e) {
                                console.error('解析JSON错误:', e);
                            }
                        } else {
                            // 直接输出非JSON数据(如PHP的echo输出)
                            output.textContent += line;
                            output.scrollTop = output.scrollHeight;
                        }
                    }
                }
            } catch (error) {
                console.error('请求错误:', error);
                output.textContent = `错误: ${error.message}`;
                statusText.textContent = '错误';
                loading.style.display = 'none';
                sendBtn.disabled = false;
            }
        }
        
        // 按Enter键发送请求(Shift+Enter换行)
        document.getElementById('userInput').addEventListener('keydown', function(e) {
            if (e.key === 'Enter' && !e.shiftKey) {
                e.preventDefault();
                sendRequest();
            }
        });
    </script>
</body>
</html>

使用phpword读取word中的文本、表格等内容

phpword读取word中的内容,调用deepseek后生成word下载,代码如下:


<?php
/**
 * Desc:
 * User: SenSen Wechat:1050575278
 * Date: 2025-8-27
 * Time: 11:02
 */

namespace app\index\controller\service;

use app\index\controller\Auth;
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\SimpleType\Jc;
use sensen\services\HttpService;
use sensen\services\JsonService;
use sensen\services\upload\Upload;

class QiSuZhuang extends Auth
{
    /**
     * 诉状上传
     */
    public function upload()
    {
        $upload_type = $this->request->get('upload_type', sys_config('upload_type', 1));
        try {
            $path = make_path('qisuzhuang', 2, true);
            $upload = new Upload((int)$upload_type, [
                'accessKey' => sys_config('accessKey'),
                'secretKey' => sys_config('secretKey'),
                'uploadUrl' => sys_config('uploadUrl'),
                'storageName' => sys_config('storage_name'),
                'storageRegion' => sys_config('storage_region'),
            ]);
            //验证类型
            $res = $upload->to($path)->validate(['fileExt'=>'doc,docx', 'fileMime'=>['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/msword']])->move('file');
            if ($res === false) {
                return JsonService::fail('上传失败:' . $upload->getError());
            } else {
                $fileInfo = $upload->getUploadInfo();
                if ($fileInfo) {
                    $file = '.'.$fileInfo['dir'];
                    $phpWord = IOFactory::load($file);
                    $sections = $phpWord->getSections();
                    $szContent = '';
                    foreach ($sections as $section) {
                        $elements = $section->getElements(); // 获取当前section的所有元素
                        foreach ($elements as $element) {
                            if ($element instanceof \PhpOffice\PhpWord\Element\TextRun) {
                                // 文本段落
                                foreach ($element->getElements() as $ele) {
                                    $szContent .= self::getTextNode($ele) . "\n";
                                }
                            }else if ($element instanceof \PhpOffice\PhpWord\Element\Table) {
                                foreach ($element->getRows() as $ele) {
                                    $szContent .= self::getTableNode($ele) . "\n";
                                }
                            }
                        }
                    }

                    $deepSeekContent = $this->getDeepSeekContent($szContent);
                    debug_file($deepSeekContent, 'qisuzhuang');
                    $fileName = date('YmdHis');
                    $this->generateQszWord($deepSeekContent, $fileName);
                    return JsonService::successful('上传成功', ['path'=>'/uploads/qisuzhuang/'.$fileName.'.docx']);
                }else{
                    return JsonService::fail('上传失败:' . $upload->getError());
                }
            }
        } catch (\Exception $e) {
            return JsonService::fail('上传失败:' . $e->getMessage());
        }
    }

    /**
     * 获取文档节点内容
     * @param $node
     * @return string
     */
    public static function getTextNode($node)
    {
        $str = '';
        //处理文本
        if ($node instanceof \PhpOffice\PhpWord\Element\Text) {
            $str .= $node->getText();
        } else if ($node instanceof \PhpOffice\PhpWord\Element\Image) {
            //处理图片
            $str .= self::pic2text($node);
        } else if ($node instanceof \PhpOffice\PhpWord\Element\TextRun) {
            //处理文本元素
            foreach ($node->getElements() as $ele) {
                $str .= self::getTextNode($ele);
            }
        }
        return $str;
    }

    /**
     * 获取表格节点内容
     * @param $node
     * @return string
     */
    public static function getTableNode($node)
    {
        $str = '';
        if ($node instanceof \PhpOffice\PhpWord\Element\Row) {
            //处理行
            foreach ($node->getCells() as $ele) {
                $str .= self::getTableNode($ele);
            }
        } else if ($node instanceof \PhpOffice\PhpWord\Element\Cell) {
            //处理列
            foreach ($node->getElements() as $ele) {
                $str .= self::getTextNode($ele);
            }
        }
        return $str;
    }

    /**
     * 处理word文档中base64格式图片
     * @param $node
     * @return string
     */
    public static function pic2text($node)
    {
        //获取图片编码
        $imageData = $node->getImageStringData(true);
        //添加图片html显示标头
        $imageData = 'data:' . $node->getImageType() . ';base64,' . $imageData;
        return '<img src="'.$imageData.'">';
    }

    /**
     * 处理word文档中base64格式图片
     * @param $node
     * @return string
     */
    public static function pic2file($node)
    {
        //图片地址(一般为word文档地址+在word中的锚点位置)
        $imageSrc  = 'images/' . md5($node->getSource()) . '.' . $node->getImageExtension();
        $imageData = $node->getImageStringData(true);
        //将图片保存在本地
        file_put_contents($imageSrc, base64_decode($imageData));
        return $imageSrc;
    }

    /**
     * 将word转化为html(转换存储html文件后展示)
     */
    public static function word2html($path)
    {
        $phpWord = IOFactory::load($path);
        $htmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'HTML');
        $path = pathinfo($path);
        $fileName = $path['dirname'] . '/' . $path['filename'] . '.html';
        $htmlWriter->save($fileName);
        $html = file_get_contents($fileName);
        return $html;
    }

    /**
     * 获取deepseek结果
     * @param string $content
     * @return mixed
     */
    public function getDeepSeekContent($content='')
    {
        $response = HttpService::postRequest('https://api.deepseek.com/chat/completions', [
            'model' => "deepseek-chat",
            "stream" => false,
            'messages' => [
                [
                    'role'=>"system",
                    'content'=>"您是法律专家,请根据提供的案件起诉状信息,生成案件诉讼的要素式起诉状信息。"
                ],
                [
                    'role' => "user",
                    'content'=>$content
                ],
                [
                    'role' => "user",
                    'content'=>'根据以上诉状内容,若原告、被告、委托诉讼代理人、第三人等存在多个数据,则返回二维数组,括号中的文字为对应数据处理说明。严格按照以下格式返回JSON数据,如无内容则留空:
{
    "原告(自然人)":[
        {
            原告姓名:
            原告性别:
            原告证件类型:
            原告证件号码:
            原告出生日期:
            原告年龄:
            原告民族:
            原告工作单位:
            原告职务:
            原告住所地:
            原告联系电话:
        }
    ],
    "原告(法人、非法人组织)":[
        {
            单位名称:
            单位所在地:
            法定代表人/主要负责人:
            法人代表人/主要负责人职务:
            联系电话:
            原告证件类型:
            原告证件号码:
            统一社会信用代码:
            单位性质:(可选项包含:有限责任公司、股份有限公司、上市公司、其他企业法人、事业单位、社会团体、基金会、社会服务机构、机关法人、农村集体经济组织法人、城镇农村的合作经济组织法人、基层群众性自治组织法人、个人独资企业、合伙企业、不具有法人资格的专业服务机构)
            所有制性质:(可选项包含:国有控股、国有参股、民营、其他)
        }
    ],
    "委托诉讼代理人":[
        {
            姓名:
            单位:
            职务:(可选项包含:律师、法律服务工作者、其他)
            联系电话:
            代理权限:
        }
    ],
    "被告(自然人)":[
        {
            被告姓名:
            被告性别:
            被告证件类型:
            被告证件号码:
            被告出生日期:
            被告年龄:
            被告民族:
            被告工作单位:
            被告职务:
            被告住所地:
            被告联系电话:
        }
    ],
    "被告(法人、非法人组织)":[
        {
            单位名称:
            单位所在地:
            法定代表人/主要负责人:
            法人代表人/主要负责人职务:
            联系电话:
            被告证件类型:
            被告证件号码:
            统一社会信用代码:
            单位性质:(可选项包含:有限责任公司、股份有限公司、上市公司、其他企业法人、事业单位、社会团体、基金会、社会服务机构、机关法人、农村集体经济组织法人、城镇农村的合作经济组织法人、基层群众性自治组织法人、个人独资企业、合伙企业、不具有法人资格的专业服务机构)
            所有制性质:(可选项包含:国有控股、国有参股、民营、其他)
        }
    ],
    "第三人(自然人)":[
        {
            姓名:
            性别:
            证件类型:
            证件号码:
            出生日期:
            年龄:
            民族:
            工作单位:
            职务:
            住所地:
            联系电话:
        }
    ],
    "第三人(法人、非法人组织)":[
        {
            单位名称:
            单位所在地:
            法定代表人/主要负责人:
            法人代表人/主要负责人职务:
            联系电话:
            原告证件类型:
            原告证件号码:
            统一社会信用代码:
            单位性质:(可选项包含:有限责任公司、股份有限公司、上市公司、其他企业法人、事业单位、社会团体、基金会、社会服务机构、机关法人、农村集体经济组织法人、城镇农村的合作经济组织法人、基层群众性自治组织法人、个人独资企业、合伙企业、不具有法人资格的专业服务机构)
            所有制性质:(可选项包含:国有控股、国有参股、民营、其他)
        }
    ],
    "原告身份":(可选项包含:卖方、买方)
    "诉讼请求":(返回完整诉讼请求)
    "给付价款":(人民币,单位:元,下同:如外币需特别注明)
    "迟延给付价款的利息(违约金)":(如原告身份为卖方时填写,返回详细描述内容)
    "是否请求支付至实际清偿之日":(如原告身份为卖方时填写,可选项包含:是、否)
    "支付赔偿金":(单位:元)
    "违约类型":(如原告身份为买方时填写,可选项包含:迟延履行、不履行、其他)
    "具体情形":(返回详细描述内容)
    "损失计算依据":(返回详细描述内容)
    "是否对标的物的瑕疵承担责任":(可选项包含:是、否)
    "对标的物的瑕疵责任承担方式":(可选项包含:修理、重作、更换、退货、减少价款或者报酬、其他)
    "要求继续履行或是解除合同":(可选项包含:继续履行、判令解除合同、已解除)
    "继续履行期限":(返回XX日内履行完毕付款或供货义务)
    "解除日期":
    "是否主张担保权利":(如为是,同时返回主张内容)
    "是否主张实现债权的费用":(如为是,同时返回主张内容)
    "是否主张诉讼费用":(可选项包含:是、否)
    "其他请求":(将其他请求填写到此处)
    "标的总额":
    "有无仲裁、法院管辖规定":(如为是,同时返回合同条款及内容)
    "是否已经诉前保全":(如为是,返回保全法院、保全时间、保全案号)
    "事实与理由":(返回完整表述纠纷涉及的事实与理由)
    "合同签订情况":(返回名称、编号、签订时间、地点等;如无书面合同,请注明"无书面合同")
    "出卖人(卖方)":
    "买受人(买方)":
    "买卖标的物情况":
    "合同约定的单价":
    "合同约定的总价":
    "合同支付媒介":(可选项包含:现金、转账、票据、其他方式)
    "合同支付方式":(可选项包含:一次性支付、分期支付)
    "分期方式":
    "合同约定信息":(包含合同约定的交货时间、地点、方式、风险承担、安装、调试、验收等)
    "合同约定的质量标准及检验方式、质量异议期限":
    "合同约定的违约金(定金)":(返回:违约金金额及对应合同条款、定金金额及对应合同条款、迟延履行违约金利率及合同条款)
    "价款支付及标的物交付情况":{
        "按期支付价款":(单位:元)
        "逾期付款":(单位:元)
        "逾期未付款":(单位:元)
        "按期交付标的物":(单位:件)
        "逾期交付":(单位:件)
        "逾期未交付":(单位:件)
    }
    "是否存在延迟履行":{
        "延迟时间":
        "延期履行方式":(可选项包含:逾期付款、逾期交货)
    }
    "是否催促过履行":{
        "催促日期":
        "催促方式":
    }
    "买卖合同标的物有无质量争议":(如有,同时返回具体情况)
    "标的物质量规格或履行方式是否存在不符合约定的情况":(如有,同时返回具体情况)
    "是否曾就标的物质量问题进行协商":(如有,同时返回具体情况)
    "是否通知解除合同":(如有,同时返回具体情况)
    "被告应当支付的利息、违约金、赔偿金":{
        "利息":(单位:元)
        "违约金":(单位:元)
        "赔偿金":(单位:元)
        "共计":(单位:元)
        "计算方式":
    }
    "是否签订物的担保(抵押、质押)合同":(如签订,同时返回签订时间)
    "担保人":
    "担保物":
    "是否最高额担保(抵押、质押)":{
        "担保债权的确定时间":
        "担保额度":
    }
    "抵押、质押登记登记方式":(可选项包含:正式登记、预告登记)
    "是否签订保证合同":{
        "签订时间":
        "保证人":
        "保证合同主要内容":
        "保证方式":(可选项包含:一般保证、连带责任保证)
    }
    "其他担保方式":{
        "担保形式":
        "签订时间":
    }
    "请求承担责任的合同约定":
    "请求承担责任的法律规定":
    "其他需要说明的内容":
    "证据清单":
    "对纠纷解决方式的意愿":{
        "是否了解调解作为非诉讼纠纷解决方式,能及时、高效、低成本、不伤和气地解决纠纷":(可选项包含:了解、不了解)
        "立案后选择先行调解的,可以很快启动调解程序。如不同意调解,法院将依程序开庭审理案件,但可能需要经过较长一段时间的排期等待,且审理、执行周期相对较长":(可选项包含:了解、不了解)
        "选择先行调解,调解成功且自动履行的免交诉讼费用,申请司法确认的不交纳诉讼费用,要求出具调解书的减半交纳诉讼费用":(可选项包含:了解、不了解)
        "首次调解不成功,但仍有继续调解意愿的,可以选择更换调解组织和调解员再进行调解。调解无法达成一致意见的,法院将依程序排期开庭":(可选项包含:了解、不了解)
        "依照法律规定,调解具有保密性要求,调解过程不公开,调解协议未经当事人同意不得公开":(可选项包含:了解、不了解)
        "调解达成的协议具有法律效力,可以依照法律规定申请司法确认,具有强制执行效力":(可选项包含:了解、不了解)
        "是否考虑先行调解":(可选项包含:是、否、暂不确定)
    }
}'
                ]
            ]
        ], [
            "Content-Type: application/json",
            "Authorization: Bearer sk-67b56a4e297c466f8e8f153814393173"
        ], 500, 'json');
        $response = json_decode($response);
        $content = $response->choices[0]->message->content;
        return $content;
    }

    /**
     * 生成起诉状word
     * todo 区分不同类型的起诉状
     * @param string $content
     * @return string
     */
    public function generateQszWord($content='', $fileName='test')
    {
        $content = str_replace('```json', '', $content);
        $content = str_replace('```', '', $content);
        $content = json_decode($content, true);

        $savePath = public_path().'/uploads/qisuzhuang/'.$fileName.'.docx';

        $phpWord = new PhpWord();
        $section = $phpWord->addSection();
        $paragraphStyleName = 'pStyle';
        $phpWord->addParagraphStyle($paragraphStyleName, array('size' => 16, 'bold' => true, 'alignment' => Jc::CENTER, 'spaceAfter' => 100));

        $section->addText('民事起诉状', array('size' => 18, 'bold'=>true), $paragraphStyleName);
        $section->addText('(买卖合同纠纷)', array('size' => 18, 'bold'=>true), $paragraphStyleName);

        $cellRowSpan = array('vMerge' => 'restart', 'valign' => 'center');
        $cellRowContinue = array('vMerge' => 'continue');
        $cellColSpan = array('gridSpan' => 1, 'valign' => 'center');
        $cellHCentered = array('alignment' => Jc::CENTER);
        $cellVCentered = array('valign' => 'center');


        $fancyTableStyle = array('borderSize' => 6, 'borderColor' => '000');
        $spanTableStyleName = 'Colspan Rowspan';
        $phpWord->addTableStyle($spanTableStyleName, $fancyTableStyle);
        $table = $section->addTable($spanTableStyleName);
        $table->addRow(500);
        $cell0 = $table->addCell(9200, $cellRowSpan);
        $cell0->addText("说明:", array('size' => 12, 'bold'=>true));
        $cell0->addText("为了方便您参加诉讼,保护您的合法权利,请填写本表。<br/>
1. 起诉时需向人民法院提交证明您身份的材料,如身份证复印件、营业执照复印件等。<br/>
2. 本表所列内容是您提起诉讼以及人民法院查明案件事实所需,请务必如实填写。<br/>
3. 本表有些内容可能与您的案件无关,您认为与案件无关的项目可以填“无”或不填;对于本表中勾选项可以在对应项打“√ ”;您认为另有重要内容需要列明的,可以另附页填写。<br/>
4. 本表word电子版填写时,相关栏目可复制粘贴或扩容,但不得改变要素内容、格式设置。例如,多原告、多被告或多委托诉讼代理人等情况,可根据实际情况复制粘贴;需填写文字较多时,可根据实际对栏目进行扩容等。<br/>
★特别提示★<br/>
诉讼参加人应遵守诚信原则如实认真填写表格。<br/>
如果诉讼参加人违反有关规定,虚假诉讼、恶意诉讼、滥用诉权,人民法院将视违法情形依法 追究责任。");
        $cell0->getStyle()->setGridSpan(2);
        $table->addRow(500);
        $cell1 = $table->addCell(9200, $cellRowSpan);
        $cell1->addText("当事人信息", array('size' => 18, 'bold'=>true), $paragraphStyleName);
        $cell1->getStyle()->setGridSpan(2);

        //遍历循环原告 至少包含一个原告
        $yuangao = isset($content["原告(自然人)"])?$content["原告(自然人)"]:[
            [
                "原告姓名"=>"",
                "原告性别"=>"",
                "原告证件类型"=>"",
                "原告证件号码"=>"",
                "原告出生日期"=>"",
                "原告年龄"=>"",
                "原告民族"=>"",
                "原告工作单位"=>"",
                "原告职务"=>"",
                "原告住所地"=>"",
                "原告联系电话"=>""
            ]
        ];

        foreach ($yuangao as $key=>$v){
            $table->addRow(500);
            $table->addCell(2000, $cellRowSpan)->addText("原告(自然人)");
            $sexStr = $this->parseSex($v['原告性别']);
            $table->addCell(7200, $cellRowSpan)->addText("姓名:{$v['原告姓名']}<br/>性别:{$sexStr}<br/>证件类型:{$v['原告证件类型']}<br/>证件号码:{$v['原告证件号码']}<br/>出生日期:{$v['原告证件类型']}<br/>年龄:{$v['原告年龄']}<br/>民族:{$v['原告民族']}<br/>工作单位:{$v['原告工作单位']}<br/>职业:{$v['原告职务']}<br/>住所地:{$v['原告住所地']}<br/>联系电话:{$v['原告联系电话']}");
        }

        //遍历循环原告法人
        $yuangaoFaren = isset($content["原告(法人、非法人组织)"])?$content["原告(法人、非法人组织)"]:[
            [
                "单位名称"=>'',
                "单位所在地"=>'',
                "法定代表人/主要负责人"=>'',
                "法人代表人/主要负责人职务"=>'',
                "联系电话"=>'',
                "原告证件类型"=>'',
                "原告证件号码"=>'',
                "统一社会信用代码"=>'',
                "单位性质"=>'',
                "所有制性质"=>'',
            ]
        ];
        foreach ($yuangaoFaren as $key=>$v){
            $table->addRow(500);
            $table->addCell(2000, $cellRowSpan)->addText("原告(法人、非法人组织)");

            $companyType = $this->parseCompanyType($v['单位性质']);
            $companyNature = $this->parseCompanyNature($v['所有制性质']);

            $table->addCell(7200, $cellRowSpan)->addText("名称:{$v['单位名称']}<br/>住所地(主要办事机构所在地):{$v['单位所在地']}<br/>法定代表人/主要负责人:{$v['法定代表人/主要负责人']}<br/>职务:{$v['法人代表人/主要负责人职务']}<br/>联系电话:{$v['联系电话']}<br/>证件类型:{$v['原告证件类型']}<br/>证件号码:{$v['原告证件号码']}<br/>统一社会信用代码:{$v['统一社会信用代码']}<br/>类型:{$companyType}<br/>所有制性质:{$companyNature}");
        }

        //委托诉讼人
        $wtssr = (isset($content["委托诉讼代理人"]) && $content["委托诉讼代理人"])?$content["委托诉讼代理人"]:[
            [
                "姓名"=>"",
                "单位"=>"",
                "职务"=>"",
                "联系电话"=>"",
                "代理权限"=>"",
            ]
        ];
        foreach ($wtssr as $key=>$v){
            $table->addRow(500);
            $table->addCell(2000, $cellRowSpan)->addText("委托诉讼代理人");
            $lvshicell0 = $table->addCell(7200, $cellRowSpan);
            if($v['姓名']){
                $lvshicell0->addText('有<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>');
            }else{
                $lvshicell0->addText('有<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>');
            }

            $lvshicell0->addText("姓名:{$v['姓名']}<br/>单位:{$v['单位']}<br/>职务:{$v['职务']}<br/>联系电话:{$v['联系电话']}<br/>");
            $lvshicell0->addText('一般授权 <w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r> 特别授权 <w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>____________');
            if(!$v['姓名']){
                $lvshicell0->addText('无<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>');
            }else{
                $lvshicell0->addText('无<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>');
            }
        }

        //遍历循环被告 至少包含一个被告
        $beigao = isset($content["被告(自然人)"])?$content["被告(自然人)"]:[
            [
                "被告姓名"=>'',
                "被告性别"=>'',
                "被告证件类型"=>'',
                "被告证件号码"=>'',
                "被告出生日期"=>'',
                "被告年龄"=>'',
                "被告民族"=>'',
                "被告工作单位"=>'',
                "被告职务"=>'',
                "被告住所地"=>'',
                "被告联系电话"=>'',
            ]
        ];
        foreach ($beigao as $key=>$v){
            $table->addRow(500);
            $table->addCell(2000, $cellRowSpan)->addText("被告(自然人)");
            $sexStr = $this->parseSex($v['被告性别']);
            $table->addCell(7200, $cellRowSpan)->addText("姓名:{$v['被告姓名']}<br/>性别:{$sexStr}<br/>证件类型:{$v['被告证件类型']}<br/>证件号码:{$v['被告证件号码']}<br/>出生日期:{$v['被告出生日期']}<br/>年龄:{$v['被告年龄']}<br/>民族:{$v['被告民族']}<br/>工作单位:{$v['被告工作单位']}<br/>职业:{$v['被告职务']}<br/>住所地:{$v['被告住所地']}<br/>联系电话:{$v['被告联系电话']}");
        }

        //遍历循环被告 至少包含一个原告
        $beigaoFaren = isset($content["被告(法人、非法人组织)"])?$content["被告(法人、非法人组织)"]:[
            [
                "单位名称"=>'',
                "单位所在地"=>'',
                "法定代表人/主要负责人"=>'',
                "法人代表人/主要负责人职务"=>'',
                "联系电话"=>'',
                "被告证件类型"=>'',
                "被告证件号码"=>'',
                "统一社会信用代码"=>'',
                "单位性质"=>'',
                "所有制性质"=>'',
            ]
        ];
        foreach ($beigaoFaren as $key=>$v){
            $table->addRow(500);
            $table->addCell(2000, $cellRowSpan)->addText("被告(法人、非法人组织)");

            $companyType = $this->parseCompanyType($v['单位性质']);
            $companyNature = $this->parseCompanyNature($v['所有制性质']);

            $table->addCell(7200, $cellRowSpan)->addText("名称:{$v['单位名称']}<br/>住所地(主要办事机构所在地):{$v['单位所在地']}<br/>法定代表人/主要负责人:{$v['法定代表人/主要负责人']}<br/>职务:{$v['法人代表人/主要负责人职务']}<br/>联系电话:{$v['联系电话']}<br/>证件类型:{$v['被告证件类型']}<br/>证件号码:{$v['被告证件号码']}<br/>统一社会信用代码:{$v['统一社会信用代码']}<br/>类型:{$companyType}<br/>所有制性质:{$companyNature}");
        }

        //遍历循环第三人
        $disanren = isset($content["第三人(自然人)"])?$content["第三人(自然人)"]:[
            [
                "姓名"=>'',
                "性别"=>'',
                "证件类型"=>'',
                "证件号码"=>'',
                "出生日期"=>'',
                "年龄"=>'',
                "民族"=>'',
                "工作单位"=>'',
                "职务"=>'',
                "住所地"=>'',
                "联系电话"=>'',
            ]
        ];
        foreach ($disanren as $key=>$v){
            $table->addRow(500);
            $table->addCell(2000, $cellRowSpan)->addText("第三人(自然人)");
            $sexStr = $this->parseSex($v['性别']);
            $table->addCell(7200, $cellRowSpan)->addText("姓名:{$v['姓名']}<br/>性别:{$sexStr}<br/>证件类型:{$v['证件类型']}<br/>证件号码:{$v['证件号码']}<br/>出生日期:{$v['出生日期']}<br/>年龄:{$v['年龄']}<br/>民族:{$v['民族']}<br/>工作单位:{$v['工作单位']}<br/>职务:{$v['职务']}<br/>住所地:{$v['住所地']}<br/>联系电话:{$v['联系电话']}");
        }

        //遍历循环
        $beigaoFaren = isset($content["第三人(法人、非法人组织)"])?$content["第三人(法人、非法人组织)"]:[
            [
                "单位名称"=>'',
                "单位所在地"=>'',
                "法定代表人/主要负责人"=>'',
                "法人代表人/主要负责人职务"=>'',
                "联系电话"=>'',
                "被告证件类型"=>'',
                "被告证件号码"=>'',
                "统一社会信用代码"=>'',
                "单位性质"=>'',
                "所有制性质"=>'',
            ]
        ];
        foreach ($beigaoFaren as $key=>$v){
            $table->addRow(500);
            $table->addCell(2000, $cellRowSpan)->addText("第三人(法人、非法人组织)");

            $companyType = $this->parseCompanyType($v['单位性质']);
            $companyNature = $this->parseCompanyNature($v['所有制性质']);

            $table->addCell(7200, $cellRowSpan)->addText("名称:{$v['单位名称']}<br/>住所地(主要办事机构所在地):{$v['单位所在地']}<br/>法定代表人/主要负责人:{$v['法定代表人/主要负责人']}<br/>职务:{$v['法人代表人/主要负责人职务']}<br/>联系电话:{$v['联系电话']}<br/>证件类型:{$v['被告证件类型']}<br/>证件号码:{$v['被告证件号码']}<br/>统一社会信用代码:{$v['统一社会信用代码']}<br/>类型:{$companyType}<br/>所有制性质:{$companyNature}");
        }


        $table->addRow(500);
        $cell1 = $table->addCell(9200, $cellRowSpan);
        $cell1->addText("诉讼请求和依据", array('size' => 18, 'bold'=>true), $paragraphStyleName);
        $cell1->addText("(原告为卖方时,填写第1项、第2项;原告为买方时,填写第3项、第4项;第5项至第10项为共同项)", array('size' => 12), $paragraphStyleName);
        $cell1->getStyle()->setGridSpan(2);

        $table->addRow(500);
        $cell1 = $table->addCell(9200, $cellRowSpan);
        if($content['诉讼请求']){
            $cell1->addText($content['诉讼请求']);
        }else{
            $cell1->addText("(可完整表述诉讼请求;为方便、准确梳理要点,相关内容请在下方要素式表格中填写)");
        }
        $cell1->getStyle()->setGridSpan(2);

        //诉讼依据
        $geifujiakuan = $yanchiweiyuejin = $qingqiuqingchang = "";
        $peichangjin = $weiyueleixing = $jutiqingxing = $sunshijisuan = $xiacizeren = $xicizerenleixing = '';
        if(isset($content['原告身份'])){
            if($content['原告身份'] == '卖方'){
                $geifujiakuan = $content['给付价款'];
                $yanchiweiyuejin = $content['迟延给付价款的利息(违约金)'];
                $qingqiuqingchang = $this->parseYesOrNo($content['是否请求支付至实际清偿之日']);
            }elseif($content['原告身份'] == '买方'){
                $peichangjin = $content['支付赔偿金'];

                if($content['是否请求支付违约金'] == '迟延履行'){
                    $weiyueleixing = "<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>迟延履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>不履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他";
                }elseif($content['是否请求支付违约金'] == '不履行'){
                    $weiyueleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>迟延履行 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>不履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他";
                }elseif($content['是否请求支付违约金'] == '其他'){
                    $weiyueleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>迟延履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>不履行 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>其他";
                }else{
                    $weiyueleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>迟延履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>不履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他";
                }

                $jutiqingxing = $content['具体情形'];
                $sunshijisuan = $content['损失计算依据'];
                $xiacizeren = $this->parseYesOrNo($content['是否对标的物的瑕疵承担责任']);
                if($content['对标的物的瑕疵责任承担方式'] == '修理'){
                    $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他";
                }elseif($content['是否请求支付违约金'] == '重作'){
                    $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他";
                }elseif($content['是否请求支付违约金'] == '更换'){
                    $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他";
                }elseif($content['是否请求支付违约金'] == '退货'){
                    $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他";
                }elseif($content['是否请求支付违约金'] == '减少价款或者报酬'){
                    $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他";
                }elseif($content['是否请求支付违约金'] == '其他'){
                    $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>其他";
                }else{
                    $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他";
                }
            }
            $table->addRow(500);
            $table->addCell(2000, $cellRowSpan)->addText("1.给付价款(元)");
            $table->addCell(7200, $cellRowSpan)->addText($geifujiakuan."元(人民币,下同:如外币需特别注明);");

            $table->addRow(500);
            $table->addCell(2000, $cellRowSpan)->addText("2.迟延给付价款的利息(违约金)");
            $table->addCell(7200, $cellRowSpan)->addText("截至止,迟延给付价款的利息元、违约金{$yanchiweiyuejin}元;自之后的逾期利息、违约金,以 元为基数按照标准计算;<br/>计算方式:<br/>是否请求支付至实际清偿之日止:{$qingqiuqingchang}");

            $table->addRow(500);
            $table->addCell(2000, $cellRowSpan)->addText("3.赔偿因卖方违约所受的损失");
            $table->addCell(7200, $cellRowSpan)->addText("支付赔偿金{$peichangjin}元<br/>违约类型:{$weiyueleixing}<br/>具体情形:{$jutiqingxing}<br/>损失计算依据:{$sunshijisuan}");
            $table->addRow(500);
            $table->addCell(2000, $cellRowSpan)->addText("4.是否对标的物的瑕疵承担责任");
            $table->addCell(7200, $cellRowSpan)->addText("{$xiacizeren}<br/>{$xicizerenleixing}");
        }

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("5.要求继续履行或是解除合同");
        $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>继续履行  日内履行完毕 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>付款 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>供货 义务 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>判令解除合同<br/>确认买卖合同已于{$content['解除日期']}解除");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("6.是否主张担保权利");
        $zzdbql = $this->parseYesOrNo($content['是否主张担保权利']);
        if($content['是否主张担保权利'] == '是'){
            $content['是否主张担保权利'] = '';
        }
        $table->addCell(7200, $cellRowSpan)->addText("{$zzdbql} <br/>内容:{$content['是否主张担保权利']}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("7.是否主张实现债权的费用");
        $zzzqfy = $this->parseYesOrNo($content['是否主张实现债权的费用']);
        if($content['是否主张实现债权的费用'] == '是'){
            $content['是否主张实现债权的费用'] = '';
        }
        $table->addCell(7200, $cellRowSpan)->addText("{$zzzqfy} <br/>费用明细:{$content['是否主张实现债权的费用']}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("8.是否主张诉讼费用");
        $sfzzssf = $this->parseYesOrNo($content['是否主张诉讼费用']);
        $table->addCell(7200, $cellRowSpan)->addText("{$sfzzssf}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("9.其他请求");
        $table->addCell(7200, $cellRowSpan)->addText($content['其他请求']);

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("10.标的总额");
        $table->addCell(7200, $cellRowSpan)->addText($content['标的总额']);

        $table->addRow(500);
        $cell1 = $table->addCell(9200, $cellRowSpan);
        $cell1->addText("约定管辖和诉前保全", array('size' => 18, 'bold'=>true), $paragraphStyleName);
        $cell1->getStyle()->setGridSpan(2);

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("1.有无仲裁、法院管辖约定");
        if($content['有无仲裁、法院管辖规定']){
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>有 合同条款及内容:{$content['有无仲裁、法院管辖规定']}<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>无");
        }else{
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>有 合同条款及内容:<br/><w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>无");
        }

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("2.是否申请诉前保全");
        if($content['是否已经诉前保全']){
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是  {$content['是否已经诉前保全']}<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否<br/>(如申请诉讼保全,请另行提交诉讼保全申请及相关材料)");
        }else{
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是<br/>保全法院:<br/><br/>保全时间:<br/><br/>保全案号:<br/><w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>否<br/>(如申请诉讼保全,请另行提交诉讼保全申请及相关材料)");
        }

        $table->addRow(500);
        $cell1 = $table->addCell(9200, $cellRowSpan);
        $cell1->addText("事实和理由", array('size' => 18), $paragraphStyleName);
        $cell1->getStyle()->setGridSpan(2);

        $table->addRow(500);
        $cell1 = $table->addCell(9200, $cellRowSpan);
        if($content['事实与理由']){
            $cell1->addText($content['事实与理由']);
        }else{
            $cell1->addText("(可完整表述纠纷涉及的事实与理由;为方便、准确梳理要点,相关内容请在下方要素式表格中填写)");
        }
        $cell1->getStyle()->setGridSpan(2);

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("1.合同的签订情况(名称、编号、签订时间、地点等;如无书面合同,请注明“无书面合同”)");
        $table->addCell(7200, $cellRowSpan)->addText($content['合同签订情况']);

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("2.合同主体");
        $table->addCell(7200, $cellRowSpan)->addText("出卖人(卖方):{$content['出卖人(卖方)']}<br/>买受人(买方):{$content['买受人(买方)']}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("3.买卖标的物情况(标的物名称、规格、质量、数量等)");
        $table->addCell(7200, $cellRowSpan)->addText($content['买卖标的物情况']);

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("4.合同约定的价格及支付方式");
        $table->addCell(7200, $cellRowSpan)->addText("单价{$content['合同约定的单价']}元;总价{$content['合同约定的总价']}元;<br/>以<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>现金<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>转账<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>票据(写明票据类型)<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他 方式<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>一次性<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>分期支付<br/>分期方式:{$content['分期方式']}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("5.合同约定的交货时间、地点、方式、风险承担、安装、调试、验收");
        $table->addCell(7200, $cellRowSpan)->addText($content['合同约定信息']);

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("6.合同约定的质量标准及检验方式、质量异议期限");
        $table->addCell(7200, $cellRowSpan)->addText($content['合同约定的质量标准及检验方式、质量异议期限']);

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("7.合同约定的违约金(定金)");
        $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>违约金  元(合同条款:第  条)<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>定金  元(合同条款:第  条)<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>迟延履行违约金 %/日(合同条款:第  条)<br/>");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("8.价款支付及标的物交付情况");
        $table->addCell(7200, $cellRowSpan)->addText("按期支付价款 元,逾期付款 元,逾期未付款 元<br/>按期交付标的物 件,逾期交付 件,逾期未交付 件");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("9.是否存在延迟履行");
        $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是  延迟时间:  <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>逾期付款<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>逾期交货<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("10.是否催促过履行");
        $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是  催促情况:   年 月 日通过  方式进行了催促<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("11.买卖合同标的物有无质量争议");
        $bzwzlzy = $this->parseYesOrNo($content['买卖合同标的物有无质量争议']);
        if($content['买卖合同标的物有无质量争议'] == '是' || $content['买卖合同标的物有无质量争议'] == '有'){
            $content['买卖合同标的物有无质量争议'] = '';
        }
        $table->addCell(7200, $cellRowSpan)->addText("{$bzwzlzy}<br/>具体情况:{$content['买卖合同标的物有无质量争议']}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("12.标的物质量规格或履行方式是否存在不符合约定的情况");
        $lxfsbf = $this->parseYesOrNo($content['标的物质量规格或履行方式是否存在不符合约定的情况']);
        if($content['标的物质量规格或履行方式是否存在不符合约定的情况'] == '是' || $content['标的物质量规格或履行方式是否存在不符合约定的情况'] == '有'){
            $content['标的物质量规格或履行方式是否存在不符合约定的情况'] = '';
        }
        $table->addCell(7200, $cellRowSpan)->addText("{$lxfsbf}<br/>具体情况:{$content['标的物质量规格或履行方式是否存在不符合约定的情况']}");

        /*$table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>有  具体情况:{$content['标的物质量规格或履行方式是否存在不符合约定的情况']}<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>无");*/

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("13.是否曾就标的物质量问题进行协商");
        //$table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>有  具体情况:{$content['是否曾就标的物质量问题进行协商']}<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>无");
        $zlwtxs = $this->parseYesOrNo($content['是否曾就标的物质量问题进行协商']);
        if($content['是否曾就标的物质量问题进行协商'] == '是' || $content['是否曾就标的物质量问题进行协商'] == '有'){
            $content['是否曾就标的物质量问题进行协商'] = '';
        }
        $table->addCell(7200, $cellRowSpan)->addText("{$zlwtxs}<br/>具体情况:{$content['是否曾就标的物质量问题进行协商']}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("14.是否通知解除合同");
        //$table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>有  具体情况:{$content['是否通知解除合同']}<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>无");
        $sftzjcht = $this->parseYesOrNo($content['是否通知解除合同']);
        if($content['是否通知解除合同'] == '是' || $content['是否通知解除合同'] == '有'){
            $content['是否通知解除合同'] = '';
        }
        $table->addCell(7200, $cellRowSpan)->addText("{$sftzjcht}<br/>具体情况:{$content['是否通知解除合同']}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("15.被告应当支付的利息、违约金、赔偿金");
        $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>利息 {$content['被告应当支付的利息、违约金、赔偿金']['利息']} 元<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>违约金 {$content['被告应当支付的利息、违约金、赔偿金']['违约金']} 元<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>赔偿金 {$content['被告应当支付的利息、违约金、赔偿金']['赔偿金']} 元<br/>共计{$content['被告应当支付的利息、违约金、赔偿金']['共计']}元   计算方式:{$content['被告应当支付的利息、违约金、赔偿金']['计算方式']}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("16.是否签订物的担保(抵押、质押)合同");
        $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是  签订时间:{$content['是否签订物的担保(抵押、质押)合同']}<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("17.担保人、担保物");
        $table->addCell(7200, $cellRowSpan)->addText("担保人:{$content['担保人']}<br/>担保物:{$content['担保物']}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("18.是否最高额担保(抵押、质押)");
        $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 担保债权的确定时间:{$content['是否最高额担保(抵押、质押)']['担保债权的确定时间']} 担保额度:{$content['是否最高额担保(抵押、质押)']['担保额度']}<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("19.是否办理抵押、质押登记");
        $sfbldy = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是  <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>正式登记 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>预告登记<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否";
        if($content['抵押、质押登记登记方式']){
            if($content['抵押、质押登记登记方式'] == '正式登记'){
                $sfbldy = "<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是  <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>正式登记 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>预告登记<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否";
            }elseif($content['抵押、质押登记登记方式'] == '预告登记'){
                $sfbldy = "<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是  <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>正式登记 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>预告登记<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否";
            }
        }
        $table->addCell(7200, $cellRowSpan)->addText("{$sfbldy}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("20.是否签订保证合同");
        if($content['是否签订保证合同']['保证人']){
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是  签订时间:{$content['是否签订保证合同']['签订时间']}  保证人: {$content['是否签订保证合同']['保证人']}  主要内容:{$content['是否签订保证合同']['保证合同主要内容']}<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否");
        }else{
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 签订时间:  保证人:    主要内容:  <br/><w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>否");
        }

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("21.保证方式");
        if($content['是否签订保证合同']['保证方式'] == '一般保证'){
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>一般保证<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>连带责任保证");
        }else if($content['是否签订保证合同']['保证方式'] == '连带责任保证'){
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>一般保证<br/><w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>连带责任保证");
        }else{
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>一般保证<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>连带责任保证");
        }

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("22.其他担保方式");
        if($content['其他担保方式']['担保形式']){
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是  形式:{$content['其他担保方式']['担保形式']}  签订时间:{$content['其他担保方式']['签订时间']}<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>连带责任保证");
        }else{
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是  形式:  签订时间:  <br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>连带责任保证");
        }

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("23.请求承担责任的依据");
        $table->addCell(7200, $cellRowSpan)->addText("合同约定:{$content['请求承担责任的合同约定']}<br/>法律规定:{$content['请求承担责任的法律规定']}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("24.其他需要说明的内容");
        $table->addCell(7200, $cellRowSpan)->addText($content['其他需要说明的内容']);

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("25.证据清单");
        $table->addCell(7200, $cellRowSpan)->addText($content['证据清单']);

        $table->addRow(500);
        $cell1 = $table->addCell(9200, $cellRowSpan);
        $cell1->addText("对纠纷解决方式的意愿", array('size' => 18, 'bold'=>true), $paragraphStyleName);
        $cell1->getStyle()->setGridSpan(2);

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("是否了解调解作为非诉讼纠纷解决方式,能及时、高效、低成本、不伤和气地解决纠纷");
        $isKnow = $this->parseIsKnow($content['对纠纷解决方式的意愿']['是否了解调解作为非诉讼纠纷解决方式,能及时、高效、低成本、不伤和气地解决纠纷']);
        $table->addCell(7200, $cellRowSpan)->addText("{$isKnow}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("是否了解先行调解解决纠纷的好处");
        $isKnow1 = $this->parseIsKnow($content['对纠纷解决方式的意愿']['立案后选择先行调解的,可以很快启动调解程序。如不同意调解,法院将依程序开庭审理案件,但可能需要经过较长一段时间的排期等待,且审理、执行周期相对较长']);
        $isKnow2 = $this->parseIsKnow($content['对纠纷解决方式的意愿']['选择先行调解,调解成功且自动履行的免交诉讼费用,申请司法确认的不交纳诉讼费用,要求出具调解书的减半交纳诉讼费用']);
        $isKnow3 = $this->parseIsKnow($content['对纠纷解决方式的意愿']['首次调解不成功,但仍有继续调解意愿的,可以选择更换调解组织和调解员再进行调解。调解无法达成一致意见的,法院将依程序排期开庭']);
        $isKnow4 = $this->parseIsKnow($content['对纠纷解决方式的意愿']['依照法律规定,调解具有保密性要求,调解过程不公开,调解协议未经当事人同意不得公开']);
        $isKnow5 = $this->parseIsKnow($content['对纠纷解决方式的意愿']['调解达成的协议具有法律效力,可以依照法律规定申请司法确认,具有强制执行效力']);

        $table->addCell(7200, $cellRowSpan)->addText("1. 立案后选择先行调解的,可以很快启动调解程序。如不同意调解,法院 将依程序开庭审理案件,但可能需要经过较长一段时间的排期等待,且审理、执行周期相对较长。<br/>{$isKnow1}<br/>2. 选择先行调解,调解成功且自动履行的免交诉讼费用,申请司法确认的不交纳诉讼费用,要求出具调解书的减半交纳诉讼费用。<br/>{$isKnow2}<br/>3. 首次调解不成功,但仍有继续调解意愿的,可以选择更换调解组织和调解员再进行调解。调解无法达成一致意见的,法院将依程序排期开庭。<br/>{$isKnow3}<br/>4. 依照法律规定,调解具有保密性要求,调解过程不公开,调解协议未经当事人同意不得公开。<br/>{$isKnow4}<br/>5. 调解达成的协议具有法律效力,可以依照法律规定申请司法确认,具有强制执行效力。<br/>{$isKnow5}");

        $table->addRow(500);
        $table->addCell(2000, $cellRowSpan)->addText("是否考虑先行调解");
        if($content['对纠纷解决方式的意愿']['是否考虑先行调解'] == '是'){
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>暂不确定,想要了解更多内容");
        }elseif($content['对纠纷解决方式的意愿']['是否考虑先行调解'] == '否'){
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是<br/><w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>否<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>暂不确定,想要了解更多内容");
        }elseif($content['对纠纷解决方式的意愿']['是否考虑先行调解'] == '暂不确定'){
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否<br/><w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>暂不确定,想要了解更多内容");
        }else{
            $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否<br/><w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>暂不确定,想要了解更多内容");
        }

        $section->addText("<br/><br/>具状人 (签字、盖章):      ", [], ['alignment' => Jc::END]);
        $section->addText("日期:".date("Y-m-d").'  ', [], ['alignment' => Jc::END]);

        //生成
        $phpWord->save($savePath);
        return $savePath;
    }


    /**
     * 解析性别
     * @param $value
     * @return string
     */
    public function parseSex($value='')
    {
        $str = '男<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>女<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>';
        if($value=='男'){
            $str = '男<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>女<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>';
        }elseif($value=='女'){
            $str = '男<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>女<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>';
        }
        return $str;
    }

    /**
     * 解析企业类型
     * @param $value
     * @return string
     */
    public function parseCompanyType($value='')
    {
        $typeArr = ["有限责任公司", "股份有限公司", "上市公司", "其他企业法人", "事业单位", "社会团体", "基金会", "社会服务机构", "机关法人", "农村集体经济组织法人", "城镇农村的合作经济组织法人", "基层群众性自治组织法人", "个人独资企业", "合伙企业", "不具有法人资格的专业服务机构"];
        $str = '';
        //如value包含在typeArr中,则对应标记为选中
        foreach ($typeArr as $k=>$v){
            if($value == $v){
                $str .= '<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>'.$v;
            }else{
                $str .= '<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'.$v;
            }
        }
        return $str;
    }

    /**
     * 解析企业性质
     * @param $value
     * @return string
     */
    public function parseCompanyNature($value='')
    {
        $typeArr = ["国有控股", "国有参股", "民营"];
        $str = '';
        //如value包含在typeArr中,则对应标记为选中
        foreach ($typeArr as $k=>$v){
            if($value == $v){
                $str .= '<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>'.$v;
            }else{
                $str .= '<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'.$v;
            }
        }
        $str .= "其他_______";
        return $str;
    }

    /**
     * 解析是否复选框
     * @param string $value
     * @return string
     */
    public function parseYesOrNo($value='')
    {
        if($value == '是'){
            $str = '是<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>否<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>';
        }elseif($value == '否'){
            $str = '是<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>否<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>';
        }else{
            $str = '是<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>否<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>';
        }
        return $str;
    }

    /**
     * 解析是否了解复选框
     * @param string $value
     * @return string
     */
    public function parseIsKnow($value='')
    {
        if($value == '了解'){
            $str = '了解<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>不了解<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>';
        }elseif($value == '不了解'){
            $str = '了解<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>不了解<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>';
        }else{
            $str = '了解<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>不了解<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>';
        }
        return $str;
    }
}

瀚高数据库安全版安装license

瀚高数据库安全版 V4.5.8 以及后续版本,license 文件可分别管控瀚高安全版数据库、
瀚高高可用集群(db_ha),瀚高读写分离集群(hg_proxy)。

上传 license
将 license文件上传到服务器任意目录下

检查 license
使用 hg_lic -c -F $filepath 来对指定 $filepath license 文件进行检查操作,该操作将会输出对 license 文件的检查结果,如果检查出现问题,将会提示 license 文件异常。如果一切正常将会输出 license 信息,包括 license 编号、license 状态、用户信息、授权方式、授权用途、申请日期、产品名称、产品版本、产品有效期。

chmod 0600 /opt/highgo/hgdb-see-4.5.8/etc/lic/hgdb.lic
hg_lic -c -F /opt/highgo/hgdb-see-4.5.8/etc/lic/hgdb.lic

加载license
使用 hg_lic -l -P $HGDB_HOME -F $filepath 来对指定文件 $filepath 进行加载操作,若配置了 $HGDB_HOME 环境变量,-P 参数可以省略。该操作会对许可证文件进行检查,如果许可证文件异常,将会提示。如果许可证一切正常,该操作会将许可证文件加载到数据库中。

PostgreSQL中的archive_command详解

什么是归档(Archiving)?

归档是指将过时或不再频繁使用的数据迁移到存储介质的过程。 PostgreSQL支持通过归档机制保存事务日志(WAL),以便在需要时进行数据库的恢复。这是确保数据安全和完整性的重要措施。

使用PostgreSQL的archive_command功能,你能够增强数据安全性,确保在发生故障时能够快速恢复。

- 阅读剩余部分 -

多因素认证(MFA)动态令牌PHP实现

两步验证(Two-Factor Authentication,2FA)是一种增加账户安全性的方式,它要求用户提供两种不同类型的身份验证凭据才能访问服务或数据。这种核心思想建立在“知道”和“拥有”两种安全因素上:一种是用户知道的信息(如密码或PIN码),另一种是用户拥有的物理设备(如手机或安全令牌)。这样,即使攻击者窃取了用户的密码,没有物理设备也无法完成认证过程。

多因素认证(MFA)的实现主要包含以下几个核心环节和技术要点,其流程设计兼顾安全性与用户体验:

一、核心实现流程

MFA 实现需平衡安全性与易用性,生物识别虽便捷但需考虑隐私合规(如 GDPR 生物数据特殊保护)。

密钥初始化与绑定‌

  • 用户启用 MFA 时,系统生成唯一密钥(如 Base32 编码字符串),并通过加密 QR 码展示给用户扫描绑定认证器(如 Google Authenticator、Authy)。
  • 密钥安全存储于服务器端,并与用户账号关联。

- 阅读剩余部分 -

js变量间赋值,修改变量值后原变量随之改变问题

vue项目的开发过程中,需要多次用到一份基础数据,为减少代码量,提高一下复用效果,便用变量A来定义,在项目中需要用到时就用变量A进行赋值。在项目中调用时,新定义一个变量B,再将变量A赋值给变量B,即B=A;
期望的效果是,赋值之后,A和B是两份数据,对变量B进行操作时不影响变量A。

B=A的方式只是将B指向A的存储地址,实际上只有同一份数据,因此无论修改A还是B都是会互相影响的。

解决方法:
B = JSON.parse(JSON.stringify(A))

OA系统信创迁移流程

需要对3000余套律所OA系统进行迁移,按天逐步迁移。基本流程如下:

1.申请瀚高测试license兼容适配
2.适配前对现有系统进行升级,提高后期迁移效率
3.编写相关脚本

- 阅读剩余部分 -