| | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <!-- 加时间戳避免浏览器缓存问题 --> |
| | | <el-image :src="`${javaApi}/img/${Mdata.imageUpload}`" fit="fill" :key="'personalPicture' + timeStamp" |
| | | <el-image v-if="Mdata.imageUpload" :src="`${javaApi}/img/${Mdata.imageUpload}`" fit="fill" :key="'personalPicture' + timeStamp" |
| | | style="width: 200px;height: 300px;border: 1px solid #000;border-radius: 10px;margin-left: 30px;margin-top: 20px;"> |
| | | <template #error><div class="image-slot"> |
| | | <lims-icon name="el-icon-picture-outline" style="font-size: 40px;"></lims-icon> |
| | | </div></template> |
| | | </el-image> |
| | | <div v-else class="image-slot" |
| | | style="width: 198px;height: 298px;border: 1px solid #000;border-radius: 10px;margin-left: 30px;margin-top: 20px;display: flex;align-items: center;justify-content: center;"> |
| | | <lims-icon name="el-icon-picture-outline" style="font-size: 40px;"></lims-icon> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <div class="form-item"> |
| | |
| | | <p>{{ Mdata.managementNumber }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>所属部门</label> |
| | | <p>{{ Mdata.laboratoryName }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>生产厂家</label> |
| | | <!-- <p>{{ Mdata.manufacturer }}</p> --> |
| | | <el-tooltip class="item" :content="Mdata.manufacturer"> |
| | |
| | | </div> |
| | | |
| | | <div class="form-item"> |
| | | <label>出厂日期</label> |
| | | <p>{{ formaterDateTime(Mdata.acquisitionDate) }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>校准有效期</label> |
| | | <p>{{ formaterDateTime(Mdata.activationDate) }}</p> |
| | | </div> |
| | |
| | | </div> |
| | | |
| | | <div class="form-item"> |
| | | <label>报废时间</label> |
| | | <p>{{ handleData() }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>准确度量值</label> |
| | | <el-tooltip class="item" :content="Mdata.technicalIndicators"> |
| | | <span class="text-ellipsis">{{ Mdata.technicalIndicators }}</span> |
| | | </el-tooltip> |
| | | <!-- <p>{{ Mdata.technicalIndicators }}</p> --> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>维修记录</label> |
| | | <p>{{ handleData() }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>被授权人</label> |
| | |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>采购费用(元)</label> |
| | | <p>{{ Mdata.unitPrice }}</p> |
| | | <p>{{ formatPurchasePrice(Mdata.unitPrice) }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>设备负责人</label> |
| | | <p>{{ Mdata.equipmentManagerName }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>验收记录</label> |
| | | <p>{{ handleData() }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>核准证书</label> |
| | |
| | | <el-table-column prop="quantity" label="份数" min-width="80" /> |
| | | <el-table-column prop="pageCount" label="页码" min-width="80" /> |
| | | <el-table-column prop="provider" label="提供者" min-width="150" /> |
| | | <el-table-column prop="provideDate" label="归档日期" min-width="170" /> |
| | | <el-table-column prop="provideDate" label="归档日期" min-width="170" :formatter="formatDateCell" /> |
| | | <el-table-column prop="comments" label="备注" min-width="150" /> |
| | | <el-table-column fixed="right" label="操作" min-width="180" align="center"> |
| | | <template #default="scope"> |
| | |
| | | <!-- 修订 --> |
| | | <el-dialog title="档案修订" top="5vh" v-model="dialogVisible" width="70%" @open="openFileRevisionDialog" |
| | | :before-close="handleClose"> |
| | | <el-row style="display:flex;justify-content: space-around;max-height: 75vh;overflow-y: auto;"> |
| | | <!-- 左边布局 --> |
| | | <el-col :span="7"> |
| | | <el-col> |
| | | <!-- 图片 --> |
| | | <el-image class="img" style="width:100%;height: 320px;margin-bottom:16px" |
| | | :src="javaApi + '/img/' + editData.imageUpload"> |
| | | <template #error><div class="image-error" style="width: calc(100% - 2px); |
| | | <div style="max-height: 75vh;overflow-y: auto;"> |
| | | <!-- 顶部:图片 + 基本信息 --> |
| | | <el-row> |
| | | <el-col :span="7" style="padding-right: 20px;"> |
| | | <!-- 图片 --> |
| | | <el-image v-if="editData.imageUpload" class="img" style="width:100%;height: 320px;" |
| | | :src="javaApi + '/img/' + editData.imageUpload"> |
| | | <template #error><div class="image-error" style="width: calc(100% - 2px); |
| | | height: 318px; |
| | | border-radius: 16px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | border: 1px solid var(--lims-divider);"> |
| | | <lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon> |
| | | </div></template> |
| | | </el-image> |
| | | <!-- 表单 --> |
| | | <el-form :model="editData" label-width="120px" ref="rules1" :rules="rules1"> |
| | | <lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon> |
| | | </div></template> |
| | | </el-image> |
| | | <div v-else class="image-error" |
| | | style="width: calc(100% - 2px);height: 320px;border-radius: 16px;display: flex;align-items: center;justify-content: center;border: 1px solid var(--lims-divider);"> |
| | | <lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon> |
| | | </div> |
| | | <!-- 图片上传 --> |
| | | <div style="margin-top: 12px;text-align: center;"> |
| | | <div v-show="editData.imageName" class="picName">{{ editData.imageName }}</div> |
| | | <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false" |
| | | accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :before-upload="beforeUpload" |
| | | :on-error="onError" ref='upload' class="avatar-uploader"> |
| | | <img v-if="editData.imageUpload" :src="javaApi + '/img/' + editData.imageUpload" class="avatar"> |
| | | <lims-icon name="el-icon-plus" v-else class="avatar-uploader-icon"></lims-icon> |
| | | </el-upload> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="17"> |
| | | <!-- 基本信息 --> |
| | | <div class="section-title" style="margin-top: 0;">基本信息</div> |
| | | <el-form :model="editData" label-width="120px" ref="rules1" :rules="rules1"> |
| | | <div class="form-row"> |
| | | <el-form-item label="仪器名称:" prop="deviceName"> |
| | | <el-input v-model="editData.deviceName" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="仪器名称EN:" prop="enDeviceName"> |
| | | <el-input v-model="editData.enDeviceName" size="small"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="form-row"> |
| | | <el-form-item label="规格型号:" prop="specificationModel"> |
| | | <el-input v-model="editData.specificationModel" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="生产厂家:"> |
| | | <el-input v-model="editData.manufacturer" size="small"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-col> |
| | | </el-col> |
| | | <!-- 中间布局 --> |
| | | <el-col :span="7"> |
| | | <el-form :model="editData" label-width="116px" ref="rules2" :rules="rules1"> |
| | | <el-form-item label="校准服务机构:"> |
| | | <el-input v-model="editData.calibrationServices" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="资产编码:"> |
| | | <el-input v-model="editData.assetCode" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="产地:"> |
| | | <el-input v-model="editData.origin" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="出厂编号:"> |
| | | <el-input v-model="editData.factoryNo" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="管理编号:" prop="managementNumber"> |
| | | <el-input v-model="editData.managementNumber" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="购置日期:"> |
| | | <el-date-picker style="width:100%" v-model="editData.acquisitionDate" type="date" format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="校准有效期:" prop="activationDate"> |
| | | <el-date-picker style="width:100%" v-model="editData.activationDate" type="date" format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="负责人:"> |
| | | <el-select v-model="editData.equipmentManager" placeholder="请选择" size="small" style="width:100%"> |
| | | <el-option v-for="item in responsiblePersonList" :key="item.name" :label="item.name" :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="存放点:"> |
| | | <el-input v-model="editData.storagePoint" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="技术指标:"> |
| | | <el-input v-model="editData.technicalIndicators" :rows="7" type="textarea" size="small"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-col> |
| | | <!-- 右边布局 --> |
| | | <el-col :span="7"> |
| | | <el-form :model="editData" label-width="140px" ref="ruleForm" :rules="rules1"> |
| | | <!-- 实验室列表 --> |
| | | <el-form-item label="所属部门:" prop="subordinateDepartmentsId"> |
| | | <el-select v-model="editData.subordinateDepartmentsId" placeholder="请选择" size="small" style="width:100%"> |
| | | <el-option v-for="item in subordinateDepartmentsList" :key="item.value" :label="item.label" |
| | | :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="检测项目:"> |
| | | <el-cascader v-model="editData.insProductIds" :options="options" :show-all-levels="false" :props="props" |
| | | placeholder="请选择" size="small" style="width:100%;" :collapse-tags="true" separator="," filterable |
| | | clearable></el-cascader> |
| | | </el-form-item> |
| | | <el-form-item label="最近校准日期:"> |
| | | <el-date-picker style="width:100%" v-model="editData.lastCalibrationDate" format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="下次校准日期:"> |
| | | <el-date-picker style="width:100%" v-model="editData.nextCalibrationDate" format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="设备类型:"> |
| | | <el-select v-model="editData.largeCategory" placeholder="请选择" size="small" style="width:100%"> |
| | | <el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="单价(万元):"> |
| | | <el-input v-model="editData.unitPrice" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="当前状态:" prop="deviceStatus"> |
| | | <el-select v-model="editData.deviceStatus" placeholder="请选择" size="small" style="width:100%"> |
| | | <el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="校准周期(月):" prop="calibrationDate"> |
| | | <el-input v-model="editData.calibrationDate" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="被授权人:"> |
| | | <el-select v-model="editData.authorizedPerson" multiple placeholder="请选择" size="small" style="width:100%"> |
| | | <el-option v-for="item in responsiblePersonList" :key="item.name" :label="item.name" :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="图片:"> |
| | | <!-- <div |
| | | style="border: 1px solid var(--el-border-color);border-radius:4px;height:32px;lineHeight:32px;display:flex;justify-content: space-around;font-size: 13px;"> |
| | | <div v-show="Mdata.imageName" class="picName">{{ Mdata.imageName }}</div> |
| | | <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false" |
| | | accept='image/jpg,image/jpeg,image/png' :headers="headers" :on-change="beforeUpload" |
| | | :on-error="onError" ref='upload'> |
| | | <el-button type="text" style="height:30px;padding-top:8px"><span v-if="Mdata.imageName"></span></el-button> |
| | | </el-upload> |
| | | </div> --> |
| | | |
| | | <div> |
| | | <div v-show="editData.imageName" class="picName">{{ editData.imageName }}</div> |
| | | <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false" |
| | | accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload" |
| | | :on-error="onError" ref='upload' class="avatar-uploader"> |
| | | <img v-if="editData.imageUpload" :src="javaApi + '/img/' + editData.imageUpload" class="avatar"> |
| | | <lims-icon name="el-icon-plus" v-else class="avatar-uploader-icon"></lims-icon> |
| | | </el-upload> |
| | | </div> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="form-row"> |
| | | <el-form-item label="产地:"> |
| | | <el-input v-model="editData.origin" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="出厂编号:"> |
| | | <el-input v-model="editData.factoryNo" size="small"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="form-row"> |
| | | <el-form-item label="资产编码:"> |
| | | <el-input v-model="editData.assetCode" size="small"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="管理编号:" prop="managementNumber"> |
| | | <el-input v-model="editData.managementNumber" size="small"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="form-row"> |
| | | <el-form-item label="购置日期:"> |
| | | <el-date-picker style="width:100%" v-model="editData.acquisitionDate" type="date" format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="校准有效期:" prop="activationDate"> |
| | | <el-date-picker style="width:100%" v-model="editData.activationDate" type="date" format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="form-row"> |
| | | <el-form-item label="校准服务机构:"> |
| | | <el-select v-model="editData.calibrationServices" clearable filterable size="small" style="width: 100%"> |
| | | <el-option v-for="name in calibrationServiceOptions" :key="name" :label="name" :value="name"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <div style="flex: 1;"></div> |
| | | </div> |
| | | </el-form> |
| | | </el-col> |
| | | </el-row> |
| | | <!-- 设备管理 --> |
| | | <div class="section-title">设备管理</div> |
| | | <el-form :model="editData" label-width="120px" ref="rules2" :rules="rules1"> |
| | | <div class="form-row"> |
| | | <el-form-item label="检测项目:"> |
| | | <el-cascader v-model="editData.insProductIds" :options="options" :show-all-levels="false" :props="props" |
| | | placeholder="请选择" size="small" style="width:100%;" :collapse-tags="true" separator="," filterable |
| | | clearable></el-cascader> |
| | | </el-form-item> |
| | | <el-form-item label="设备/计量器具:"> |
| | | <el-select v-model="editData.largeCategory" placeholder="请选择" size="small" style="width:100%"> |
| | | <el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="单价(万元):"> |
| | | <el-input v-model="editData.unitPrice" size="small"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="form-row"> |
| | | <el-form-item label="当前状态:" prop="deviceStatus"> |
| | | <el-select v-model="editData.deviceStatus" placeholder="请选择" size="small" style="width:100%"> |
| | | <el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="负责人:"> |
| | | <el-select v-model="editData.equipmentManager" placeholder="请选择" size="small" style="width:100%"> |
| | | <el-option v-for="item in responsiblePersonList" :key="item.name" :label="item.name" :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="被授权人:"> |
| | | <el-select v-model="editData.authorizedPerson" multiple placeholder="请选择" size="small" style="width:100%"> |
| | | <el-option v-for="item in inspectorList" :key="item.name" :label="item.name" :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="form-row"> |
| | | <el-form-item label="存放点:"> |
| | | <el-input v-model="editData.storagePoint" size="small"></el-input> |
| | | </el-form-item> |
| | | <div style="flex: 1;"></div> |
| | | </div> |
| | | </el-form> |
| | | <!-- 校准/保养/核查 周期信息 --> |
| | | <el-form :model="editData" :rules="rules1" ref="cycleForm" label-width="140px" |
| | | style="margin-top: 12px;border-top: 1px solid var(--lims-divider);padding-top: 4px;"> |
| | | <div class="cycle-row"> |
| | | <span class="cycle-title">校准信息</span> |
| | | <el-form-item label="最近校准日期:" class="cycle-item"> |
| | | <el-date-picker style="width:100%" v-model="editData.lastCalibrationDate" @change="calcNextDate(editData)" |
| | | format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="下次校准日期:" class="cycle-item"> |
| | | <el-date-picker :disabled="true" style="width:100%" v-model="editData.nextCalibrationDate" |
| | | format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="校准周期(月):" prop="calibrationDate" class="cycle-item"> |
| | | <el-input v-model="editData.calibrationDate" size="small" @change="calcNextDate(editData)"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="cycle-row"> |
| | | <span class="cycle-title">保养信息</span> |
| | | <el-form-item label="最近保养日期:" class="cycle-item"> |
| | | <el-date-picker style="width:100%" v-model="editData.lastMaintenanceDate" @change="calcNextDate(editData)" |
| | | format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="下次保养日期:" class="cycle-item"> |
| | | <el-date-picker :disabled="true" style="width:100%" v-model="editData.nextMaintenanceDate" |
| | | format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="保养周期(月):" class="cycle-item"> |
| | | <el-input v-model="editData.maintenanceCycle" size="small" @change="calcNextDate(editData)"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="cycle-row"> |
| | | <span class="cycle-title">核查信息</span> |
| | | <el-form-item label="最近核查日期:" class="cycle-item"> |
| | | <el-date-picker style="width:100%" v-model="editData.lastExamineDate" @change="calcNextDate(editData)" |
| | | format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="下次核查日期:" class="cycle-item"> |
| | | <el-date-picker :disabled="true" style="width:100%" v-model="editData.nextExamineDate" |
| | | format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="选择日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="核查周期(月):" class="cycle-item"> |
| | | <el-input v-model="editData.examineCycle" size="small" @change="calcNextDate(editData)"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | <!-- 技术指标 --> |
| | | <div class="section-title">技术指标</div> |
| | | <el-form :model="editData" ref="ruleForm" :rules="rules1"> |
| | | <el-form-item> |
| | | <el-input v-model="editData.technicalIndicators" :rows="7" type="textarea" size="small"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <template #footer><span class="dialog-footer"> |
| | | <el-row> |
| | | <el-button @click="handleClose">取 消</el-button> |
| | |
| | | |
| | | <script> |
| | | import { ElMessageBox } from 'element-plus' |
| | | import dayjs from 'dayjs' |
| | | import fileDownload from '@/utils/file' |
| | | // vue-qr 只支持 Vue2,换成同 props 的本地组件(内部用 Vue3 的 qrcode.vue) |
| | | import vueQr from '@/components/QrCode' |
| | |
| | | getInsProduction, |
| | | } from '@/api/cnas/resourceDemand/device.js' |
| | | import { selectUserCondition } from "@/api/business/inspectionTask"; |
| | | import { |
| | | obtainItemParameterList, |
| | | } from '@/api/cnas/resourceDemand/device.js' |
| | | import { selectQualifiedSupplierManagementPage } from '@/api/cnas/externalService/supplierManage/supplierManage' |
| | | import { formatListDate } from './dateFormat' |
| | | import { saveBlobOrShowError } from '@/utils/saveBlob' |
| | | export default { |
| | | props: { |
| | | clickNodeVal: { |
| | |
| | | ], |
| | | calibrationDate: [ |
| | | { required: true, message: '请输入校准周期(月)', trigger: 'blur' }, |
| | | ], |
| | | subordinateDepartmentsId: [ |
| | | { required: true, message: '请选择所属部门', trigger: 'change' }, |
| | | ] |
| | | }, |
| | | // dateForm: { |
| | |
| | | // }, |
| | | fileList: [], // 添加附件上传文件列表 |
| | | timeStamp: '', // 给图片添加key,在每次加载页面的时候新建时间戳 |
| | | equipmentManager: [], |
| | | formLabelWidth: '100px', |
| | | dialogVisible1: false, |
| | | recordNumber: '', |
| | |
| | | num: 1, |
| | | //添加附件数据收集 |
| | | addFile: { |
| | | documentType: '', // 维护类型 |
| | | documentType: 0, // 维护类型 |
| | | provideDate: null, // 归档日期 |
| | | name: '', // 档案名称 |
| | | number: '', // 库号/资产编号 |
| | |
| | | dialogVisible: false, |
| | | upLoad: false, |
| | | responsiblePersonList: [], |
| | | subordinateDepartmentsList: [], |
| | | inspectorList: [], |
| | | options: [], |
| | | equipmentList: [], |
| | | // 设备类型:与左侧树“设备/计量器具”分类保持一致 |
| | | equipmentList: [ |
| | | { label: '设备', value: '设备' }, |
| | | { label: '计量器具', value: '计量器具' } |
| | | ], |
| | | deviceStatusList: [], |
| | | props: { multiple: true, emitPath: false, value: 'id', label: 'name' }, |
| | | // 收集设备档案数据 |
| | |
| | | editData: { |
| | | authorizedPerson: [], |
| | | }, |
| | | qualifiedSupplierNames: [], |
| | | } |
| | | }, |
| | | computed: { |
| | | // 校准服务机构下拉选项(合格供应商 + 当前值兜底) |
| | | calibrationServiceOptions() { |
| | | const list = this.qualifiedSupplierNames.slice(); |
| | | const value = this.editData.calibrationServices; |
| | | if (value && list.indexOf(value) === -1) list.push(value); |
| | | return list; |
| | | }, |
| | | action() { |
| | | return this.javaApi + '/deviceScope/uploadFile' |
| | | } |
| | |
| | | // 获取相关文档的数据 |
| | | this.getPage() |
| | | this.timeStamp = Date.now() |
| | | this.obtainQualifiedSupplierList() |
| | | }, |
| | | methods: { |
| | | formatDateCell(row, column, cellValue) { |
| | | return formatListDate(cellValue) |
| | | }, |
| | | // 拉取合格供应商列表(校准服务机构下拉选项) |
| | | obtainQualifiedSupplierList() { |
| | | selectQualifiedSupplierManagementPage({ current: 1, size: 999 }).then(res => { |
| | | if (res.code === 200) { |
| | | const rows = (res.data && res.data.records) || []; |
| | | this.qualifiedSupplierNames = [...new Set(rows.map(r => r.supplierName).filter(Boolean))]; |
| | | } |
| | | }); |
| | | }, |
| | | // 原先的 Vue2 filter,Vue3 已移除 filters 选项,改为方法调用 |
| | | formaterDateTime(dateTime) { |
| | | if (dateTime === undefined || dateTime === null || dateTime === '') { |
| | |
| | | openFileRevisionDialog() { |
| | | // 获取档案修订负责人下拉框数据 |
| | | this.selectDevicePrincipal() |
| | | // 获取档案修订所属部门下拉框数据 |
| | | this.obtainItemParameterList() |
| | | // 获取档案修订设备状态下拉框数据 |
| | | this.selectEnumByCategory() |
| | | // 获取档案修订检验项目级联弹框数据 |
| | |
| | | }, |
| | | //附件和相关文档事件 |
| | | handleAttachmentClick(row) { |
| | | console.log(row) |
| | | if (row.fileName) { |
| | | this.$download.saveAs(row.fileName) |
| | | } else { |
| | | if (!row.systemFileName) { |
| | | this.$message.warning('未上传文件!') |
| | | return |
| | | } |
| | | // 图片存 /img/,其他文档存 /word/ |
| | | const isImage = /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(row.systemFileName) |
| | | const url = this.javaApi + (isImage ? '/img/' : '/word/') + row.systemFileName |
| | | this.$download.saveAs(url, row.fileName || row.systemFileName) |
| | | }, |
| | | handleViewClick(row) { |
| | | this.isAddFileUpdate = true |
| | |
| | | }) |
| | | }, |
| | | saveRecord() { |
| | | if (!this.addFile.name) { |
| | | this.$message.warning('请输入档案名称') |
| | | return |
| | | } |
| | | if (this.addFile.documentType !== 0 && this.addFile.documentType !== '0' && |
| | | this.addFile.documentType !== 1 && this.addFile.documentType !== '1') { |
| | | this.$message.warning('请选择维护类型') |
| | | return |
| | | } |
| | | //转换数据 |
| | | this.addFile.deviceId = this.clickNodeVal.value |
| | | // 新上传时 systemFileName 是 {name: 原始文件名, url: 存储文件名};编辑旧记录时已是字符串 |
| | | let obj = this.addFile.systemFileName |
| | | this.addFile.systemFileName = obj.name |
| | | this.addFile.fileName = obj.url |
| | | if (obj && typeof obj === 'object') { |
| | | this.addFile.systemFileName = obj.url |
| | | this.addFile.fileName = obj.name |
| | | } |
| | | |
| | | // 更新 |
| | | if (this.isAddFileUpdate) { |
| | |
| | | } |
| | | }, |
| | | handleRemove(file, fileList) { |
| | | this.deleteFile(this.addFile.systemFileName) |
| | | const obj = this.addFile.systemFileName |
| | | const fileName = obj && typeof obj === 'object' ? obj.url : obj |
| | | if (fileName) this.deleteFile(fileName) |
| | | this.addFile.systemFileName = '' |
| | | this.addFile.fileName = '' |
| | | }, |
| | | deleteFile(fileName) { |
| | | deleteCNASFile({ fileName }).then(res => { |
| | | this.$message.success('删除成功!') |
| | | if (res.code == 200) { |
| | | this.$message.success('删除成功!') |
| | | } |
| | | }) |
| | | }, |
| | | handleExceed(files, fileList) { |
| | |
| | | this.tableDataA = res.data |
| | | }) |
| | | }, |
| | | // 被授权人历史值可能是被反复转义的多层 JSON 字符串,逐层解析还原成数组 |
| | | normalizeAuthorizedPerson(val) { |
| | | let v = val |
| | | for (let i = 0; i < 10; i++) { |
| | | if (typeof v !== 'string') break |
| | | if (v === '') { |
| | | v = [] |
| | | break |
| | | } |
| | | try { |
| | | v = JSON.parse(v) |
| | | } catch (e) { |
| | | v = [] |
| | | break |
| | | } |
| | | } |
| | | if (!Array.isArray(v)) { |
| | | v = v === '' || v === null || v === undefined ? [] : [v] |
| | | } |
| | | return v.filter(x => x !== '' && x !== null && x !== undefined) |
| | | }, |
| | | // 收集数据 |
| | | getList(id) { |
| | | selectDeviceByCode({ id }).then(res => { |
| | | // 将分类列表的信息存起来 |
| | | if (res.code == 200) { |
| | | this.Mdata = res.data; |
| | | this.Mdata.insProductIds = this.Mdata.insProductIds.split(',') |
| | | if (this.Mdata.authorizedPerson) { |
| | | this.Mdata.authorizedPerson = JSON.parse(this.Mdata.authorizedPerson) |
| | | } |
| | | this.Mdata.insProductIds = this.Mdata.insProductIds |
| | | ? String(this.Mdata.insProductIds).split(',') |
| | | : [] |
| | | this.Mdata.authorizedPerson = this.normalizeAuthorizedPerson(this.Mdata.authorizedPerson) |
| | | } |
| | | }); |
| | | }, |
| | |
| | | //打开修订档案弹框 |
| | | openEditForm() { |
| | | this.editData = JSON.parse(JSON.stringify(this.Mdata)) |
| | | // 设备类型为空时,默认取左侧树当前所在分类 |
| | | const treeCategory = this.clickNodeVal && this.clickNodeVal.parent ? this.clickNodeVal.parent.label : '' |
| | | if (!this.editData.largeCategory && (treeCategory === '设备' || treeCategory === '计量器具')) { |
| | | this.editData.largeCategory = treeCategory |
| | | } |
| | | this.$nextTick(() => { |
| | | this.dialogVisible = true |
| | | }) |
| | | }, |
| | | // 下次日期 = 最近日期 + 周期(月),自动计算 |
| | | calcNextDate(data) { |
| | | const calc = (lastDate, cycle) => { |
| | | const period = parseInt(cycle) |
| | | if (!lastDate || !period || period <= 0) { |
| | | return null |
| | | } |
| | | return dayjs(String(lastDate).replace(' ', 'T')) |
| | | .add(period, 'month') |
| | | .format('YYYY-MM-DD HH:mm:ss') |
| | | } |
| | | const nextCalibrationDate = calc(data.lastCalibrationDate, data.calibrationDate) |
| | | if (nextCalibrationDate) { |
| | | data.nextCalibrationDate = nextCalibrationDate |
| | | } |
| | | const nextMaintenanceDate = calc(data.lastMaintenanceDate, data.maintenanceCycle) |
| | | if (nextMaintenanceDate) { |
| | | data.nextMaintenanceDate = nextMaintenanceDate |
| | | } |
| | | const nextExamineDate = calc(data.lastExamineDate, data.examineCycle) |
| | | if (nextExamineDate) { |
| | | data.nextExamineDate = nextExamineDate |
| | | } |
| | | }, |
| | | //修订档案 |
| | | submitForm() { |
| | | let flag = true |
| | | this.$refs['rules1'].validate((valid) => { |
| | | if (!valid) { |
| | | flag = false; |
| | | return false; |
| | | // validate() 返回 Promise,统一等四个表单全部校验完再判断 |
| | | const formRefs = ['rules1', 'rules2', 'ruleForm', 'cycleForm'] |
| | | Promise.all(formRefs.map(ref => this.$refs[ref].validate().catch(() => false))).then(results => { |
| | | if (results.some(valid => !valid)) { |
| | | return |
| | | } |
| | | }); |
| | | this.$refs['rules2'].validate((valid) => { |
| | | if (!valid) { |
| | | flag = false; |
| | | return false; |
| | | } |
| | | }); |
| | | this.$refs['ruleForm'].validate((valid) => { |
| | | if (!valid) { |
| | | flag = false; |
| | | return false; |
| | | } |
| | | }); |
| | | if (!flag) { |
| | | return; |
| | | } |
| | | delete this.editData.createTime |
| | | delete this.editData.updateTime |
| | | delete this.editData.createUser |
| | | delete this.editData.updateUser |
| | | delete this.editData.orderBy |
| | | const formData = this.HaveJson(this.editData) |
| | | formData.userAllow = this.equipmentManager.toString(); |
| | | formData.insProductIds = Array.isArray(formData.insProductIds) ? formData.insProductIds.join(',') : ''; |
| | | if (formData.authorizedPerson.length === 0) { |
| | | formData.authorizedPerson = '' |
| | | } else { |
| | | formData.authorizedPerson = JSON.stringify(formData.authorizedPerson) |
| | | } |
| | | this.upLoad = true; |
| | | upDeviceParameter(formData).then(res => { |
| | | this.$message.success('修改成功') |
| | | this.upLoad = false |
| | | this.getList(this.clickNodeVal.value) |
| | | this.dialogVisible = false |
| | | }).catch(e => { |
| | | this.$message.error('修改失败') |
| | | this.dialogVisible = false |
| | | this.upLoad = false |
| | | delete this.editData.createTime |
| | | delete this.editData.updateTime |
| | | delete this.editData.createUser |
| | | delete this.editData.updateUser |
| | | delete this.editData.orderBy |
| | | const formData = this.HaveJson(this.editData) |
| | | formData.insProductIds = Array.isArray(formData.insProductIds) ? formData.insProductIds.join(',') : ''; |
| | | formData.authorizedPerson = Array.isArray(formData.authorizedPerson) && formData.authorizedPerson.length |
| | | ? JSON.stringify(formData.authorizedPerson) |
| | | : '' |
| | | this.upLoad = true; |
| | | upDeviceParameter(formData).then(res => { |
| | | this.upLoad = false |
| | | if (res.code == 200) { |
| | | this.$message.success('修改成功') |
| | | this.getList(this.clickNodeVal.value) |
| | | // 类型可能变更,刷新左侧树让设备归到新的分类下 |
| | | this.$emit('refresh-tree') |
| | | this.dialogVisible = false |
| | | } else { |
| | | this.$message.error(res.message || res.msg || '修改失败') |
| | | } |
| | | }).catch(e => { |
| | | // 失败保留弹窗,避免已编辑内容丢失 |
| | | this.$message.error('修改失败') |
| | | this.upLoad = false |
| | | }) |
| | | }) |
| | | }, |
| | | // 导出 |
| | |
| | | this.outLoading = true |
| | | exportDeviceFile({ deviceId: this.clickNodeVal.value }).then(res => { |
| | | this.outLoading = false |
| | | const blob = new Blob([res], { type: 'application/octet-stream' }); |
| | | this.$download.saveAs(blob, '设备档案卡.doc') |
| | | saveBlobOrShowError(res, '设备档案卡.doc', 'application/msword') |
| | | }).catch(() => { |
| | | this.outLoading = false |
| | | }) |
| | | }, |
| | | // 修订弹窗按万元录入,档案详情按元展示 |
| | | formatPurchasePrice(val) { |
| | | if (val === null || val === undefined || val === '') { |
| | | return '-' |
| | | } |
| | | const num = Number(val) |
| | | return isNaN(num) ? val : num * 10000 |
| | | }, |
| | | handleSuccessUpImg2(response) { |
| | | if (response.code == 200) { |
| | |
| | | selectUserCondition().then(res => { |
| | | this.responsiblePersonList = res.data; |
| | | }) |
| | | }, |
| | | obtainItemParameterList() { |
| | | obtainItemParameterList().then(res => { |
| | | let data = [] |
| | | res.data.forEach(a => { |
| | | data.push({ |
| | | label: a.laboratoryName, |
| | | value: a.id |
| | | }) |
| | | }) |
| | | this.subordinateDepartmentsList = data |
| | | // 被授权人下拉只取检测员角色人员 |
| | | selectUserCondition({ type: 3 }).then(res => { |
| | | this.inspectorList = res.data; |
| | | }) |
| | | }, |
| | | getInsProductIds() { |
| | |
| | | a.value = parseInt(a.value) |
| | | } |
| | | }) |
| | | }); |
| | | // 设备分类 |
| | | this.getDicts("device_type").then((response) => { |
| | | this.equipmentList = this.dictToValue(response.data); |
| | | }); |
| | | }, |
| | | }, |
| | |
| | | width: 100%; |
| | | } |
| | | |
| | | .cycle-row { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .cycle-title { |
| | | width: 68px; |
| | | flex-shrink: 0; |
| | | font-size: 13px; |
| | | color: var(--lims-text-2, #909399); |
| | | } |
| | | |
| | | .cycle-item { |
| | | flex: 1; |
| | | margin-bottom: 6px; |
| | | margin-right: 10px; |
| | | } |
| | | |
| | | .cycle-item:last-child { |
| | | margin-right: 0; |
| | | } |
| | | |
| | | .form-row { |
| | | display: flex; |
| | | gap: 16px; |
| | | } |
| | | |
| | | .form-row > .el-form-item { |
| | | flex: 1; |
| | | } |
| | | |
| | | .section-title { |
| | | position: relative; |
| | | padding-left: 10px; |
| | | margin: 14px 0 12px; |
| | | font-size: 13px; |
| | | font-weight: 600; |
| | | color: var(--lims-text-1, #303133); |
| | | } |
| | | |
| | | .section-title::before { |
| | | content: ""; |
| | | position: absolute; |
| | | left: 0; |
| | | top: 3px; |
| | | bottom: 3px; |
| | | width: 3px; |
| | | border-radius: 2px; |
| | | background: var(--el-color-primary, #409eff); |
| | | } |
| | | |
| | | .el-image { |
| | | position: relative; |
| | | } |