spring
2025-03-04 648520268c8878cd839e8560dc67af2c6e4d97cd
src/components/Table/value-table.vue
@@ -49,14 +49,18 @@
  .handleBtn.is-disabled {
    color: #C0C4CC;
  }
  .red{
    color: red !important;
  }
  >>>.el-loading-parent--relative {
    z-index: 1 !important;
  }
  >>> .el-table__body-wrapper::-webkit-scrollbar {
    height: 14px; /* 设置滚动条宽度 */
  height: 14px;
  /* 设置滚动条宽度 */
  }
</style>
<style>
@@ -104,30 +108,34 @@
    align-items: center;
    justify-content: center;
  }
  .el-table__empty-text{
    text-align: left;
    width: 100%;
    display: inline-block;
    margin-left: 200px;
  }
</style>
<template>
  <div class="value-table">
    <div :style="data.isPage!=undefined&&data.isPage!=true?'height:100%':''" class="table">
      <el-table :key="specialKey" ref="eltable" v-loading="loading" :current-row-key="data.currentId" :data="tableData" :highlight-current-row="data.highlight===undefined||data.highlight"
        :row-class-name="tableRowClassName" :row-key="record=>record[rowKey]" :show-summary="data.countFleid!=undefined && data.countFleid.length > 0" :span-method="spanMethod"
        :summary-method="getSummaries"
        height="100%" style="width: 100%;" tooltip-effect="dark"
        @select="select" @selection-change="selectChange"
        @sort-change="sortChange" @row-click="rowClick">
      <el-table :key="specialKey" ref="eltable" v-loading="loading" :current-row-key="data.currentId" :data="tableData"
        :highlight-current-row="data.highlight === undefined || data.highlight" :row-class-name="tableRowClassName"
        :row-key="record => record[rowKey]" :show-summary="data.countFleid != undefined && data.countFleid.length > 0"
        :span-method="spanMethod" :summary-method="getSummaries" height="100%" style="width: 100%;"
        tooltip-effect="dark" @select="select" @selection-change="selectChange" @sort-change="sortChange"
        @row-click="rowClick">
        <el-table-column v-if="data.showSelect" :key="Math.random()" :width="selectionWidth" type="selection">
        </el-table-column>
        <el-table-column v-if="data.isIndex" :key="Math.random()" :width="selectionWidth" align="center" label="序号" type="index">
        <el-table-column v-if="data.isIndex" :key="Math.random()" :width="selectionWidth" align="center" label="序号"
          type="index">
        </el-table-column>
        <el-table-column v-for="(a, ai) in tableHead" v-if="!data.headNoShow||(data.headNoShow&&data.headNoShow.length==0)||(data.headNoShow&&data.headNoShow.length>0&&!data.headNoShow.find(d=>d==a.label))" :key="ai+'bbbbb'" :isColumnWidth="isColumnWidth" :isShowZero="isShowZero"
          :label="a.value" :min-width="columnMinWidth" :prop="a.label" :sortable="a.sort === 'custom' ? 'custom' : false" show-overflow-tooltip>
        <el-table-column v-for="(a, ai) in tableHead"
          v-if="!data.headNoShow || (data.headNoShow && data.headNoShow.length == 0) || (data.headNoShow && data.headNoShow.length > 0 && !data.headNoShow.find(d => d == a.label))"
          :key="ai + 'bbbbb'" :isColumnWidth="isColumnWidth" :isShowZero="isShowZero" :label="a.value"
          :min-width="columnMinWidth" :prop="a.label" :sortable="a.sort === 'custom' ? 'custom' : false"
          show-overflow-tooltip>
          <template slot-scope="scope">
            <div v-if="showType(a.label, data.tagField) != null">
              <template v-if="typeof(scope.row[a.label]) == 'object'">
@@ -137,29 +145,28 @@
                </template>
              </template>
              <template v-else>
                <el-tag v-for="(b, bi) in data.tagField[a.label].select" v-show="b.value == scope.row[a.label]" :key="bi+'ddddd'"
                  :type="b.type" size="medium">{{b.label}}</el-tag>
                <el-tag v-for="(b, bi) in data.tagField[a.label].select" v-show="b.value == scope.row[a.label]"
                  :key="bi + 'ddddd'" :type="b.type" size="medium">{{ b.label }}</el-tag>
              </template>
            </div>
            <!-- 可操作行进行点击事件 -->
            <span v-else-if="data.linkEvent&&showLink(a.label, data.linkEvent)" style="color:#409EFF;cursor: pointer;"
              @click="handleLinkEvent(scope.row,data.linkEvent[a.label])">{{scope.row[a.label]}}</span>
            <img v-else-if="showUpload(a.label)&&scope.row[a.label]" :src="javaApi+'/img/'+scope.row[a.label]"
              alt="" style="width: 40px;height: 40px;margin-top: 10px;">
            <img v-else-if="showUpload(a.label) && scope.row[a.label]" :src="javaApi + '/img/' + scope.row[a.label]" alt=""
              style="width: 40px;height: 40px;margin-top: 10px;">
            <span v-else :class="{red:getRedColor(a.label,scope.row)}" >{{scope.row[a.label]}}</span>
          </template>
        </el-table-column>
        <el-table-column v-if="data.do.length > 0" :width="getWidth()" align="center" fixed="right" label="操作">
          <template slot-scope="scope">
            <el-button v-for="(a, ai) in data.do" :key="ai
            +'qqqq'" :disabled="a.disabFun ? a.disabFun(scope.row,scope.$index) : false"
              :type="a.type" class="handleBtn"
              @click="main(scope.row, a)">
              + 'qqqq'" :disabled="a.disabled ? a.disabled(scope.row, scope.$index) : false" :type="a.type"
              class="handleBtn" @click="main(scope.row, a)">
              <span v-if="a.type!='upload'">{{a.font}}</span>
              <el-upload v-else ref='upload'
                :accept='a.uploadConfig.accept' :action="javaApi+a.uploadConfig.url+'?id='+ (a.uploadConfig.uploadIdFun ? a.uploadConfig.uploadIdFun(scope.row) :  scope.row.id)"
                :disabled="a.disabFun ? a.disabFun(scope.row,scope.$index) : false" :headers="token" :on-error="onError" :on-success="handleSuccessUp" :show-file-list="false"
                name="file" style="background: transparent;">
              <el-upload v-else ref='upload' :accept='a.uploadConfig.accept'
                :action="javaApi + a.uploadConfig.url + '?id=' + (a.uploadConfig.uploadIdFun ? a.uploadConfig.uploadIdFun(scope.row) : scope.row.id)"
                :disabled="a.disabled ? a.disabled(scope.row, scope.$index) : false" :headers="token" :on-error="onError"
                :on-success="handleSuccessUp" :show-file-list="false" name="file" style="background: transparent;">
                <span>{{a.font}}</span>
              </el-upload>
            </el-button>
@@ -174,8 +181,7 @@
      </el-pagination>
    </div>
    <el-dialog :close-on-click-modal="false" :visible.sync="upDia"
               :width="data.row==1?'500px':540+data.row * 200 + 'px'"
               append-to-body title="编辑">
      :width="data.row == 1 ? '500px' : 540 + data.row * 200 + 'px'" append-to-body title="编辑">
      <div class="body" style="max-height: 600px;overflow-y: auto;padding: 5px 10px 5px 0;">
        <div v-if="data.row > 1">
          <div v-for="(a, ai) in upHead" :key="ai+'ffff'" style="line-height: 50px;">
@@ -183,31 +189,29 @@
              <span v-if="showUpReq(a.label)" class="required-span">* </span>{{a.value}}:
            </el-col>
            <el-col :span="16/data.row">
              <el-input v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)" v-model="upData[a.label]" :disabled="isDisabled(a.label)" :placeholder="`请输入${a.value}`"
                clearable
              <el-input v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
                v-model="upData[a.label]" :disabled="isDisabled(a.label)" :placeholder="`请输入${a.value}`" clearable
                size="small"></el-input>
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]" :allow-create="data.selectField[a.label].allowCreate"
                         :default-first-option="data.selectField[a.label].defaultFirstOption"
                         :disabled="isDisabled(a.label)"
                :multiple="data.selectField[a.label].choose" clearable filterable
                size="small" style="width: 100%;">
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]"
                :allow-create="data.selectField[a.label].allowCreate"
                :default-first-option="data.selectField[a.label].defaultFirstOption" :disabled="isDisabled(a.label)"
                :multiple="data.selectField[a.label].choose" clearable filterable size="small" style="width: 100%;">
                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi+'eeeee'" :label="b.label"
                  :value="b.value">
                </el-option>
              </el-select>
              <el-upload v-if="showUpload(a.label)" ref='upload'
                :accept='data.addUploadConfig.accept' :action="javaApi+data.addUploadConfig.url" :headers="token" :multiple="false"
                :on-error="onError" :on-success="m=>handleSuccessUp(m, a.label)" :show-file-list="false" class="avatar-uploader"
                name="file"
              <el-upload v-if="showUpload(a.label)" ref='upload' :accept='data.addUploadConfig.accept'
                :action="javaApi + data.addUploadConfig.url" :headers="token" :multiple="false" :on-error="onError"
                :on-success="m => handleSuccessUp(m, a.label)" :show-file-list="false" class="avatar-uploader" name="file"
                style="background: transparent;width: 80px;height: 80px;border: 1px solid #DCDFE6;border-radius: 6px;margin: 10px 0;">
                <img v-if="upData[a.label]" :src="javaApi+'/img/'+upData[a.label]" class="avatar"
                  style="width: 80px;height: 80px;border-radius: 6px;">
                <i v-else class="el-icon-plus avatar-uploader-icon"></i>
              </el-upload>
              <el-cascader v-if="showCascader(a.label)" :options="data.cascaderField[a.label].tree" :placeholder="`请选择${a.value}`"
                :props="data.cascaderField.props" :show-all-levels="false" :value="upData[a.label]"
                clearable filterable size="small"
                style="width: 100%;" @change="m=>handleCascader(m,a.label)"></el-cascader>
              <el-cascader v-if="showCascader(a.label)" :options="data.cascaderField[a.label].tree"
                :placeholder="`请选择${a.value}`" :props="data.cascaderField.props" :show-all-levels="false"
                :value="upData[a.label]" clearable filterable size="small" style="width: 100%;"
                @change="m => handleCascader(m, a.label)"></el-cascader>
            </el-col>
          </div>
        </div>
@@ -217,11 +221,11 @@
              <span v-if="showUpReq(a.label)" class="required-span">* </span>{{a.value}}:
            </el-col>
            <el-col :offset="1" :span="16">
              <el-input v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)" v-model="upData[a.label]" :disabled="isDisabled(a.label)" :placeholder="`请输入${a.value}`"
                clearable
              <el-input v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
                v-model="upData[a.label]" :disabled="isDisabled(a.label)" :placeholder="`请输入${a.value}`" clearable
                size="small"></el-input>
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]" :disabled="isDisabled(a.label)"
                :multiple="data.selectField[a.label].choose" clearable filterable
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]"
                :disabled="isDisabled(a.label)" :multiple="data.selectField[a.label].choose" clearable filterable
                size="small" style="width: 100%;">
                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi+'fffff'" :label="b.label"
                  :value="b.value"></el-option>
@@ -234,9 +238,10 @@
                  style="width: 80px;height: 80px;border-radius: 6px;">
                <i v-else class="el-icon-plus avatar-uploader-icon"></i>
              </el-upload>
              <el-cascader v-if="showCascader(a.label)" :options="data.cascaderField[a.label].tree" :placeholder="`请选择${a.value}`"
                :props="data.cascaderField.props" :show-all-levels="false" :value="upData[a.label]" clearable
                filterable size="small" style="width: 100%;" @change="m=>handleCascader(m,a.label)"></el-cascader>
              <el-cascader v-if="showCascader(a.label)" :options="data.cascaderField[a.label].tree"
                :placeholder="`请选择${a.value}`" :props="data.cascaderField.props" :show-all-levels="false"
                :value="upData[a.label]" clearable filterable size="small" style="width: 100%;"
                @change="m => handleCascader(m, a.label)"></el-cascader>
            </el-col>
          </el-row>
        </div>
@@ -247,8 +252,7 @@
      </span>
    </el-dialog>
    <el-dialog :close-on-click-modal="false" :visible.sync="addDia"
               :width="data.row==1?'500px':540+data.row * 200 + 'px'"
               append-to-body title="新增">
      :width="data.row == 1 ? '500px' : 540 + data.row * 200 + 'px'" append-to-body title="新增">
      <div v-if="addDia" class="body" style="max-height: 550px;overflow-y: auto;padding: 5px 10px 5px 0;">
        <div v-if="data.row > 1">
          <div v-for="(a, ai) in upHead" :key="ai+'yyyyy'" style="line-height: 50px;">
@@ -256,26 +260,25 @@
                class="required-span">*
              </span>{{a.value}}:</el-col>
            <el-col :span="16/data.row">
              <el-input v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)" v-model="upData[a.label]" :placeholder="`请输入${a.value}`" clearable
                size="small"></el-input>
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]" :multiple="data.selectField[a.label].choose"
              :placeholder="`请选择${a.value}`"
                clearable filterable size="small" style="width: 100%;">
              <el-input v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
                v-model="upData[a.label]" :placeholder="`请输入${a.value}`" clearable size="small"></el-input>
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]"
                :multiple="data.selectField[a.label].choose" :placeholder="`请选择${a.value}`" clearable filterable
                size="small" style="width: 100%;">
                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi+'hhhh'" :label="b.label"
                  :value="b.value"></el-option>
              </el-select>
              <el-upload v-if="showUpload(a.label)" ref='upload'
                :accept='data.addUploadConfig.accept' :action="javaApi+data.addUploadConfig.url" :headers="token" :multiple="false"
                :on-error="onError" :on-success="m=>handleSuccessUp(m, a.label)" :show-file-list="false" class="avatar-uploader"
                name="file"
              <el-upload v-if="showUpload(a.label)" ref='upload' :accept='data.addUploadConfig.accept'
                :action="javaApi + data.addUploadConfig.url" :headers="token" :multiple="false" :on-error="onError"
                :on-success="m => handleSuccessUp(m, a.label)" :show-file-list="false" class="avatar-uploader" name="file"
                style="background: transparent;width: 80px;height: 80px;border: 1px solid #DCDFE6;border-radius: 6px;margin: 10px 0;">
                <img v-if="upData[a.label]" :src="javaApi+'/img/'+upData[a.label]" class="avatar"
                  style="width: 80px;height: 80px;border-radius: 6px;">
                <i v-else class="el-icon-plus avatar-uploader-icon"></i>
              </el-upload>
              <el-cascader v-if="showCascader(a.label)" :options="data.cascaderField[a.label].tree" :placeholder="`请选择${a.value}`"
                :props="data.cascaderField.props" :show-all-levels="false" clearable filterable
                size="small" style="width: 100%;" @change="m=>handleCascader(m,a.label)"></el-cascader>
              <el-cascader v-if="showCascader(a.label)" :options="data.cascaderField[a.label].tree"
                :placeholder="`请选择${a.value}`" :props="data.cascaderField.props" :show-all-levels="false" clearable
                filterable size="small" style="width: 100%;" @change="m => handleCascader(m, a.label)"></el-cascader>
            </el-col>
          </div>
        </div>
@@ -284,26 +287,25 @@
            <el-col :span="6" style="text-align: right;"><span v-if="showAddReq(a.label)" class="required-span">*
              </span>{{a.value}}:</el-col>
            <el-col :offset="1" :span="16">
              <el-input v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)" v-model="upData[a.label]" :placeholder="`请输入${a.value}`" clearable
                size="small"></el-input>
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]" :multiple="data.selectField[a.label].choose"
              :placeholder="`请选择${a.value}`"
                clearable size="small" style="width: 100%;">
              <el-input v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
                v-model="upData[a.label]" :placeholder="`请输入${a.value}`" clearable size="small"></el-input>
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]"
                :multiple="data.selectField[a.label].choose" :placeholder="`请选择${a.value}`" clearable size="small"
                style="width: 100%;">
                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi+'mmmmmm'" :label="b.label"
                  :value="b.value"></el-option>
              </el-select>
              <el-upload v-if="showUpload(a.label)" ref='upload'
                :accept='data.addUploadConfig.accept' :action="javaApi+data.addUploadConfig.url" :headers="token" :multiple="false"
                :on-error="onError" :on-success="m=>handleSuccessUp(m, a.label)" :show-file-list="false" class="avatar-uploader"
                name="file"
              <el-upload v-if="showUpload(a.label)" ref='upload' :accept='data.addUploadConfig.accept'
                :action="javaApi + data.addUploadConfig.url" :headers="token" :multiple="false" :on-error="onError"
                :on-success="m => handleSuccessUp(m, a.label)" :show-file-list="false" class="avatar-uploader" name="file"
                style="background: transparent;width: 80px;height: 80px;border: 1px solid #DCDFE6;border-radius: 6px;margin: 10px 0;">
                <img v-if="upData[a.label]" :src="javaApi+'/img/'+upData[a.label]" class="avatar"
                  style="width: 80px;height: 80px;border-radius: 6px;">
                <i v-else class="el-icon-plus avatar-uploader-icon"></i>
              </el-upload>
              <el-cascader v-if="showCascader(a.label)" :options="data.cascaderField[a.label].tree" :placeholder="`请选择${a.value}`"
                :props="data.cascaderField.props" :show-all-levels="false" clearable filterable
                size="small" style="width: 100%;" @change="m=>handleCascader(m,a.label)"></el-cascader>
              <el-cascader v-if="showCascader(a.label)" :options="data.cascaderField[a.label].tree"
                :placeholder="`请选择${a.value}`" :props="data.cascaderField.props" :show-all-levels="false" clearable
                filterable size="small" style="width: 100%;" @change="m => handleCascader(m, a.label)"></el-cascader>
            </el-col>
          </el-row>
        </div>
@@ -325,9 +327,9 @@
    </el-dialog>
    <el-dialog :visible.sync="uploadDia" title="数据导入" width="500px">
      <div style="margin: 0 auto;">
        <el-upload ref="upload" :accept="data.accept===undefined?'.csv':data.accept" :action="javaApi + inputUrl" :auto-upload="false" :data="{param: data.uploadStr}" :file-list="fileList"
          :headers="token" :limit="1" :on-change="beforeUpload" :on-error="onError" :on-success="onSuccess"
          drag name="file">
        <el-upload ref="upload" :accept="data.accept === undefined ? '.csv' : data.accept" :action="javaApi + inputUrl"
          :auto-upload="false" :data="{ param: data.uploadStr }" :file-list="fileList" :headers="token" :limit="1"
          :on-change="beforeUpload" :on-error="onError" :on-success="onSuccess" drag name="file">
          <i class="el-icon-upload"></i>
          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        </el-upload>
@@ -1208,7 +1210,8 @@
            item.state = state
            auxiliaryWorkingHoursDays.push(item)
          })
          this.$axios.post(this.$api.auxiliaryWorkingHoursDay.approve, {auxiliaryWorkingHoursDays: auxiliaryWorkingHoursDays
        this.$axios.post(this.$api.auxiliaryWorkingHoursDay.approve, {
          auxiliaryWorkingHoursDays: auxiliaryWorkingHoursDays
            },{
              headers: {
                'Content-Type': 'application/json'