| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- è®¾å¤æ¡£æ¡ --> |
| | | <template> |
| | | <div class="page"> |
| | | <div class="page-header"> |
| | | <h4><span class="line"></span><span>è®¾å¤æ¡£æ¡</span></h4> |
| | | <div class="btns"> |
| | | <el-button type="primary" size="small" @click="openEditForm" style="">修订档æ¡</el-button> |
| | | <el-button type="primary" size="small" @click="dialogVisible1 = true" style="">æ·»å éä»¶</el-button> |
| | | <el-button type="primary" size="small" @click="deviceDialog = true" style="">æ¥ç设å¤äºç»´ç </el-button> |
| | | <!-- <el-button type="primary" size="small" @click="handleDownOne" style="">导åº</el-button>--> |
| | | </div> |
| | | </div> |
| | | <el-divider></el-divider> |
| | | <div class="main_div"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <!-- å æ¶é´æ³é¿å
æµè§å¨ç¼åé®é¢ --> |
| | | <el-image :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;"> |
| | | <div slot="error" class="image-slot"> |
| | | <i class="el-icon-picture-outline" style="font-size: 40px;"></i> |
| | | </div> |
| | | </el-image> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <div class="form-item"> |
| | | <label>设å¤åç§°</label> |
| | | <!-- <p>{{ Mdata.deviceName }}</p> --> |
| | | <el-tooltip |
| | | class="item" |
| | | :content="Mdata.deviceName" |
| | | > |
| | | <span class="text-ellipsis" >{{ Mdata.deviceName }}</span> |
| | | </el-tooltip> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>设å¤ç±»å</label> |
| | | <p>{{ Mdata.largeCategory }}</p> |
| | | </div> |
| | | |
| | | <div class="form-item"> |
| | | <label>管çç¼å·</label> |
| | | <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" |
| | | > |
| | | <span class="text-ellipsis" >{{ Mdata.manufacturer }}</span> |
| | | </el-tooltip> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>èµäº§ç¼ç </label> |
| | | <p class="text-ellipsis">{{ Mdata.assetCode }}</p> |
| | | </div> |
| | | |
| | | <div class="form-item"> |
| | | <label>åºåæ¥æ</label> |
| | | <p>{{ Mdata.acquisitionDate | formaterDateTime }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>å¯ç¨æ¥æ</label> |
| | | <p>{{ Mdata.activationDate | formaterDateTime }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>æ ¸å卿(æ)</label> |
| | | <p>{{ Mdata.calibrationDate }}</p> |
| | | </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> |
| | | <p>{{ Mdata.authorizedPersonName }}</p> |
| | | </div> |
| | | |
| | | </el-col> |
| | | <el-col :span="10"> |
| | | <div class="form-item"> |
| | | <label>è§æ ¼åå·</label> |
| | | <p>{{ Mdata.specificationModel }}</p> |
| | | </div> |
| | | <!-- <div class="form-item"> |
| | | <label>ç»ç±»</label> |
| | | <p>{{ handleData() }}</p> |
| | | </div> --> |
| | | <div class="form-item"> |
| | | <label>åºåç¼å·</label> |
| | | <p>{{ Mdata.factoryNo }}</p> |
| | | </div> |
| | | <div class="form-items"> |
| | | <label>设å¤ç¶æ</label> |
| | | <el-radio-group v-model="Mdata.deviceStatus" style="margin-left: 10px;"> |
| | | <el-radio :label="0" :disabled="Mdata.deviceStatus != 0">æ£å¸¸</el-radio> |
| | | <el-radio :label="1" :disabled="Mdata.deviceStatus != 1">ç»´ä¿®</el-radio> |
| | | <el-radio :label="2" :disabled="Mdata.deviceStatus != 2">åç¨</el-radio> |
| | | <el-radio :label="3" :disabled="Mdata.deviceStatus != 3">æ¥åº</el-radio> |
| | | </el-radio-group> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>åæ¾ç¹</label> |
| | | <p>{{ Mdata.storagePoint }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>产å°</label> |
| | | <p>{{ Mdata.origin }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>æ£éªé¡¹</label> |
| | | <el-tooltip |
| | | class="item" |
| | | effect="dark" |
| | | :content="Mdata.insProductItem" |
| | | placement="top" |
| | | > |
| | | <span class="text-ellipsis" >{{ Mdata.insProductItem }}</span> |
| | | </el-tooltip> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>è´ç½®æ¥æ</label> |
| | | <p>{{ Mdata.acquisitionDate | formaterDateTime }}</p> |
| | | </div> |
| | | |
| | | <div class="form-item"> |
| | | <label>æè¿æº¯æºæ¥æ</label> |
| | | <p>{{ Mdata.lastCalibrationDate | formaterDateTime }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>éè´è´¹ç¨(å
)</label> |
| | | <p>{{ Mdata.unitPrice }}</p> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label>åç¨æ¶é´</label> |
| | | <p>{{ Mdata.nextCalibrationDate | formaterDateTime }}</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> |
| | | <p>{{ Mdata.calibrateNo }}</p> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | <h4 style="margin-bottom: 10px;margin-top: 10px;"><span class="line"></span><span>éä»¶åç¸å
³ææ¡£</span></h4> |
| | | <el-table height="200px" :data="tableDataA"> |
| | | <el-table-column header-align="center" align="center" prop="prop" label="åºå·" type="index" width="60" /> |
| | | <el-table-column prop="documentType" label="ç±»å" min-width="100"> |
| | | <template v-slot="scope"> |
| | | {{ scope.row.documentType === '0' ? 'éä»¶' : scope.row.documentType === '1' ? 'ææ¡£' : '' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="name" label="åç§°" min-width="150" /> |
| | | <el-table-column prop="number" label="ç¼å·" min-width="150" /> |
| | | <el-table-column prop="version" label="çæ¬" min-width="80" /> |
| | | <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="150" /> |
| | | <el-table-column prop="comments" label="夿³¨" min-width="150" /> |
| | | <el-table-column fixed="right" label="æä½" min-width="180"> |
| | | <template slot-scope="scope"> |
| | | <el-button type="text" size="small" @click="handleAttachmentClick(scope.row)">ä¸è½½éä»¶</el-button> |
| | | <el-button type="text" size="small" @click="handleViewClick(scope.row)">æ¥ç</el-button> |
| | | <el-button type="text" size="small" @click="handleDeleteClick(scope.row)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | <!-- 修订 --> |
| | | <el-dialog title="修订档æ¡" top="5vh" :visible.sync="dialogVisible" width="70%" @open="openFileRevisionDialog" |
| | | :before-close="handleClose"> |
| | | <el-row style="display:flex;justify-content: space-around;"> |
| | | <!-- 左边å¸å± --> |
| | | <el-col :span="7"> |
| | | <el-col> |
| | | <!-- å¾ç --> |
| | | <el-image class="img" style="width:100%;height: 320px;margin-bottom:16px" |
| | | :src="javaApi + '/img/' + editData.imageUpload"> |
| | | <div slot="error" class="image-error" style="width: calc(100% - 2px); |
| | | height: 318px; |
| | | border-radius: 16px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | border: 1px solid #EEEEEE;"> |
| | | <i class="el-icon-picture-outline" style="font-size:60px;color:#666666;"></i> |
| | | </div> |
| | | </el-image> |
| | | <!-- 表å --> |
| | | <el-form :model="editData" label-width="120px" ref="rules1" :rules="rules1"> |
| | | <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> |
| | | <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" disabled 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="æå±é¨é¨:"> |
| | | <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="Mdata.latestTraceability" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd" type="date" size="small" placeholder="éæ©æ¥æ"> |
| | | </el-date-picker> |
| | | </el-form-item> --> |
| | | <!-- <el-form-item label="䏿¬¡æ ¡åæ¥æ:"> |
| | | <el-date-picker style="width:100%" v-model="Mdata.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 #DCDFE6;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"> |
| | | <i v-else class="el-icon-plus avatar-uploader-icon"></i> |
| | | </el-upload> |
| | | </div> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-col> |
| | | </el-row> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-row> |
| | | <el-button @click="handleClose">å æ¶</el-button> |
| | | <el-button type="primary" @click="submitForm" :loading="upLoad">ç¡® å®</el-button> |
| | | </el-row> |
| | | </span> |
| | | </el-dialog> |
| | | <el-dialog title="æ·»å 设å¤éä»¶" top="5vh" v-if="dialogVisible1" :visible.sync="dialogVisible1" width="40%"> |
| | | <el-form ref="form" :model="addFile" label-width="120px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç»´æ¤ç±»åï¼"> |
| | | <el-radio-group v-model="addFile.documentType"> |
| | | <el-radio :label="0">éä»¶</el-radio> |
| | | <el-radio :label="1">ææ¡£</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ¡£æ¡åç§°ï¼"> |
| | | <el-input size="small" placeholder="请è¾å
¥" clearable v-model="addFile.name"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="åºå·/èµäº§ç¼å·:"> |
| | | <el-input size="small" placeholder="请è¾å
¥" clearable v-model="addFile.number"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="çæ¬ï¼"> |
| | | <el-input size="small" placeholder="请è¾å
¥" clearable v-model="addFile.version"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="份æ°ï¼"> |
| | | <el-input-number v-model="addFile.quantity" controls-position="right" style="width: 100%;" size="small" |
| | | :min="0" :max="10"></el-input-number> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="页ç ï¼"> |
| | | <el-input-number v-model="addFile.pageCount" controls-position="right" style="width: 100%;" size="small" |
| | | :min="0" :max="10"></el-input-number> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æä¾è
ï¼"> |
| | | <el-input size="small" placeholder="请è¾å
¥" clearable v-model="addFile.provider"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="彿¡£æ¥æï¼"> |
| | | <el-date-picker type="date" style="width:100%" placeholder="è¯·éæ©æ¥æ" size="small" v-model="addFile.archiveDate" |
| | | format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="夿³¨ï¼"> |
| | | <el-input type="textarea" :rows="2" size="small" v-model="addFile.comments"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="éä»¶ï¼" style="float: left;"> |
| | | <el-upload class="upload-demo" :action="action" :headers="uploadHeader" ref="uploadFile" :on-error="onError" |
| | | :on-remove="handleRemove" :on-success="onSuccess" :before-remove="beforeRemove" multiple :limit="1" |
| | | :on-exceed="handleExceed" :file-list="fileList"> |
| | | <el-button size="small" type="primary">ç¹å»ä¸ä¼ </el-button> |
| | | </el-upload> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-row> |
| | | <el-button @click="dialogVisible1 = false" size="small">å æ¶</el-button> |
| | | <el-button type="primary" @click="saveRecord" size="small" :loading="isLoading">{{ isAddFileUpdate == true ? |
| | | 'æ´æ°' : |
| | | 'ç¡® å®' }}</el-button> |
| | | </el-row> |
| | | </span> |
| | | </el-dialog> |
| | | <el-dialog title="设å¤äºç»´ç " :visible.sync="deviceDialog" top="5vh" width="30%"> |
| | | <div style="width:90%;text-align: right;"> |
| | | <el-button type="primary" size="mini" @click="clickGeneratePicture">ä¸è½½å¾ç</el-button> |
| | | <el-button type="primary" size="mini" @click="labelPrint">æ ç¾æå°</el-button> |
| | | </div> |
| | | <div class="device-main" ref="deviceQrCode" id="deviceCode"> |
| | | <div class="device-center"> |
| | | <p class="device-title">{{ Mdata.deviceName }}</p> |
| | | <div class="device-footer"> |
| | | <div> |
| | | <vueQr class="qr-code" |
| | | :text="'https://zttx-lims.ztt.cn:8021/lims/qr/qrScan?code=' + Mdata.managementNumber + '&type=device'" |
| | | :size="200" :margin="10"></vueQr> |
| | | </div> |
| | | <div class="device-number"> |
| | | <span class="device-text">设å¤ç¼ç :</span> |
| | | <span class="device-text">{{ Mdata.managementNumber }}</span> |
| | | </div> |
| | | <div class="device-name"> |
| | | <span class="device-text">设å¤åå·:</span> |
| | | <span class="device-text">{{ Mdata.specificationModel }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { MessageBox } from 'element-ui' |
| | | import fileDownload from '@/utils/file' |
| | | import vueQr from 'vue-qr' |
| | | import PrintJS from 'print-js' |
| | | import domtoimage from 'dom-to-image'; |
| | | import { |
| | | deleteCNASFile, |
| | | updateDocument, |
| | | addDocument, |
| | | deleteDocumentById, |
| | | getAllDocuments, |
| | | selectDeviceByCode, |
| | | upDeviceParameter, |
| | | exportDeviceFile, |
| | | getInsProduction, |
| | | } from '@/api/cnas/resourceDemand/device.js' |
| | | import { selectUserCondition } from "@/api/system/user"; |
| | | import { |
| | | obtainItemParameterList, |
| | | } from '@/api/cnas/resourceDemand/device.js' |
| | | export default { |
| | | filters: { |
| | | formaterDateTime(dateTime) { |
| | | if (dateTime === undefined || dateTime === null || dateTime === '') { |
| | | return dateTime |
| | | } |
| | | return dateTime.split(" ")[0] |
| | | } |
| | | }, |
| | | props: { |
| | | clickNodeVal: { |
| | | type: Object, |
| | | default: () => { |
| | | return {}; |
| | | } |
| | | } |
| | | }, |
| | | components: { |
| | | vueQr |
| | | }, |
| | | data() { |
| | | return { |
| | | deviceDialog: false,//æ¥ç设å¤äºç»´ç å¼¹æ¡ |
| | | rules1: { |
| | | deviceName: [ |
| | | { required: true, message: '请è¾å
¥ä»ªå¨åç§°', trigger: 'blur' }, |
| | | ], |
| | | enDeviceName: [ |
| | | { required: true, message: '请è¾å
¥ä»ªå¨åç§°EN', trigger: 'blur' }, |
| | | ], |
| | | specificationModel: [ |
| | | { required: true, message: '请è¾å
¥è§æ ¼åå·', trigger: 'blur' }, |
| | | ], |
| | | managementNumber: [ |
| | | { required: true, message: '请è¾å
¥ç®¡çç¼å·', trigger: 'blur' }, |
| | | ], |
| | | activationDate: [ |
| | | { required: true, message: '请è¾å
¥æ ¡åæææ', trigger: 'blur' }, |
| | | ], |
| | | deviceStatus: [ |
| | | { required: true, message: '请è¾å
¥å½åç¶æ', trigger: 'blur' }, |
| | | ], |
| | | calibrationDate: [ |
| | | { required: true, message: '请è¾å
¥æ ¡å卿(æ)', trigger: 'blur' }, |
| | | ], |
| | | subordinateDepartmentsId: [ |
| | | { required: true, message: 'è¯·éæ©æå±é¨é¨', trigger: 'change' }, |
| | | ] |
| | | }, |
| | | // dateForm: { |
| | | |
| | | // }, |
| | | fileList: [], // æ·»å éä»¶ä¸ä¼ æä»¶å表 |
| | | timeStamp: '', // ç»å¾çæ·»å keyï¼å¨æ¯æ¬¡å 载页é¢çæ¶åæ°å»ºæ¶é´æ³ |
| | | equipmentManager: [], |
| | | formLabelWidth: '100px', |
| | | dialogVisible1: false, |
| | | recordNumber: '', |
| | | inLoading: false, // æ§å¶ä¸ä¼ æé®å è½½ç¶æ |
| | | isLoading: false, // æ§å¶ç¡®å®æé®å è½½ç¶æ |
| | | formData: {}, |
| | | tableDataA: [], |
| | | num: 1, |
| | | //æ·»å éä»¶æ°æ®æ¶é |
| | | addFile: { |
| | | documentType: '', // ç»´æ¤ç±»å |
| | | provideDate: null, // 彿¡£æ¥æ |
| | | name: '', // æ¡£æ¡åç§° |
| | | number: '', // åºå·/èµäº§ç¼å· |
| | | version: '', // çæ¬ |
| | | quantity: 1, // ä»½æ° |
| | | pageCount: 1, // 页ç |
| | | provider: '', // æä¾è
|
| | | comments: "", // 夿³¨ |
| | | fileName: "", // æä»¶ååç§° |
| | | systemFileName: "", // ç³»ç»çæåç§° |
| | | }, |
| | | componentData: { |
| | | entity: { name: "", orderBy: { field: "id", order: "asc" } }, |
| | | page: { current: "1", size: "80" } |
| | | }, |
| | | upIndex: 0, |
| | | dialogVisible: false, |
| | | upLoad: false, |
| | | responsiblePersonList: [], |
| | | subordinateDepartmentsList: [], |
| | | options: [], |
| | | equipmentList: [], |
| | | deviceStatusList: [], |
| | | props: { multiple: true, emitPath: false, value: 'id', label: 'name' }, |
| | | // æ¶éè®¾å¤æ¡£æ¡æ°æ® |
| | | Mdata: { |
| | | deviceName: null |
| | | }, |
| | | isAddFileUpdate: false, |
| | | editData: { |
| | | authorizedPerson: [], |
| | | }, |
| | | } |
| | | }, |
| | | computed: { |
| | | action() { |
| | | return this.javaApi + '/deviceScope/uploadFile' |
| | | } |
| | | }, |
| | | mounted() { |
| | | // æ¶éæ°æ® |
| | | this.getList(this.clickNodeVal.value) |
| | | // è·åç¸å
³ææ¡£çæ°æ® |
| | | this.getPage() |
| | | this.timeStamp = Date.now() |
| | | }, |
| | | methods: { |
| | | /** |
| | | * å°é¡µé¢æå®èç¹å
容转为å¾ç |
| | | * 1.æ¿å°æ³è¦è½¬æ¢ä¸ºå¾ççå
容èç¹DOMï¼ |
| | | * 2.转æ¢ï¼æ¿å°è½¬æ¢åçcanvas |
| | | * 3.转æ¢ä¸ºå¾ç |
| | | */ |
| | | clickGeneratePicture() { |
| | | const _than = this |
| | | domtoimage.toPng(_than.$refs.deviceQrCode, { quality: 1, width: 440, }).then(function (dataUrl) { |
| | | // å°è½¬æ¢åçå¾åæ°æ®åå¨ä¸º data URL |
| | | fileDownload.downloadIamge(dataUrl, _than.Mdata.deviceName) |
| | | }); |
| | | }, |
| | | //æå°è®¾å¤äºç»´ç |
| | | labelPrint() { |
| | | PrintJS({ |
| | | printable: 'deviceCode',//é¡µé¢ |
| | | type: "html",//ææ¡£ç±»å |
| | | maxWidth: 360, |
| | | css: ['/static/css/device-print.css'], |
| | | style: '@page { size: auto; margin: 0mm;}', |
| | | targetStyles: ["*"], // 使ç¨domçæææ ·å¼ï¼å¾éè¦ |
| | | }); |
| | | }, |
| | | openFileRevisionDialog() { |
| | | // è·åæ¡£æ¡ä¿®è®¢è´è´£äººä¸ææ¡æ°æ® |
| | | this.selectDevicePrincipal() |
| | | // è·åæ¡£æ¡ä¿®è®¢æå±é¨é¨ä¸ææ¡æ°æ® |
| | | this.obtainItemParameterList() |
| | | // è·åæ¡£æ¡ä¿®è®¢è®¾å¤ç¶æä¸ææ¡æ°æ® |
| | | this.selectEnumByCategory() |
| | | // è·åæ¡£æ¡ä¿®è®¢æ£éªé¡¹ç®çº§èå¼¹æ¡æ°æ® |
| | | this.getInsProductIds() |
| | | }, |
| | | //éä»¶åç¸å
³ææ¡£äºä»¶ |
| | | handleAttachmentClick(row) { |
| | | console.log(row) |
| | | if (row.fileName) { |
| | | this.$download.saveAs(row.fileName) |
| | | } else { |
| | | this.$message.warning('æªä¸ä¼ æä»¶ï¼') |
| | | } |
| | | }, |
| | | handleViewClick(row) { |
| | | this.isAddFileUpdate = true |
| | | this.addFile = { ...row } |
| | | this.dialogVisible1 = true |
| | | if (row.fileName) { |
| | | const obj = Object.assign({ |
| | | name: row.fileName, |
| | | url: row.fileName, |
| | | status: 'success', |
| | | uid: Date.now(), |
| | | }) |
| | | this.fileList.push(obj) |
| | | } |
| | | }, |
| | | handleDeleteClick(row) { |
| | | // å é¤é»è¾ |
| | | MessageBox.confirm('ç¡®å®è¦å é¤è¯¥è®°å½åï¼', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning', |
| | | }).then(() => { |
| | | deleteDocumentById({ id: row.id }).then(res => { |
| | | if (res.code == 200) { |
| | | this.$message.success('å 餿å') |
| | | this.getPage() |
| | | } |
| | | }) |
| | | }).catch(() => { |
| | | this.$message.info('已忶å é¤') |
| | | }) |
| | | }, |
| | | saveRecord() { |
| | | //è½¬æ¢æ°æ® |
| | | this.addFile.deviceId = this.clickNodeVal.value |
| | | let obj = this.addFile.systemFileName |
| | | this.addFile.systemFileName = obj.name |
| | | this.addFile.fileName = obj.url |
| | | |
| | | // æ´æ° |
| | | if (this.isAddFileUpdate) { |
| | | updateDocument(this.addFile).then(res => { |
| | | if (res.code == 200) { |
| | | this.$message.success('æ´æ°æå') |
| | | this.dialogVisible1 = false; |
| | | this.getPage() |
| | | } |
| | | }) |
| | | } else { |
| | | // æ°å¢ |
| | | addDocument(this.addFile).then(res => { |
| | | if (res.code == 200) { |
| | | this.$message.success('ä¿åæå') |
| | | this.dialogVisible1 = false; |
| | | this.getPage() |
| | | } |
| | | }) |
| | | } |
| | | }, |
| | | onSuccess(response, file, fileList) { |
| | | if (response.code == 200) { |
| | | this.addFile.systemFileName = response.data |
| | | this.addFile.fileName = file.name |
| | | } else { |
| | | this.$refs.uploadFile.clearFiles() |
| | | this.$message.error('ä¸ä¼ 失败ï¼' + response.message) |
| | | } |
| | | }, |
| | | handleRemove(file, fileList) { |
| | | this.deleteFile(this.addFile.systemFileName) |
| | | }, |
| | | deleteFile(fileName) { |
| | | deleteCNASFile({ fileName }).then(res => { |
| | | this.$message.success('å 餿åï¼') |
| | | }) |
| | | }, |
| | | handleExceed(files, fileList) { |
| | | this.$message.warning(`å½åéå¶éæ© 1 个æä»¶ï¼æ¬æ¬¡éæ©äº ${files.length} 个æä»¶ï¼å
±éæ©äº ${files.length + fileList.length} 个æä»¶`); |
| | | }, |
| | | beforeRemove(file, fileList) { |
| | | return this.$confirm(`ç¡®å®ç§»é¤ ${file.name}ï¼`); |
| | | }, |
| | | // è·åç¸å
³ææ¡£æ°æ®çapi |
| | | getPage() { |
| | | getAllDocuments({ deviceId: this.clickNodeVal.value }).then(res => { |
| | | if (res.code == 200) |
| | | this.tableDataA = res.data |
| | | }) |
| | | }, |
| | | // æ¶éæ°æ® |
| | | 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) |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | handleData(m) { |
| | | if (m) { |
| | | return m |
| | | } else { |
| | | return '-' |
| | | } |
| | | }, |
| | | handleClose() { |
| | | this.dialogVisible = false |
| | | }, |
| | | //æå¼ä¿®è®¢æ¡£æ¡å¼¹æ¡ |
| | | openEditForm() { |
| | | this.editData = JSON.parse(JSON.stringify(this.Mdata)) |
| | | this.$nextTick(() => { |
| | | this.dialogVisible = true |
| | | }) |
| | | }, |
| | | //ä¿®è®¢æ¡£æ¡ |
| | | submitForm() { |
| | | let flag = true |
| | | this.$refs['rules1'].validate((valid) => { |
| | | if (!valid) { |
| | | flag = false; |
| | | return false; |
| | | } |
| | | }); |
| | | 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 |
| | | }) |
| | | }, |
| | | // å¯¼åº |
| | | handleDownOne(row) { |
| | | 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') |
| | | }) |
| | | }, |
| | | handleSuccessUpImg2(response) { |
| | | if (response.code == 200) { |
| | | this.$nextTick(() => { |
| | | this.editData.imageUpload = response.data.url; |
| | | this.editData.imageName = response.data.name; |
| | | console.log(this.javaApi + 'img/' + this.editData.imageUpload); |
| | | |
| | | }) |
| | | } |
| | | }, |
| | | beforeUpload(file) { |
| | | if (file.size > 1024 * 1024 * 10) { |
| | | this.$message.error('ä¸ä¼ æä»¶ä¸è¶
è¿10M'); |
| | | this.$refs.upload.clearFiles() |
| | | return false; |
| | | } else { |
| | | return true; |
| | | } |
| | | }, |
| | | onError(err, file, fileList) { |
| | | this.$message.error('ä¸ä¼ 失败') |
| | | this.$refs.upload.clearFiles() |
| | | }, |
| | | // è·åè´è´£äººå表 |
| | | selectDevicePrincipal() { |
| | | 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 |
| | | }) |
| | | }, |
| | | getInsProductIds() { |
| | | getInsProduction().then(res => { |
| | | this.options = res.data.map((m, i) => { |
| | | m.id = m.name; |
| | | return m |
| | | }) |
| | | this.options.forEach(item => { |
| | | if (item.children.length == 0) { |
| | | item.children = null; |
| | | } else { |
| | | item.children.forEach(m => { |
| | | if (m.children.length == 0) { |
| | | m.children = null; |
| | | } else { |
| | | m.children.forEach(n => { |
| | | if (n.children && n.children.length == 0) { |
| | | n.children = null; |
| | | } |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | }) |
| | | }) |
| | | }, |
| | | // è·ååå
¸ |
| | | selectEnumByCategory() { |
| | | // 设å¤ç¶æ |
| | | this.getDicts("device_status").then((response) => { |
| | | this.deviceStatusList = this.dictToValue(response.data) |
| | | this.deviceStatusList.forEach(a => { |
| | | if (!isNaN(a.value)) { |
| | | a.value = parseInt(a.value) |
| | | } |
| | | }) |
| | | }); |
| | | // 设å¤åç±» |
| | | this.getDicts("device_type").then((response) => { |
| | | this.equipmentList = this.dictToValue(response.data); |
| | | }); |
| | | }, |
| | | }, |
| | | watch: { |
| | | // çå¬ç¹å»el-treeçæ°æ®ï¼è¿è¡æ°æ®å·æ° |
| | | clickNodeVal(newVal) { |
| | | if (newVal.value) { |
| | | this.getList(newVal.value) |
| | | this.getPage() |
| | | } |
| | | }, |
| | | dialogVisible1(newVal) { |
| | | if (newVal == false) { |
| | | this.isAddFileUpdate = false |
| | | this.addFile = {} |
| | | this.fileList = [] |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .main_div { |
| | | height: calc(100vh - 15em); |
| | | overflow-y: auto; |
| | | overflow-x: hidden; |
| | | } |
| | | |
| | | .page { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | .page-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | h4 { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | h4 .line { |
| | | display: inline-block; |
| | | width: 3px; |
| | | height: 16px; |
| | | background: #3A7BFA; |
| | | margin-right: 4px; |
| | | } |
| | | |
| | | .tables { |
| | | width: 100%; |
| | | } |
| | | |
| | | .el-image { |
| | | position: relative; |
| | | } |
| | | |
| | | .el-icon-picture-outline { |
| | | position: absolute; |
| | | left: 50%; |
| | | top: 50%; |
| | | transform: translate(-50%, -50%); |
| | | } |
| | | |
| | | .form-item { |
| | | line-height: 34px; |
| | | display: flex; |
| | | align-items: center; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .text-ellipsis { |
| | | display: inline-block; |
| | | width: 200px; |
| | | /* æè
æ¨å¯ä»¥è®¾ç½®ä¸ä¸ªå
·ä½çå®½åº¦å¼ */ |
| | | box-sizing: border-box; |
| | | /* ç¡®ä¿paddingåborderä¸å½±åå
ç´ çæ»å®½åº¦ */ |
| | | white-space: nowrap; |
| | | /* ç¦æ¢ææ¬æ¢è¡ */ |
| | | text-overflow: ellipsis; |
| | | /* 使ç¨çç¥å·è¡¨ç¤ºè¢«æªæçææ¬ */ |
| | | overflow: hidden; |
| | | /* éèè¶
åºå®¹å¨çå
容 */ |
| | | } |
| | | |
| | | .form-items { |
| | | line-height: 34px; |
| | | /* display: flex; */ |
| | | /* align-items: center; */ |
| | | margin-left: 15%; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | |
| | | .form-item label { |
| | | min-width: 130px; |
| | | display: inline-block; |
| | | text-align: right; |
| | | margin-right: 20px; |
| | | color: #999; |
| | | } |
| | | |
| | | .form-item p { |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | display: -webkit-box; |
| | | -webkit-line-clamp: 3; |
| | | /* è¿éè®¾ç½®ä½ æ³è¦çè¡æ° */ |
| | | -webkit-box-orient: vertical; |
| | | } |
| | | |
| | | .btns { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .search_thing, |
| | | .check_thing { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | gap: 1rem; |
| | | } |
| | | |
| | | .search_label, |
| | | .check_label { |
| | | width: 120px; |
| | | } |
| | | |
| | | .search_input, |
| | | .check_data, |
| | | .check_input { |
| | | flex-grow: 1; |
| | | } |
| | | |
| | | .avatar-uploader .el-upload { |
| | | border: 1px dashed #190505; |
| | | border-radius: 6px; |
| | | cursor: pointer; |
| | | position: relative; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .avatar-uploader .el-upload:hover { |
| | | border-color: #409EFF; |
| | | } |
| | | |
| | | .avatar-uploader-icon { |
| | | font-size: 28px; |
| | | color: #8c939d; |
| | | width: 178px; |
| | | height: 178px; |
| | | line-height: 178px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .avatar { |
| | | width: 178px; |
| | | height: 178px; |
| | | display: block; |
| | | } |
| | | |
| | | .device-main { |
| | | width: 90%; |
| | | margin: 0px 5%; |
| | | height: 500px; |
| | | padding: 25px 0px; |
| | | background-color: #fff; |
| | | } |
| | | |
| | | .device-center { |
| | | width: 90%; |
| | | height: 490px; |
| | | margin: 0px 5%; |
| | | border-radius: 15px; |
| | | background-color: #fff; |
| | | overflow: hidden; |
| | | /* box-shadow: 3px 3px 8px 0 rgba(0, 0, 0, 0.3); */ |
| | | filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.3)) |
| | | } |
| | | |
| | | .device-title { |
| | | position: relative; |
| | | top: 20px; |
| | | z-index: 2; |
| | | font-size: clamp(1rem, 0.582rem + 1.59vw, 1.475rem); |
| | | font-weight: bold; |
| | | color: #4f6ab2; |
| | | width: 100%; |
| | | height: 90px; |
| | | line-height: 100px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .device-footer { |
| | | width: 100%; |
| | | height: 420px; |
| | | background-color: #3361d0; |
| | | position: relative |
| | | } |
| | | |
| | | .device-footer::after { |
| | | content: ""; |
| | | width: 100%; |
| | | height: 70px; |
| | | position: absolute; |
| | | top: -30px; |
| | | border-radius: 0 0 50% 50%; |
| | | background-color: #fff; |
| | | } |
| | | |
| | | .device-footer .qr-code { |
| | | width: 55%; |
| | | height: 200px; |
| | | position: relative; |
| | | top: 60px; |
| | | left: 22.5%; |
| | | background-color: #fff; |
| | | border-radius: 15px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .device-number { |
| | | width: 80%; |
| | | height: 20px; |
| | | margin-left: 20%; |
| | | position: relative; |
| | | top: 80px; |
| | | } |
| | | |
| | | .device-text { |
| | | color: #fff; |
| | | font-weight: bold; |
| | | font-size: 100%; |
| | | } |
| | | |
| | | .device-name { |
| | | width: 80%; |
| | | margin-left: 20%; |
| | | height: 20px; |
| | | position: relative; |
| | | top: 90px; |
| | | } |
| | | </style> |