value
2024-04-26 d9f8ae99586ff3e4f1e86fee447d7ffd715e8b10
检验项目绑定产品,检验对象绑定产品
已修改5个文件
2833 ■■■■ 文件已修改
src/App.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/api/controller.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/tool/value-table.vue 1850 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/a5-capacity-scope.vue 962 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/a6-device-management.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue
@@ -307,4 +307,5 @@
    overflow: hidden;
    text-overflow: ellipsis;
  }
</style>
src/assets/api/controller.js
@@ -103,6 +103,11 @@
    upTestObject: "/capacityScope/upTestObject", //修改检测对象
    selectTestObjectByName: "/capacityScope/selectTestObjectByName", //获取检验对象枚举
  getInsProduction: "/capacityScope/getInsProduction", //设备里面选择检验项目(树形结构)
  selectProductListByObjectId: "/capacityScope/selectProductListByObjectId", //维护检验对象的产品
  addProduct: "/capacityScope/addProduct", //新增产品
  delProduct: "/capacityScope/delProduct", //删除产品
  upProduct: "/capacityScope/upProduct", //修改产品
  getItemTree: "/capacityScope/getItemTree", //获取检验对象树
}
const laboratoryScope = {
src/components/tool/value-table.vue
@@ -1,95 +1,95 @@
<style scoped>
    .value-table {
        width: 100%;
        height: 100%;
        overflow-y: auto;
    }
  .value-table {
    width: 100%;
    height: 100%;
    overflow-y: auto;
  }
    .table {
        width: 100%;
        height: calc(100% - 42px);
    }
  .table {
    width: 100%;
    height: calc(100% - 42px);
  }
    .page {
        width: 100%;
        height: 30px;
        text-align: right;
        margin-top: 10px;
    }
  .page {
    width: 100%;
    height: 30px;
    text-align: right;
    margin-top: 10px;
  }
    .down-left {
        width: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
    }
  .down-left {
    width: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
  }
    .down-right {
        width: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
    }
  .down-right {
    width: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
  }
    .body {
        overflow-x: hidden;
    }
  .body {
    overflow-x: hidden;
  }
  .handleBtn{
  .handleBtn {
    border: none;
    padding: 0;
    color: #409EFF;
    background: transparent;
  }
  .handleBtn:hover{
  .handleBtn:hover {
    background: transparent;
  }
  .handleBtn.is-disabled{
  .handleBtn.is-disabled {
    color: #C0C4CC;
  }
</style>
<style>
    /* .value-table .highlight-warning-row-border td {
  /* .value-table .highlight-warning-row-border td {
        border-top: 2px solid #ffcd29;
        border-bottom: 2px solid #ffcd29;
    } */
    .value-table .highlight-warning-row-border td:first-child {
        border-left: 4px solid #ffcd29;
    }
  .value-table .highlight-warning-row-border td:first-child {
    border-left: 4px solid #ffcd29;
  }
    .value-table .highlight-warning-row-border td:last-child {
        border-right: 4px solid #ffcd29;
    }
  .value-table .highlight-warning-row-border td:last-child {
    border-right: 4px solid #ffcd29;
  }
    /* .value-table .highlight-danger-row-border td {
  /* .value-table .highlight-danger-row-border td {
        border-top: 2px solid red;
        border-bottom: 2px solid red;
    } */
    .value-table .highlight-danger-row-border td:first-child {
        border-left: 4px solid #f56c6c;
    }
  .value-table .highlight-danger-row-border td:first-child {
    border-left: 4px solid #f56c6c;
  }
    .value-table .highlight-danger-row-border td:last-child {
        border-right: 4px solid #f56c6c;
    }
  .value-table .highlight-danger-row-border td:last-child {
    border-right: 4px solid #f56c6c;
  }
    .value-table .el-upload {
        width: 100%;
    }
  .value-table .el-upload {
    width: 100%;
  }
    .value-table .el-upload-dragger {
        width: 100%;
    }
  .value-table .el-upload-dragger {
    width: 100%;
  }
  .handleBtn.is-disabled .el-upload:focus{
  .handleBtn.is-disabled .el-upload:focus {
    color: #C0C4CC !important;
  }
  .avatar-uploader .el-upload{
  .avatar-uploader .el-upload {
    height: 80px;
    display: flex;
    align-items: center;
@@ -98,412 +98,383 @@
</style>
<template>
    <div class="value-table">
        <div class="table" :style="data.isPage!=undefined&&data.isPage!=true?'height:100%':''">
            <el-table ref="eltable" :data="tableData" style="width: 100%;" height="100%"
      tooltip-effect="dark" border
                @selection-change="selectChange" @select="select" v-loading="loading" @sort-change="sortChange"
                @row-click="rowClick" :show-summary="data.countFleid!=undefined && data.countFleid.length > 0"
                :summary-method="getSummaries" :row-class-name="tableRowClassName"
        :row-key="record=>record.id" :current-row-key="data.currentId"
        :highlight-current-row="data.highlight===undefined||data.highlight"
  <div class="value-table">
    <div class="table" :style="data.isPage!=undefined&&data.isPage!=true?'height:100%':''">
      <el-table ref="eltable" :data="tableData" style="width: 100%;" height="100%" tooltip-effect="dark" border
        @selection-change="selectChange" @select="select" v-loading="loading" @sort-change="sortChange"
        @row-click="rowClick" :show-summary="data.countFleid!=undefined && data.countFleid.length > 0"
        :summary-method="getSummaries" :row-class-name="tableRowClassName" :row-key="record=>record.id"
        :current-row-key="data.currentId" :highlight-current-row="data.highlight===undefined||data.highlight"
        :span-method="spanMethod">
                <el-table-column type="selection" width="65" v-if="data.showSelect" :key="Math.random()">
                </el-table-column>
                <el-table-column type="index" align="center" label="序号" width="65" v-if="data.isIndex" :key="Math.random()">
                </el-table-column>
                <el-table-column :prop="a.label" :label="a.value" :sortable="data.sort==false?false:'custom'"
                    v-for="(a, ai) in tableHead" :key="ai" show-overflow-tooltip min-width="155">
                    <template slot-scope="scope">
                        <div v-if="showType(a.label, data.tagField) != null">
                            <template v-if="typeof(scope.row[a.label]) == 'object'">
                                <template v-for="(param, i) in scope.row[a.label]">
                                    <el-tag v-for="(b, bi) in data.tagField[a.label].select" :key="bi" v-if="b.value == param"
                                        :type="b.type" size="medium" style="margin-right: 5px;">{{b.label}}</el-tag>
                                </template>
                            </template>
                            <template v-else>
                                <el-tag v-for="(b, bi) in data.tagField[a.label].select" :key="bi" v-if="b.value == scope.row[a.label]"
                                    :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 style="width: 40px;height: 40px;margin-top: 10px;" :src="javaApi+'/img/'+scope.row[a.label]" v-else-if="showUpload(a.label)&&scope.row[a.label]" alt="">
            <span v-else-if="showCascader(a.label)&&scope.row[a.label]">{{handleTree(data.cascaderField[a.label].tree,scope.row[a.label].split(',')[scope.row[a.label].split(',').length-1])}}</span>
                        <span v-else>{{scope.row[a.label]}}</span>
                    </template>
                </el-table-column>
                <el-table-column fixed="right" align="center" label="操作" :width="getWidth()" v-if="data.do.length > 0">
                    <template slot-scope="scope">
                        <el-button v-for="(a, ai) in data.do" :key="ai" :type="a.type"
                            :disabled="a.disabFun ? a.disabFun(scope.row,scope.$index) : false"
                            @click="main(scope.row, a)" class="handleBtn">
        <el-table-column type="selection" width="65" v-if="data.showSelect" :key="Math.random()">
        </el-table-column>
        <el-table-column type="index" align="center" label="序号" width="65" v-if="data.isIndex" :key="Math.random()">
        </el-table-column>
        <el-table-column :prop="a.label" :label="a.value" :sortable="data.sort==false?false:'custom'"
          v-for="(a, ai) in tableHead" :key="ai" show-overflow-tooltip min-width="155">
          <template slot-scope="scope">
            <div v-if="showType(a.label, data.tagField) != null">
              <template v-if="typeof(scope.row[a.label]) == 'object'">
                <template v-for="(param, i) in scope.row[a.label]">
                  <el-tag v-for="(b, bi) in data.tagField[a.label].select" :key="bi" v-if="b.value == param"
                    :type="b.type" size="medium" style="margin-right: 5px;">{{b.label}}</el-tag>
                </template>
              </template>
              <template v-else>
                <el-tag v-for="(b, bi) in data.tagField[a.label].select" :key="bi" v-if="b.value == scope.row[a.label]"
                  :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 style="width: 40px;height: 40px;margin-top: 10px;" :src="javaApi+'/img/'+scope.row[a.label]"
              v-else-if="showUpload(a.label)&&scope.row[a.label]" alt="">
            <span v-else>{{scope.row[a.label]}}</span>
          </template>
        </el-table-column>
        <el-table-column fixed="right" align="center" label="操作" :width="getWidth()" v-if="data.do.length > 0">
          <template slot-scope="scope">
            <el-button v-for="(a, ai) in data.do" :key="ai" :type="a.type"
              :disabled="a.disabFun ? a.disabFun(scope.row,scope.$index) : false" @click="main(scope.row, a)"
              class="handleBtn">
              <span v-if="a.type!='upload'">{{a.font}}</span>
              <el-upload
              :action="javaApi+a.uploadConfig.url+'?id='+scope.row.id"
              v-else
              :disabled="a.disabFun ? a.disabFun(scope.row,scope.$index) : false"
              :on-success="handleSuccessUp"
              :show-file-list="false"
              :headers="token"
              name="file"
                            :accept='a.uploadConfig.accept'
                            :on-error="onError"
              ref='upload'
              style="background: transparent;">
                                    <span>{{a.font}}</span>
                                </el-upload>
              <el-upload :action="javaApi+a.uploadConfig.url+'?id='+scope.row.id" v-else
                :disabled="a.disabFun ? a.disabFun(scope.row,scope.$index) : false" :on-success="handleSuccessUp"
                :show-file-list="false" :headers="token" name="file" :accept='a.uploadConfig.accept' :on-error="onError"
                ref='upload' style="background: transparent;">
                <span>{{a.font}}</span>
              </el-upload>
            </el-button>
                    </template>
                </el-table-column>
            </el-table>
        </div>
        <div class="page" v-if="data.isPage==undefined||data.isPage">
            <el-pagination @size-change="sizeChange" @current-change="currentChange" :current-page="page.current"
                :page-sizes="[10, 20, 30, 50, 100]" :page-size="page.size" layout="total, sizes, prev, pager, next, jumper"
                :total="total" >
            </el-pagination>
        </div>
        <el-dialog title="编辑" :visible.sync="upDia" :width="data.row==1?'500px':500+data.row * 200 + 'px'">
            <div class="body" v-if="upDia" 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" style="line-height: 50px;">
                        <el-col :span="6/data.row" style="text-align: right;" :offset="1">
                            <span class="required-span" v-if="showUpReq(a.label)">* </span>{{a.value}}:
                        </el-col>
                        <el-col :span="16/data.row">
                            <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`请输入${a.value}`"
                                v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)" :disabled="isDisabled(a.label)"></el-input>
                            <el-select v-model="upData[a.label]" :multiple="data.selectField[a.label].choose" size="small"
                                v-if="showType(a.label, data.selectField) != null" style="width: 100%;" :disabled="isDisabled(a.label)"
                                clearable filterable>
                                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi" :value="b.value"
                                    :label="b.label">
                                </el-option>
                            </el-select>
              <el-upload
              :action="javaApi+data.addUploadConfig.url"
              v-if="showUpload(a.label)"
              :on-success="m=>handleSuccessUp(m, a.label)"
              :show-file-list="false"
              :headers="token"
              name="file"
              :multiple="false"
                            :accept='data.addUploadConfig.accept'
                            :on-error="onError"
              ref='upload'
              class="avatar-uploader"
              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
              :value="upData[a.label]"
              :options="data.cascaderField[a.label].tree"
              v-if="showCascader(a.label)"
              :show-all-levels="false"
              clearable
              :props="data.cascaderField.props"
              size="small"
              style="width: 100%;"
              @change="m=>handleCascader(m,a.label)"></el-cascader>
                        </el-col>
                    </div>
                </div>
                <div v-else>
                    <el-row v-for="(a, ai) in upHead" :key="ai" style="line-height: 50px;">
                        <el-col :span="6" style="text-align: right;">
                            <span class="required-span" v-if="showUpReq(a.label)">* </span>{{a.value}}:
                        </el-col>
                        <el-col :span="16" :offset="1">
                            <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`请输入${a.value}`"
                                v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)" :disabled="isDisabled(a.label)"></el-input>
                            <el-select v-model="upData[a.label]" :multiple="data.selectField[a.label].choose" size="small"
                                v-if="showType(a.label, data.selectField) != null" style="width: 100%;" :disabled="isDisabled(a.label)"
                                clearable filterable>
                                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi" :value="b.value"
                                    :label="b.label"></el-option>
                            </el-select>
              <el-upload
              :action="javaApi+data.addUploadConfig.url"
              v-if="showUpload(a.label)"
              :multiple="false"
              :on-success="m=>handleSuccessUp(m, a.label)"
              :show-file-list="false"
              :headers="token"
              name="file"
                            :accept='data.addUploadConfig.accept'
                            :on-error="onError"
              ref='upload'
              class="avatar-uploader"
              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 :value="upData[a.label]" :options="data.cascaderField[a.label].tree" :show-all-levels="false" v-if="showCascader(a.label)" clearable :props="data.cascaderField.props" size="small" style="width: 100%;" @change="m=>handleCascader(m,a.label)"></el-cascader>
                        </el-col>
                    </el-row>
                </div>
            </div>
            <span slot="footer" class="dialog-footer">
                <el-button @click="upDia = false">取 消</el-button>
                <el-button type="primary" @click="saveUpData" :loading="upLoad">确 定</el-button>
            </span>
        </el-dialog>
        <el-dialog title="新增" :visible.sync="addDia" :width="data.row==1?'500px':500+data.row * 200 + 'px'">
            <div class="body" v-if="addDia" style="max-height: 550px;overflow-y: auto;padding: 5px 0;">
                <div v-if="data.row > 1">
                    <div v-for="(a, ai) in upHead" :key="ai" style="line-height: 50px;">
                        <el-col :span="6/data.row" style="text-align: right;"><span class="required-span"
                                v-if="showAddReq(a.label)">*
                            </span>{{a.value}}:</el-col>
                        <el-col :span="16/data.row" :offset="1">
                            <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`请输入${a.value}`"
                                v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)"></el-input>
                            <el-select v-model="upData[a.label]" size="small" v-if="showType(a.label, data.selectField) != null"
                                style="width: 100%;" :placeholder="`请选择${a.value}`" clearable filterable>
                                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi" :value="b.value"
                                    :label="b.label"></el-option>
                            </el-select>
              <el-upload
              :action="javaApi+data.addUploadConfig.url"
              v-if="showUpload(a.label)"
              :on-success="m=>handleSuccessUp(m, a.label)"
              :show-file-list="false"
              :headers="token"
              :multiple="false"
              name="file"
                            :accept='data.addUploadConfig.accept'
                            :on-error="onError"
              ref='upload'
              class="avatar-uploader"
              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 :options="data.cascaderField[a.label].tree" v-if="showCascader(a.label)" clearable :props="data.cascaderField.props" size="small" style="width: 100%;" :show-all-levels="false" @change="m=>handleCascader(m,a.label)"></el-cascader>
                        </el-col>
                    </div>
                </div>
                <div v-else>
                    <el-row v-for="(a, ai) in upHead" :key="ai" style="line-height: 50px;">
                        <el-col :span="6" style="text-align: right;"><span class="required-span" v-if="showAddReq(a.label)">*
                            </span>{{a.value}}:</el-col>
                        <el-col :span="16" :offset="1">
                            <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`请输入${a.value}`"
                                v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)"></el-input>
                            <el-select v-model="upData[a.label]" size="small" v-if="showType(a.label, data.selectField) != null"
                                style="width: 100%;" :placeholder="`请选择${a.value}`" clearable>
                                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi" :value="b.value"
                                    :label="b.label"></el-option>
                            </el-select>
              <el-upload
              :action="javaApi+data.addUploadConfig.url"
              v-if="showUpload(a.label)"
              :on-success="m=>handleSuccessUp(m, a.label)"
              :show-file-list="false"
              :headers="token"
              name="file"
              :multiple="false"
                            :accept='data.addUploadConfig.accept'
                            :on-error="onError"
              ref='upload'
              class="avatar-uploader"
              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 :options="data.cascaderField[a.label].tree" v-if="showCascader(a.label)" clearable :props="data.cascaderField.props" size="small" style="width: 100%;" :show-all-levels="false" @change="m=>handleCascader(m,a.label)"></el-cascader>
                        </el-col>
                    </el-row>
                </div>
            </div>
            <span slot="footer" class="dialog-footer">
                <el-button @click="addDia = false">取 消</el-button>
                <el-button type="primary" @click="saveAddData" :loading="addLoad">确 定</el-button>
            </span>
        </el-dialog>
        <el-dialog title="导出" :visible.sync="downDia" width="400px">
            <div style="display: flex;width: 100%;height: 100px;">
                <div class="down-left" @click="downFile(true)">
                    <el-button>本页导出</el-button>
                </div>
                <div class="down-right" @click="downFile(false)">
                    <el-button>全部导出</el-button>
                </div>
            </div>
        </el-dialog>
        <el-dialog title="数据导入" :visible.sync="uploadDia" width="500px">
            <div style="margin: 0 auto;">
                <el-upload ref="upload" drag :action="javaApi + inputUrl" :headers="token" :file-list="fileList" name="file"
                    :auto-upload="false" accept=".csv" :limit="1" :on-change="beforeUpload" :on-success="onSuccess"
                    :on-error="onError" :data="{param: data.uploadStr}">
                    <i class="el-icon-upload"></i>
                    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                </el-upload>
            </div>
            <span slot="footer" class="dialog-footer">
                <el-button @click="uploadDia = false">取 消</el-button>
                <el-button type="primary" @click="submitUpload()">上 传</el-button>
            </span>
        </el-dialog>
    </div>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div class="page" v-if="data.isPage==undefined||data.isPage">
      <el-pagination @size-change="sizeChange" @current-change="currentChange" :current-page="page.current"
        :page-sizes="[10, 20, 30, 50, 100]" :page-size="page.size" layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
    <el-dialog title="编辑" :visible.sync="upDia" :width="data.row==1?'500px':500+data.row * 200 + 'px'" append-to-body>
      <div class="body" v-if="upDia" 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" style="line-height: 50px;">
            <el-col :span="6/data.row" style="text-align: right;" :offset="1">
              <span class="required-span" v-if="showUpReq(a.label)">* </span>{{a.value}}:
            </el-col>
            <el-col :span="16/data.row">
              <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`请输入${a.value}`"
                v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)"
                :disabled="isDisabled(a.label)"></el-input>
              <el-select v-model="upData[a.label]" :multiple="data.selectField[a.label].choose" size="small"
                v-if="showType(a.label, data.selectField) != null" style="width: 100%;" :disabled="isDisabled(a.label)"
                clearable filterable>
                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi" :value="b.value"
                  :label="b.label">
                </el-option>
              </el-select>
              <el-upload :action="javaApi+data.addUploadConfig.url" v-if="showUpload(a.label)"
                :on-success="m=>handleSuccessUp(m, a.label)" :show-file-list="false" :headers="token" name="file"
                :multiple="false" :accept='data.addUploadConfig.accept' :on-error="onError" ref='upload'
                class="avatar-uploader"
                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 :value="upData[a.label]" :options="data.cascaderField[a.label].tree"
                v-if="showCascader(a.label)" :placeholder="`请选择${a.value}`" clearable
                :props="data.cascaderField.props" size="small" style="width: 100%;"
                @change="m=>handleCascader(m,a.label)" filterable></el-cascader>
            </el-col>
          </div>
        </div>
        <div v-else>
          <el-row v-for="(a, ai) in upHead" :key="ai" style="line-height: 50px;">
            <el-col :span="6" style="text-align: right;">
              <span class="required-span" v-if="showUpReq(a.label)">* </span>{{a.value}}:
            </el-col>
            <el-col :span="16" :offset="1">
              <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`请输入${a.value}`"
                v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)"
                :disabled="isDisabled(a.label)"></el-input>
              <el-select v-model="upData[a.label]" :multiple="data.selectField[a.label].choose" size="small"
                v-if="showType(a.label, data.selectField) != null" style="width: 100%;" :disabled="isDisabled(a.label)"
                clearable filterable>
                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi" :value="b.value"
                  :label="b.label"></el-option>
              </el-select>
              <el-upload :action="javaApi+data.addUploadConfig.url" v-if="showUpload(a.label)" :multiple="false"
                :on-success="m=>handleSuccessUp(m, a.label)" :show-file-list="false" :headers="token" name="file"
                :accept='data.addUploadConfig.accept' :on-error="onError" ref='upload' class="avatar-uploader"
                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 :value="upData[a.label]" :options="data.cascaderField[a.label].tree" :show-all-levels="false"
                :placeholder="`请选择${a.value}`" v-if="showCascader(a.label)" clearable :props="data.cascaderField.props"
                size="small" style="width: 100%;" @change="m=>handleCascader(m,a.label)" filterable></el-cascader>
            </el-col>
          </el-row>
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="upDia = false">取 消</el-button>
        <el-button type="primary" @click="saveUpData" :loading="upLoad">确 定</el-button>
      </span>
    </el-dialog>
    <el-dialog title="新增" :visible.sync="addDia" :width="data.row==1?'500px':500+data.row * 200 + 'px'" append-to-body>
      <div class="body" v-if="addDia" 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" style="line-height: 50px;">
            <el-col :span="6/data.row" style="text-align: right;"><span class="required-span"
                v-if="showAddReq(a.label)">*
              </span>{{a.value}}:</el-col>
            <el-col :span="16/data.row" :offset="1">
              <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`请输入${a.value}`"
                v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)"></el-input>
              <el-select v-model="upData[a.label]" size="small" v-if="showType(a.label, data.selectField) != null"
                style="width: 100%;" :placeholder="`请选择${a.value}`" clearable filterable>
                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi" :value="b.value"
                  :label="b.label"></el-option>
              </el-select>
              <el-upload :action="javaApi+data.addUploadConfig.url" v-if="showUpload(a.label)"
                :on-success="m=>handleSuccessUp(m, a.label)" :show-file-list="false" :headers="token" :multiple="false"
                name="file" :accept='data.addUploadConfig.accept' :on-error="onError" ref='upload'
                class="avatar-uploader"
                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 :options="data.cascaderField[a.label].tree" v-if="showCascader(a.label)" clearable
                :placeholder="`请选择${a.value}`" :props="data.cascaderField.props" size="small" style="width: 100%;"
                @change="m=>handleCascader(m,a.label)" filterable></el-cascader>
            </el-col>
          </div>
        </div>
        <div v-else>
          <el-row v-for="(a, ai) in upHead" :key="ai" style="line-height: 50px;">
            <el-col :span="6" style="text-align: right;"><span class="required-span" v-if="showAddReq(a.label)">*
              </span>{{a.value}}:</el-col>
            <el-col :span="16" :offset="1">
              <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`请输入${a.value}`"
                v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)"></el-input>
              <el-select v-model="upData[a.label]" size="small" v-if="showType(a.label, data.selectField) != null"
                style="width: 100%;" :placeholder="`请选择${a.value}`" clearable>
                <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi" :value="b.value"
                  :label="b.label"></el-option>
              </el-select>
              <el-upload :action="javaApi+data.addUploadConfig.url" v-if="showUpload(a.label)"
                :on-success="m=>handleSuccessUp(m, a.label)" :show-file-list="false" :headers="token" name="file"
                :multiple="false" :accept='data.addUploadConfig.accept' :on-error="onError" ref='upload'
                class="avatar-uploader"
                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 :options="data.cascaderField[a.label].tree" v-if="showCascader(a.label)" clearable
                :placeholder="`请选择${a.value}`" :props="data.cascaderField.props" size="small" style="width: 100%;"
                @change="m=>handleCascader(m,a.label)" filterable></el-cascader>
            </el-col>
          </el-row>
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDia = false">取 消</el-button>
        <el-button type="primary" @click="saveAddData" :loading="addLoad">确 定</el-button>
      </span>
    </el-dialog>
    <el-dialog title="导出" :visible.sync="downDia" width="400px">
      <div style="display: flex;width: 100%;height: 100px;">
        <div class="down-left" @click="downFile(true)">
          <el-button>本页导出</el-button>
        </div>
        <div class="down-right" @click="downFile(false)">
          <el-button>全部导出</el-button>
        </div>
      </div>
    </el-dialog>
    <el-dialog title="数据导入" :visible.sync="uploadDia" width="500px">
      <div style="margin: 0 auto;">
        <el-upload ref="upload" drag :action="javaApi + inputUrl" :headers="token" :file-list="fileList" name="file"
          :auto-upload="false" accept=".csv" :limit="1" :on-change="beforeUpload" :on-success="onSuccess"
          :on-error="onError" :data="{param: data.uploadStr}">
          <i class="el-icon-upload"></i>
          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        </el-upload>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="uploadDia = false">取 消</el-button>
        <el-button type="primary" @click="submitUpload()">上 传</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
    import {
        Page
    } from 'iview';
import { data } from 'jquery';
    export default {
        props: {
            tableRowClassName: {
                type: Function
            },
            url: {
                type: String,
                default: () => null
            },
            upUrl: {
                type: String,
                default: () => null
            },
            delUrl: {
                type: String,
                default: () => null
            },
            downUrl: {
                type: String,
                default: () => null
            },
            inputUrl: {
                type: String,
                default: () => null
            },
            componentData: {
                type: Object,
                default: () => {
                    return {
                        entity: {
                            orderBy: {
                                field: 'id',
                                order: 'asc'
                            }
                        },
                        isIndex: false,
                        showSelect: false,
                        select: true,
                        row: 1,
                        do: [{
                            id: 'update',
                            font: '编辑',
                            type: 'text',
                            method: 'doDiy'
                        }, {
                            id: 'delete',
                            font: '删除',
                            type: 'text',
                            method: 'doDiy'
                        }],
                        doDiy: true,
                        tagField: [{
                            label: 'state',
                            select: [{
                                value: '1',
                                type: 'success',
                                label: '启用'
                            }, {
                                value: '0',
                                type: 'danger',
                                label: '停用'
                            }]
                        }]
                    }
                }
            }
        },
        data() {
            return {
                data: {
                    entity: {
                        orderBy: {
                            field: 'id',
                            order: 'asc'
                        }
                    },
                    isIndex: false,
                    showSelect: false,
                    select: true,
                    row: 1,
          isPage:true,//
                    do: [{
                        font: '删除',
                        type: 'text'
                    }],
                    type: [],
                    uploadStr: "",
          currentId:'',//当前高亮的ID
                },
                tableHead: [],
                tableData: [],
                multipleSelection: [],
                user: {},
                page: {
                    current: 1,
                    size: 20,
                },
                total: 0,
                loading: false,
                upDia: false,
                upData: {},
                upHead: [],
                upLoad: false,
                addDia: false,
                addUrl: null,
                addLoad: false,
                dataCopy: {},
                downDia: false,
                uploadDia: false,
                token: null,
                fileList: [],
                init: true,
        spanList:[
  import {
    Page
  } from 'iview';
  import {
    data
  } from 'jquery';
  export default {
    props: {
      tableRowClassName: {
        type: Function
      },
      url: {
        type: String,
        default: () => null
      },
      upUrl: {
        type: String,
        default: () => null
      },
      delUrl: {
        type: String,
        default: () => null
      },
      downUrl: {
        type: String,
        default: () => null
      },
      inputUrl: {
        type: String,
        default: () => null
      },
      componentData: {
        type: Object,
        default: () => {
          return {
            entity: {
              orderBy: {
                field: 'id',
                order: 'asc'
              }
            },
            isIndex: false,
            showSelect: false,
            select: true,
            row: 1,
            do: [{
              id: 'update',
              font: '编辑',
              type: 'text',
              method: 'doDiy'
            }, {
              id: 'delete',
              font: '删除',
              type: 'text',
              method: 'doDiy'
            }],
            doDiy: true,
            tagField: [{
              label: 'state',
              select: [{
                value: '1',
                type: 'success',
                label: '启用'
              }, {
                value: '0',
                type: 'danger',
                label: '停用'
              }]
            }]
          }
        }
      }
    },
    data() {
      return {
        data: {
          entity: {
            orderBy: {
              field: 'id',
              order: 'asc'
            }
          },
          isIndex: false,
          showSelect: false,
          select: true,
          row: 1,
          isPage: true, //
          do: [{
            font: '删除',
            type: 'text'
          }],
          type: [],
          uploadStr: "",
          currentId: '', //当前高亮的ID
        },
        tableHead: [],
        tableData: [],
        multipleSelection: [],
        user: {},
        page: {
          current: 1,
          size: 20,
        },
        total: 0,
        loading: false,
        upDia: false,
        upData: {},
        upHead: [],
        upLoad: false,
        addDia: false,
        addUrl: null,
        addLoad: false,
        dataCopy: {},
        downDia: false,
        uploadDia: false,
        token: null,
        fileList: [],
        init: true,
        spanList: [
          // {
          //   arr:[],
          //   position:0
          // }
        ],
        specialSpanList:[
        specialSpanList: [
          // {
          //   arr:[],
          //   position:0
          // }
        ],
            }
        },
        watch: {
            tableData: {
                deep: true,
                handler: function() {
                    this.$nextTick(() => {
                        this.$refs.eltable.doLayout()
                    })
                }
            },
        },
        mounted() {
            this.data = this.componentData
            this.dataCopy = this.HaveJson(this.componentData)
            if(this.data.init===undefined||this.data.init===true){
                this.selectList()
            }
            this.token = {
                'token': sessionStorage.getItem('token')
            }
        },
        methods: {
        param: {}
      }
    },
    watch: {
      tableData: {
        deep: true,
        handler: function() {
          this.$nextTick(() => {
            this.$refs.eltable.doLayout()
          })
        }
      },
    },
    beforeUpdate() {
      this.$nextTick(() => {
        this.$refs.eltable.doLayout()
      })
    },
    mounted() {
      this.data = this.componentData
      this.dataCopy = this.HaveJson(this.componentData)
      if (this.data.init === undefined || this.data.init === true) {
        this.selectList()
      }
      this.token = {
        'token': sessionStorage.getItem('token')
      }
    },
    methods: {
      rowspan(spanArr, position, spanName) {
        this.tableData.forEach((item, index) => {
          if (index === 0) {
@@ -523,15 +494,20 @@
          }
        });
      },
      spanMethod({ row, column, rowIndex, columnIndex }){
      spanMethod({
        row,
        column,
        rowIndex,
        columnIndex
      }) {
        // 一般的合并行
        if(this.data.spanConfig!=undefined&&this.data.spanConfig.rows&&this.data.spanConfig.rows.length>0){
        if (this.data.spanConfig != undefined && this.data.spanConfig.rows && this.data.spanConfig.rows.length > 0) {
          let i = null;
          let obj = this.data.spanConfig.rows.find((item,index)=>{
          let obj = this.data.spanConfig.rows.find((item, index) => {
            i = index;
            return item.index==columnIndex
            return item.index == columnIndex
          })
          if(obj){
          if (obj) {
            const _row = this.spanList[i].arr[rowIndex];
            const _col = _row > 0 ? 1 : 0;
            return {
@@ -541,13 +517,14 @@
          }
        }
        // 特殊的合并行
        if(this.data.spanConfig!=undefined&&this.data.spanConfig.special&&this.data.spanConfig.special.main&&this.data.spanConfig.special.rows&&this.data.spanConfig.special.rows.length>0){
        if (this.data.spanConfig != undefined && this.data.spanConfig.special && this.data.spanConfig.special.main &&
          this.data.spanConfig.special.rows && this.data.spanConfig.special.rows.length > 0) {
          let i = null;
          let obj = this.data.spanConfig.special.rows.find((item,index)=>{
          let obj = this.data.spanConfig.special.rows.find((item, index) => {
            i = index;
            return item.index==columnIndex
            return item.index == columnIndex
          })
          if(obj){
          if (obj) {
            const _row = this.specialSpanList[i].arr[rowIndex];
            const _col = _row > 0 ? 1 : 0;
            return {
@@ -557,546 +534,555 @@
          }
        }
      },
            selectChange(val) {
                if (this.data.select) {
                    this.multipleSelection = val;
                } else {
                    this.multipleSelection = val[val.length - 1];
                }
        if(this.data.selectMethod!=undefined){
          if(this.$parent.$el.className.indexOf('el-')==0){
      selectChange(val) {
        if (this.data.select) {
          this.multipleSelection = val;
        } else {
          this.multipleSelection = val[val.length - 1];
        }
        if (this.data.selectMethod != undefined) {
          if (this.$parent.$el.className.indexOf('el-') == 0) {
            this.$parent.$parent[this.data.selectMethod](val)
          }else{
          } else {
            this.$parent[this.data.selectMethod](val)
          }
        }
            },
            select(val, row) {
                if (!this.data.select) {
                    this.$refs['eltable'].clearSelection()
                    this.$refs['eltable'].toggleRowSelection(row, true)
                }
            },
            rowClick(row, column, event) {
                if (this.data.select) {
                    this.$refs['eltable'].toggleRowSelection(row)
                } else {
                    this.$refs['eltable'].clearSelection()
                    this.$refs['eltable'].toggleRowSelection(row, true)
                }
            },
            sizeChange(val) {
                this.page.size = val
                this.selectList()
            },
            currentChange(val) {
                this.page.current = val
                this.selectList()
            },
            selectList() {
                this.loading = true
        if(this.data.isPage!=undefined&&this.data.isPage!=true){
      },
      select(val, row) {
        if (!this.data.select) {
          this.$refs['eltable'].clearSelection()
          this.$refs['eltable'].toggleRowSelection(row, true)
        }
      },
      rowClick(row, column, event) {
        if (this.data.select) {
          this.$refs['eltable'].toggleRowSelection(row)
        } else {
          this.$refs['eltable'].clearSelection()
          this.$refs['eltable'].toggleRowSelection(row, true)
        }
      },
      sizeChange(val) {
        this.page.size = val
        this.selectList()
      },
      currentChange(val) {
        this.page.current = val
        this.selectList()
      },
      selectList() {
        this.loading = true
        if (this.data.isPage != undefined && this.data.isPage != true) {
          this.page = {
            current: -1,
            size: -1,
          }
        }
                this.$axios.post(this.url, {
                    page: this.page,
                    entity: this.data.entity
                }, {
                    headers: {
                        'Content-Type': 'application/json'
                    }
                }).then(res => {
                    if (res.code === 201) {
                        this.loading = false
                        return
                    }
                    this.total = res.data.body.total
                    this.tableHead = res.data.head
                    this.tableData = res.data.body.records
                    for (var a in this.data.selectField) {
                        if (this.data.selectField[a].choose == true) {
                            this.tableData.map(b => {
                                try {
                                    b[a] = JSON.parse(b[a])
                                } catch (e) {}
                            })
                        }
                    }
        this.$axios.post(this.url, {
          page: this.page,
          entity: this.data.entity
        }, {
          headers: {
            'Content-Type': 'application/json'
          }
        }).then(res => {
          if (res.code === 201) {
            this.loading = false
            return
          }
          this.total = res.data.body.total
          this.tableHead = res.data.head
          this.tableData = res.data.body.records
          for (var a in this.data.selectField) {
            if (this.data.selectField[a].choose == true) {
              this.tableData.map(b => {
                try {
                  b[a] = JSON.parse(b[a])
                } catch (e) {}
              })
            }
          }
          // 一般的合并行
          if(this.data.spanConfig!=undefined&&this.data.spanConfig.rows&&this.data.spanConfig.rows.length>0){
          if (this.data.spanConfig != undefined && this.data.spanConfig.rows && this.data.spanConfig.rows.length >
            0) {
            this.spanList = [];
            this.data.spanConfig.rows.forEach((item,index)=>{
            this.data.spanConfig.rows.forEach((item, index) => {
              this.spanList.push({
                arr:[],
                position:0
                arr: [],
                position: 0
              })
              this.rowspan(this.spanList[index].arr, this.spanList[index].position, item.name);
            })
          }
          // 特殊的合并行
          if(this.data.spanConfig!=undefined&&this.data.spanConfig.special&&this.data.spanConfig.special.main&&this.data.spanConfig.special.rows&&this.data.spanConfig.special.rows.length>0){
          if (this.data.spanConfig != undefined && this.data.spanConfig.special && this.data.spanConfig.special
            .main && this.data.spanConfig.special.rows && this.data.spanConfig.special.rows.length > 0) {
            this.specialSpanList = []
            this.data.spanConfig.special.rows.forEach((item,index)=>{
            this.data.spanConfig.special.rows.forEach((item, index) => {
              this.specialSpanList.push({
                arr:[],
                position:0
                arr: [],
                position: 0
              })
              this.rowspan(this.specialSpanList[index].arr, this.specialSpanList[index].position, this.data.spanConfig.special.main);
              this.rowspan(this.specialSpanList[index].arr, this.specialSpanList[index].position, this.data
                .spanConfig.special.main);
            })
          }
                    this.loading = false
                }).catch(e => {
                    this.loading = false
                    this.$message.error('请刷新页面再尝试')
                })
            },
            sortChange(ob) {
                this.data.entity.orderBy = {}
                this.data.entity.orderBy.field = ob.prop
                if (ob.order == 'ascending') {
                    this.data.entity.orderBy.order = 'asc'
                } else if (ob.order == 'descending') {
                    this.data.entity.orderBy.order = 'desc'
                } else {
                    if (this.componentData.entity.orderBy != undefined) {
                        this.data.entity.orderBy = this.HaveJson(this.dataCopy.entity.orderBy)
                    }
                }
                this.selectList()
            },
            showType(val, ob) {
                var str = ob[val]
                return str == undefined ? null : ob[val].select
            },
            showLink(val, ob) {
                var str = ob[val]
                return str == undefined ? null : ob[val].method
            },
            showAddReq(label) {
                if (this.data.requiredAdd == undefined) {
                    return
                }
                for (var i = 0; i < this.data.requiredAdd.length; i++) {
                    if (label == this.data.requiredAdd[i]) {
                        return true
                    }
                }
                return false
            },
            showUpReq(label) {
                if (this.data.requiredUp == undefined) {
                    return
                }
                for (var i = 0; i < this.data.requiredUp.length; i++) {
                    if (label == this.data.requiredUp[i]) {
                        return true
                    }
                }
                return false
            },
      showUpload(label){
        if(this.data.addUpload&&this.data.addUpload.find(m=>m==label)){
          this.loading = false
        }).catch(e => {
          this.loading = false
          this.$message.error('请刷新页面再尝试')
        })
      },
      sortChange(ob) {
        this.data.entity.orderBy = {}
        this.data.entity.orderBy.field = ob.prop
        if (ob.order == 'ascending') {
          this.data.entity.orderBy.order = 'asc'
        } else if (ob.order == 'descending') {
          this.data.entity.orderBy.order = 'desc'
        } else {
          if (this.componentData.entity.orderBy != undefined) {
            this.data.entity.orderBy = this.HaveJson(this.dataCopy.entity.orderBy)
          }
        }
        this.selectList()
      },
      showType(val, ob) {
        var str = ob[val]
        return str == undefined ? null : ob[val].select
      },
      showLink(val, ob) {
        var str = ob[val]
        return str == undefined ? null : ob[val].method
      },
      showAddReq(label) {
        if (this.data.requiredAdd == undefined) {
          return
        }
        for (var i = 0; i < this.data.requiredAdd.length; i++) {
          if (label == this.data.requiredAdd[i]) {
            return true
          }
        }
        return false
      },
      showUpReq(label) {
        if (this.data.requiredUp == undefined) {
          return
        }
        for (var i = 0; i < this.data.requiredUp.length; i++) {
          if (label == this.data.requiredUp[i]) {
            return true
          }
        }
        return false
      },
      showUpload(label) {
        if (this.data.addUpload && this.data.addUpload.find(m => m == label)) {
          return true;
        }else{
        } else {
          return false;
        }
      },
      showCascader(label){
        if(this.data.cascaderField&&this.data.cascaderField[label]){
      showCascader(label) {
        if (this.data.cascaderField && this.data.cascaderField[label]) {
          return true;
        }else{
        } else {
          return false;
        }
      },
      handleTree(arr,value){
      handleTree(arr, value) {
        let label = ''
        for (let i = 0; i < arr.length; i++) {
          if(arr[i].id==value){
          if (arr[i].id == value) {
            label = arr[i].name
            return label
          }else if(arr[i].children){
            label = this.handleTree(arr[i].children,value)
          } else if (arr[i].children) {
            label = this.handleTree(arr[i].children, value)
          }
        }
        return label
      },
            main(row, val) {
                if (val.method == undefined) return
                else if (val.method == 'doDiy') {
                    if (val.id == 'update') {
                        this.upDia = true,
                        this.upData = this.HaveJson(row)
                        this.upHead = this.HaveJson(this.tableHead)
            this.upHead.forEach((item,index)=>{
              if(this.data.cascaderField&&this.data.cascaderField[item.label]){
                if(this.upData[item.label]){
                  this.upData[item.label] = this.upData[item.label].split(',').map(m=>Number(m));
                }else{
      main(row, val) {
        if (val.method == undefined) return
        else if (val.method == 'doDiy') {
          if (val.id == 'update') {
            this.upDia = true,
              this.upData = this.HaveJson(row)
            this.upHead = this.HaveJson(this.tableHead)
            this.upHead.forEach((item, index) => {
              if (this.data.cascaderField && this.data.cascaderField[item.label]) {
                if (this.upData[item.label]) {
                  this.upData[item.label] = JSON.parse(this.upData[item.label])
                } else {
                  this.upData[item.label] = []
                }
              }
            })
                        this.upHead = this.upHead.filter(a => a.label != 'createTime' && a.label != 'updateTime')
                        delete this.upData.orderBy
                        delete this.upData.createTime
                        delete this.upData.updateTime
                        delete this.upData.createUser
                        delete this.upData.updateUser
                        val.field.forEach(a => {
                            if (this.upData[a] === undefined) {
                                this.upHead.push({
                                    value: a.split('=')[0],
                                    label: a.split('=')[1]
                                })
                            } else {
                                delete this.upData[a]
                                for (var i = 0; i < this.upHead.length; i++) {
                                    if (this.upHead[i].label == a) {
                                        this.upHead.splice(i, 1);
                                        i--
                                        break
                                    }
                                }
                            }
                        })
                    } else if (val.id == 'delete') {
                        if (this.delUrl == null) {
                            this.$message.error('请给删除请求地址')
                            return
                        }
                        this.$confirm('是否删除当前数据?', "警告", {
                            confirmButtonText: "确定",
                            cancelButtonText: "取消",
                            type: "warning"
                        }).then(() => {
                            this.$axios.post(this.delUrl, {
                                id: row.id
                            }).then(res => {
                                if (res.code === 201) {
                                    return
                                }
                                this.$message.success('删除成功')
                                this.selectList()
                            }).catch(e => {
                                this.$message.error('删除失败')
                            })
                        }).catch(() => {})
                    }
                } else {
                    delete row.orderBy
                    this.$parent[val.method](row)
                }
            },
            saveUpData() {
                if (this.upUrl == null) {
                    this.$message.error('请给修改请求地址')
                    return
                }
                for (var i = 0; i < this.data.requiredUp.length; i++) {
                    if (this.upData[this.data.requiredUp[i]] === null || this.upData[this.data.requiredUp[i]] === '') {
                        var list = this.upHead.filter(a => {
                            if (a.label == this.data.requiredUp[i]) return a
                        })
                        if (list[0].value == undefined) continue
                        this.$message.error(list[0].value + '是必填项')
                        return
                    }
                }
                this.upLoad = true
                for (var a in this.data.selectField) {
                    if (this.data.selectField[a].choose == true) {
                        this.upData[a] = JSON.stringify(this.upData[a])
                    }
                }
        this.upHead.forEach((item,index)=>{
          if(this.data.cascaderField&&this.data.cascaderField[item.label]){
            if(this.upData[item.label]){
              this.upData[item.label] = this.upData[item.label].join(',');
            }else{
            this.upHead = this.upHead.filter(a => a.label != 'createTime' && a.label != 'updateTime')
            delete this.upData.orderBy
            delete this.upData.createTime
            delete this.upData.updateTime
            delete this.upData.createUser
            delete this.upData.updateUser
            val.field.forEach(a => {
              if (this.upData[a] === undefined) {
                this.upHead.push({
                  value: a.split('=')[0],
                  label: a.split('=')[1]
                })
              } else {
                delete this.upData[a]
                for (var i = 0; i < this.upHead.length; i++) {
                  if (this.upHead[i].label == a) {
                    this.upHead.splice(i, 1);
                    i--
                    break
                  }
                }
              }
            })
          } else if (val.id == 'delete') {
            if (this.delUrl == null) {
              this.$message.error('请给删除请求地址')
              return
            }
            this.$confirm('是否删除当前数据?', "警告", {
              confirmButtonText: "确定",
              cancelButtonText: "取消",
              type: "warning"
            }).then(() => {
              this.$axios.post(this.delUrl, {
                id: row.id
              }).then(res => {
                if (res.code === 201) {
                  return
                }
                this.$message.success('删除成功')
                this.selectList()
              }).catch(e => {
                this.$message.error('删除失败')
              })
            }).catch(() => {})
          }
        } else {
          delete row.orderBy
          this.$parent[val.method](row)
        }
      },
      saveUpData() {
        if (this.upUrl == null) {
          this.$message.error('请给修改请求地址')
          return
        }
        for (var i = 0; i < this.data.requiredUp.length; i++) {
          if (this.upData[this.data.requiredUp[i]] === null || this.upData[this.data.requiredUp[i]] === '') {
            var list = this.upHead.filter(a => {
              if (a.label == this.data.requiredUp[i]) return a
            })
            if (list[0].value == undefined) continue
            this.$message.error(list[0].value + '是必填项')
            return
          }
        }
        this.upLoad = true
        for (var a in this.data.selectField) {
          if (this.data.selectField[a].choose == true) {
            this.upData[a] = JSON.stringify(this.upData[a])
          }
        }
        this.upHead.forEach((item, index) => {
          if (this.data.cascaderField && this.data.cascaderField[item.label]) {
            if (this.upData[item.label]) {
              this.upData[item.label] = JSON.stringify(this.upData[item.label])
            } else {
              this.upData[item.label] = ''
            }
          }
        })
                this.$axios.post(this.upUrl, this.upData, {
                    headers: {
                        'Content-Type': 'application/json'
                    }
                }).then(res => {
                    if (res.code === 201) {
                        this.upLoad = false
                        return
                    }
                    this.$message.success('修改成功')
                    this.upDia = false
                    this.selectList()
        this.$axios.post(this.upUrl, this.upData, {
          headers: {
            'Content-Type': 'application/json'
          }
        }).then(res => {
          if (res.code === 201) {
            this.upLoad = false
            return
          }
          this.$message.success('修改成功')
          this.upDia = false
          this.selectList()
          this.$refs.eltable.doLayout();
                    this.upLoad = false
                }).catch(e => {
                    this.$message.error('修改失败')
                    this.upDia = false
                    this.upLoad = false
                })
            },
            openAddDia(addUrl) {
                this.addDia = true
                this.addUrl = addUrl
                this.upData = {}
                this.tableHead.forEach((k, v) => {
                    if (k.label != 'orderBy' && k.label != 'createTime' && k.label != 'updateTime' && k.label !=
                        'createUser' && k.label != 'updateUser')
                        this.upData[k.label] = null
                })
                this.upData = this.HaveJson(this.upData)
                this.upHead = this.HaveJson(this.tableHead)
                this.upHead = this.upHead.filter(a => a.label != 'createTime' && a.label != 'updateTime')
                var val = this.data.do.filter(a => a.id == 'update')[0]
                if (val == undefined) {
                    val = {
                        field: []
                    }
                }
                val.field.forEach(a => {
                    if (JSON.stringify(this.upData[a]) === undefined) {
                        this.upHead.push({
                            value: a.split('=')[0],
                            label: a.split('=')[1]
                        })
                    } else {
                        delete this.upData[a]
                        for (var i = 0; i < this.upHead.length; i++) {
                            if (this.upHead[i].label == a) {
                                this.upHead.splice(i, 1);
                                i--
                                break
                            }
                        }
                    }
                })
            },
            saveAddData() {
                if (this.addUrl == null) {
                    this.$message.error('请给添加请求地址')
                    return
                }
                for (var i = 0; i < this.data.requiredAdd.length; i++) {
                    if (this.upData[this.data.requiredAdd[i]] === null || this.upData[this.data.requiredAdd[i]] === '') {
                        var list = this.upHead.filter(a => {
                            if (a.label == this.data.requiredAdd[i]) return a
                        })
                        if (list[0].value == undefined) continue
                        this.$message.error(list[0].value + '是必填项')
                        return
                    }
                }
                this.addLoad = true
        this.upHead.forEach((item,index)=>{
          if(this.data.cascaderField&&this.data.cascaderField[item.label]){
            if(this.upData[item.label]){
              this.upData[item.label] = this.upData[item.label].join(',');
            }else{
          this.upLoad = false
        }).catch(e => {
          this.$message.error('修改失败')
          this.upDia = false
          this.upLoad = false
        })
      },
      openAddDia(addUrl, param) {
        this.addDia = true
        this.addUrl = addUrl
        this.param = param
        this.upData = {}
        this.tableHead.forEach((k, v) => {
          if (k.label != 'orderBy' && k.label != 'createTime' && k.label != 'updateTime' && k.label !=
            'createUser' && k.label != 'updateUser')
            this.upData[k.label] = null
        })
        this.upData = this.HaveJson(this.upData)
        this.upHead = this.HaveJson(this.tableHead)
        this.upHead = this.upHead.filter(a => a.label != 'createTime' && a.label != 'updateTime')
        var val = this.data.do.filter(a => a.id == 'update')[0]
        if (val == undefined) {
          val = {
            field: []
          }
        }
        val.field.forEach(a => {
          if (JSON.stringify(this.upData[a]) === undefined) {
            this.upHead.push({
              value: a.split('=')[0],
              label: a.split('=')[1]
            })
          } else {
            delete this.upData[a]
            for (var i = 0; i < this.upHead.length; i++) {
              if (this.upHead[i].label == a) {
                this.upHead.splice(i, 1);
                i--
                break
              }
            }
          }
        })
      },
      saveAddData() {
        if (this.addUrl == null) {
          this.$message.error('请给添加请求地址')
          return
        }
        for (var i = 0; i < this.data.requiredAdd.length; i++) {
          if (this.upData[this.data.requiredAdd[i]] === null || this.upData[this.data.requiredAdd[i]] === '') {
            var list = this.upHead.filter(a => {
              if (a.label == this.data.requiredAdd[i]) return a
            })
            if (list[0].value == undefined) continue
            this.$message.error(list[0].value + '是必填项')
            return
          }
        }
        this.addLoad = true
        this.upHead.forEach((item, index) => {
          if (this.data.cascaderField && this.data.cascaderField[item.label]) {
            if (this.upData[item.label]) {
              this.upData[item.label] = JSON.stringify(this.upData[item.label])
            } else {
              this.upData[item.label] = ''
            }
          }
        })
                this.$axios.post(this.addUrl, this.upData, {
                    headers: {
                        'Content-Type': 'application/json'
                    }
                }).then(res => {
                    if (res.code === 201) {
                        this.addLoad = false
                        return
                    }
                    this.$message.success('添加成功')
                    this.addDia = false
                    this.selectList()
                    this.addLoad = false
                }).catch(e => {
                    this.addDia = false
                    this.addLoad = false
                })
            },
            openDownDia() {
                this.downDia = true
            },
            downFile(type) {
                if (this.downUrl == null) {
                    this.$message.error('请给导出请求地址')
                    return
                }
                var page = this.HaveJson(this.page)
                if (!type) {
                    page.current = 0
                    page.size = this.total
                }
                this.loading = true
                this.$axios.post(this.downUrl, {
                    page: page,
                    entity: this.data.entity
                }, {
                    headers: {
                        'Content-Type': 'application/json'
                    }
                }).then(res => {
                    if (res.code === 201) {
                        this.loading = false
                        return
                    }
                    this.downDia = false
                    this.loading = false
                    this.$message.success('导出成功')
                    let eleLink = document.createElement('a')
                    eleLink.style.display = 'none'
                    eleLink.download = res.data
                    eleLink.href = this.javaApi + '/outPath/' + res.data
                    document.body.appendChild(eleLink)
                    eleLink.click()
                    document.body.removeChild(eleLink)
                }).catch(e => {
                    console.log(e);
                    this.loading = false
                    this.$message.error('请刷新页面再尝试')
                })
            },
            openUpload() {
                if (this.inputUrl == null) {
                    this.$message.error('请给导入请求地址')
                    return
                }
                this.uploadDia = true
            },
            beforeUpload(file, fileList) {
                if (file.raw.type != 'text/csv') {
                    this.$message.error('上传文件格式不正确');
                    this.$refs.upload.clearFiles()
                    return false;
                }
            },
            submitUpload() {
                if (this.$refs.upload.uploadFiles.length == 0) {
                    this.$message.error('未选择文件')
                    return
                }
                this.uploading = true
                this.$refs.upload.submit();
            },
            onSuccess(response, file, fileList) {
                this.$refs.upload.clearFiles()
                this.uploadDia = false
                this.uploading = false
                if (response.code == 201) {
                    this.$message.error(response.message)
                    return
                }
                this.$message.success('上传成功')
                this.selectList()
            },
            onError(err, file, fileList) {
                this.$message.error('上传失败')
                this.$refs.upload.clearFiles()
                this.uploading = false
            },
            isDisabled(label) {
                if (this.data.disabledUp == undefined) {
                    return
                }
                for (var i = 0; i < this.data.disabledUp.length; i++) {
                    if (label == this.data.disabledUp[i]) {
                        return true
                    }
                }
                return false
            },
            getSummaries(param) {
                const {
                    columns,
                    data
                } = param;
                const sums = [];
                columns.forEach((column, index) => {
                    if (index === 0) {
                        sums[index] = '合计';
                        return;
                    }
                    const values = data.map(item => Number(item[column.property]));
                    if (this.data.countFleid == undefined) {
                        sums[index] = ''
                        return
                    }
                    if (this.data.countFleid.filter(str => {
                            return str === column.property
                        }).length > 0) {
                        sums[index] = values.reduce((prev, curr) => {
                            const value = Number(curr);
                            if (!isNaN(value)) {
                                return prev + curr;
                            } else {
                                return prev;
                            }
                        }, 0);
                        sums[index] += '';
                    } else {
                        sums[index] = '';
                    }
                });
                return sums;
            },
            handleLinkEvent(row, val) {
                if (val.method == 'doDiy') {
                    this.main(row, val)
                } else {
                    this.$parent[val.method](row)
                }
            },
            getWidth() {
                let count = 0
                this.data.do.forEach(a => {
                    count += a.font.length
                })
                return count * 15 + 60 + 'px'
            },
      handleSuccessUp(response,label){
        if(typeof label === 'string'){
          if(response.code==200){
        if (this.param !== undefined && this.param !== null) {
          for (let i in this.param) {
            this.upData[i] = this.param[i]
          }
        }
        this.$axios.post(this.addUrl, this.upData, {
          headers: {
            'Content-Type': 'application/json'
          }
        }).then(res => {
          if (res.code === 201) {
            this.addLoad = false
            return
          }
          this.$message.success('添加成功')
          this.addDia = false
          this.selectList()
          this.addLoad = false
        }).catch(e => {
          this.addDia = false
          this.addLoad = false
        })
      },
      openDownDia() {
        this.downDia = true
      },
      downFile(type) {
        if (this.downUrl == null) {
          this.$message.error('请给导出请求地址')
          return
        }
        var page = this.HaveJson(this.page)
        if (!type) {
          page.current = 0
          page.size = this.total
        }
        this.loading = true
        this.$axios.post(this.downUrl, {
          page: page,
          entity: this.data.entity
        }, {
          headers: {
            'Content-Type': 'application/json'
          }
        }).then(res => {
          if (res.code === 201) {
            this.loading = false
            return
          }
          this.downDia = false
          this.loading = false
          this.$message.success('导出成功')
          let eleLink = document.createElement('a')
          eleLink.style.display = 'none'
          eleLink.download = res.data
          eleLink.href = this.javaApi + '/outPath/' + res.data
          document.body.appendChild(eleLink)
          eleLink.click()
          document.body.removeChild(eleLink)
        }).catch(e => {
          console.log(e);
          this.loading = false
          this.$message.error('请刷新页面再尝试')
        })
      },
      openUpload() {
        if (this.inputUrl == null) {
          this.$message.error('请给导入请求地址')
          return
        }
        this.uploadDia = true
      },
      beforeUpload(file, fileList) {
        if (file.raw.type != 'text/csv') {
          this.$message.error('上传文件格式不正确');
          this.$refs.upload.clearFiles()
          return false;
        }
      },
      submitUpload() {
        if (this.$refs.upload.uploadFiles.length == 0) {
          this.$message.error('未选择文件')
          return
        }
        this.uploading = true
        this.$refs.upload.submit();
      },
      onSuccess(response, file, fileList) {
        this.$refs.upload.clearFiles()
        this.uploadDia = false
        this.uploading = false
        if (response.code == 201) {
          this.$message.error(response.message)
          return
        }
        this.$message.success('上传成功')
        this.selectList()
      },
      onError(err, file, fileList) {
        this.$message.error('上传失败')
        this.$refs.upload.clearFiles()
        this.uploading = false
      },
      isDisabled(label) {
        if (this.data.disabledUp == undefined) {
          return
        }
        for (var i = 0; i < this.data.disabledUp.length; i++) {
          if (label == this.data.disabledUp[i]) {
            return true
          }
        }
        return false
      },
      getSummaries(param) {
        const {
          columns,
          data
        } = param;
        const sums = [];
        columns.forEach((column, index) => {
          if (index === 0) {
            sums[index] = '合计';
            return;
          }
          const values = data.map(item => Number(item[column.property]));
          if (this.data.countFleid == undefined) {
            sums[index] = ''
            return
          }
          if (this.data.countFleid.filter(str => {
              return str === column.property
            }).length > 0) {
            sums[index] = values.reduce((prev, curr) => {
              const value = Number(curr);
              if (!isNaN(value)) {
                return prev + curr;
              } else {
                return prev;
              }
            }, 0);
            sums[index] += '';
          } else {
            sums[index] = '';
          }
        });
        return sums;
      },
      handleLinkEvent(row, val) {
        if (val.method == 'doDiy') {
          this.main(row, val)
        } else {
          this.$parent[val.method](row)
        }
      },
      getWidth() {
        let count = 0
        this.data.do.forEach(a => {
          count += a.font.length
        })
        return count * 15 + 60 + 'px'
      },
      handleSuccessUp(response, label) {
        if (typeof label === 'string') {
          if (response.code == 200) {
            this.upData[label] = response.data.url;
          }
        }else{
          if(response.code==200){
        } else {
          if (response.code == 200) {
            this.$message.success('上传成功')
            this.selectList()
          }
        }
      },
      handleCascader(e,label){
      handleCascader(e, label) {
        this.upData[label] = e;
      },
      // 批量删除
      batchDelete(){
        if(this.multipleSelection&&this.multipleSelection.length>0){
      batchDelete() {
        if (this.multipleSelection && this.multipleSelection.length > 0) {
          this.$confirm('是否删除选中的数据?', "警告", {
                            confirmButtonText: "确定",
                            cancelButtonText: "取消",
                            type: "warning"
                        }).then(() => {
                            this.$axios.post(this.delUrl, {
                                ids: JSON.stringify(this.multipleSelection.map(item => item.id))
                            }).then(res => {
                                if (res.code === 201) {
                                    return
                                }
                                this.$message.success('删除成功')
                                this.selectList()
                            }).catch(e => {
                                this.$message.error('删除失败')
                            })
                        }).catch(() => {})
        }else{
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning"
          }).then(() => {
            this.$axios.post(this.delUrl, {
              ids: JSON.stringify(this.multipleSelection.map(item => item.id))
            }).then(res => {
              if (res.code === 201) {
                return
              }
              this.$message.success('删除成功')
              this.selectList()
            }).catch(e => {
              this.$message.error('删除失败')
            })
          }).catch(() => {})
        } else {
          this.$message.error('请选择要删除的数据')
        }
      },
        }
    }
    }
  }
</script>
src/components/view/a5-capacity-scope.vue
@@ -1,451 +1,559 @@
<style scoped>
    .title {
        height: 60px;
        line-height: 60px;
    }
  .title {
    height: 60px;
    line-height: 60px;
  }
    .bodys {
        height: 100%;
    }
  .bodys {
    height: 100%;
  }
    .search {
        background-color: #fff;
        height: 80px;
        display: flex;
        align-items: center;
    }
  .search {
    background-color: #fff;
    height: 80px;
    display: flex;
    align-items: center;
  }
    .search_thing {
        width: 350px;
        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_label {
    width: 110px;
    font-size: 14px;
    text-align: right;
  }
    .search_input {
        width: calc(100% - 110px);
    }
  .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;
    }
  .table {
    margin-top: 10px;
    background-color: #fff;
    width: calc(100% - 40px);
    height: calc(100% - 60px - 80px - 10px - 40px);
    padding: 20px;
  }
</style>
<template>
    <div class="capacity-scope">
        <div>
            <el-row class="title">
                <el-col :span="12">
                    <el-radio-group v-model="radio" @input="selectorSwitch" size="medium" fill="#3A7BFA" v-if="select==3">
                        <el-radio-button label="0">检验项目参数</el-radio-button>
                        <el-radio-button label="1">检验对象</el-radio-button>
                    </el-radio-group>
                    <el-button size="medium" type="primary" v-else-if="select==1">检验项目参数</el-button>
                    <el-button size="medium" type="primary" v-else-if="select==2">检验对象</el-button>
                </el-col>
                <el-col :span="12" style="text-align: right;">
                    <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">新增</el-button>
                    <el-button size="medium" icon="el-icon-delete">删除</el-button>
                </el-col>
            </el-row>
        </div>
        <div v-if="radio==0" class="bodys">
            <div class="search">
                <div class="search_thing">
                    <div class="search_label">检验项:</div>
                    <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                            v-model="itemParameterData.entity.inspectionItem" @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="itemParameterData.entity.inspectionItemSubclass" @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>
            <div class="table">
                <ValueTable ref="itemParameterTable" :url="$api.capacityScope.selectItemParameterList"
                    :upUrl="$api.capacityScope.upItemParameter" :delUrl="$api.capacityScope.delItemParameter"
                    :componentData="itemParameterData" :key="upIndex" />
            </div>
        </div>
        <div class="bodys">
            <div class="search" v-if="radio==1">
                <div class="search_thing">
                    <div class="search_label">样品名称:</div>
                    <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                            v-model="testObjectData.entity.specimenName" @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>
            <div class="table" v-if="radio==1">
                <ValueTable ref="testObjectTable" :url="$api.capacityScope.selectTestObjectList"
                    :upUrl="$api.capacityScope.upTestObject" :delUrl="$api.capacityScope.delTestObject"
                    :componentData="testObjectData" :key="upIndex" />
            </div>
        </div>
    </div>
  <div class="capacity-scope">
    <div>
      <el-row class="title">
        <el-col :span="12">
          <el-radio-group v-model="radio" @input="selectorSwitch" size="medium" fill="#3A7BFA" v-if="select==3">
            <el-radio-button label="0">检验项目参数</el-radio-button>
            <el-radio-button label="1">检验对象</el-radio-button>
          </el-radio-group>
          <el-button size="medium" type="primary" v-else-if="select==1">检验项目参数</el-button>
          <el-button size="medium" type="primary" v-else-if="select==2">检验对象</el-button>
        </el-col>
        <el-col :span="12" style="text-align: right;">
          <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">新增</el-button>
          <el-button size="medium" icon="el-icon-delete">删除</el-button>
        </el-col>
      </el-row>
    </div>
    <div v-if="radio==0" class="bodys">
      <div class="search">
        <div class="search_thing">
          <div class="search_label">检验项:</div>
          <div class="search_input"><el-input size="small" placeholder="请输入" clearable
              v-model="itemParameterData.entity.inspectionItem" @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="itemParameterData.entity.inspectionItemSubclass" @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>
      <div class="table">
        <ValueTable ref="itemParameterTable" :url="$api.capacityScope.selectItemParameterList"
          :upUrl="$api.capacityScope.upItemParameter" :delUrl="$api.capacityScope.delItemParameter"
          :componentData="itemParameterData" :key="upIndex" />
      </div>
    </div>
    <div class="bodys">
      <div class="search" v-if="radio==1">
        <div class="search_thing">
          <div class="search_label">检验对象:</div>
          <div class="search_input"><el-input size="small" placeholder="请输入" clearable
              v-model="testObjectData.entity.specimenName" @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>
      <div class="table" v-if="radio==1">
        <ValueTable ref="testObjectTable" :url="$api.capacityScope.selectTestObjectList"
          :upUrl="$api.capacityScope.upTestObject" :delUrl="$api.capacityScope.delTestObject"
          :componentData="testObjectData" :key="upIndex" />
      </div>
    </div>
    <el-dialog title="产品维护" :visible.sync="diaProduct" width="600px">
      <div class="body" v-if="diaProduct" style="height: 350px;overflow-y: auto;padding: 5px 0;">
        <ValueTable ref="productData" :url="$api.capacityScope.selectProductListByObjectId"
          :upUrl="$api.capacityScope.upProduct" :delUrl="$api.capacityScope.delProduct"
          :componentData="productData" :key="upIndex" />
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="diaProduct = false">取 消</el-button>
        <el-button type="primary" @click="openAdd2" :loading="productLoad">新 增</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
    import ValueTable from '../tool/value-table.vue'
    export default {
        components: {
            ValueTable
        },
        data() {
            return {
                radio: '-1',
                showItemParameter: true,
                showTestObject: false,
                itemParameterData: {
                    entity: {
                        inspectionItem: null,
                        inspectionItemSubclass: null,
                        orderBy: {
                            field: 'id',
                            order: 'asc'
                        }
                    },
                    isIndex: false,
                    showSelect: true,
                    select: true,
                    row: 2,
                    do: [{
                        id: 'update',
                        font: '编辑',
                        type: 'text',
                        method: 'doDiy',
                        field: []
                    }, {
                        id: 'delete',
                        font: '删除',
                        type: 'text',
                        method: 'doDiy'
                    }],
                    tagField: {
                        inspectionItemType: {
                            select: []
                        },
                        bsm:{
                            select: []
                        },
                        inspectionValueType:{
                            select:[]
                        },
                        laboratory:{
                            select:[]
                        },
                        method:{select:[]},
                        templateId:{
                            select:[]
                        },
                        sonLaboratory: {select:[]},
                        unit: {select:[]},
                        sample: {select:[]},
            dic: {select:[]},
                    },
                    selectField: {
                        inspectionItemType: {
                            select: []
                        },
                        bsm:{
                            select: []
                        },
                        inspectionValueType:{
                            select:[]
                        },
                        laboratory:{
                            select:[]
                        },
                        templateId:{
                            select:[]
                        },
                        method:{select:[],choose: true},
                        sample: {select:[]},
                        sonLaboratory: {select:[]},
                        unit: {select:[]},
            dic:{select:[]},
                    },
                    requiredAdd: ['sonLaboratory','inspectionItem', 'manHour', 'inspectionItemType','inspectionValueType','laboratory','unit','method','price','manDay','sample'],
                    requiredUp: ['sonLaboratory','inspectionItem', 'manHour', 'inspectionItemType','inspectionValueType','laboratory','unit','method','price','manDay','sample']
                },
                testObjectData: {
                    entity: {
                        specimenName: null,
                        orderBy: {
                            field: 'id',
                            order: 'asc'
                        }
                    },
                    isIndex: false,
                    showSelect: true,
                    select: true,
                    do: [{
                        id: 'update',
                        font: '编辑',
                        type: 'text',
                        method: 'doDiy',
                        field: ['createUserName', 'updateUserName']
                    }, {
                        id: 'delete',
                        font: '删除',
                        type: 'text',
                        method: 'doDiy'
                    }],
                    tagField: {},
                    selectField: {},
                    requiredAdd: ['specimenName','code'],
                    requiredUp: ['specimenName','code']
                },
                itemParameterEntityCopy: {},
                testObjectDataEntityCopy: {},
                upIndex: 0,
                addDia: false,
                addPower: true,
                select: 0
            }
        },
        mounted() {
            this.itemParameterEntityCopy = this.HaveJson(this.itemParameterData.entity)
            this.testObjectDataEntityCopy = this.HaveJson(this.testObjectData.entity)
            this.selectEnumByCategory()
            // this.selectEnumByCategoryForValue()
            this.selectEnumByCategoryForSpecial()
            this.selectEnumByCategoryForInspectionValueType()
            this.obtainItemParameterList()
            this.selectStandardMethods()
            this.selectTestObjectByName()
            this.getStandardTemplate()
            this.selectEnumByCategoryForSLaboratory()
  import ValueTable from '../tool/value-table.vue'
  export default {
    components: {
      ValueTable
    },
    data() {
      return {
        radio: '-1',
        showItemParameter: true,
        showTestObject: false,
        itemParameterData: {
          entity: {
            inspectionItem: null,
            inspectionItemSubclass: null,
            orderBy: {
              field: 'id',
              order: 'asc'
            }
          },
          isIndex: false,
          showSelect: true,
          select: true,
          row: 2,
          do: [{
            id: 'update',
            font: '编辑',
            type: 'text',
            method: 'doDiy',
            field: []
          }, {
            id: 'delete',
            font: '删除',
            type: 'text',
            method: 'doDiy'
          }],
          tagField: {
            inspectionItemType: {
              select: []
            },
            bsm: {
              select: []
            },
            inspectionValueType: {
              select: []
            },
            laboratory: {
              select: []
            },
            method: {
              select: []
            },
            templateId: {
              select: []
            },
            sonLaboratory: {
              select: []
            },
            unit: {
              select: []
            },
            dic: {
              select: []
            },
          },
          selectField: {
            inspectionItemType: {
              select: []
            },
            bsm: {
              select: []
            },
            inspectionValueType: {
              select: []
            },
            laboratory: {
              select: []
            },
            templateId: {
              select: []
            },
            method: {
              select: [],
              choose: true
            },
            sonLaboratory: {
              select: []
            },
            unit: {
              select: []
            },
            dic: {
              select: []
            },
          },
          cascaderField:{
            sample:{
              tree:[]
            },
            // 字段配置
            props:{
              value:'name',
              label:'name',
              checkStrictly: false
            }
          },
          requiredAdd: ['sonLaboratory', 'inspectionItem', 'manHour', 'inspectionItemType', 'inspectionValueType',
            'unit', 'method', 'price', 'manDay'
          ],
          requiredUp: ['sonLaboratory', 'inspectionItem', 'manHour', 'inspectionItemType', 'inspectionValueType',
            'unit', 'method', 'price', 'manDay'
          ]
        },
        testObjectData: {
          entity: {
            specimenName: null,
            orderBy: {
              field: 'id',
              order: 'asc'
            }
          },
          isIndex: false,
          showSelect: true,
          select: true,
          do: [{
            id: 'update',
            font: '编辑',
            type: 'text',
            method: 'doDiy',
            field: ['createUserName', 'updateUserName', 'product']
          }, {
            id: 'delete',
            font: '删除',
            type: 'text',
            method: 'doDiy'
          }, {
            font: '产品维护',
            type: 'text',
            method: 'upProduct'
          }],
          tagField: {
            laboratoryId: {
              select: []
            }
          },
          selectField: {
            laboratoryId: {
              select: []
            }
          },
          requiredAdd: ['specimenName', 'code', 'laboratoryId'],
          requiredUp: ['specimenName', 'code', 'laboratoryId']
        },
        itemParameterEntityCopy: {},
        testObjectDataEntityCopy: {},
        upIndex: 0,
        addDia: false,
        addPower: true,
        select: 0,
        laboratory: [],
        productLoad: false,
        diaProduct: false,
        productData: {
          entity: {
            objectId: 0,
            orderBy: {
              field: 'id',
              order: 'asc'
            }
          },
          isPage: false,
          isIndex: true,
          showSelect: false,
          select: true,
          do: [{
            id: 'update',
            font: '编辑',
            type: 'text',
            method: 'doDiy',
            field: []
          }, {
            id: 'delete',
            font: '删除',
            type: 'text',
            method: 'doDiy'
          }],
          tagField: {},
          selectField: {},
          requiredAdd: ['name','nameEn'],
          requiredUp: ['name','nameEn']
        }
      }
    },
    mounted() {
      this.itemParameterEntityCopy = this.HaveJson(this.itemParameterData.entity)
      this.testObjectDataEntityCopy = this.HaveJson(this.testObjectData.entity)
      this.selectEnumByCategory()
      // this.selectEnumByCategoryForValue()
      this.selectEnumByCategoryForSpecial()
      this.selectEnumByCategoryForInspectionValueType()
      this.obtainItemParameterList()
      this.selectStandardMethods()
      this.selectTestObjectByName()
      this.getStandardTemplate()
      this.selectEnumByCategoryForSLaboratory()
      this.selectDocUnit()
            this.selectEnumByCategoryForUnit()
            this.getPower('0')
        },
        methods: {
            selectorSwitch(radio) {
                if (this.radio === '0') {
                    this.showItemParameter = true;
                    this.showTestObject = false;
                    /* this.$nextTick(() => {
                        this.$refs.itemParameterTable.selectList()
                    }) */
                } else {
                    this.showTestObject = true;
                    this.showItemParameter = false;
                }
                this.getPower(radio)
            },
            refreshTable() {
                if (this.radio === '0') {
                    this.$refs['itemParameterTable'].selectList()
                } else {
                    this.$refs['testObjectTable'].selectList()
                }
            },
            refresh() {
                this.itemParameterData.entity = this.HaveJson(this.itemParameterEntityCopy)
                this.testObjectData.entity = this.HaveJson(this.testObjectDataEntityCopy)
                this.upIndex++
            },
            openAdd() {
                if (this.radio === '0') {
                    this.$refs.itemParameterTable.openAddDia(this.$api.capacityScope.addItemParameter);
                } else {
                    this.$refs.testObjectTable.openAddDia(this.$api.capacityScope.addTestObject);
                }
            },
            selectEnumByCategory() {
                this.$axios.post(this.$api.enums.selectEnumByCategory, {
                    category: "检验项类型"
                }).then(res => {
                    this.itemParameterData.selectField.inspectionItemType.select = res.data
                    res.data[1].type = 'info'
                    this.itemParameterData.tagField.inspectionItemType.select = res.data
                })
            },
            selectEnumByCategoryForValue() {
                this.$axios.post(this.$api.enums.selectEnumByCategory, {
                    category: "取值类型"
                }).then(res => {
                    this.itemParameterData.selectField.valueType.select = res.data
                    this.itemParameterData.tagField.valueType.select = res.data
                })
            },
            selectEnumByCategoryForSpecial() {
                this.$axios.post(this.$api.enums.selectEnumByCategory, {
                    category: "是否"
                }).then(res => {
                    this.itemParameterData.selectField.bsm.select = res.data
                    this.itemParameterData.tagField.bsm.select = res.data
                })
            },
            selectEnumByCategoryForInspectionValueType() {
                this.$axios.post(this.$api.enums.selectEnumByCategory, {
                    category: "检验值类型"
                }).then(res => {
                    this.itemParameterData.selectField.inspectionValueType.select = res.data
                    this.itemParameterData.tagField.inspectionValueType.select = res.data
                })
            },
            selectEnumByCategoryForSLaboratory() {
                this.$axios.post(this.$api.enums.selectEnumByCategory, {
                    category: "子实验室"
                }).then(res => {
                    this.itemParameterData.selectField.sonLaboratory.select = res.data
                    this.itemParameterData.tagField.sonLaboratory.select = res.data
                })
            },
            selectEnumByCategoryForUnit() {
                this.$axios.post(this.$api.enums.selectEnumByCategory, {
                    category: "单位"
                }).then(res => {
                    this.itemParameterData.selectField.unit.select = res.data
                    this.itemParameterData.tagField.unit.select = res.data
                })
            },
      this.selectEnumByCategoryForUnit()
      this.getPower('0')
    },
    methods: {
      selectorSwitch(radio) {
        if (this.radio === '0') {
          this.showItemParameter = true;
          this.showTestObject = false;
          /* this.$nextTick(() => {
              this.$refs.itemParameterTable.selectList()
          }) */
        } else {
          this.showTestObject = true;
          this.showItemParameter = false;
        }
        this.getPower(radio)
      },
      refreshTable() {
        if (this.radio === '0') {
          this.$refs['itemParameterTable'].selectList()
        } else {
          this.$refs['testObjectTable'].selectList()
        }
      },
      refresh() {
        this.itemParameterData.entity = this.HaveJson(this.itemParameterEntityCopy)
        this.testObjectData.entity = this.HaveJson(this.testObjectDataEntityCopy)
        this.upIndex++
      },
      openAdd() {
        if (this.radio === '0') {
          this.$refs.itemParameterTable.openAddDia(this.$api.capacityScope.addItemParameter);
        } else {
          this.$refs.testObjectTable.openAddDia(this.$api.capacityScope.addTestObject);
        }
      },
      selectEnumByCategory() {
        this.$axios.post(this.$api.enums.selectEnumByCategory, {
          category: "检验项类型"
        }).then(res => {
          this.itemParameterData.selectField.inspectionItemType.select = res.data
          res.data[1].type = 'info'
          this.itemParameterData.tagField.inspectionItemType.select = res.data
        })
      },
      selectEnumByCategoryForValue() {
        this.$axios.post(this.$api.enums.selectEnumByCategory, {
          category: "取值类型"
        }).then(res => {
          this.itemParameterData.selectField.valueType.select = res.data
          this.itemParameterData.tagField.valueType.select = res.data
        })
      },
      selectEnumByCategoryForSpecial() {
        this.$axios.post(this.$api.enums.selectEnumByCategory, {
          category: "是否"
        }).then(res => {
          this.itemParameterData.selectField.bsm.select = res.data
          this.itemParameterData.tagField.bsm.select = res.data
        })
      },
      selectEnumByCategoryForInspectionValueType() {
        this.$axios.post(this.$api.enums.selectEnumByCategory, {
          category: "检验值类型"
        }).then(res => {
          this.itemParameterData.selectField.inspectionValueType.select = res.data
          this.itemParameterData.tagField.inspectionValueType.select = res.data
        })
      },
      selectEnumByCategoryForSLaboratory() {
        this.$axios.post(this.$api.enums.selectEnumByCategory, {
          category: "子实验室"
        }).then(res => {
          this.itemParameterData.selectField.sonLaboratory.select = res.data
          this.itemParameterData.tagField.sonLaboratory.select = res.data
        })
      },
      selectEnumByCategoryForUnit() {
        this.$axios.post(this.$api.enums.selectEnumByCategory, {
          category: "单位"
        }).then(res => {
          this.itemParameterData.selectField.unit.select = res.data
          this.itemParameterData.tagField.unit.select = res.data
        })
      },
      selectDocUnit() {
                this.$axios.post(this.$api.enums.getDic).then(res => {
                    this.itemParameterData.selectField.dic.select = res.data.map(m=>{
        this.$axios.post(this.$api.enums.getDic).then(res => {
          this.itemParameterData.selectField.dic.select = res.data.map(m => {
            return {
              label: m,
              value:m
              value: m
            }
          })
                    this.itemParameterData.tagField.dic.select = res.data.map(m=>{
          this.itemParameterData.tagField.dic.select = res.data.map(m => {
            return {
              label: m,
              value:m
              value: m
            }
          })
                })
            },
            obtainItemParameterList() {
                this.$axios.get(this.$api.laboratoryScope.obtainItemParameterList).then(res => {
                    let data = []
                    res.data.forEach(a=>{
                        data.push({
                            label: a.laboratoryName,
                            value: a.laboratoryName
                        })
                    })
                    this.itemParameterData.selectField.laboratory.select = data
                    this.itemParameterData.tagField.laboratory.select = data
                })
            },
            selectStandardMethods() {
                this.$axios.get(this.$api.standardMethod.selectStandardMethods).then(res => {
                    let data = []
                    res.data.forEach(a=>{
                        data.push({
                            label: a.code,
                            value: a.code
                        })
                    })
                    this.itemParameterData.selectField.method.select = data
                    this.itemParameterData.tagField.method.select = data
                })
            },
            selectTestObjectByName() {
                this.$axios.get(this.$api.capacityScope.selectTestObjectByName).then(res => {
                    let data = []
                    res.data.forEach(a => {
                        data.push({
                            label: a.specimenName,
                            value: a.id,
                            type: 'success'
                        })
                    })
                    this.itemParameterData.selectField.sample.select = data
                    this.itemParameterData.tagField.sample.select = data
                })
            },
            getStandardTemplate() {
                this.$axios.get(this.$api.StandardTemplate.getStandardTemplate).then(res => {
                    let data = []
                    res.data.forEach(a => {
                        data.push({
                            label: a.name,
                            value: a.id,
                            type: 'success'
                        })
                    })
                    this.itemParameterData.selectField.templateId.select = data
                    this.itemParameterData.tagField.templateId.select = data
                })
            },
            // 权限分配
            getPower(radio) {
                let power = JSON.parse(sessionStorage.getItem('power'))
                let up = false
                let add = false
                let del = false
                let select = 0
                for (var i = 0; i < power.length; i++) {
                    if (power[i].menuMethod == 'selectItemParameterList') {
                        select += 1
                    }
                    if (power[i].menuMethod == 'selectTestObjectList') {
                        select += 2
                    }
                    if (this.radio === '0') {
                        if (power[i].menuMethod == 'upItemParameter') {
                            up = true
                        }
                        if (power[i].menuMethod == 'delItemParameter') {
                            del = true
                        }
                        if (power[i].menuMethod == 'addItemParameter') {
                            add = true
                        }
                    } else {
                        if (power[i].menuMethod == 'upTestObject') {
                            up = true
                        }
                        if (power[i].menuMethod == 'delTestObject') {
                            del = true
                        }
                        if (power[i].menuMethod == 'addTestObject') {
                            add = true
                        }
                    }
                }
                if (this.radio === '0') {
                    if (!del) {
                        this.itemParameterData.do.splice(1, 1)
                    }
                    if (!up) {
                        this.itemParameterData.do.splice(0, 1)
                    }
                } else {
                    if (!del) {
                        this.testObjectData.do.splice(1, 1)
                    }
                    if (!up) {
                        this.testObjectData.do.splice(0, 1)
                    }
                }
                this.addPower = add
                this.select = select
                if (select == 1 || select == 3) this.radio = radio
                else if (select == 2) this.radio = '1'
                else this.radio = '-1'
            }
        }
    }
        })
      },
      obtainItemParameterList() {
        this.$axios.get(this.$api.laboratoryScope.obtainItemParameterList).then(res => {
          let data = []
          res.data.forEach(a => {
            data.push({
              label: a.laboratoryName,
              value: a.id
            })
          })
          this.itemParameterData.selectField.laboratory.select = data
          this.itemParameterData.tagField.laboratory.select = data
          this.testObjectData.selectField.laboratoryId.select = data
          this.testObjectData.tagField.laboratoryId.select = data
          this.laboratory = data
        })
      },
      selectStandardMethods() {
        this.$axios.get(this.$api.standardMethod.selectStandardMethods).then(res => {
          let data = []
          res.data.forEach(a => {
            data.push({
              label: a.code,
              value: a.code
            })
          })
          this.itemParameterData.selectField.method.select = data
          this.itemParameterData.tagField.method.select = data
        })
      },
      selectTestObjectByName() {
        this.$axios.get(this.$api.capacityScope.getItemTree).then(res => {
          res.data.forEach(a=>{
            this.cascaderFieldData(a)
          })
          this.itemParameterData.cascaderField.sample.tree = 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)
          })
        }
      },
      getStandardTemplate() {
        this.$axios.get(this.$api.StandardTemplate.getStandardTemplate).then(res => {
          let data = []
          res.data.forEach(a => {
            data.push({
              label: a.name,
              value: a.id,
              type: 'success'
            })
          })
          this.itemParameterData.selectField.templateId.select = data
          this.itemParameterData.tagField.templateId.select = data
        })
      },
      // 权限分配
      getPower(radio) {
        let power = JSON.parse(sessionStorage.getItem('power'))
        let up = false
        let add = false
        let del = false
        let product = false
        let select = 0
        for (var i = 0; i < power.length; i++) {
          if (power[i].menuMethod == 'selectItemParameterList') {
            select += 1
          }
          if (power[i].menuMethod == 'selectTestObjectList') {
            select += 2
          }
          if (this.radio === '0') {
            if (power[i].menuMethod == 'upItemParameter') {
              up = true
            }
            if (power[i].menuMethod == 'delItemParameter') {
              del = true
            }
            if (power[i].menuMethod == 'addItemParameter') {
              add = true
            }
          } else {
            if (power[i].menuMethod == 'upTestObject') {
              up = true
            }
            if (power[i].menuMethod == 'delTestObject') {
              del = true
            }
            if (power[i].menuMethod == 'addTestObject') {
              add = true
            }
            if (power[i].menuMethod == 'selectProductListByObjectId') {
              product = true
            }
          }
        }
        if (this.radio === '0') {
          if (!del) {
            this.itemParameterData.do.splice(1, 1)
          }
          if (!up) {
            this.itemParameterData.do.splice(0, 1)
          }
        } else {
          if (!product) {
            this.testObjectData.do.splice(2, 1)
          }
          if (!del) {
            this.testObjectData.do.splice(1, 1)
          }
          if (!up) {
            this.testObjectData.do.splice(0, 1)
          }
        }
        this.addPower = add
        this.select = select
        if (select == 1 || select == 3) this.radio = radio
        else if (select == 2) this.radio = '1'
        else this.radio = '-1'
      },
      upProduct(row) {
        this.productData.entity.objectId = row.id
        this.diaProduct = true
      },
      openAdd2(){
          this.$refs.productData.openAddDia(this.$api.capacityScope.addProduct, {objectId: this.productData.entity.objectId});
      },
    }
  }
</script>
src/components/view/a6-device-management.vue
@@ -55,13 +55,14 @@
            <el-row class="title">
                <el-col :span="12" style="padding-left: 20px;">设备工具明细</el-col>
                <el-col :span="12" style="text-align: right;">
                    <el-button size="medium" type="primary" @click="dialogVisible2 = true">新增</el-button>
                </el-col>
            </el-row>
        </div>
        <div class="search">
            <div class="search_thing">
                <div class="search_label">状态:</div>
                <el-select v-model="componentData.entity.deviceStatus" placeholder="全部">
                <el-select v-model="componentData.entity.deviceStatus" placeholder="全部" size="small">
                    <el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value">
                    </el-option>
                </el-select>
@@ -76,19 +77,9 @@
                <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                        v-model="componentData.entity.specificationModel" @keyup.enter.native="refreshTable()"></el-input></div>
            </div>
            <div class="search_thing">
                <div class="search_label">设备分类:</div>
                <el-select v-model="componentData.entity.largeCategory" placeholder="请选择">
                    <el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value">
                    </el-option>
                </el-select>
            </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>
                <el-col :span="12" style="text-align: right;">
                    <el-button size="medium" type="primary" @click="dialogVisible2 = true">新增</el-button>
                </el-col>
            </div>
        </div>
        <div class="table">
@@ -460,7 +451,7 @@
                options: [],
                labelPosition: 'right',
                dialogVisible: false,
                dialogVisible2: true,
                dialogVisible2: false,
                addPower: false,
                componentData: {
                    entity: {