spring
2025-02-18 5b0b688ff9f1bdf08ef651718708aa42d1b2477b
完成实验室能力档案搬迁
已修改3个文件
已添加2个文件
1070 ■■■■ 文件已修改
src/api/cnas/process/method/standardMethod.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/performance/class.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Table/lims-table.vue 309 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/standardMethod/index.vue 489 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/class/index.vue 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/process/method/standardMethod.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
import request from "@/utils/request";
//获取标准方法列表
export function selectStandardMethodList(query) {
  return request({
    url: "/standardMethod/selectStandardMethodList",
    method: "get",
    params: query,
  });
}
//删除标准方法
export function delStandardMethod(query) {
  return request({
    url: "/standardMethod/delStandardMethod",
    method: "delete",
    params: query,
  });
}
// æ·»åŠ æ ‡å‡†æ–¹æ³•
export function addStandardMethod(data) {
  return request({
    url: "/standardMethod/addStandardMethod",
    method: "post",
    data: data,
  });
}
// ä¿®æ”¹æ ‡å‡†æ–¹æ³•
export function upStandardMethod(data) {
  return request({
    url: "/standardMethod/upStandardMethod",
    method: "post",
    data: data,
  });
}
//获取产品架构
export function getStandardTree2(query) {
  return request({
    url: "/standardTree/getStandardTree2",
    method: "get",
    params: query,
  });
}
// å¯¼å…¥æ ‡å‡†æ˜Žç»†
export function importStandardDetails(data) {
  return request({
    url: "/standardMethod/importStandardDetails",
    method: "post",
    data: data,
  });
}
src/api/performance/class.js
@@ -90,10 +90,10 @@
  });
}
// èŽ·å–ç”¨æˆ·åˆ—è¡¨ (用于班次,工时)
export function selectUserList(query) {
// èŽ·å–ç”¨æˆ·åˆ—è¡¨
export function selectUserCondition(query) {
  return request({
    url: "/user/selectUserList",
    url: "/system/newUser/selectUserCondition",
    method: "get",
    params: query,
  });
src/components/Table/lims-table.vue
@@ -19,169 +19,166 @@
      @current-change="currentChange"
      @selection-change="handleSelectionChange"
    >
      <template v-if="isSelection">
        <el-table-column type="selection" width="55" />
      </template>
      <template>
        <el-table-column
          align="center"
          label="序号"
          type="index"
          width="60"
          :index="indexMethod"
        />
      </template>
      <el-table-column type="selection" width="55" v-if="isSelection" />
      <el-table-column
        align="center"
        label="序号"
        type="index"
        width="60"
        :index="indexMethod"
      />
      <template v-for="(item, index) in column">
        <el-table-column
          :column-key="item.columnKey"
          :filter-method="item.filterHandler"
          :filter-multiple="item.filterMultiple"
          :filtered-value="item.filteredValue"
          :filters="item.filters"
          :fixed="item.fixed"
          :label="item.label"
          :min-width="item.minWidth"
          :prop="item.prop"
          show-overflow-tooltip
          :sortable="item.sortable ? true : false"
          :type="item.type"
          :width="item.width"
          align="center"
      <el-table-column
        v-for="(item, index) in column"
        :key="index"
        :column-key="item.columnKey"
        :filter-method="item.filterHandler"
        :filter-multiple="item.filterMultiple"
        :filtered-value="item.filteredValue"
        :filters="item.filters"
        :fixed="item.fixed"
        :label="item.label"
        :min-width="item.minWidth"
        :prop="item.prop"
        show-overflow-tooltip
        :sortable="item.sortable ? true : false"
        :type="item.type"
        :width="item.width"
        align="center"
      >
        <!-- <div class="123" v-if="item.type == ''"> -->
        <template
          v-if="item.hasOwnProperty('colunmTemplate')"
          :slot="item.colunmTemplate"
          slot-scope="scope"
        >
          <!-- <div class="123" v-if="item.type == ''"> -->
          <template
            v-if="item.hasOwnProperty('colunmTemplate')"
            :slot="item.colunmTemplate"
            slot-scope="scope"
          >
          <slot
            v-if="item.theadSlot"
            :index="index"
            :name="item.theadSlot"
            :row="scope.row"
          />
        </template>
        <template slot-scope="scope">
          <!-- æ’æ§½ -->
          <div v-if="item.dataType == 'slot'">
            <slot
              v-if="item.theadSlot"
              :index="index"
              :name="item.theadSlot"
              v-if="item.slot"
              :index="scope.$index"
              :name="item.slot"
              :row="scope.row"
            />
          </template>
          </div>
          <!-- è¿›åº¦æ¡ -->
          <div v-else-if="item.dataType == 'progress'">
            <el-progress :percentage="Number(scope.row[item.prop])" />
          </div>
          <!-- å›¾ç‰‡ -->
          <div v-else-if="item.dataType == 'image'">
            <img
              :src="javaApi + '/img/' + item.prop"
              alt=""
              style="width: 40px; height: 40px; margin-top: 10px"
            />
          </div>
          <template slot-scope="scope">
            <!-- æ’æ§½ -->
            <div v-if="item.dataType == 'slot'">
              <slot
                v-if="item.slot"
                :index="scope.$index"
                :name="item.slot"
                :row="scope.row"
              />
            </div>
            <!-- è¿›åº¦æ¡ -->
            <div v-else-if="item.dataType == 'progress'">
              <el-progress :percentage="Number(scope.row[item.prop])" />
            </div>
            <!-- å›¾ç‰‡ -->
            <div v-else-if="item.dataType == 'image'">
              <img :src="javaApi+'/img/'+item.prop"
                   alt="" style="width: 40px;height: 40px;margin-top: 10px;">
            </div>
            <!-- tag -->
            <div v-else-if="item.dataType == 'tag'">
              <el-tag
                v-if="
                  typeof dataTypeFn(scope.row[item.prop], item.formatData) ==
                  'string'
                "
                :title="scope.row[item.prop] | formatters(item.formatData)"
                :type="formatType(scope.row[item.prop], item.formatType)"
                >{{
                  scope.row[item.prop] | formatters(item.formatData)
                }}</el-tag
              >
              <el-tag
                v-for="(tag, index) in dataTypeFn(
                  scope.row[item.prop],
                  item.formatData
                )"
                v-else-if="
                  typeof dataTypeFn(scope.row[item.prop], item.formatData) ==
                  'object'
                "
                :key="index"
                :title="scope.row[item.prop] | formatters(item.formatData)"
                :type="formatType(tag, item.formatType)"
                >{{
                  item.tagGroup
          <!-- tag -->
          <div v-else-if="item.dataType == 'tag'">
            <el-tag
              v-if="
                typeof dataTypeFn(scope.row[item.prop], item.formatData) ==
                'string'
              "
              :title="scope.row[item.prop] | formatters(item.formatData)"
              :type="formatType(scope.row[item.prop], item.formatType)"
              >{{ scope.row[item.prop] | formatters(item.formatData) }}</el-tag
            >
            <el-tag
              v-for="(tag, index) in dataTypeFn(
                scope.row[item.prop],
                item.formatData
              )"
              v-else-if="
                typeof dataTypeFn(scope.row[item.prop], item.formatData) ==
                'object'
              "
              :key="index"
              :title="scope.row[item.prop] | formatters(item.formatData)"
              :type="formatType(tag, item.formatType)"
              >{{
                item.tagGroup
                  ? tag[item.tagGroup.label]
                    ? tag[item.tagGroup.label]
                      ? tag[item.tagGroup.label]
                      : tag
                    : tag
                }}</el-tag
              >
              <el-tag
                v-else
                :title="scope.row[item.prop] | formatters(item.formatData)"
                :type="formatType(scope.row[item.prop], item.formatType)"
                >{{
                  scope.row[item.prop] | formatters(item.formatData)
                }}</el-tag
              >
            </div>
                  : tag
              }}</el-tag
            >
            <el-tag
              v-else
              :title="scope.row[item.prop] | formatters(item.formatData)"
              :type="formatType(scope.row[item.prop], item.formatType)"
              >{{ scope.row[item.prop] | formatters(item.formatData) }}</el-tag
            >
          </div>
            <!-- æŒ‰é’® -->
            <div v-else-if="item.dataType == 'action'">
              <template v-for="(o, key) in item.operation">
          <!-- æŒ‰é’® -->
          <div v-else-if="item.dataType == 'action'">
            <template v-for="(o, key) in item.operation">
              <el-button
                v-if="o.type != 'upload'"
                size="mini"
                v-show="o.showHide ? o.showHide(scope.row) : true"
                :disabled="o.disabled ? o.disabled(scope.row) : false"
                :icon="iconFn(o)"
                :plain="o.plain"
                :style="{ color: o.name === '删除' ? '#f56c6c' : o.color }"
                :type="o.type | typeFn(scope.row)"
                @click="o.clickFun(scope.row)"
                :key="key"
              >
                {{ o.name }}
              </el-button>
              <el-upload
                action="#"
                size="mini"
                :on-change="
                  (file, fileList) => o.clickFun(scope.row, file, fileList)
                "
                :multiple="o.multiple ? o.multiple : false"
                :limit="o.limit ? o.limit : 1"
                :disabled="o.disabled ? o.disabled(scope.row) : false"
                :accept="
                  o.accept
                    ? o.accept
                    : '.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar'
                "
                v-if="o.type == 'upload'"
                style="display: inline-block; width: 50px"
                v-show="o.showHide ? o.showHide(scope.row) : true"
                :auto-upload="false"
                :on-exceed="onExceed"
                :show-file-list="false"
                :key="key"
              >
                <el-button
                  v-if="o.type != 'upload'"
                  size="mini"
                  v-show="o.showHide ? o.showHide(scope.row) : true"
                  :size="o.size ? o.size : 'small'"
                  type="text"
                  :disabled="o.disabled ? o.disabled(scope.row) : false"
                  :icon="iconFn(o)"
                  :plain="o.plain"
                  :style="{ color: o.name === '删除' ? '#f56c6c' : o.color }"
                  :type="o.type | typeFn(scope.row)"
                  @click="o.clickFun(scope.row)"
                  >{{ o.name }}</el-button
                >
                  {{ o.name }}
                </el-button>
                <el-upload
                  action="#"
                  size="mini"
                  :on-change="
                    (file, fileList) => o.clickFun(scope.row, file, fileList)
                  "
                  :multiple="o.multiple ? o.multiple : false"
                  :limit="o.limit ? o.limit : 1"
                  :disabled="o.disabled ? o.disabled(scope.row) : false"
                  :accept="
                    o.accept
                      ? o.accept
                      : '.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar'
                  "
                  v-if="o.type == 'upload'"
                  style="display: inline-block; width: 50px"
                  v-show="o.showHide ? o.showHide(scope.row) : true"
                  :auto-upload="false"
                  :on-exceed="onExceed"
                  :show-file-list="false"
                >
                  <el-button
                    :size="o.size ? o.size : 'small'"
                    type="text"
                    :disabled="o.disabled ? o.disabled(scope.row) : false"
                    >{{ o.name }}</el-button
                  >
                </el-upload>
              </template>
            </div>
            <!-- é»˜è®¤çº¯å±•示数据 -->
            <div v-else>
              <span v-if="!item.formatData">{{ scope.row[item.prop] }}</span>
              <span v-else>{{
                scope.row[item.prop] | formatters(item.formatData)
              }}</span>
            </div>
          </template>
        </el-table-column>
      </template>
              </el-upload>
            </template>
          </div>
          <!-- é»˜è®¤çº¯å±•示数据 -->
          <div v-else class="cell" style="width: 100%">
            <span v-if="!item.formatData">{{ scope.row[item.prop] }}</span>
            <span v-else>{{
              scope.row[item.prop] | formatters(item.formatData)
            }}</span>
          </div>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="page.total > 0"
@@ -392,4 +389,14 @@
.el-table >>> .el-table__empty-text {
  text-align: center;
}
.cell {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  padding-right: 4px;
  padding-left: 4px;
}
>>> .cell {
  padding: 0 !important;
}
</style>
src/views/CNAS/process/method/standardMethod/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,489 @@
<style scoped>
.search {
  background-color: #fff;
  height: 80px;
  display: flex;
  align-items: center;
}
.search_thing {
  width: 350px;
  display: flex;
  align-items: center;
}
.search_label {
  width: 110px;
  font-size: 14px;
  text-align: right;
}
.search_input {
  width: calc(100% - 110px);
}
.table {
  margin-top: 10px;
  background-color: #fff;
  width: calc(100% - 40px);
  height: calc(100% - 60px - 80px - 10px - 40px);
  padding: 20px;
}
</style>
<template>
  <div class="standard_method">
    <div class="search">
      <div class="search_thing">
        <div class="search_label">标准编号:</div>
        <div class="search_input">
          <el-input
            size="small"
            placeholder="请输入"
            clearable
            v-model="queryParams.code"
            @keyup.enter.native="refreshTable()"
          ></el-input>
        </div>
      </div>
      <div class="search_thing">
        <div class="search_label">标准名称:</div>
        <div class="search_input">
          <el-input
            size="small"
            placeholder="请输入"
            clearable
            v-model="queryParams.name"
            @keyup.enter.native="refreshTable()"
          ></el-input>
        </div>
      </div>
      <div class="search_thing" style="padding-left: 30px">
        <el-button size="small" @click="refresh()">重 ç½®</el-button>
        <el-button size="small" type="primary" @click="refreshTable()"
          >查 è¯¢</el-button
        >
      </div>
      <div class="btn">
        <el-button
          size="small"
          @click="$refs.ValueTable.openUpload()"
          v-if="inPower"
        >
          <i class="el-icon-upload2" style="color: #3a7bfa"></i>
          <span style="color: #3a7bfa">导入</span></el-button
        >
        <el-button size="small" type="primary" @click="openAdd" v-if="addPower"
          >新增</el-button
        >
      </div>
    </div>
    <lims-table
      :tableData="tableData"
      :column="column"
      :page="page"
      :tableLoading="tableLoading"
      :height="'calc(100vh - 250px)'"
      style="padding: 20px; padding-top: 0"
      @pagination="pagination"
    ></lims-table>
    <!-- æ–°å¢ž/编辑 -->
    <el-dialog :title="title" :visible.sync="addDlog" width="500px">
      <el-form
        :model="addForm"
        ref="addForm"
        :rules="addRules"
        label-position="right"
        label-width="120px"
      >
        <el-form-item label="领域" prop="field">
          <el-input
            size="small"
            placeholder="请输入"
            clearable
            v-model="addForm.field"
          ></el-input>
        </el-form-item>
        <el-form-item label="标准编号" prop="code">
          <el-input
            size="small"
            placeholder="请输入"
            clearable
            v-model="addForm.code"
          >
          </el-input>
        </el-form-item>
        <el-form-item label="检验对象" prop="structureTestObjectId">
          <el-cascader
            size="small"
            :options="tandardTree"
            v-model="addForm.structureTestObjectId"
            collapse-tags
            :props="{ multiple: true, checkStrictly: true }"
            clearable
            style="width: 100%"
          ></el-cascader>
        </el-form-item>
        <el-form-item label="标准描述" prop="name">
          <el-input
            size="small"
            placeholder="请输入"
            clearable
            v-model="addForm.name"
          >
          </el-input>
        </el-form-item>
        <el-form-item label="标准描述EN" prop="nameEn">
          <el-input
            size="small"
            placeholder="请输入"
            clearable
            v-model="addForm.nameEn"
          >
          </el-input>
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input
            size="small"
            placeholder="请输入"
            clearable
            v-model="addForm.remark"
          >
          </el-input>
        </el-form-item>
        <el-form-item label="资质" prop="qualificationId">
          <el-select
            v-model="addForm.qualificationId"
            size="small"
            clearable
            placeholder="请选择"
            style="width: 100%"
          >
            <el-option
              v-for="item in qualificationList"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="是否产品标准" prop="isProduct">
          <el-select
            v-model="addForm.isProduct"
            size="small"
            clearable
            placeholder="请选择"
            style="width: 100%"
          >
            <el-option label="否" :value="0"> </el-option>
            <el-option label="是" :value="1"> </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="是否启用" prop="isUse">
          <el-select
            v-model="addForm.isUse"
            size="small"
            clearable
            placeholder="请选择"
            style="width: 100%"
          >
            <el-option label="否" :value="0"> </el-option>
            <el-option label="是" :value="1"> </el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDlog = false">取 æ¶ˆ</el-button>
        <el-button
          :loading="addLoading"
          type="primary"
          @click="submitProduct('addForm')"
          >ç¡® è®¤</el-button
        >
      </span>
    </el-dialog>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import {
  selectStandardMethodList,
  getStandardTree2,
  delStandardMethod,
  addStandardMethod,
  upStandardMethod,
} from "@/api/cnas/process/method/standardMethod";
export default {
  components: {
    limsTable,
  },
  data() {
    return {
      addPower: true,
      title: "新增",
      inPower: true,
      queryParams: {},
      tableData: [],
      column: [
        { label: "领域", prop: "field", width: "100px" },
        { label: "标准编号", prop: "code", width: "100px" },
        { label: "检验对象", prop: "structureTestObjectId", width: "140px" },
        { label: "标准描述", prop: "name", width: "100px" },
        { label: "标准描述EN", prop: "nameEn", width: "100px" },
        { label: "备注", prop: "remark" },
        { label: "资质", prop: "qualificationId" },
        {
          label: "是否产品标准",
          prop: "isProduct",
          width: "100px",
          dataType: "tag",
          formatData: (params) => {
            if (params == 0) {
              return "否";
            } else {
              return "是";
            }
          },
          formatType: (params) => {
            if (params == 0) {
              return "danger";
            } else {
              return "primary";
            }
          },
        },
        {
          label: "是否启用",
          prop: "isUse",
          formatData: (params) => {
            if (params == 0) {
              return "否";
            } else {
              return "是";
            }
          },
          formatType: (params) => {
            if (params == 0) {
              return "danger";
            } else {
              return "primary";
            }
          },
        },
        { label: "创建人", prop: "createUserName" },
        { label: "创建时间", prop: "createTime" },
        { label: "更新人", prop: "updateUserName" },
        { label: "更新时间", prop: "updateTime" },
        {
          dataType: "action",
          fixed: "right",
          label: "操作",
          width: "120px",
          operation: [
            {
              name: "编辑",
              type: "text",
              clickFun: (row) => {
                this.title = "编辑";
                this.addForm = row;
                this.addForm.structureTestObjectId = JSON.parse(
                  this.addForm.structureTestObjectId
                );
                this.addDlog = true;
              },
            },
            {
              name: "删除",
              type: "text",
              clickFun: (row) => {
                this.handleDelete(row);
              },
            },
          ],
        },
      ],
      page: {
        total: 0,
        size: 10,
        current: 1,
      },
      tableLoading: false,
      addForm: {},
      addDlog: false,
      addLoading: false,
      qualificationList: [],
      tandardTree: [],
      addRules: {
        code: [{ required: true, message: "请输入标准编号", trigger: "blur" }],
        name: [{ required: true, message: "请输入标准描述", trigger: "blur" }],
        nameEn: [
          { required: true, message: "请输入标准描述EN", trigger: "blur" },
        ],
        isProduct: [
          { required: true, message: "请选择是否产品标准", trigger: "change" },
        ],
        isUse: [
          { required: true, message: "请选择是否启用", trigger: "change" },
        ],
      },
    };
  },
  mounted() {
    this.getQualificationList();
    this.selectTestObjectByName();
    this.getList();
  },
  methods: {
    getList() {
      this.tableLoading = true;
      let param = { ...this.queryParams, ...this.page };
      delete param.total;
      selectStandardMethodList({ ...param })
        .then((res) => {
          this.tableLoading = false;
          if (res.code === 200) {
            this.tableData = res.data.records;
            this.page.total = res.data.total;
          }
        })
        .catch((err) => {
          this.tableLoading = false;
        });
    },
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.getList();
    },
    refreshTable() {
      this.page.current = 1;
      this.getList();
      this.selectTestObjectByName();
    },
    refresh() {
      this.selectTestObjectByName();
      this.page.current = 1;
      this.queryParams = {};
      this.getList();
    },
    // æƒé™åˆ†é…
    getPower() {
      let power = JSON.parse(sessionStorage.getItem("power"));
      let up = false;
      let del = false;
      let add = false;
      let inPower = false;
      for (var i = 0; i < power.length; i++) {
        if (power[i].menuMethod == "addStandardMethod") {
          add = true;
        }
        if (power[i].menuMethod == "delStandardMethod") {
          del = true;
        }
        if (power[i].menuMethod == "upStandardMethod") {
          up = true;
        }
        if (power[i].menuMethod == "importStandardDetails") {
          inPower = true;
        }
      }
      this.addPower = add;
      this.inPower = inPower;
    },
    openAdd() {
      this.title = "新增";
      this.addForm = {};
      this.addDlog = true;
    },
    getQualificationList() {
      this.getDicts("cnas_method_qualification").then((response) => {
        let arr = response.data.map((m) => {
          return {
            label: m.dictLabel,
            value: m.dictValue,
          };
        });
        this.qualificationList = arr;
      });
    },
    selectTestObjectByName() {
      getStandardTree2().then((res) => {
        res.data.forEach((a) => {
          this.cascaderFieldData(a);
        });
        this.tandardTree = res.data;
      });
    },
    cascaderFieldData(val) {
      if (val.children === undefined) {
        return;
      } else if (val.children.length == 0) {
        delete val.children;
      } else {
        val.children.forEach((a) => {
          this.cascaderFieldData(a);
        });
      }
    },
    submitProduct(formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          this.addLoading = true;
          let addForm = JSON.parse(JSON.stringify(this.addForm));
          addForm.structureTestObjectId = JSON.stringify(
            addForm.structureTestObjectId
          );
          if (this.title == "新增") {
            addStandardMethod(addForm)
              .then((res) => {
                this.addLoading = false;
                if (res.code != 200) {
                  return;
                }
                this.$message.success("提交成功");
                this.getList();
                this.addDlog = false;
              })
              .catch((err) => {
                this.addLoading = false;
              });
          } else {
            upStandardMethod(addForm)
              .then((res) => {
                this.addLoading = false;
                if (res.code != 200) {
                  return;
                }
                this.$message.success("提交成功");
                this.getList();
                this.addDlog = false;
              })
              .catch((err) => {
                this.addLoading = false;
              });
          }
        } else {
          return false;
        }
      });
    },
    handleDelete(row) {
      this.$confirm("是否删除该条数据?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          delStandardMethod({ id: row.id }).then((res) => {
            if (res.code == 201) return;
            this.$message.success("删除成功");
            this.getList();
          });
        })
        .catch(() => {});
    },
  },
};
</script>
src/views/performance/class/index.vue
@@ -67,15 +67,14 @@
        <el-button
          size="small"
          type="primary"
          v-if="listPower"
          v-if="checkPermi(['performance:class:time'])"
          @click="configTime"
          :loading="downLoading"
          >时间配置</el-button
        >
        <el-button
          size="small"
          type="primary"
          v-if="downPower"
          v-if="checkPermi(['performance:class:down'])"
          @click="handleDown"
          :loading="downLoading"
          >导 å‡º</el-button
@@ -84,7 +83,7 @@
          size="small"
          type="primary"
          @click="schedulingVisible = true"
          v-if="addPower"
          v-if="checkPermi(['performance:class:add'])"
          >排 ç­</el-button
        >
      </div>
@@ -106,9 +105,18 @@
            v-on:mouseenter="onMouseEnter(index)"
            v-on:mouseleave="currentUserIndex = null"
          >
            <div class="user-pic">{{ item.name.charAt(0) }}</div>
            <div class="user-pic">
              {{ item.name ? item.name.charAt(0) : "" }}
            </div>
            <div class="user-info">
              <p style="font-size: 14px; color: #3a7bfa; line-height: 24px">
              <p
                style="
                  font-size: 14px;
                  color: #3a7bfa;
                  line-height: 24px;
                  margin: 0;
                "
              >
                {{ item.name }}
              </p>
              <p
@@ -119,13 +127,14 @@
                  white-space: nowrap;
                  width: 150px;
                  overflow-x: show;
                  margin: 0;
                "
              >
                æ—©:{{ item.day0 }},中:{{ item.day1 }},夜:{{ item.day2 }},休:{{
                  item.day3
                }},假:{{ item.day4 }},å·®:{{ item.day6 }}
              </p>
              <p style="margin-top: 4px">
              <p style="margin-top: 4px; margin: 0">
                <span
                  style="
                    color: #999999;
@@ -158,7 +167,7 @@
              >
                <span
                  class="month"
                  style="position: absolute; top: 4px"
                  style="position: absolute; top: 0px"
                  v-if="item.week == '周日'"
                  >{{ item.weekNum }}周</span
                >
@@ -185,7 +194,7 @@
                  trigger="click"
                  placement="bottom"
                  @command="(e) => handleCommand(e, m)"
                  :disabled="!upPower"
                  :disabled="!checkPermi(['performance:class:edit'])"
                  style="width: 100%; height: 100%; cursor: pointer"
                >
                  <div
@@ -212,8 +221,8 @@
                    <el-dropdown-item
                      v-for="(n, j) in classType"
                      :key="'h' + j"
                      :command="n.value"
                      >{{ n.label }}</el-dropdown-item
                      :command="n.dictValue"
                      >{{ n.dictLabel }}</el-dropdown-item
                    >
                  </el-dropdown-menu>
                </el-dropdown>
@@ -242,9 +251,18 @@
            v-on:mouseenter="onMouseEnter(index)"
            v-on:mouseleave="currentUserIndex = null"
          >
            <div class="user-pic">{{ item.name.charAt(0) }}</div>
            <div class="user-pic">
              {{ item.name ? item.name.charAt(0) : "" }}
            </div>
            <div class="user-info">
              <p style="font-size: 14px; color: #3a7bfa; line-height: 24px">
              <p
                style="
                  font-size: 14px;
                  color: #3a7bfa;
                  line-height: 24px;
                  margin: 0;
                "
              >
                {{ item.name }}
              </p>
              <p
@@ -255,13 +273,14 @@
                  white-space: nowrap;
                  width: 150px;
                  overflow-x: show;
                  margin: 0;
                "
              >
                æ—©:{{ item.day0 }},中:{{ item.day1 }},夜:{{ item.day2 }},休:{{
                  item.day3
                }},假:{{ item.day4 }},å·®:{{ item.day6 }}
              </p>
              <p style="margin-top: 4px">
              <p style="margin-top: 4px; margin: 0">
                <span
                  style="
                    color: #999999;
@@ -358,9 +377,9 @@
                >
                  <el-option
                    v-for="obj in timeTypeList"
                    :key="obj.value"
                    :label="obj.label"
                    :value="obj.value"
                    :key="obj.dictValue"
                    :label="obj.dictLabel"
                    :value="obj.dictValue"
                  >
                  </el-option>
                </el-select>
@@ -492,9 +511,9 @@
          >
            <el-option
              v-for="item in classType"
              :key="item.value"
              :label="item.label"
              :value="item.value"
              :key="item.dictValue"
              :label="item.dictLabel"
              :value="item.dictValue"
            >
            </el-option>
          </el-select>
@@ -523,14 +542,11 @@
  exportFile,
  obtainItemParameterList,
  update,
  selectUserList,
  selectUserCondition,
} from "@/api/performance/class";
export default {
  data() {
    return {
      addPower: true,
      upPower: true,
      downPower: true,
      query: {
        userName: "",
        laboratory: "",
@@ -613,7 +629,6 @@
      configTimeVisibleLoading: false, // æ—¶é—´é…ç½®å¼¹æ¡†loading
      timeTypeList: [],
      timeQuery: [],
      listPower: false,
    };
  },
  watch: {
@@ -652,7 +667,7 @@
      this.monthList.push(i);
    }
    this.monthList.reverse();
    this.getPower();
    // this.getPower();
  },
  methods: {
    refresh() {
@@ -797,31 +812,6 @@
        });
      });
    },
    getPower() {
      let power = JSON.parse(sessionStorage.getItem("power"));
      let add = false;
      let up = false;
      let down = false;
      let listPower = false;
      for (var i = 0; i < power.length; i++) {
        if (power[i].menuMethod == "performanceShiftUpdate") {
          up = true;
        }
        if (power[i].menuMethod == "delDeviceParameter") {
          down = true;
        }
        if (power[i].menuMethod == "performanceShiftAdd") {
          add = true;
        }
        if (power[i].menuMethod == "shiftTimeList") {
          listPower = true;
        }
      }
      this.addPower = add;
      this.upPower = up;
      this.downPower = down;
      this.listPower = listPower;
    },
    onMouseEnter(index) {
      this.currentUserIndex = index;
    },
@@ -854,18 +844,22 @@
        endWeek,
        userId: this.schedulingQuery.userId.join(","),
        shift: this.schedulingQuery.shift,
      }).then((res) => {
        this.loading = false;
        if (res.code == 201) return;
        this.$message.success("操作成功");
        this.schedulingVisible = false;
        this.schedulingQuery = {
          week: "",
          userId: null,
          shift: "",
        };
        this.refresh();
      });
      })
        .then((res) => {
          this.loading = false;
          if (res.code == 201) return;
          this.$message.success("操作成功");
          this.schedulingVisible = false;
          this.schedulingQuery = {
            week: "",
            userId: null,
            shift: "",
          };
          this.refresh();
        })
        .catch((err) => {
          this.loading = false;
        });
    },
    configTime() {
      this.getDicts("sys_class_type").then((response) => {
@@ -883,10 +877,10 @@
            res.data.forEach((item) => {
              item.isEdit = false;
              const index = this.timeTypeList.findIndex(
                (val) => val.value === item.shift
                (val) => val.dictValue === item.shift
              );
              if (index > -1) {
                item.type = this.timeTypeList[index].label;
                item.type = this.timeTypeList[index].dictLabel;
              }
            });
            this.timeQuery = res.data;
@@ -909,10 +903,10 @@
    saveEdit(item, index) {
      if (item.shift) {
        const index = this.timeTypeList.findIndex(
          (val) => val.value === item.shift
          (val) => val.dictValue === item.shift
        );
        if (index > -1) {
          item.type = this.timeTypeList[index].label;
          item.type = this.timeTypeList[index].dictLabel;
        }
      }
      delete item.orderBy;
@@ -975,20 +969,24 @@
        userName: this.query.userName,
        laboratory: this.query.laboratory,
        isMonth: this.query.month ? true : false,
      }).then((res) => {
        this.$message.success("下载成功");
        this.downLoading = false;
        const blob = new Blob([res], {
          type: "application/force-download",
      })
        .then((res) => {
          this.$message.success("下载成功");
          this.downLoading = false;
          const blob = new Blob([res], {
            type: "application/force-download",
          });
          let fileName = "";
          if (this.query.month) {
            fileName = year + "-" + this.query.month + " ç­æ¬¡ä¿¡æ¯";
          } else {
            fileName = year + " ç­æ¬¡æ±‡æ€»";
          }
          this.$download.saveAs(blob, fileName + ".xlsx");
        })
        .catch((err) => {
          this.downLoading = false;
        });
        let fileName = "";
        if (this.query.month) {
          fileName = year + "-" + this.query.month + " ç­æ¬¡ä¿¡æ¯";
        } else {
          fileName = year + " ç­æ¬¡æ±‡æ€»";
        }
        this.$download.saveAs(blob, fileName + ".xlsx");
      });
    },
    selectEnumByCategory() {
      this.getDicts("sys_class_type").then((response) => {
@@ -1033,63 +1031,35 @@
      }
    },
    getUsers() {
      selectUserList({
        current: -1,
        size: -1,
      }).then((res) => {
      selectUserCondition().then((res) => {
        if (res.code === 201) {
          return;
        }
        let arr = res.data.body.records;
        let arr = res.data;
        this.personList = arr;
      });
    },
    getDayByDic(e) {
      let obj = this.classType.find((m) => m.label == e);
      let obj = this.classType.find((m) => m.dictLabel == e);
      if (obj) {
        return obj.value;
        return obj.dictValue;
      }
    },
    getShiftByDic(e) {
      let obj = this.classType.find((m) => m.value == e);
      let obj = this.classType.find((m) => m.dictValue == e);
      if (obj) {
        return obj.label;
        return obj.dictLabel;
      }
      return "无";
    },
    scrollInit() {
      // èŽ·å–è¦ç»‘å®šäº‹ä»¶çš„å…ƒç´ 
      const nav = document.getElementById("nav");
      var flag; // é¼ æ ‡æŒ‰ä¸‹
      var downX; // é¼ æ ‡ç‚¹å‡»çš„x下标
      var scrollLeft; // å½“前元素滚动条的偏移量
      nav.addEventListener("mousedown", function (event) {
        flag = true;
        downX = event.clientX; // èŽ·å–åˆ°ç‚¹å‡»çš„x下标
        scrollLeft = this.scrollLeft; // èŽ·å–å½“å‰å…ƒç´ æ»šåŠ¨æ¡çš„åç§»é‡
      });
      nav.addEventListener("mousemove", function (event) {
        if (flag) {
          // åˆ¤æ–­æ˜¯å¦æ˜¯é¼ æ ‡æŒ‰ä¸‹æ»šåŠ¨å…ƒç´ åŒºåŸŸ
          var moveX = event.clientX; // èŽ·å–ç§»åŠ¨çš„xè½´
          var scrollX = moveX - downX; // å½“前移动的x轴下标减去刚点击下去的x轴下标得到鼠标滑动距离
          this.scrollLeft = scrollLeft - scrollX; // é¼ æ ‡æŒ‰ä¸‹çš„æ»šåŠ¨æ¡åç§»é‡å‡åŽ»å½“å‰é¼ æ ‡çš„æ»‘åŠ¨è·ç¦»
        }
      });
      // é¼ æ ‡æŠ¬èµ·åœæ­¢æ‹–动
      nav.addEventListener("mouseup", function () {
        flag = false;
      });
      // é¼ æ ‡ç¦»å¼€å…ƒç´ åœæ­¢æ‹–动
      nav.addEventListener("mouseleave", function (event) {
        flag = false;
      });
    },
  },
};
</script>
<style scoped>
.class-page {
  padding: 10px;
}
.form_title {
  height: 36px;
  display: flex;
@@ -1127,7 +1097,7 @@
}
.center {
  width: 100%;
  height: calc(100% - 100px);
  height: calc(100vh - 220px);
  background-color: #fff;
  overflow-y: auto;
  display: flex;
@@ -1161,8 +1131,8 @@
  min-height: calc(100% - 10px); /* è§†å£é«˜åº¦ */
}
.content-title {
  height: 52px;
  line-height: 52px;
  height: 58px;
  line-height: 58px;
  border-bottom: 1px solid #eeeeee;
}
.content-title-right {
@@ -1194,6 +1164,7 @@
.content-title-item .day {
  font-size: 14px;
  color: #333333;
  margin-right: 4px;
}
.content-title-item .week {
  font-size: 12px;