<template>
<div class="app-container">
<!-- 搜索表单 -->
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable size="small" @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable size="small" @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="成品料号" prop="batteryFinishedPartNumber">
<el-input v-model="queryParams.batteryFinishedPartNumber" placeholder="请输入成品料号" clearable size="small" @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="半成品料号" prop="pcbSemiFinishedPartNumber">
<el-input v-model="queryParams.pcbSemiFinishedPartNumber" placeholder="请输入半成品料号" clearable size="small" @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="丝印" prop="mainBoardSilkScreen">
<el-input v-model="queryParams.mainBoardSilkScreen" placeholder="请输入丝印" clearable size="small" @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="文档版次" prop="materialColor">
<el-input v-model="queryParams.materialColor" placeholder="请输入文档版次" clearable size="small" @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['cms:specificationdata:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate" v-hasPermi="['cms:specificationdata:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete" v-hasPermi="['cms:specificationdata:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['cms:specificationdata:export']">导出列表</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"/>
</el-row>
<!-- 表格 -->
<el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="30" align="center"/>
<el-table-column label="ID" fixed="left" width="50" prop="id" align="center"/>
<el-table-column label="项目名称" fixed="left" prop="projectName" align="center" sortable width="130"/>
<el-table-column label="电芯品牌" prop="cellBrand" align="center" width="130"/>
<el-table-column label="电芯型号" prop="cellModel" align="center"/>
<el-table-column label="丝印" prop="mainBoardSilkScreen" align="center" width="130"/>
<el-table-column label="料号" prop="mainBoardPartNumber" align="center" width="100"/>
<el-table-column label="客户名称" prop="customerName" align="center"/>
<el-table-column label="文档版次" prop="revision" align="center"/>
<el-table-column label="更新人" prop="updateBy" align="center" width="100" sortable/>
<el-table-column label="更新时间" prop="updateTime" align="center" width="100" sortable>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime || scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="PCB顶图" align="center" width="150">
<template slot-scope="scope">
<el-button v-if="scope.row.pcbPlacementDiagramTopImg" type="text" icon="el-icon-document" @click="previewFile(scope.row.pcbPlacementDiagramTopImg)">查看顶图</el-button>
<span v-else>—</span>
</template>
</el-table-column>
<el-table-column label="PCB底图" align="center" width="150">
<template slot-scope="scope">
<el-button v-if="scope.row.pcbPlacementDiagramBottomImg" type="text" icon="el-icon-document" @click="previewFile(scope.row.pcbPlacementDiagramBottomImg)">查看底图</el-button>
<span v-else>—</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" width="160">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-download" @click="handleExportWord(scope.row)" v-hasPermi="['cms:specificationdata:export']">导出</el-button>
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['cms:specificationdata:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-document-copy" @click="handleCopy(scope.row)" v-hasPermi="['cms:specificationdata:add']">复制</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['cms:specificationdata:remove']">删除</el-button>
<el-button size="mini" type="text" icon="el-icon-download" v-show="scope.row.dwgLocalPath" @click="handleDownload(scope.row)" v-hasPermi="['cms:specificationdata:export']">下载附件</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList"/>
<!-- 添加/编辑对话框 -->
<el-dialog
:title="title"
:visible.sync="open"
:before-close="cancel"
:close-on-click-modal="false"
width="95%"
top="5vh"
append-to-body
>
<el-tabs type="border-card">
<!-- 基本信息 -->
<table class="basic-table">
<tr>
<th class="label-cell">客户名称</th>
<td>
<el-input v-model="specForm.customerName" />
</td>
</tr>
<tr>
<th class="label-cell">项目名称</th>
<td>
<el-input v-model="specForm.projectName" />
</td>
</tr>
<tr>
<th class="label-cell">成品料号</th>
<td>
<el-input v-model="specForm.batteryFinishedPartNumber" />
</td>
</tr>
<tr>
<th class="label-cell">半成品料号</th>
<td>
<el-input v-model="specForm.pcbSemiFinishedPartNumber" />
</td>
</tr>
</table>
<h1 style="text-align: center;">生产规格书</h1>
<!-- 保密等级 -->
<h4>保密等级:</h4>
<el-radio-group v-model="confidentialLevel" disabled>
<el-radio label="绝密" class="custom-radio">绝密</el-radio>
<el-radio label="机密" class="custom-radio">机密</el-radio>
<el-radio label="内部公开" class="custom-radio">内部公开</el-radio>
<el-radio label="外部公开" class="custom-radio">外部公开</el-radio>
</el-radio-group>
<!-- 审批信息 -->
<h4>审批信息</h4>
<table class="spec-table">
<tr>
<th>拟制/日期<br>电子工程师</th>
<th>审核/日期<br>直接上级</th>
<th>审核/日期<br>DQE</th>
<th>审核/日期<br>NPI</th>
<th>批准/日期<br>经理</th>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
<!-- 文件修正记录 -->
<h4>文件修正记录</h4>
<div id="app">
<table class="spec-table">
<thead>
<tr>
<th>序号</th>
<th>版次</th>
<th>变更日期</th>
<th>变更内容</th>
<th>拟制</th>
<th>审核</th>
<th>批准</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in versionRecordList" :key="item.id">
<td>{{ index + 1 }}</td>
<td><input type="text" v-model="item.revision" /></td>
<td><input type="text" v-model="item.updateTime" /></td>
<td><input type="text" v-model="item.changeDescription" /></td>
<td><input type="text" v-model="item.updateBy" /></td>
<td><input type="text" v-model="item.reviewedBy" /></td>
<td><input type="text" v-model="item.approvedBy" /></td>
</tr>
</tbody>
</table>
<button @click="addRow">新增一行</button>
</div>
<hr class="divider">
<!-- 目录 -->
<div class="directory-container">
<h2>目录</h2>
<ul class="spec-directory">
<li>1 引言</li>
<li>1.1 编写目的</li>
<li>1.2 适用范围</li>
<li>2 版本说明</li>
<li>2.1 硬件版本</li>
<li>2.2 软件版本</li>
<li>2.3 上位机软件版本</li>
<li>3 PCB贴片图</li>
<li>4 PCM测试及检验规范</li>
<li>4.1 PCM端口示意图</li>
<li>4.2 烧录</li>
<li>4.3 PCM测试</li>
<li>4.4 PCBA半成品工艺要求</li>
<li>5 半成品测试及检验规范</li>
<li>5.1 电芯配组要求</li>
<li>5.2 PCM组装上电顺序</li>
<li>5.3 输出端口定义</li>
<li>5.4 功能测试及检验标准</li>
<li>6 成品测试及检验规范</li>
<li>6.1 成品检测项目及标准</li>
<li>6.2 成品结构尺寸</li>
<li>6.3 成品打码规则</li>
<li>6.4 追溯要求</li>
<li>附录一</li>
<li>附录二</li>
</ul>
</div>
<hr class="divider">
<!-- 引言 -->
<h3>1 引言</h3>
<p>本文主要描述该项目产品的生产性能要求说明,明确整个产品在PCM、半成品、成品的性能测试标准及要求。</p>
<h4>1.1 编写目的</h4>
<p>本文档描述了本产品的生产过程性能测试要求及标准、工艺要求等。方便生产相关人员对本产品的制造和检验。</p>
<h4>1.2 适用范围</h4>
<p>本规格书适用于欣动能源科技有限公司设计的产品生产技术规范,适用于与之相关的生产和检验。</p>
<hr class="divider">
<!-- 版本说明 -->
<h4>2 版本说明</h4>
<h5>2.1 硬件版本</h5>
<table class="spec-table">
<thead>
<tr>
<th>序号</th>
<th>PCB</th>
<th>丝印</th>
<th>料号</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>主板</td>
<td><input type="text" v-model="specForm.mainBoardSilkScreen" /></td>
<td><input type="text" v-model="specForm.mainBoardPartNumber" /></td>
<td></td>
</tr>
<tr>
<td>2</td>
<td>采集板</td>
<td>/</td>
<td>/</td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>灯板</td>
<td>/</td>
<td>/</td>
<td></td>
</tr>
</tbody>
</table>
<h5>2.2 软件版本</h5>
<table class="spec-table">
<thead>
<tr>
<th>序号</th>
<th>PCM</th>
<th>软件</th>
<th>版本信息</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr><td>1</td><td rowspan="10">主板</td><td>Bootloader</td><td>/</td><td></td></tr>
<tr><td>2</td><td>应用程序</td><td>/</td><td></td></tr>
<tr><td>3</td><td>一体程序</td><td>/</td><td></td></tr>
<tr><td rowspan="3">4</td><td rowspan="3">固件信息</td>
<td>/</td><td rowspan="3"></td>
</tr>
<tr><td>/</td></tr>
<tr><td>/</td></tr>
<tr><td>5</td><td>烧录芯片选型</td><td>/</td><td></td></tr>
<tr><td>6</td><td>固件烧录软件</td><td>/</td><td></td></tr>
<tr><td>7</td><td>通讯设备</td><td>/</td><td></td></tr>
</tbody>
</table>
<h5>2.3 上位机软件版本</h5>
<h5 style="text-align: center;">生产上位机</h5>
<table class="spec-table">
<thead>
<tr>
<th>序号</th>
<th>上位机</th>
<th>版本</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr><td>1</td><td>Bin对比上位机</td><td>/</td><td></td></tr>
<tr><td>2</td><td>通讯/升级上位机</td><td>/</td><td></td></tr>
<tr><td>3</td><td>自动对比上位机</td><td>/</td><td></td></tr>
<tr><td>4</td><td>通信设备</td><td>/</td><td></td></tr>
</tbody>
</table>
<h5 style="text-align: center;">生产文件</h5>
<table class="spec-table">
<thead>
<tr>
<th>序号</th>
<th>上位机</th>
<th>版本</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr><td>1</td><td>Bin对比上位机</td><td>/</td><td></td></tr>
<tr><td>2</td><td>通讯/升级上位机模板</td><td>/</td><td></td></tr>
<tr><td>3</td><td>PCM自动对比模板</td><td>/</td><td></td></tr>
<tr><td>4</td><td>半成品自动对比模板</td><td>/</td><td></td></tr>
<tr><td>4</td><td>成品自动对比模板</td><td>/</td><td></td></tr>
</tbody>
</table>
<!-- PCB贴片图 -->
<hr class="divider">
<h4>3 PCB贴片图</h4>
<div class="upload-group">
<label>顶面</label>
<input type="file" @change="uploadPcbTopImage" />
<label>底面</label>
<input type="file" @change="uploadPcbBottomImage" />
</div>
<!-- PCM测试及检验规范 -->
<hr class="divider">
<h4>4 PCM测试及检验规范</h4>
<h5>4.1 PCM端口示意图</h5>
<input type="file" @change="uploadPcmPortImage" />
<hr class="divider">
<h5>4.2 烧录</h5>
<p>不涉及</p>
<hr class="divider">
<h5>4.3 PCM测试</h5>
<table class="spec-table">
<thead>
<tr>
<th colspan="2">检验项目</th>
<th>性能要求</th>
<th>必检项</th>
<th>抽检项</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="16">充电保护</td>
<td>过充电保护电压</td>
<td>4.175±0.025V</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td>每节电芯</td>
</tr>
<tr>
<td>过充电保护延时</td>
<td>1.0±0.5S</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td></td>
</tr>
<tr>
<td>过充电保护释放电压</td>
<td>4.075±0.025V</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td>每节电芯</td>
</tr>
<tr>
<td>过充电保护电压2</td>
<td>4.25±0.025V</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td>每节电芯</td>
</tr>
<tr>
<td>过充电保护延时2</td>
<td>1.0±0.5S</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td></td>
</tr>
<tr>
<td>过放电保护电压</td>
<td>2.80±0.03V</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td>每节电芯</td>
</tr>
<tr>
<td>过放电保护延时</td>
<td>1.0±0.5 S</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td></td>
</tr>
<tr>
<td>过放电保护释放电压</td>
<td>3.0±0.03V</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td>每节电芯</td>
</tr>
<tr>
<td>充电过流保护</td>
<td>6.67±1.67A</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td></td>
</tr>
<tr>
<td>充电过电流保护延时</td>
<td>500±200ms</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td></td>
</tr>
<tr>
<td>放电过流保护1</td>
<td>16.67±2A</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td></td>
</tr>
<tr>
<td>放电过电流保护1延时</td>
<td>200±100ms</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td></td>
</tr>
<tr>
<td>放电过流保护2</td>
<td>33.2±4A</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td></td>
</tr>
<tr>
<td>放电过电流保护2延时</td>
<td>20±10ms</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td></td>
</tr>
<tr>
<td>短路保护</td>
<td>66±7A</td>
<td><input type="checkbox" disabled/></td>
<td><input type="checkbox" checked disabled /></td>
<td></td>
</tr>
<tr>
<td>短路保护延时</td>
<td><1000us</td>
<td><input type="checkbox" disabled/></td>
<td><input type="checkbox" checked disabled /></td>
<td></td>
</tr>
<tr>
<td rowspan="2">充放电</td>
<td>充电测试</td>
<td>16.6V/5.3A@5S</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td>单边测试法满足5.3A@5S即可</td>
</tr>
<tr>
<td>正常放电</td>
<td>1A@2S</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td></td>
</tr>
<tr>
<td rowspan="4">阻值测试</td>
<td>NTC1阻值测试</td>
<td>当前电池温度在附录一R-T表中所对应的阻值在该温度±3℃所对应的阻值范围内</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td>测试方法:检测测试点 RT1和B-1间阻值,并判断其是否在当前电池温度±3℃所对应的阻值范围内。生产时需检测并控制环境温度,按附录一 R-T表灵活调整阻值范围。(例,电池温度为25℃时,对应阻值范围为8.8KΩ~11.4KΩ)</td>
</tr>
<tr>
<td>B-与P-之间阻值</td>
<td>≤40mΩ</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td>不包括外部测试设备等阻值</td>
</tr>
<tr>
<td>B+与P+之间阻值</td>
<td>≤20mΩ</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td>不包括外部测试设备等阻值</td>
</tr>
<tr>
<td>NTC与P-端子间阻值</td>
<td>当前电池温度在附录二R-T表中所对应的阻值在该温度±3℃所对应的阻值范围内</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td>NTC和P-端子之间阻值,需要在在当前电池温度±3℃所对应的阻值范围内。参考附录二R-T表灵活调整阻值范围。(例,电池温度为 25℃时,对应阻值范围为8.8KΩ ~11.3KΩ)</td>
</tr>
<tr>
<td rowspan="2">功耗</td>
<td>工作功耗</td>
<td>≤40uA</td>
<td><input type="checkbox" checked disabled /></td>
<td><input type="checkbox" disabled/></td>
<td>工作模式</td>
</tr>
<tr>
<td>休眠功耗</td>
<td>≤15uA</td>
<td><input type="checkbox" disabled/></td>
<td><input type="checkbox" checked disabled /></td>
<td>设备欠压保护32±8S后进入休眠模式</td>
</tr>
</tbody>
</table>
<h5>4.4 PCBA半成品工艺要求</h5>
<div>
<label>参见受控的 PCBA 半成品检验标准</label>
</div>
<h4>5 半成品测试及检验规范</h4>
<h5>5.1 电芯配组要求</h5>
<table class="spec-table">
<thead>
<tr>
<th>序号</th>
<th>检查项</th>
<th>要求</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>电芯型号</td>
<td><el-input v-model="specForm.cellModel" /></td>
<td><el-input v-model="specForm.cellBrand" /></td>
</tr>
<tr>
<td>2</td>
<td>内阻差</td>
<td>
<el-input v-model="specForm.maxCellInternalResistanceMohm" />
</td>
<td>单个电芯内阻≤<el-input v-model="specForm.maxCellGroupResistanceDiffMohm" style="display: inline-block; width: 200px;" /></td>
</tr>
<tr>
<td>3</td>
<td>电压差</td>
<td>
<el-input v-model="specForm.maxCellGroupVoltageDiffMv" />
</td>
<td>根据电芯来料检验标准</td>
</tr>
<tr>
<td>4</td>
<td>容量差</td>
<td>
<el-input v-model="specForm.maxCellGroupCapacityDiffMah" />
</td>
<td>容量差由电芯供应商管控</td>
</tr>
<tr>
<td>5</td>
<td>档位/批次</td>
<td>同一组电芯组为同一批次电芯,容量档位不能混用</td>
<td></td>
</tr>
</tbody>
</table>
<h5>5.2 PCM组装上电顺序</h5>
<div><label>1)电芯上电顺序:<el-input v-model="specForm.cellPowerOnSequence" style="display: inline-block; width: 250px;" />;</label></div>
<div><label>2)组装成半成品后,在半成品测试之前需焊接JP点。</label></div>
<div><label>注:上电后不允许在PCM上焊接任何接线或端子</label></div>
<h5>5.3 输出端口定义</h5>
<table class="spec-table">
<thead>
<tr>
<th>Terminal<br>端子</th>
<th>Name<br>名称</th>
<th>Description<br>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>Pin1</td>
<td>P+</td>
<td>UL1007 20AWG 红</td>
</tr>
<tr>
<td>Pin2</td>
<td>P+</td>
<td>UL1007 20AWG 红</td>
</tr>
<tr>
<td>Pin3</td>
<td>NTC</td>
<td>UL1007 24AWG 白</td>
</tr>
<tr>
<td>Pin4</td>
<td>P-</td>
<td>UL1007 20AWG 黑</td>
</tr>
<tr>
<td>Pin5</td>
<td>P-</td>
<td>UL1007 20AWG 黑</td>
</tr>
<tr>
<th colspan="3">Battery pack output port diagram/电池组输出端口图</th>
</tr>
<tr>
<td colspan="3"> <input type="file" @change="uploadBatteryPackOutputPortDiagramImg" /></td>
</tr>
</tbody>
</table>
<h5>5.4 功能测试及检验标准</h5>
<table class="spec-table">
<thead>
<tr>
<th colspan="2">检验项目</th>
<th>性能要求</th>
<th>必检项</th>
<th>抽检项</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="14">功能测试</td>
<td>充电过流保护</td>
<td><el-input v-model="specForm.chargeOvercurrentProtection" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection1" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling1" style="display: inline-block; width: 250px;" /></td>
<td></td>
</tr>
<tr>
<td>充电过电流保护延时</td>
<td><el-input v-model="specForm.chargeOvercurrentDelay" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection2" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling2" style="display: inline-block; width: 250px;" /></td>
<td></td>
</tr>
<tr>
<td>放电过流保护1</td>
<td><el-input v-model="specForm.level1DischargeOvercurrentProtection" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection3" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling3" style="display: inline-block; width: 250px;" /></td>
<td></td>
</tr>
<tr>
<td>放电过电流保护1延时</td>
<td><el-input v-model="specForm.level1DischargeOvercurrentDelay" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection4" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling4" style="display: inline-block; width: 250px;" /></td>
<td></td>
</tr>
<tr>
<td>放电过流保护2</td>
<td><el-input v-model="specForm.level2DischargeOvercurrentProtection" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection5" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling5" style="display: inline-block; width: 250px;" /></td>
<td></td>
</tr>
<tr>
<td>放电过电流保护2延时</td>
<td><el-input v-model="specForm.level2DischargeOvercurrentDelay" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection6" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling6" style="display: inline-block; width: 250px;" /></td>
<td></td>
</tr>
<tr>
<td>短路保护</td>
<td><el-input v-model="specForm.shortCircuitProtection" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection7" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling7" style="display: inline-block; width: 250px;" /></td>
<td></td>
</tr>
<tr>
<td>短路保护延时</td>
<td><el-input v-model="specForm.shortCircuitDelay" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection8" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling8" style="display: inline-block; width: 250px;" /></td>
<td></td>
</tr>
<tr>
<td>充电测试</td>
<td><el-input v-model="specForm.normalCharging" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection9" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling9" style="display: inline-block; width: 250px;" /></td>
<td></td>
</tr>
<tr>
<td>正常放电</td>
<td><el-input v-model="specForm.normalDischarging" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection10" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling10" style="display: inline-block; width: 250px;" /></td>
<td></td>
</tr>
<tr>
<td>开路电压</td>
<td><el-input v-model="specForm.openCircuitVoltage" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection11" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling11" style="display: inline-block; width: 250px;" /></td>
<td>单节3.6-3.7V</td>
</tr>
<tr>
<td>PACK 内阻</td>
<td><el-input v-model="specForm.packInternalResistanceMohm" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection12" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling12" style="display: inline-block; width: 250px;" /></td>
<td>不包括测试线材阻值</td>
</tr>
<tr>
<td>JP点连通性测试</td>
<td><el-input v-model="specForm.jPpointContinuityTest" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection13" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling13" style="display: inline-block; width: 250px;" /></td>
<td>测试点TD与B-之间电压</td>
</tr>
<tr>
<td>NTC与P-端子间阻值</td>
<td>当前电池温度在附录二R-T表中所对应的阻值在该温度±3℃所对应的阻值范围内</td>
<td><el-input v-model="specForm.requiredinspection14" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling14" style="display: inline-block; width: 250px;" /></td>
<td>NTC和P-端子之间阻值,需要在在当前电池温度±3℃所对应的阻值范围内。参考附录二R-T表灵活调整阻值范围。(例,电池温度为 25℃时,对应阻值范围为8.8KΩ ~11.3KΩ)</td>
</tr>
<tr>
<td rowspan="5">全程活化</td>
<td>CC-CV充电</td>
<td colspan="3"><el-input v-model="specForm.fullCcCvCharging" style="display: inline-block; width: 250px;" /></td>
<td rowspan="7">试产阶段需全程活化,量产后可由团队评估是否简易活化</td>
</tr>
<tr>
<td>搁置</td>
<td colspan="3"><el-input v-model="specForm.fullStandby" style="display: inline-block; width: 250px;" /></td>
</tr>
<tr>
<td>恒流放电</td>
<td colspan="3"><el-input v-model="specForm.fullConstantCurrentDischarge" style="display: inline-block; width: 250px;" /></td>
</tr>
<tr>
<td>搁置</td>
<td colspan="3"><el-input v-model="specForm.fullStandby" style="display: inline-block; width: 250px;" /></td>
</tr>
<tr>
<td>充电至出货电压</td>
<td colspan="3"><el-input v-model="specForm.fullChargeToShipmentVoltage" style="display: inline-block; width: 250px;" /></td>
</tr>
<tr>
<td rowspan="2">简易活化</td>
<td>充电至出货电压</td>
<td colspan="3"><el-input v-model="specForm.quickChargeToShipmentVoltage" style="display: inline-block; width: 250px;" /></td>
</tr>
<tr>
<td>搁置</td>
<td colspan="3"><el-input v-model="specForm.quickStandby" style="display: inline-block; width: 250px;" /></td>
</tr>
<tr>
<td>活化标准</td>
<td>放电容量</td>
<td><el-input v-model="specForm.standardDischargeCapacity" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.requiredinspection15" style="display: inline-block; width: 250px;" /></td>
<td><el-input v-model="specForm.sampling15" style="display: inline-block; width: 250px;" /></td>
<td>全程活化放电容量</td>
</tr>
</tbody>
</table>
<!-- 附录上传 -->
<hr class="divider">
<h4>附录</h4>
<div class="upload-group">
<label>附录一</label>
<input type="file" @change="uploadNtcTable1" />
</div>
<div class="upload-group">
<label>附录二</label>
<input type="file" @change="uploadNtcTable2" />
</div>
</el-tabs>
<div style="text-align: right; margin-top: 20px;">
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="submitForm">提交</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listData, getData, delData, addData, updateData } from "@/api/cms/specificationData";
import { parseTime } from "@/utils";
import { getToken } from "@/utils/auth";
export default {
name: "SpecificationData",
data() {
return {
confidentialLevel: "内部公开",
loading: true,
single: true,
multiple: true,
showSearch: true,
total: 0,
dataList: [],
open: false,
title: "",
uploadUrl: process.env.VUE_APP_BASE_API + "/api/upload",
uploadHeaders: {
Authorization: "Bearer " + getToken()
},
queryParams: {
pageNum: 1,
pageSize: 10,
customerName: "",
projectName: "",
batteryFinishedPartNumber: "",
pcbSemiFinishedPartNumber: "",
mainBoardSilkScreen: "",
materialColor: ""
},
specForm: {
id: null,
customerName: "",
projectName: "",
batteryFinishedPartNumber: "",
pcbSemiFinishedPartNumber: "",
mainBoardSilkScreen: "",
mainBoardPartNumber: "",
revision: "",
updateTime: "",
changeDescription: "",
updateBy: "",
reviewedBy: "",
approvedBy: "",
confidentialLevel: "内部公开",
materialColor: "",
pcbPlacementDiagramTopImg: "",
pcbPlacementDiagramBottomImg: "",
topImgList: [],
bottomImgList: []
},
versionRecordList: [
{ revision: "", updateTime: "", changeDescription: "", updateBy: "", reviewedBy: "", approvedBy: "" }
],
rules: {
customerName: [{ required: true, message: "客户名称不能为空", trigger: "blur" }],
projectName: [{ required: true, message: "项目名称不能为空", trigger: "blur" }],
batteryFinishedPartNumber: [{ required: true, message: "成品料号不能为空", trigger: "blur" }],
pcbSemiFinishedPartNumber: [{ required: true, message: "半成品料号不能为空", trigger: "blur" }],
mainBoardSilkScreen: [{ required: true, message: "丝印不能为空", trigger: "blur" }]
}
};
},
created() {
this.getList();
},
methods: {
parseTime,
getList() {
this.loading = true;
listData(this.queryParams).then(response => {
this.dataList = response.rows;
this.total = response.total;
this.loading = false;
});
},
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
handleAdd() {
this.resetForm();
this.open = true;
this.title = "新增";
},
handleUpdate(row) {
const id = row.id || this.ids;
getData(id).then(response => {
this.specForm = response.data;
this.open = true;
this.title = "修改生产规格书";
});
},
handleDelete(row) {
const ids = row.id || this.ids;
this.$confirm('是否确认删除编号为"' + ids + '"的数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
delData(ids).then(() => {
this.getList();
this.$message.success("删除成功");
});
});
},
handleExport() {
this.download('cms/specificationdata/export', { ...this.queryParams }, `data_${new Date().getTime()}.xlsx`);
},
handleExportWord(row) {
const id = row.id || this.ids;
getData(id).then(response => {
this.specForm = response.data;
// 可添加导出逻辑
});
},
handleDownload(row) {
const name = row.dwgLocalPath.substring(row.dwgLocalPath.lastIndexOf("-") + 1);
const urlParts = row.dwgLocalPath.split("specificationDwg");
const url = '/profile/specificationDwg' + urlParts[1];
const a = document.createElement('a');
a.setAttribute('download', name);
a.setAttribute('href', process.env.VUE_APP_BASE_API + url);
a.click();
},
resetForm() {
this.specForm = {
id: null,
customerName: "",
projectName: "",
batteryFinishedPartNumber: "",
pcbSemiFinishedPartNumber: "",
mainBoardSilkScreen: "",
materialColor: "",
pcbPlacementDiagramTopImg: "",
pcbPlacementDiagramBottomImg: "",
topImgList: [],
bottomImgList: []
};
},
submitForm() {
this.$refs.form.validate(valid => {
if (valid) {
if (this.specForm.id) {
updateData(this.specForm).then(() => {
this.$message.success("修改成功");
this.open = false;
this.getList();
});
} else {
addData(this.specForm).then(() => {
this.$message.success("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
cancel() {
this.open = false;
this.resetForm();
},
handleTopImgSuccess(response) {
this.specForm.pcbPlacementDiagramTopImg = response.url;
},
handleBottomImgSuccess(response) {
this.specForm.pcbPlacementDiagramBottomImg = response.url;
},
beforeImgUpload(file) {
const isValid = file.type.startsWith("image/");
if (!isValid) this.$message.error("只能上传图片文件");
return isValid;
},
handleExceed(files) {
this.$message.warning(`最多上传 1 个文件,本次选择了 ${files.length} 个文件`);
},
uploadPcbTopImage(file) {
console.log('上传PCB顶部图片', file);
},
uploadPcbBottomImage(file) {
console.log('上传PCB底部图片', file);
},
uploadPcmPortImage(file) {
console.log('上传PCM端口图', file);
},
uploadBatteryPackOutputPortDiagramImg(file) {
console.log('上传电池组输出端口图', file);
},
uploadNtcTable1(file) {
console.log('上传NTC表1', file);
},
uploadNtcTable2(file) {
console.log('上传NTC表2', file);
}
}
};
</script>
<style lang="scss" scoped>
.app-container {
padding: 20px;
}
.el-table {
width: 100%;
}
.el-button--mini {
padding: 5px 10px;
font-size: 12px;
}
.el-form-item__content {
width: 200px;
}
@media (max-width: 768px) {
.el-form-item__content {
width: 100%;
}
}
.spec-table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
th, td {
border: 1px solid #ccc;
padding: 8px;
text-align: center;
}
}
.directory-container {
max-width: 600px;
margin: 0 auto;
padding: 0 20px;
box-sizing: border-box;
}
.directory-container h2 {
text-align: center; /* 标题居中 */
margin-bottom: 16px;
padding-left: 0;
}
.spec-directory {
list-style: none;
padding: 0;
margin: 0;
}
.spec-directory li {
text-align: left;
margin: 4px 0;
padding-left: 0;
transform: translateX(45%); /* 向右移动 20% */
width: 100%;
}
.upload-group {
margin-bottom: 10px;
}
.upload-group label {
font-weight: bold;
margin-right: 10px;
}
.basic-table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
th, td {
border: 1px solid #ccc;
padding: 8px;
text-align: center;
}
}
.divider {
border: 0;
height: 1px;
background: #ccc; /* 灰色分界线 */
margin: 20px 0; /* 上下留白 */
width: 100%; /* 与容器宽度一致 */
}
/* 隐藏原生 radio 的样式,而不是使用 aria-hidden */
.custom-radio .el-radio__original {
opacity: 0;
position: absolute;
clip: rect(0 0 0 0);
pointer-events: none;
}
</style>
。根据</template>帮我完成<script>
最新发布