lxp
2025-03-18 ee38779810cfbe512788f71679aaaaa7fedb1775
表格合并以及权限添加
已修改14个文件
623 ■■■■■ 文件已修改
src/components/Table/lims-table.vue 259 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/bulletinBoard/tasksShow/index.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/costStatistics/index.vue 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/inspectionTask/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/reportPreparation/index.vue 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/reportPreparation/onlyoffice.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/sample/index.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/unPass/index.vue 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/class/index.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/manHour/index.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/manHour/work-time-config.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/manHour/work-time-management.vue 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/manHour/work-time-statistics.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/staffEvaluate/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Table/lims-table.vue
@@ -1,31 +1,85 @@
<template>
  <div>
    <!-- 表格 -->
    <el-table ref="multipleTable" v-loading="tableLoading" element-loading-text="加载中..."
      element-loading-spinner="el-icon-loading" :border="border" :data="tableData"
      :header-cell-style="{ background: '#f8f8f9', color: '#515a6e' }" :height="height"
      :highlight-current-row="highlightCurrentRow" :row-class-name="rowClassName" :row-style="rowStyle"
      :row-key="rowKey" :span-method="spanMethod" :stripe="stripe" style="width: 100%" tooltip-effect="dark"
      @row-click="rowClick" @current-change="currentChange" @selection-change="handleSelectionChange"
      class="lims-table">
      <el-table-column align="center" type="selection" width="55" v-if="isSelection" />
      <el-table-column align="center" label="序号" type="index" width="60" :index="indexMethod" />
    <el-table
      ref="multipleTable"
      v-loading="tableLoading"
      element-loading-text="加载中..."
      element-loading-spinner="el-icon-loading"
      :border="border"
      :data="tableData"
      :header-cell-style="{ background: '#f8f8f9', color: '#515a6e' }"
      :height="height"
      :highlight-current-row="highlightCurrentRow"
      :row-class-name="rowClassName"
      :row-style="rowStyle"
      :row-key="rowKey"
      :span-method="finalSpanMethod"
      :stripe="stripe"
      style="width: 100%"
      tooltip-effect="dark"
      @row-click="rowClick"
      @current-change="currentChange"
      @selection-change="handleSelectionChange"
      class="lims-table"
    >
      <el-table-column
        align="center"
        type="selection"
        width="55"
        v-if="isSelection"
      />
      <el-table-column
        align="center"
        label="序号"
        type="index"
        width="60"
        :index="indexMethod"
      />
      <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="item.dataType === 'action' || item.dataType === 'slot' ? false : true
          " :sortable="item.sortable ? true : false" :type="item.type" align="center"
        :width="item.dataType == 'action' ? btnWidth : item.width">
      <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="
          item.dataType === 'action' || item.dataType === 'slot' ? false : true
        "
        :sortable="item.sortable ? true : false"
        :type="item.type"
        align="center"
        :width="item.dataType == 'action' ? btnWidth : item.width"
      >
        <!-- <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
          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.slot" :index="scope.$index" :name="item.slot" :row="scope.row" />
            <slot
              v-if="item.slot"
              :index="scope.$index"
              :name="item.slot"
              :row="scope.row"
            />
          </div>
          <!-- 进度条 -->
          <div v-else-if="item.dataType == 'progress'">
@@ -33,73 +87,141 @@
          </div>
          <!-- 图片 -->
          <div v-else-if="item.dataType == 'image'">
            <img :src="javaApi + '/img/' + scope.row[item.prop]" alt=""
              style="width: 40px; height: 40px; margin-top: 10px" />
            <img
              :src="javaApi + '/img/' + scope.row[item.prop]"
              alt=""
              style="width: 40px; height: 40px; margin-top: 10px"
            />
          </div>
          <!-- tag -->
          <div v-else-if="item.dataType == 'tag'">
            <el-tag v-if="
            <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(
              "
              :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="
              )"
              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)">{{
              "
              :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
                  : 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>
              }}</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'" :style="`width:${getWidth(item.operation, scope.row)}`">
          <div
            v-else-if="item.dataType == 'action'"
            :style="`width:${getWidth(item.operation, scope.row)}`"
          >
            <template v-for="(o, key) in item.operation">
              <el-button v-show="o.type != 'upload'" size="mini" v-if="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">
              <el-button
                v-show="o.type != 'upload'"
                size="mini"
                v-if="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="javaApi + o.url" size="mini" ref="upload" :multiple="o.multiple ? o.multiple : false"
                :disabled="o.disabled ? o.disabled(scope.row) : false" :accept="o.accept
              <el-upload
                :action="javaApi + o.url"
                size="mini"
                ref="upload"
                :multiple="o.multiple ? o.multiple : false"
                :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' && o.url" style="display: inline-block; width: 50px"
                :data="o.data ? o.data(scope.row) : {}" :before-upload="o.beforeUpload ? o.beforeUpload(scope.row) : () => true
                  " v-show="o.showHide ? o.showHide(scope.row) : true" :headers="uploadHeader" :on-error="onError"
                :on-exceed="onExceed" :on-success="handleSuccessUp" :show-file-list="false" :key="key">
                <el-button :size="o.size ? o.size : 'small'" type="text"
                  :disabled="o.disabled ? o.disabled(scope.row) : false">{{ o.name }}</el-button>
                "
                v-if="o.type == 'upload' && o.url"
                style="display: inline-block; width: 50px"
                :data="o.data ? o.data(scope.row) : {}"
                :before-upload="
                  o.beforeUpload ? o.beforeUpload(scope.row) : () => true
                "
                v-show="o.showHide ? o.showHide(scope.row) : true"
                :headers="uploadHeader"
                :on-error="onError"
                :on-exceed="onExceed"
                :on-success="handleSuccessUp"
                :show-file-list="false"
                :key="key"
              >
                <el-button
                  :size="o.size ? o.size : 'small'"
                  type="text"
                  :disabled="o.disabled ? o.disabled(scope.row) : false"
                  >{{ o.name }}</el-button
                >
              </el-upload>
              <el-upload action="#" :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
              <el-upload
                action="#"
                :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' && !o.url" 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 :size="o.size ? o.size : 'small'" type="text"
                  :disabled="o.disabled ? o.disabled(scope.row) : false">{{ o.name }}</el-button>
                "
                v-if="o.type == 'upload' && !o.url"
                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
                  :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-if="item.dataType == 'link'" class="cell" style="width: 100%"
            @click="goLink(scope.row, item.linkEvent)">
          <div
            v-else-if="item.dataType == 'link'"
            class="cell"
            style="width: 100%"
            @click="goLink(scope.row, item.linkEvent)"
          >
            <span class="link" v-if="!item.formatData">
              {{ scope.row[item.prop] }}
            </span>
@@ -114,8 +236,16 @@
        </template>
      </el-table-column>
    </el-table>
    <pagination v-if="page" v-show="page.total > 0" :total="page.total" :layout="page.layout" :page.sync="page.current"
      :limit.sync="page.size" @pagination="pagination" style="background-color: #fff" />
    <pagination
      v-if="page"
      v-show="page.total > 0"
      :total="page.total"
      :layout="page.layout"
      :page.sync="page.current"
      :limit.sync="page.size"
      @pagination="pagination"
      style="background-color: #fff"
    />
  </div>
</template>
@@ -189,6 +319,10 @@
    },
  },
  props: {
    parentSpanMethod: {
      type: Function,
      default: () => {},
    },
    isSelection: {
      type: Boolean,
      default: undefined,
@@ -289,6 +423,17 @@
      this.$refs.multipleTable.doLayout();
    });
  },
  computed: {
    finalSpanMethod() {
      if(this.parentSpanMethod) {
        console.log('父组件的合并方法');
        return this.parentSpanMethod;
      }else{
        console.log('子组件的合并方法');
        return this.spanMethod;
      }
    },
  },
  mounted() {
    this.calculateSpanInfo();
  },
src/views/bulletinBoard/tasksShow/index.vue
@@ -116,7 +116,7 @@
        border
        :data="tableData"
        style="width: 100%"
        :height="tableHeight"
        :height="tableHeight+''"
        :header-cell-style="{ textAlign: 'center' }"
        :cell-style="{ textAlign: 'center' }"
      >
@@ -228,7 +228,7 @@
        <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="page.currentPage"
          :current-page="page.current"
          :page-sizes="[20, 40, 60, 80, 100]"
          :page-size="20"
          layout="total, sizes, prev, pager, next, jumper"
@@ -257,11 +257,11 @@
      intervalId: null,
      total: 0,
      page: {
        currentPage: 1,
        pageSize: 20,
        current: 1,
        size: 20,
      },
      tableData: [],
      tableHeight: 0,
      tableHeight: "",
    };
  },
  watch: {
@@ -320,12 +320,7 @@
  methods: {
    //动态获取表格高度
    handlerResize() {
      let viewHeight = window.innerHeight;
      let titleHeight = 60;
      let headMenuHeight = 90;
      let pageHeight = 42;
      this.tableHeight =
        viewHeight - titleHeight - headMenuHeight - pageHeight - 120;
      this.tableHeight = window.innerHeight - 50 - 46 - 60 - 80  - 30 - 30 - 32;
    },
    // 关闭
    close() {
@@ -373,20 +368,20 @@
      this.getTableData();
    },
    handleSizeChange(val) {
      this.page.pageSize = val;
      this.page.size = val;
      this.getTableData();
      console.log(`每页 ${val} 条`);
    },
    handleCurrentChange(val) {
      this.page.currentPage = val;
      this.page.current = val;
      this.getTableData();
      console.log(`当前页: ${val}`);
    },
    getTableData() {
      this.loading = true;
      let data = {
        currentPage: this.page.currentPage,
        pageSize: this.page.pageSize,
        current: this.page.current,
        size: this.page.size,
        sonLaboratory: this.sonLaboratory,
      };
        tasksShow(data).then((res) => {
src/views/business/costStatistics/index.vue
@@ -1,4 +1,8 @@
<style scoped>
.costStatistics {
  width: 100%;
  height: 100%;
}
.title {
  height: 60px;
  line-height: 60px;
@@ -49,15 +53,20 @@
</style>
<template>
  <div class="inspection_order">
    <div style="width: 100%; height: 100%">
  <div>
    <div class="costStatistics bg-1">
      <div>
        <el-row class="title">
          <el-col :span="12" style="padding-left: 20px; text-align: left"
            >费用统计</el-col
          >
          <el-col :span="12" style="text-align: right">
            <el-button size="small" type="primary">OA推送</el-button>
            <el-button
              size="small"
              type="primary"
              v-hasPermi="['business:costStatistics:OA']"
              >OA推送</el-button
            >
          </el-col>
        </el-row>
      </div>
@@ -83,8 +92,6 @@
        <div class="search_thing" style="width: 340px">
          <div class="search_label">委托单位:</div>
          <div class="search_input">
            <!--            <el-input size="small" placeholder="请输入" clearable-->
            <!--               @keyup.enter.native="refreshTable()"></el-input>-->
            <el-select
              @focus="getCompanyOptions"
              @change="refreshTable()"
@@ -109,7 +116,6 @@
            >查 询</el-button
          >
        </div>
        <!-- <div class="search_thing" style="padding-left: 70px;">总价:{{total}}</div> -->
        <div class="search_thing" style="margin-left: 50px">
          <div style="width: 100%; text-align: right">总价:</div>
          <el-statistic
@@ -125,24 +131,18 @@
            type="primary"
            @click="handleDown"
            :loading="outLoading"
            v-hasPermi="['business:costStatistics:export']"
            >导出</el-button
          >
        </div>
      </div>
      <div class="table">
        <!-- <ValueTable
          ref="ValueTable"
          :url="$api.insOrder.costStatistics"
          :componentData="componentData"
          :key="upIndex"
          @handleWeave="handleWeave"
          :column-min-width="'140'"
        /> -->
        <lims-table
          :tableData="tableData"
          :parentSpanMethod="spanMethod"
          :column="column"
          :tableLoading="tableLoading"
          :height="'calc(100vh - 270px)'"
          :height="tableHeight"
          :page="page"
          @pagination="pagination"
        ></lims-table>
@@ -178,6 +178,7 @@
  },
  data() {
    return {
      tableHeight: "",
      tableData: [],
      column: [
        {
@@ -237,12 +238,48 @@
      outLoading: false,
    };
  },
  created() {
    this.getTableHeight();
  },
  mounted() {
    this.getDates();
    this.refreshTable();
    this.entityCopy = this.HaveJson(this.entity);
  },
  methods: {
    // 合并单元格
    spanMethod({row, column, rowIndex, columnIndex}) {
      // 委托单号相同的进行一个列合并
      const mergeColumns = [1,2,8,9]
      if (
        mergeColumns.includes(columnIndex)
      ) {
        // 如果是第一行, 或者上一行数据的委托单号和当前行的委托单号不一样
        if (
          rowIndex == 0 ||
          row.entrustCode != this.tableData[rowIndex - 1].entrustCode
        ) {
          // 计算需要合并的行数
          let rowspan = 1;
          while (
            rowIndex + rowspan < this.tableData.length &&
            row.entrustCode == this.tableData[rowIndex + rowspan].entrustCode
          ) {
            rowspan++;
          }
          return [rowspan, 1];
        } else {
          return [0, 0];
        }
      } else {
        // 其他列不合并
        return [1, 1];
      }
    },
    getTableHeight() {
      const windowHeight = window.innerHeight;
      this.tableHeight = windowHeight - 50 - 46 - 60 - 80 - 60 - 32 + "";
    },
    getData() {
      this.tableLoading = true;
      let params = { ...this.page, ...this.entity };
@@ -252,15 +289,15 @@
        this.tableLoading = false;
      });
    },
    pagination({ cutPage, size }) {
      this.page.current = cutPage;
      this.page.size = size;
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.refreshTable();
    },
    handleDown() {
      let data = {
        company: this.entity.company ? this.entity.company : '',
        company: this.entity.company ? this.entity.company : "",
        startTime: this.dates[0],
        endTime: this.dates[1],
      };
src/views/business/inspectionTask/index.vue
@@ -414,7 +414,7 @@
              border
              ref="showResultTable"
              v-loading="loadingTable"
              :height="tableHeight"
              :height="tableHeight+''"
              element-loading-text="加载中"
              element-loading-spinner="el-icon-loading"
              element-loading-background="rgba(255, 255, 255, 1)"
src/views/business/reportPreparation/index.vue
@@ -1,4 +1,9 @@
<style scoped>
.reportPreparation {
  width: 100%;
  height: 100%;
}
.title {
  height: 60px;
  line-height: 60px;
@@ -15,7 +20,7 @@
  display: flex;
  align-items: center;
  height: 50px;
  width: 230px;
  width: 210px;
}
.search_label {
@@ -65,8 +70,8 @@
</style>
<template>
  <div class="inspection_order">
    <div style="width: 100%; height: 100%">
  <div>
    <div class="reportPreparation bg-1">
      <div>
        <el-row class="title">
          <el-col :span="12" style="padding-left: 20px; text-align: left"
@@ -196,6 +201,7 @@
                :icon="!more ? 'el-icon-arrow-down' : 'el-icon-arrow-up'"
                style="color: #3a7bfa"
                @click="more = !more"
                v-hasPermi="['bbusiness:reportPreparation:more']"
                >{{ !more ? "更多" : "收起" }}</el-button
              >
              <div class="search_thing" style="padding-left: 20px">
@@ -224,31 +230,31 @@
                      <el-dropdown-item
                        icon="el-icon-download"
                        command="batchDownload"
                        v-hasPermi="['business:reportPreparation:batchDownload']"
                        >批量下载</el-dropdown-item
                      >
                      <el-dropdown-item
                        icon="el-icon-upload"
                        command="batchUpload"
                         v-hasPermi="['business:reportPreparation:batchUpload']"
                        >批量上传</el-dropdown-item
                      >
                      <el-dropdown-item
                        icon="el-icon-s-check"
                        command="oneClickApproval"
                         v-hasPermi="['business:reportPreparation:oneClickApproval']"
                        >一键审批</el-dropdown-item
                      >
                      <el-dropdown-item
                        icon="el-icon-setting"
                        command="approvalConfig"
                         v-hasPermi="['business:reportPreparation:signatureConfiguration']"
                        >审批签名配置</el-dropdown-item
                      >
                    </el-dropdown-menu>
                  </el-dropdown>
                </template>
              </div>
              <!-- <div class="btns">
              <el-button size="small" type="primary" @click="handleDowns" :loading="outLoading" style="margin-right: 16px;">批量下载</el-button>
              <el-button size="small" type="primary" @click="openBatchUploadDia()" :loading="inLoading">批量上传</el-button>
            </div> -->
            </div>
          </el-col>
        </el-row>
@@ -290,7 +296,7 @@
          :tableData="tableData"
          :column="column"
          :tableLoading="tableLoading"
          :height="'calc(100vh - 270px)'"
          :height="tableHeight+''"
          :page="page"
          @pagination="pagination"
        ></lims-table>
@@ -312,13 +318,6 @@
          style="cursor: pointer; font-size: 18px"
          @click="fullscreen = true"
        ></i>
        <!-- <img
          v-else
          alt=""
          src="../../../static/img/no-full.svg"
          style="cursor: pointer"
          @click="fullscreen = false"
        /> -->
      </div>
      <div v-if="viewIssuedVisible" style="height: 80vh">
        <onlyoffice
@@ -342,13 +341,6 @@
          @click="fullscreen = true"
          v-if="!fullscreen"
        ></i>
        <!-- <img
          src="../../../static/img/no-full.svg"
          alt=""
          v-else
          style="cursor: pointer"
          @click="fullscreen = false"
        /> -->
      </div>
      <Word
        style="height: 70vh"
@@ -377,13 +369,6 @@
          @click="fullscreen = true"
          v-if="!fullscreen"
        ></i>
        <!-- <img
          src="../../../static/img/no-full.svg"
          alt=""
          v-else
          style="cursor: pointer"
          @click="fullscreen = false"
        /> -->
      </div>
      <div style="height: 75vh" v-if="issuedVisible">
        <onlyoffice
@@ -448,13 +433,6 @@
          @click="fullscreen = true"
          v-if="!fullscreen"
        ></i>
        <!-- <img
          src="../../../static/img/no-full.svg"
          alt=""
          v-else
          style="cursor: pointer"
          @click="fullscreen = false"
        /> -->
      </div>
      <div style="height: 75vh" v-if="approveVisible">
        <onlyoffice
@@ -513,18 +491,6 @@
      top="5vh"
    >
      <div>
        <!-- <el-upload
            class="upload-demo"
            :action="action"
            :headers="headers"
            :show-file-list="false"
            accept=".doc,.docx"
            :limit="1"
            :before-upload="beforeUpload"
            :on-success="handleSuccess"
            ref="upload"
            :on-error="onError">
          </el-upload> -->
        <el-upload
          ref="upload"
          class="upload-demo custom-upload"
@@ -834,6 +800,8 @@
import { getToken } from "@/utils/auth";
import auth from "@/plugins/auth.js";
export default {
  components: {
    limsTable,
@@ -841,6 +809,7 @@
  },
  data() {
    return {
      tableHeight: "",
      tagField: {
        isUpload: {
          select: [
@@ -1092,12 +1061,18 @@
              disabled: (row) => {
                return row.isExamine != -9;
              },
              showHide: () => {
                return auth.hasPermi("business:reportPreparation:establishment");
              },
            },
            {
              name: "下载",
              type: "text",
              clickFun: (row) => {
                this.download(row);
              },
              showHide: () => {
                return auth.hasPermi("business:reportPreparation:download");
              },
            },
            {
@@ -1115,6 +1090,9 @@
              disabled: (row) => {
                return row.isExamine != -9;
              },
              showHide: () => {
                return auth.hasPermi("business:reportPreparation:upload");
              },
            },
            {
              name: "还原",
@@ -1125,6 +1103,9 @@
              disabled: (row) => {
                return row.isExamine != -9;
              },
              showHide: () => {
                return auth.hasPermi("business:reportPreparation:restore");
              },
            },
            {
              name: "提交",
@@ -1134,6 +1115,9 @@
              },
              disabled: (row) => {
                return row.state != 0;
              },
              showHide: () => {
                return auth.hasPermi("business:reportPreparation:submit");
              },
            },
            {
@@ -1146,6 +1130,9 @@
                return (
                  row.state == null || row.state == 0 || row.isExamine == 1
                );
              },
              showHide: () => {
                return auth.hasPermi("business:reportPreparation:examine");
              },
            },
            {
@@ -1163,6 +1150,9 @@
                  row.isRatify == 1
                );
              },
              showHide: () => {
                return auth.hasPermi("business:reportPreparation:approve");
              },
            },
            {
              name: "撤回",
@@ -1172,6 +1162,9 @@
              },
              disabled: (row) => {
                return row.state == 1;
              },
              showHide: () => {
                return auth.hasPermi("business:reportPreparation:withdraw");
              },
            },
          ],
@@ -1244,6 +1237,11 @@
    this.entityCopy = this.HaveJson(this.entity);
    this.getList();
    this.getReportCountInfo();
    this.getTableHeight();
    window.addEventListener('resize', this.calculateTableHeight); // 监听窗口大小变化
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.calculateTableHeight); // 移除监听
  },
  watch: {
    batchUploadDia(newVal) {
@@ -1281,6 +1279,12 @@
    },
  },
  methods: {
    // 获取表格高度
    getTableHeight() {
      const windowHeight =   window.innerHeight; // 浏览器窗口高度
      this.tableHeight = windowHeight - 60 - 80 - 46 - 50 - 32 - 44 -30 - 30;
      console.log('this.tableHeight',this.tableHeight);
    },
    // 返回分页值
    pagination({ page, limit }) {
      this.page.current = page;
src/views/business/reportPreparation/onlyoffice.vue
@@ -187,14 +187,13 @@
  body {
    height: 100%;
  }
  #app {
  /* #app {
    font-family: Avenir, Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
    height: 100%;
  }
  } */
  .qualityManual-container {
    padding: 0 !important;
    height: 100%;
src/views/business/sample/index.vue
@@ -168,8 +168,8 @@
        <el-row class="title">
          <el-col :span="12" style="padding-left: 20px;text-align: left;">样品管理</el-col>
          <el-col :span="12" style="text-align: right;">
            <el-button size="small" type="primary" @click="storageVisible=true">入库</el-button>
            <el-button size="small" type="primary" @click="exportVisible=true">出库</el-button>
            <el-button size="small" type="primary" @click="storageVisible=true"  v-hasPermi="['business:sample:store']">入库</el-button>
            <el-button size="small" type="primary" @click="exportVisible=true"  v-hasPermi="['business:sample:outbound']">出库</el-button>
          </el-col>
        </el-row>
      </div>
@@ -200,15 +200,11 @@
            </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="btns">
          <el-button size="small" style="color:#3A7BFA" @click="keepVisible=true">维护</el-button>
          <el-button size="small" style="color:#3A7BFA" @click="warehouseVisible=true,isEdit=false">添加仓库</el-button>
          <el-button size="small" style="color:#3A7BFA" @click="keepVisible=true"  v-hasPermi="['business:sample:maintenance']">维护</el-button>
          <el-button size="small" style="color:#3A7BFA" @click="warehouseVisible=true,isEdit=false"  v-hasPermi="['business:sample:addWarehouse']">添加仓库</el-button>
          <el-button size="small" style="color:#3A7BFA" @click="shelvesVisible=true,isEdit=false"
            :disabled="entity.warehouseId==null">添加货架</el-button>
            :disabled="entity.warehouseId==null"  v-hasPermi="['business:sample:addGoodsShelves']">添加货架</el-button>
        </div>
      </div>
      <div class="table" v-loading="tableLoading">
src/views/business/unPass/index.vue
@@ -33,7 +33,7 @@
}
</style>
<template>
  <div class="below-standard-main">
  <div class="below-standard-main bg-1">
    <div style="width: 100%; height: 100%">
      <div>
        <el-row class="title">
@@ -79,7 +79,8 @@
          :tableData="tableData"
          :column="column"
          :tableLoading="tableLoading"
          :height="'calc(100vh - 270px)'"
          :parentSpanMethod="spanMethod"
          :height="tableHeight+''"
          :page="page"
          @pagination="pagination"
        ></lims-table>
@@ -157,12 +158,39 @@
    this.entityCopy = this.HaveJson(this.entity);
    this.refreshTable();
  },
  created() {
    this.getTableHeight();
  },
  methods: {
    // 表格合并
    spanMethod({row,column,rowIndex,columnIndex}) {
      // 需要合并的列
      const needSpan = [1]
      if(needSpan.includes(columnIndex)) {
        // 如果是第一行 或者 当前行的值和上一行的值不一样 就要开始进行计算合并
        if(rowIndex == 0 || row.entrustCode != this.tableData[rowIndex -1 ].entrustCode) {
          // 向下找到和当前行不一样的行数
          let rowSpan = 1;
          while(rowIndex + rowSpan < this.tableData.length && row.entrustCode == this.tableData[rowIndex + rowSpan].entrustCode) {
            rowSpan++
          }
          return [rowSpan,1]
        }else {
          // 如果和上一行的值一样 就隐藏
          return [0,0]
        }
      }else{
        return [1,1]
      }
    },
    getTableHeight() {
      this.tableHeight = window.innerHeight - 50 - 46 - 60 - 80 - 30 - 30 - 32;
    },
    getData() {
      this.tableLoading = true;
      pageInsUnPass({
        current: this.page.current,
        limit: this.page.size,
        size: this.page.size,
        model: this.entity.model,
        sample: this.entity.sample,
      }).then((res) => {
@@ -171,8 +199,8 @@
        this.page.total = res.data.total;
      });
    },
    pagination({current,limit}) {
      this.page.current = current;
    pagination({page,limit}) {
      this.page.current = page;
      this.page.size = limit;
      this.getData();
    },
src/views/performance/class/index.vue
@@ -1,5 +1,5 @@
<template>
  <div class="class-page">
  <div class="classHour bg-1">
    <div class="search">
      <div class="search_thing">
        <div class="search_label">选择时间:</div>
@@ -70,6 +70,7 @@
          size="small"
          type="primary"
          @click="configTime"
           v-hasPermi="['performance:class:time']"
          >时间配置</el-button
        >
        <el-button
@@ -78,6 +79,7 @@
          size="small"
          type="primary"
          @click="handleDown"
           v-hasPermi="['performance:class:down']"
          >导 出</el-button
        >
        <el-button
@@ -85,6 +87,7 @@
          size="small"
          type="primary"
          @click="schedulingVisible = true"
           v-hasPermi="['performance:class:add']"
          >排 班</el-button
        >
      </div>
@@ -1068,6 +1071,10 @@
</script>
  
  <style scoped>
  .classHour{
    width: 100%;
    height: 100%;
  }
.form_title {
  height: 36px;
  display: flex;
src/views/performance/manHour/index.vue
@@ -2,13 +2,13 @@
  <div class="work-time-management bg-1">
    <div style="text-align: left">
      <el-radio-group v-model="currentComponent" size="small" style="margin-top: 16px;margin-bottom: 16px;">
        <el-radio-button label="workTimeStatistics">
        <el-radio-button label="workTimeStatistics"  v-hasPermi="['performance:manHour:workTimeStatistics']">
          工时统计
        </el-radio-button>
        <el-radio-button label="workTimeManagement" >
        <el-radio-button label="workTimeManagement" v-hasPermi="['performance:manHour:workTimeManagement']">
          日工时管理
        </el-radio-button>
        <el-radio-button label="workTimeConfig">
        <el-radio-button label="workTimeConfig" v-hasPermi="['performance:manHour:workTimeConfig']">
          辅助工时配置
        </el-radio-button>
      </el-radio-group>
src/views/performance/manHour/work-time-config.vue
@@ -54,18 +54,16 @@
        type="primary"
        style="position: absolute; right: 50px"
        @click="openAdd()"
         v-hasPermi="['performance:manHour:workTimeConfig:add']"
        >新 增</el-button
      >
    </div>
    <div class="table">
      <!-- <ValueTable ref="ValueTable0"
                  :url="$api.auxiliaryWorkingHours.selectAuxiliaryWorkingHours" :upUrl="$api.auxiliaryWorkingHours.upAuxiliaryWorkingHours"
                  :delUrl="$api.auxiliaryWorkingHours.deleteAuxiliaryWorkingHours" :componentData="componentData" :key="upIndex" /> -->
      <lims-table
        :tableData="tableData"
        :column="column"
        :tableLoading="tableLoading"
        :height="'calc(100vh - 270px)'"
        :height="tableHeight"
        :page="page"
        @pagination="pagination"
      ></lims-table>
@@ -172,6 +170,8 @@
} from "../../../api/business/manHour";
import { getYearAndMonthAndDays } from "../../../utils/date";
import auth from "@/plugins/auth.js";
import { getDicts } from "@/api/system/dict/data";
import { number } from "echarts";
export default {
@@ -180,6 +180,7 @@
  },
  data() {
    return {
      tableHeight: "",
      rules: {
        number: [{ required: true, message: "请输入编号", trigger: "blur" }],
        auxiliaryProject: [
@@ -273,12 +274,18 @@
              clickFun: (row) => {
                this.openAdd(row);
              },
              showHide: (row) => {
                return auth.hasPermi("performance:manHour:workTimeConfig:edit");
              },
            },
            {
              name: "删除",
              type: "text",
              clickFun: (row) => {
                this.del(row);
              },
              showHide: (row) => {
                return auth.hasPermi("performance:manHour:workTimeConfig:del");
              },
            },
          ],
@@ -302,7 +309,9 @@
      addPower: true,
    };
  },
  created() {},
  created() {
    this.getTableHeight();
  },
  mounted() {
    this.entityCopy = this.HaveJson(this.entity);
    this.obtainItemParameterList();
@@ -310,6 +319,9 @@
    this.getData();
  },
  methods: {
    getTableHeight() {
      this.tableHeight = window.innerHeight -50 -46 - 63 - 80 - 41 -30 -30 -32 + '';
    },
    getData() {
      this.tableLoading = true;
      this.page.total = 0;
src/views/performance/manHour/work-time-management.vue
@@ -124,6 +124,7 @@
          type="primary"
          @click="openAdd"
          v-show="currentTable == 'ValueTable0'"
           v-hasPermi="['performance:manHour:workTimeManagement:enterData']"
          >录入数据</el-button
        >
        <el-button
@@ -131,6 +132,7 @@
          type="primary"
          @click="handleOut"
          :loading="outLoading"
          v-hasPermi="['performance:manHour:workTimeManagement:export']"
          >导 出</el-button
        >
        <el-button
@@ -138,6 +140,7 @@
          type="primary"
          v-show="currentTable == 'ValueTable0'"
          @click="openBatchCheck(0)"
          v-hasPermi="['performance:manHour:workTimeManagement:batchExamine']"
          >批量审核</el-button
        >
        <el-button
@@ -145,6 +148,7 @@
          type="primary"
          v-show="currentTable == 'ValueTable0'"
          @click="openBatchCheck(1)"
          v-hasPermi="['performance:manHour:workTimeManagement:batchApprove']"
          >批量批准</el-button
        >
      </div>
@@ -158,7 +162,7 @@
        :column="column"
        :key="upIndex"
        :tableLoading="tableLoading"
        :height="'calc(100vh - 270px)'"
        :height="tableHeight+''"
        :page="page"
        @pagination="pagination"
      ></lims-table>
@@ -169,7 +173,7 @@
        :column="column1"
        :key="upIndex1"
        :tableLoading="tableLoading1"
        :height="'calc(100vh - 270px)'"
        :height="tableHeight+''"
        :page="page1"
        @pagination="pagination1"
      ></lims-table>
@@ -477,6 +481,8 @@
} from "../../../api/business/manHour";
import { getYearAndMonthAndDays } from "../../../utils/date";
import auth from "@/plugins/auth.js";
import { getDicts } from "@/api/system/dict/data";
import Big from "big.js";
export default {
@@ -485,6 +491,7 @@
  },
  data() {
    return {
      tableHeight: "",
        shiftList:[],
      tableData: [],
      column: [
@@ -597,6 +604,9 @@
              clickFun: (row) => {
                this.del(row);
              },
              showHide: () => {
                return auth.hasPermi('performance:manHour:workTimeManagement:del');
              }
            },
            {
              name: "编辑",
@@ -604,6 +614,9 @@
              clickFun: (row) => {
                this.handleEdit(row);
              },
              showHide: () => {
                return auth.hasPermi('performance:manHour:workTimeManagement:edit');
              }
            },
            {
              name: "审核",
@@ -611,6 +624,9 @@
              clickFun: (row) => {
                this.handleCheck(row);
              },
              showHide: () => {
                return auth.hasPermi('performance:manHour:workTimeManagement:examine');
              }
            },
            {
              name: "批准",
@@ -618,6 +634,9 @@
              clickFun: (row) => {
                this.handleRatify(row);
              },
              showHide: () => {
                return auth.hasPermi('performance:manHour:workTimeManagement:approve');
              }
            },
          ],
        },
@@ -840,6 +859,7 @@
    //当只有产量工时tab页时,当前页改为产量工时页
    this.selectEnumByCategory();
    this.setDate();
    this.getTableHeight();
  },
  mounted() {
    console.log(11);
@@ -849,6 +869,9 @@
    this.entityCopy1 = this.HaveJson(this.entity);
  },
  methods: {
    getTableHeight() {
      this.tableHeight = window.innerHeight -50 -46 - 63 - 80 - 41 -30 -30 -32;
    },
    del(row) {
      console.log(row);
      this.$confirm("此操作将永久删除, 是否继续?", "提示", {
@@ -889,8 +912,8 @@
        console.log('产量工时');
        this.tableLoading1 = true;
        let params = {
            current: this.page.current,
            size: this.page.size,
            current: this.page1.current,
            size: this.page1.size,
            dateTime1: this.entity.dateTime[0],
            dateTime2: this.entity.dateTime[1],
            week: this.entity.week,
@@ -906,13 +929,13 @@
          });
      }
    },
    pagination({ current, limit }) {
      this.page.current = current;
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.getData();
    },
    pagination1({ current, limit }) {
      this.page1.current = current;
    pagination1({ page, limit }) {
      this.page1.current = page;
      this.page1.size = limit;
      this.getData();
    },
src/views/performance/manHour/work-time-statistics.vue
@@ -95,24 +95,13 @@
      </el-radio-group>
    </div>
    <div class="table">
      <!-- <ValueTable ref="ValueTable0"
          v-if="currentTable == 'value0' && isPermission('selectAuxiliaryOriginalHours')" :isColumnWidth="true"
                    :isShowZero="true"
                  :url="$api.auxiliaryOriginalHours.selectAuxiliaryOriginalHours"
                  :componentData="componentData" :key="upIndex" />
        <ValueTable ref="ValueTable1" :isShowZero="true"
          v-if="currentTable == 'value1' && isPermission('selectAuxiliaryCorrectionHours')" :isColumnWidth="true"
                  :url="$api.auxiliaryCorrectionHours.selectAuxiliaryCorrectionHours"
          :inputUrl="$api.auxiliaryCorrectionHours.upload"
                  :componentData="componentData0"
          :key="upIndex1" /> -->
      <lims-table
        v-if="currentTable == 'value0'"
        :tableData="tableData"
        :column="column"
        :key="upIndex"
        :tableLoading="tableLoading"
        :height="'calc(100vh - 270px)'"
        :height="tableHeight+''"
        :page="page"
        @pagination="pagination"
      ></lims-table>
@@ -123,7 +112,7 @@
        :column="column1"
        :key="upIndex1"
        :tableLoading="tableLoading1"
        :height="'calc(100vh - 270px)'"
        :height="tableHeight+''"
        :page="page1"
        @pagination="pagination1"
      ></lims-table>
@@ -151,6 +140,7 @@
  computed: {},
  data() {
    return {
      tableHeight: "",
      column: [
        {
          label: "姓名",
@@ -468,7 +458,9 @@
      outLoading: false,
    };
  },
  created() {},
  created() {
    this.getTableHeight();
  },
  mounted() {
    this.entityCopy = this.HaveJson(this.entity);
    this.entityCopy0 = this.HaveJson(this.entity);
@@ -480,6 +472,9 @@
    },
  },
  methods: {
    getTableHeight() {
      this.tableHeight = window.innerHeight -50 -46 - 63 - 80 - 41 -30 -30 -32;
    },
    getData() {
        if (this.currentTable == "value0") {
            console.log('value0');
@@ -505,13 +500,13 @@
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.getList();
      this.getData();
    },
   // 返回分页值
   pagination1({ page, limit }) {
      this.page1.current = page;
      this.page1.size = limit;
      this.getList();
      this.getData();
    },
    refresh() {
      this.entity = {
src/views/performance/staffEvaluate/index.vue
@@ -42,7 +42,7 @@
        <el-radio-button v-hasPermi="['staffEvaluate:leaderRate:list']" label="leaderRate">组长评分</el-radio-button>
        <el-radio-button v-hasPermi="['staffEvaluate:supervisorRate:list']" label="supervisorRate">主管打分</el-radio-button>
      </el-radio-group>
      <el-button :loading="outLoading" size="small" type="primary" @click="handleDown">导 出</el-button>
      <el-button :loading="outLoading" size="small" type="primary" @click="handleDown"  v-hasPermi="['staffEvaluate:evaluation:export']">导 出</el-button>
    </div>
    </basicContainer>