licp
2024-12-20 c9400e3754eeccfa0cce5cb3584f5adede360263
完成量值溯源计划迁移
已修改2个文件
已添加2个文件
521 ■■■■■ 文件已修改
src/assets/api/controller.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/do/a6-quantity-value-traceability-plan/formDia.vue 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/a6-quantity-value-traceability-plan.vue 323 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/js/menu.js 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/api/controller.js
@@ -67,6 +67,7 @@
    facilitiesAndEnvironment,
    internalWastes,
    foreignRegister,
    feCalibrationSchedule,
  }
}
@@ -890,3 +891,12 @@
  delForeignRegister: '/foreignRegister/delForeignRegister', // å¤–来人员删除
  exportForeignRegister: '/foreignRegister/exportForeignRegister', // å¯¼å‡ºå¤–来人员
}
// 6.5量值溯源计划
const feCalibrationSchedule = {
  getPageCalibrationSchedule:'/feCalibrationSchedule/getPageCalibrationSchedule',// é‡å€¼æº¯æºè®¡åˆ’查询
  addCalibrationSchedule:'/feCalibrationSchedule/addCalibrationSchedule',//量值溯源计划新增编辑
  removeCalibrationSchedule:'/feCalibrationSchedule/removeCalibrationSchedule',//删除量值溯源计划
  exportOfValueTraceabilityPlan: '/feCalibrationSchedule/exportOfValueTraceabilityPlan', // é‡å€¼æº¯æºè®¡åˆ’ å¯¼å‡º
  importOfValueTraceabilityPlan: '/feCalibrationSchedule/importOfValueTraceabilityPlan', // é‡å€¼æº¯æºè®¡åˆ’ å¯¼å…¥
}
src/components/do/a6-quantity-value-traceability-plan/formDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,162 @@
<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>
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)
          this.$axios.post(this.$api.feCalibrationSchedule.addCalibrationSchedule, internalReport, {
            headers: {
              "Content-Type": "application/json"
            },
            noQs: true
          }).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/components/view/a6-quantity-value-traceability-plan.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,323 @@
<template>
  <div>
    <div>
      <div class="view-title">
        <span>量值溯源计划</span>
        <span>
          <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>
        </span>
      </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>
      <div class="table">
        <div>
          <TableCard :showForm="false" :showTitle="false">
            <template v-slot:table>
              <ZTTable
                :column="tableColumn"
                :height="'calc(100vh - 23em)'"
                :table-data="tableData"
                :table-loading="tableLoading"
                style="padding: 0 15px;margin-bottom: 16px">
              </ZTTable>
            </template>
          </TableCard>
          <el-pagination :current-page="1" :page-size="page.size" :page-sizes="[10, 20, 30, 50, 100]"
                         :total="total" layout="->,total, sizes, prev, pager, next, jumper"
                         @size-change="handleSizeChange"
                         @current-change="handleCurrentChange">
          </el-pagination>
        </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 + $api.feCalibrationSchedule.importOfValueTraceabilityPlan" :auto-upload="false" :before-upload="beforeUpload" :file-list="fileList" :headers="token"
                   :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 '../caorui/TableCard/index.vue';
import ZTTable from '../caorui/ZTTable/index.vue';
import FormDia from '../do/a6-quantity-value-traceability-plan/formDia.vue';
export default {
  name: 'a6-quantity-value-traceability-plan',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { FormDia, ZTTable, 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: [],
      token: ""
    };
  },
  mounted() {
    this.token = {
      'token': sessionStorage.getItem('token')
    }
    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
      this.$axios.post(this.$api.feCalibrationSchedule.exportOfValueTraceabilityPlan, {
        instrumentName: this.searchForm.instrumentName
      }, {responseType: "blob"}).then(res => {
        this.outLoading = false
        this.$message.success('导出成功')
        const blob = new Blob([res], {type: 'application/octet-stream'});
        const url = URL.createObjectURL(blob);
        const link = document.createElement('a');
        link.href = url;
        link.download = '量值溯源计划.xlsx';
        link.click();
      }).finally(() => {
        this.outLoading = false
      })
    },
    // æŸ¥è¯¢åˆ—表
    searchList () {
      this.tableLoading = true
      this.$axios.get(this.$api.feCalibrationSchedule.getPageCalibrationSchedule + '?instrumentName=' + this.searchForm.instrumentName
        + '&managementNumber=' + this.searchForm.managementNumber
        + '&pages=' + this.page.current + '&size=' + this.page.size).then(res => {
        this.tableLoading = false
        if (res.code === 201) return
        this.tableData = res.data.records
        this.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
        this.$axios.get(this.$api.feCalibrationSchedule.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()
    },
    // åˆ†é¡µ
    handleSizeChange(val) {
      this.page.size = val;
      this.searchList();
    },
    handleCurrentChange(val) {
      this.page.current = val;
      this.searchList();
    },
  }
};
</script>
<style scoped>
.view-title {
  display: flex;
  justify-content: space-between;
  align-items: center;
  height: 60px;
  padding-left: 20px;
}
.search-background {
  width: 100%;
  height: 80px;
  line-height: 80px;
  background-color: #ffffff;
  display: flex;
}
.search-group {
  display: flex;
  align-items: center;
  margin: 0 20px;
}
.table {
  margin-top: 20px;
  background-color: #ffffff;
  padding-top: 20px;
}
</style>
static/js/menu.js
@@ -370,19 +370,19 @@
            g: "6.6 å¤–部提供的产品和服务",
            p: ""
        },
    {
            v: "设备总览",
            i: "font icon-erjidaohang",
            u: "a6-device-overview",
            g: "6.4 è®¾å¤‡",
            p: "selectDeviceParameter"
        }, {
            v: "设备工具明细",
            i: "font icon-erjidaohang",
            u: "a6-device-management",
            g: "6.4 è®¾å¤‡",
            p: "selectDeviceParameter"
        },
    // {
        //     v: "设备总览",
        //     i: "font icon-erjidaohang",
        //     u: "a6-device-overview",
        //     g: "6.4 è®¾å¤‡",
        //     p: "selectDeviceParameter"
        // }, {
        //     v: "设备工具明细",
        //     i: "font icon-erjidaohang",
        //     u: "a6-device-management",
        //     g: "6.4 è®¾å¤‡",
        //     p: "selectDeviceParameter"
        // },
    {
            v: "标准物质清单",
            i: "font icon-erjidaohang",