spring
2025-03-07 91912f7cd43992092a49eb539534472a123ea705
搬迁量值溯源计划
已添加3个文件
已修改1个文件
496 ■■■■■ 文件已修改
src/api/cnas/resourceDemand/quantityTraceabilityPlan.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/AppMain.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/resourceDemand/quantityTraceabilityPlan/components/formDia.vue 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/resourceDemand/quantityTraceabilityPlan/index.vue 304 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/resourceDemand/quantityTraceabilityPlan.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
import request from "@/utils/request";
// é‡å€¼æº¯æºè®¡åˆ’ å¯¼å‡º
export function exportOfValueTraceabilityPlan(query) {
  return request({
    url: "/feCalibrationSchedule/exportOfValueTraceabilityPlan",
    method: "get",
    params: query,
    responseType: "blob",
  });
}
//量值溯源计划查询
export function getPageCalibrationSchedule(query) {
  return request({
    url: "/feCalibrationSchedule/getPageCalibrationSchedule",
    method: "get",
    params: query,
  });
}
//删除量值溯源计划
export function removeCalibrationSchedule(query) {
  return request({
    url: "/feCalibrationSchedule/removeCalibrationSchedule",
    method: "delete",
    params: query,
  });
}
// é‡å€¼æº¯æºè®¡åˆ’新增编辑
export function addCalibrationSchedule(data) {
  return request({
    url: "/feCalibrationSchedule/addCalibrationSchedule",
    method: "post",
    data: data,
  });
}
src/layout/components/AppMain.vue
@@ -50,10 +50,10 @@
  width: 100%;
  position: relative;
  overflow: hidden;
  background: rgb(245, 247, 251);
  // background: rgb(245, 247, 251);
}
.fixed-header + .app-main {
.fixed-header+.app-main {
  padding-top: 50px;
}
@@ -63,7 +63,7 @@
    min-height: calc(100vh - 94px);
  }
  .fixed-header + .app-main {
  .fixed-header+.app-main {
    padding-top: 84px;
  }
}
src/views/CNAS/resourceDemand/quantityTraceabilityPlan/components/formDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
<template>
  <div>
    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
      :visible.sync="formDia" title="量值溯源计划" width="80%" @close="closeFormDia">
      <el-form ref="form" :model="form" :rules="rules" label-position="right" label-width="auto">
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="仪器名称" prop="instrumentName">
              <el-input v-model="form.instrumentName" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="规格型号" prop="model">
              <el-input v-model="form.model" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="管理编号" prop="managementNumber">
              <el-input v-model="form.managementNumber" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="技术指标" prop="technicalIndicators">
              <el-input v-model="form.technicalIndicators" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="检定周期" prop="verificationCyde">
              <el-input v-model="form.verificationCyde" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="检定单位" prop="verificationUnit">
              <el-input v-model="form.verificationUnit" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="最近检定日期" prop="recentlyTime">
              <el-date-picker v-model="form.recentlyTime" clearable format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期"
                size="small" style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss">
              </el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="计划下次检定日期" prop="nextTime">
              <el-date-picker v-model="form.nextTime" clearable format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期"
                size="small" style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss">
              </el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="备注" prop="remark">
              <el-input v-model="form.remark" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="closeFormDia">取 æ¶ˆ</el-button>
        <el-button :loading="loading" type="primary" @click="handleEdit">提 äº¤</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import {
  addCalibrationSchedule,
} from '@/api/cnas/resourceDemand/quantityTraceabilityPlan.js'
export default {
  name: "formDia",
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      formDia: false,
      diaLoading: false,
      loading: false,
      form: {
        instrumentName: '',
        model: '',
        managementNumber: '',
        technicalIndicators: '',
        verificationCyde: '',
        verificationUnit: '',
        recentlyTime: '',
        nextTime: '',
        remark: '',
        id: '',
      },
      rules: {
        instrumentName: [{ required: true, message: '请填写仪器名称', trigger: 'blur' }],
        model: [{ required: true, message: '请填写规格型号', trigger: 'blur' }],
        managementNumber: [{ required: true, message: '请填写管理编号', trigger: 'blur' }],
        technicalIndicators: [{ required: true, message: '请填写技术指标', trigger: 'blur' }],
        verificationCyde: [{ required: true, message: '请填写检定周期', trigger: 'blur' }],
        verificationUnit: [{ required: true, message: '请填写检定单位', trigger: 'blur' }],
        recentlyTime: [{ required: true, message: '请选择最近检定日期', trigger: 'change' }],
        nextTime: [{ required: true, message: '请选择计划下次检定日期', trigger: 'change' }],
      },
      operationType: '',
    }
  },
  mounted() {
  },
  // æ–¹æ³•集合
  methods: {
    // æ‰“开弹框
    openDia(type, row) {
      this.formDia = true
      this.operationType = type
      if (type !== 'add') {
        this.form = row
      }
    },
    // æäº¤å¼¹æ¡†æ•°æ®
    handleEdit() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          this.loading = true
          const internalReport = this.HaveJson(this.form)
          addCalibrationSchedule(internalReport).then(res => {
            this.loading = false
            if (res.code === 201) return
            this.$message.success('操作成功')
            this.closeFormDia()
          }).catch(err => {
            console.log('err---', err);
            this.loading = false
          })
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    closeFormDia() {
      this.$refs.form.resetFields();
      this.formDia = false
      this.$emit('closeFormDia')
    },
  },
}
</script>
<style scoped></style>
src/views/CNAS/resourceDemand/quantityTraceabilityPlan/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,304 @@
<template>
  <div>
    <div>
      <div class="search-background">
        <span class="search-group">
          <span style="width: 120px">仪器名称:</span>
          <el-input v-model="searchForm.instrumentName" clearable size="small"></el-input>
        </span>
        <span class="search-group">
          <span style="width: 120px">管理编号:</span>
          <el-input v-model="searchForm.managementNumber" clearable size="small"></el-input>
        </span>
        <span class="search-group">
          <el-button size="medium" @click="resetSearchForm">重 ç½®</el-button>
          <el-button size="medium" type="primary" @click="searchList">查 è¯¢</el-button>
        </span>
        <div class="btn">
          <el-button size="medium" @click="exportFun">导 å‡º</el-button>
          <el-button size="medium" @click="uploadDia = true">导 å…¥</el-button>
          <el-button size="medium" type="primary" @click="openFormDia('add')">新 å¢ž</el-button>
        </div>
      </div>
      <div class="table">
        <div>
          <TableCard :showForm="false" :showTitle="false">
            <template v-slot:table>
              <limsTable :column="tableColumn" :height="'calc(100vh - 17em)'" :table-data="tableData"
                :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" :page="page"
                @pagination="pagination">
              </limsTable>
            </template>
          </TableCard>
        </div>
      </div>
    </div>
    <form-dia v-if="formDia" ref="formDia" @closeFormDia="closeFormDia"></form-dia>
    <el-dialog :visible.sync="uploadDia" title="数据导入" width="500px">
      <div style="margin: 0 auto;">
        <el-upload ref="upload" :action="javaApi + '/feCalibrationSchedule/importOfValueTraceabilityPlan'"
          :auto-upload="false" :before-upload="beforeUpload" :file-list="fileList" :headers="uploadHeader" :limit="1"
          :on-error="onError" :on-success="onSuccess" accept=".xlsx" drag name="file">
          <i class="el-icon-upload"></i>
          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        </el-upload>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="uploadDia = false">取 æ¶ˆ</el-button>
        <el-button :loading="uploading" type="primary" @click="submitUpload()">上 ä¼ </el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import TableCard from '@/components/TableCard/index.vue';
import limsTable from "@/components/Table/lims-table.vue";
import FormDia from './components/formDia.vue';
import {
  exportOfValueTraceabilityPlan,
  getPageCalibrationSchedule,
  removeCalibrationSchedule,
} from '@/api/cnas/resourceDemand/quantityTraceabilityPlan.js'
export default {
  name: 'a6-quantity-value-traceability-plan',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { FormDia, limsTable, TableCard },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      outLoading: false,
      searchForm: {
        instrumentName: '',
        managementNumber: '',
      },
      tableColumn: [
        {
          label: '仪器名称',
          prop: 'instrumentName',
          minWidth: '120'
        },
        {
          label: '规格型号',
          prop: 'model',
          minWidth: '100'
        },
        {
          label: '管理编号',
          prop: 'managementNumber',
          minWidth: '100'
        },
        {
          label: '技术指标',
          prop: 'technicalIndicators',
          minWidth: '100'
        },
        {
          label: '检定周期',
          prop: 'verificationCyde',
          minWidth: '100'
        },
        {
          label: '检定单位',
          prop: 'verificationUnit',
          minWidth: '100'
        },
        {
          label: '最近检定日期',
          prop: 'recentlyTime',
          minWidth: '100'
        },
        {
          label: '计划下次检定日期',
          prop: 'nextTime',
          minWidth: '100'
        },
        {
          label: '备注',
          prop: 'remark',
          minWidth: '100'
        },
        {
          dataType: 'action',
          fixed: 'right',
          minWidth: '180',
          label: '操作',
          operation: [
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('edit', row);
              },
            },
            {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.delPlan(row)
              },
            }
          ]
        }
      ],
      tableData: [],
      tableLoading: false,
      uploadDia: false,
      uploading: false,
      page: {
        size: 20,
        current: 1,
        total: 0,
      },
      formDia: false,
      fileList: [],
    };
  },
  mounted() {
    this.searchList()
  },
  // æ–¹æ³•集合
  methods: {
    beforeUpload(file, fileList) {
      if (file.type != 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
        this.$message.error('上传文件格式不正确');
        this.$refs.upload.clearFiles()
        return false;
      }
    },
    submitUpload() {
      if (this.$refs.upload.uploadFiles.length == 0) {
        this.$message.error('未选择文件')
        return
      }
      this.uploading = true
      this.$refs.upload.submit();
      this.uploading = false
    },
    onError(err, file, fileList) {
      this.$message.error('上传失败')
      this.$refs.upload.clearFiles()
      this.uploading = false
    },
    onSuccess(response, file, fileList) {
      this.$refs.upload.clearFiles()
      this.uploadDia = false
      this.uploading = false
      if (response.code == 201) {
        this.$message.error(response.message)
        return
      }
      this.$message.success('上传成功')
      this.standardList = []
      this.productList = []
      this.searchList()
    },
    // å¯¼å‡º
    exportFun() {
      this.outLoading = true
      exportOfValueTraceabilityPlan({
        instrumentName: this.searchForm.instrumentName,
        managementNumber: this.searchForm.managementNumber,
      }).then(res => {
        this.outLoading = false
        const blob = new Blob([res], { type: 'application/octet-stream' });
        this.$download.saveAs(blob, '量值溯源计划.xlsx')
      }).finally(() => {
        this.outLoading = false
      })
    },
    // æŸ¥è¯¢åˆ—表
    searchList() {
      this.tableLoading = true
      getPageCalibrationSchedule({
        ...this.searchForm,
        ...this.page
      }).then(res => {
        this.tableLoading = false
        if (res.code === 201) return
        this.tableData = res.data.records
        this.page.total = res.data.total
      }).catch(err => {
        console.log('err---', err);
        this.tableLoading = false
      })
    },
    // åˆ é™¤
    delPlan(row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.tableLoading = true
        removeCalibrationSchedule({ id: row.id }).then(res => {
          this.tableLoading = false
          if (res.code === 201) return
          this.$message.success('删除成功')
          this.searchList()
        }).catch(err => {
          this.tableLoading = false
          console.log('err---', err);
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    // é‡ç½®æŸ¥è¯¢æ¡ä»¶
    resetSearchForm() {
      this.searchForm.instrumentName = '';
      this.searchForm.managementNumber = '';
      this.searchList()
    },
    // æ–°å¢žï¼Œç¼–辑,批准弹框
    openFormDia(type, row) {
      this.formDia = true
      this.$nextTick(() => {
        this.$refs.formDia.openDia(type, row)
      })
    },
    closeFormDia() {
      this.formDia = false
      this.searchList()
    },
    // åˆ†é¡µ
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.searchList();
    },
  }
};
</script>
<style scoped>
.search-background {
  width: 100%;
  height: 80px;
  line-height: 80px;
  background-color: #ffffff;
  display: flex;
  position: relative;
}
.search-group {
  display: flex;
  align-items: center;
  margin: 0 20px;
}
.table {
  background-color: #ffffff;
}
.btn {
  position: absolute;
  right: 20px;
  top: 16px;
}
</style>