spring
2025-02-14 f9c43ac677055208074879262c670926fbdee44b
标准库搬迁50%
已修改1个文件
已添加3个文件
2463 ■■■■■ 文件已修改
src/api/standard/standardLibrary.js 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/standard/model/index.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/views/standard/standardLibrary/index.vue 2253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/standard/standardLibrary.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,208 @@
import request from "@/utils/request";
// æ ‡å‡†åº“树排序
export function updateTreeSort(data) {
  return request({
    url: "/standardTree/updateTreeSort",
    method: "post",
    data: data,
  });
}
// æ ‡å‡†åº“检验项排序保存接口
export function resetTreeDragBatch(data) {
  return request({
    url: "/standardTree/resetTreeDragBatch",
    method: "post",
    data: data,
  });
}
// åˆ é™¤æ ‡å‡†æ ‘的层级
export function delStandardTree(data) {
  return request({
    url: "/standardTree/delStandardTree",
    method: "post",
    data: data,
  });
}
// èŽ·å–æ ‡å‡†æ ‘
export function selectStandardTreeList(query) {
  return request({
    url: "/standardTree/selectStandardTreeList",
    method: "get",
    params: query,
  });
}
// èŽ·å–å®žéªŒå®¤åç§°
export function obtainItemParameterList(query) {
  return request({
    url: "/laboratoryScope/obtainItemParameterList",
    method: "get",
    params: query,
  });
}
// èŽ·å–æ£€éªŒå¯¹è±¡æžšä¸¾
export function selectTestObjectByName(query) {
  return request({
    url: "/capacityScope/selectTestObjectByName",
    method: "get",
    params: query,
  });
}
// ç»™æ ‡å‡†æ ‘添加检验标准
export function addStandardMethodList(data) {
  return request({
    url: "/standardTree/addStandardMethodList",
    method: "post",
    data: data,
  });
}
// æ·»åŠ æ ‡å‡†æ ‘
export function addStandardTree(data) {
  return request({
    url: "/standardTree/addStandardTree",
    method: "post",
    data: data,
  });
}
// ä¿®æ”¹æ ‡å‡†æ ‘
export function updateStandardTree(data) {
  return request({
    url: "/standardTree/updateStandardTree",
    method: "post",
    data: data,
  });
}
// æ ¹æ®æ ‡å‡†æ ‘进行标准查询
export function selectsStandardMethodByFLSSM(data) {
  return request({
    url: "/standardTree/selectsStandardMethodByFLSSM",
    method: "post",
    data: data,
  });
}
// ä¿®æ”¹æ ‡å‡†åº“中的要求值
export function upStandardProductList(data) {
  return request({
    url: "/standardTree/upStandardProductList",
    method: "post",
    data: data,
  });
}
// åˆ é™¤æ ‡å‡†æ ‘下的检验标准
export function delStandardMethodByFLSSM(data) {
  return request({
    url: "/standardTree/delStandardMethodByFLSSM",
    method: "post",
    data: data,
  });
}
// åˆ é™¤æ ‡å‡†æ ‘下的检验标准
export function delStandardProductByIds(data) {
  return request({
    url: "/standardTree/delStandardProductByIds",
    method: "post",
    data: data,
  });
}
// æ–°å¢žæ ‡å‡†æ ‘下的检验项目
export function addStandardProduct(data) {
  return request({
    url: "/standardTree/addStandardProduct",
    method: "post",
    data: data,
  });
}
// é€šè¿‡æ£€éªŒæ ‡å‡†æŸ¥è¯¢æ£€éªŒé¡¹ç›®
export function selectStandardProductListByMethodId(data) {
  return request({
    url: "/standardTree/selectStandardProductListByMethodId",
    method: "post",
    data: data,
  });
}
// ä¿®æ”¹æ ‡å‡†åº“中的区间设置
export function updateSection(data) {
  return request({
    url: "/standardTree/updateSection",
    method: "post",
    data: data,
  });
}
// èŽ·å–äº§å“æž¶æž„
export function upStandardProducts(data) {
  return request({
    url: "/standardTree/upStandardProducts",
    method: "post",
    data: data,
  });
}
// æŸ¥è¯¢åŽŸå§‹è®°å½•æ¨¡æ¿æžšä¸¾
export function getStandardTemplate(query) {
  return request({
    url: "/StandardTemplate/getStandardTemplate",
    method: "get",
    params: query,
  });
}
// èŽ·å–æ ‡å‡†æ–¹æ³•æžšä¸¾
export function selectStandardMethods(query) {
  return request({
    url: "/standardMethod/selectStandardMethods",
    method: "get",
    params: query,
  });
}
// æ‰¹é‡ç¼–辑查询检验项目
export function selectStandardProductByMethodId(data) {
  return request({
    url: "/standardTree/selectStandardProductByMethodId",
    method: "post",
    data: data,
  });
}
// æ‰¹é‡ç¼–辑查询所有检验项目和检验子项枚举
export function selectStandardProductEnumByMethodId(data) {
  return request({
    url: "/standardTree/selectStandardProductEnumByMethodId",
    method: "post",
    data: data,
  });
}
// é‡ç½®æ ‡å‡†åº“单价
export function resetTreeOfPrice(data) {
  return request({
    url: "/standardTree/resetTreeOfPrice",
    method: "post",
    data: data,
  });
}
// é‡ç½®æ ‡å‡†åº“工时系数
export function resetTreeOfHour(data) {
  return request({
    url: "/standardTree/resetTreeOfHour",
    method: "post",
    data: data,
  });
}
src/views/standard/model/index.vue
src/views/standard/standardLibrary/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2253 @@
<style scoped>
.standard {
  padding: 10px 0;
  display: flex;
}
.left {
  width: 330px;
  height: calc(100% - 40px - 10px);
  background-color: white;
  padding: 15px;
}
.custom-tree-node {
  width: 100%;
  line-height: 32px;
}
.custom-tree-node .el-icon-delete {
  color: #3a7bfa;
  opacity: 0;
  font-size: 18px;
}
.custom-tree-node:hover .el-icon-delete {
  opacity: 1;
}
.custom-tree-node .el-icon-edit {
  color: #3a7bfa;
  opacity: 0;
  font-size: 18px;
}
.custom-tree-node:hover .el-icon-edit {
  opacity: 1;
}
.node_i {
  color: orange;
  font-size: 18px;
}
.right {
  margin-left: 5px;
  width: calc(100% - 365px);
  height: calc(100% - 40px);
}
.right .title {
  height: 34px;
  line-height: 34px;
  padding: 0 10px;
  background-color: white;
}
.standard_table {
  border-top: 1px solid #ebeef5;
  background-color: white;
}
.product_table {
  border-top: 1px solid #ebeef5;
  height: calc(100% - 235px);
  margin-top: 5px;
  background-color: white;
  user-select: none;
}
.product_table .el-table {
  height: calc(100% - 35px) !important;
}
.sort {
  width: 80% !important;
  overflow: hidden;
}
>>> .el-table__body-wrapper {
  height: calc(100% - 46px) !important;
}
>>> .header-class {
  height: 40px !important;
}
>>> .header-class th.el-table__cell > .cell {
  line-height: 20px !important;
  padding-top: 0 !important;
  padding-bottom: 0 !important;
}
>>> .el-table__row {
  height: 35px !important;
}
.search {
  border-bottom: 1px solid #ebeef5;
  margin-bottom: 16px;
  display: flex;
  align-items: center;
  box-sizing: border-box;
  padding-bottom: 10px;
}
.search-item {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
}
.search-item .el-row {
  display: flex;
  align-items: center;
}
.search-item .el-col {
  margin-left: 0;
}
.more-edit .dialog-footer {
  position: absolute;
  top: 15px;
  right: 70px;
}
>>> .is-disabled .el-textarea__inner {
  background: rgba(0, 0, 0, 0.05) !important;
}
>>> .el-table__body-wrapper::-webkit-scrollbar {
  height: 14px; /* è®¾ç½®æ»šåŠ¨æ¡å®½åº¦ */
}
</style>
<style>
.standard .el-tree-node__content {
  height: 32px;
  font-size: 14px;
  border-radius: 2px;
}
.standard
  .el-tree--highlight-current
  .el-tree-node.is-current
  > .el-tree-node__content {
  color: #3a7bfa;
}
.standard .has-gutter .el-table__cell .cell {
  line-height: 34px;
  background-color: #f8f8f8;
}
.standard .has-gutter .el-table__cell {
  background-color: #fafafa !important;
}
.standard .standard_table .el-table__row .cell {
  font-size: 14px;
}
.standard .el-table .warning-row .cell {
  color: #bababa;
}
.standard .el-table-filter__list {
  max-height: 400px;
  overflow-y: auto;
}
.standard .el-upload {
  width: 100%;
}
.standard .el-upload-dragger {
  width: 100%;
}
.standard .handleBtn.is-disabled .el-upload:focus {
  color: #c0c4cc !important;
}
.standard .avatar-uploader .el-upload {
  height: 80px;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>
<template>
  <div class="standard">
    <div class="left">
      <el-row>
        <el-col :span="20">
          <el-input
            v-model="search"
            clearable
            placeholder="输入关键字进行搜索"
            size="small"
            style="margin-bottom: 5px"
            suffix-icon="el-icon-search"
            @blur="searchFilter"
            @clear="searchFilter"
          ></el-input>
        </el-col>
        <el-col
          v-if="addPower"
          :span="4"
          style="text-align: center; line-height: 30px"
        >
          <el-button
            circle
            icon="el-icon-plus"
            size="mini"
            type="primary"
            @click="addDia = true"
          ></el-button>
        </el-col>
      </el-row>
      <el-tree
        ref="tree"
        v-loading="treeLoad"
        :allow-drop="allowDrop"
        :data="list"
        :default-expanded-keys="expandedKeys"
        :draggable="true"
        :filter-node-method="filterNode"
        :props="{ children: 'children', label: 'label' }"
        highlight-current
        node-key="label"
        style="
          height: calc(100% - 30px);
          overflow-y: scroll;
          scrollbar-width: none;
        "
        @node-click="handleNodeClick"
        @node-expand="nodeOpen"
        @node-collapse="nodeClose"
        @node-drop="handleDrop"
      >
        <div slot-scope="{ node, data }" class="custom-tree-node">
          <el-row style="width: 100%">
            <el-col
              :class="{ sort: node.level > 3 }"
              :span="19"
              :title="data.label"
              style="text-align: left"
            >
              <span>
                <i
                  :class="`node_i ${
                    data.children != undefined
                      ? data.code === '[1]'
                        ? 'el-icon-folder-opened'
                        : 'el-icon-folder'
                      : 'el-icon-tickets'
                  }`"
                ></i>
                {{ data.label }}
              </span>
            </el-col>
            <el-col
              v-if="
                checkPermi(['system:standard:delStandardTree']) &&
                (node.data.children === null ||
                  node.data.children === undefined)
              "
              :span="2"
              style="text-align: right"
            >
              <el-button
                size="mini"
                type="text"
                @click="editTreeName(node.data)"
              >
                <i class="el-icon-edit"></i>
              </el-button>
            </el-col>
            <el-col
              v-if="
                checkPermi(['system:standard:delStandardTree']) &&
                (node.data.children === null ||
                  node.data.children === undefined)
              "
              :span="2"
              style="text-align: right"
            >
              <el-button
                size="mini"
                type="text"
                @click.stop="remove(node, data)"
              >
                <i class="el-icon-delete"></i>
              </el-button>
            </el-col>
          </el-row>
        </div>
      </el-tree>
    </div>
    <div class="right">
      <el-row class="title" style="width: 100%">
        <el-col :span="20" style="font-size: 14px; color: #999">{{
          selectTree
        }}</el-col>
        <el-col :span="4">
          <el-button
            v-if="isShowCopy"
            size="small"
            style="position: absolute; right: 50px; top: 1px"
            type="primary"
            @click="openCopyDia"
            >批量复制</el-button
          >
        </el-col>
      </el-row>
      <el-row v-loading="tableLoad" class="standard_table">
        <el-table
          ref="standard"
          :data="standardList"
          class="el-table"
          header-row-class-name="header-class"
          height="220"
          highlight-current-row
          style="width: 100%; height: 220px !important"
          tooltip-effect="dark"
          @row-click="rowClick"
        >
          <el-table-column
            label="标准编号"
            prop="code"
            show-overflow-tooltip
            width="200"
          >
            <template slot-scope="scope">
              <span style="color: red; font-size: 14px">{{
                scope.row["code"]
              }}</span>
            </template>
          </el-table-column>
          <el-table-column
            label="标准名称"
            prop="name"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column
            label="备注"
            prop="remark"
            show-overflow-tooltip
          ></el-table-column>
        </el-table>
      </el-row>
      <el-row v-loading="tableLoad2" class="product_table">
        <el-table
          id="templateParamTable"
          ref="productTable"
          v-loading="productTableLoading"
          :data="productList"
          :fit="true"
          :row-class-name="tableRowClassName"
          border
          class="productTable"
          header-row-class-name="header-class"
          height="100%"
          row-key="id"
          stripe
          style="width: 100%"
          tooltip-effect="dark"
          @select="upProductSelect"
          @selection-change="handleSelectionChange"
          @select-all="handleAll"
        >
          <el-table-column type="selection" width="50"> </el-table-column>
          <el-table-column
            label="产品"
            min-width="100"
            prop="sample"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column
            label="型号"
            min-width="100"
            prop="model"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column
            label="检验项分类"
            min-width="140"
            prop="inspectionItemClass"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column
            label="检验项"
            min-width="140"
            prop="inspectionItem"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column
            label="检验项子项"
            min-width="140"
            prop="inspectionItemSubclass"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column
            label="子实验室"
            prop="sonLaboratory"
            show-overflow-tooltip
            width="130"
          ></el-table-column>
          <el-table-column label="要求值" min-width="200px" prop="ask">
            <template slot-scope="scope">
              <el-input
                v-if="checkPermi(['system:standard:upStandardProduct'])"
                v-model="scope.row.ask"
                :autosize="{ minRows: 1, maxRows: 3 }"
                clearable
                placeholder="要求值"
                size="small"
                type="textarea"
                @change="(value) => upStandardProductList(value, scope.row.id)"
              ></el-input>
              <span v-else>{{ scope.row.ask }}</span>
            </template>
          </el-table-column>
          <el-table-column label="要求描述" min-width="220px" prop="tell">
            <template slot-scope="scope">
              <el-input
                v-if="checkPermi(['system:standard:upStandardProduct'])"
                v-model="scope.row.tell"
                :autosize="{ minRows: 1, maxRows: 3 }"
                clearable
                placeholder="要求描述"
                size="small"
                type="textarea"
                @change="
                  (value) => upStandardProductListOfTell(value, scope.row.id)
                "
              ></el-input>
              <span v-else>{{ scope.row.ask }}</span>
            </template>
          </el-table-column>
          <el-table-column label="试验方法" prop="method" width="200">
            <template slot-scope="scope">
              <el-select
                v-if="checkPermi(['system:standard:upStandardProduct'])"
                v-model="scope.row.methodS"
                clearable
                placeholder="试验方法"
                size="small"
                @change="
                  (value) => upStandardProductListOfMethodS(value, scope.row.id)
                "
              >
                <el-option
                  v-for="(a, i) in scope.row.method &&
                  JSON.parse(scope.row.method)"
                  :key="i"
                  :label="a"
                  :value="a"
                ></el-option>
              </el-select>
              <span v-else>{{ scope.row.methodS }}</span>
            </template>
          </el-table-column>
          <el-table-column
            label="条件"
            min-width="140"
            prop="radius"
            show-overflow-tooltip
          >
            <template slot-scope="scope">
              <el-select
                v-if="checkPermi(['system:standard:upStandardProduct'])"
                v-model="scope.row.radius"
                clearable
                placeholder="条件"
                size="small"
                @change="
                  (value) => upStandardProductListOfRadius(value, scope.row.id)
                "
              >
                <el-option
                  v-for="(a, i) in scope.row.radiusList &&
                  JSON.parse(scope.row.radiusList)"
                  :key="i"
                  :label="a"
                  :value="a"
                ></el-option>
              </el-select>
              <span v-else>{{ scope.row.radius }}</span>
            </template>
          </el-table-column>
          <el-table-column
            label="计量单位"
            prop="unit"
            show-overflow-tooltip
            width="100"
          ></el-table-column>
          <el-table-column label="单价(元)" prop="price" width="120">
            <template slot-scope="scope">
              <el-input
                v-if="checkPermi(['system:standard:upStandardProduct'])"
                v-model="scope.row.price"
                placeholder="单价(元)"
                size="small"
                @change="
                  (value) => upStandardProductListOfPrice(value, scope.row.id)
                "
              >
              </el-input>
              <span v-else>{{ scope.row.price }}</span>
            </template>
          </el-table-column>
          <el-table-column label="工时系数" prop="manHour" width="120">
            <template slot-scope="scope">
              <el-input
                v-if="checkPermi(['system:standard:upStandardProduct'])"
                v-model="scope.row.manHour"
                placeholder="单价(元)"
                size="small"
                @change="
                  (value) => upStandardProductListOfManHour(value, scope.row.id)
                "
              >
              </el-input>
              <span v-else>{{ scope.row.manHour }}</span>
            </template>
          </el-table-column>
          <el-table-column
            label="工时分组"
            prop="manHourGroup"
            show-overflow-tooltip
            width="100"
          ></el-table-column>
          <el-table-column label="模板" prop="templateId" width="200">
            <template slot-scope="scope">
              <el-select
                v-model="scope.row.templateId"
                :disabled="!checkPermi(['system:standard:upStandardProduct'])"
                filterable
                size="small"
                @change="
                  (value) =>
                    upStandardProductListOfTemplate(value, scope.row.id)
                "
              >
                <el-option
                  v-for="(a, ai) in templateList"
                  :key="ai"
                  :label="a.name"
                  :value="a.id"
                ></el-option>
              </el-select>
            </template>
          </el-table-column>
          <el-table-column
            label="区间"
            prop="section"
            show-overflow-tooltip
            width="120"
          ></el-table-column>
          <el-table-column label="操作" prop="section" width="160">
            <template slot-scope="scope">
              <el-button type="text" @click="sectionUp(scope.row)"
                >区间设置</el-button
              >
              <el-button
                type="text"
                @click="bindSupplierDensitySecond(scope.row)"
                >绑定厂家</el-button
              >
            </template>
          </el-table-column>
        </el-table>
        <el-pagination
          :current-page="currentPage"
          :page-size="300"
          :total="total"
          layout="total, prev, pager, next, jumper"
          style="position: absolute; right: 16px; bottom: 1px"
          @current-change="handleCurrentChange"
        >
        </el-pagination>
      </el-row>
    </div>
    <el-dialog :visible.sync="addDia" title="分类添加" width="400px">
      <div class="body">
        <el-row style="line-height: 50px">
          <el-col :span="6" style="text-align: right">
            <span class="required-span">* </span>型号:
          </el-col>
          <el-col :offset="1" :span="16">
            <el-input
              v-model="addOb.model"
              clearable
              placeholder="请输入型号"
              size="small"
              @keyup.enter.native="addStandardTree"
            ></el-input>
          </el-col>
        </el-row>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDia = false">取 æ¶ˆ</el-button>
        <el-button :loading="addLoad" type="primary" @click="addStandardTree"
          >ç¡® å®š</el-button
        >
      </span>
    </el-dialog>
    <el-dialog :visible.sync="updateDia" title="分类修改" width="400px">
      <div class="body">
        <el-row style="line-height: 50px">
          <el-col :span="6" style="text-align: right">
            <span class="required-span">* </span>型号:
          </el-col>
          <el-col :offset="1" :span="16">
            <el-input
              v-model="addOb.model"
              clearable
              placeholder="请输入型号"
              size="small"
              @keyup.enter.native="updateStandardTree"
            ></el-input>
          </el-col>
        </el-row>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="updateDia = false">取 æ¶ˆ</el-button>
        <el-button
          :loading="updateLoad"
          type="primary"
          @click="updateStandardTree"
          >ç¡® å®š</el-button
        >
      </span>
    </el-dialog>
    <el-dialog
      :visible.sync="moreEdit"
      class="more-edit"
      title="批量编辑"
      width="90%"
    >
      <div
        class="body"
        style="display: flex; flex-direction: column; height: 85vh"
      >
        <div class="search">
          <div class="search-item">
            <el-row style="width: 25%; margin-bottom: 16px">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                è¦æ±‚值:</el-col
              >
              <el-col :span="16">
                <el-input
                  v-model="moreInfo.ask"
                  :disabled="moreSelects.length == 0"
                  clearable
                  size="small"
                ></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%; margin-bottom: 16px">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                è¦æ±‚描述:</el-col
              >
              <el-col
                :span="16"
                style="display: flex; align-items: flex-start; height: 100%"
              >
                <el-input
                  v-model="moreInfo.tell"
                  :autosize="{ minRows: 1, maxRows: 3 }"
                  :disabled="moreSelects.length == 0"
                  clearable
                  size="small"
                  type="textarea"
                ></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%; margin-bottom: 16px">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                è¯•验方法:</el-col
              >
              <el-col :span="16">
                <el-select
                  v-model="moreInfo.methodS"
                  :disabled="moreSelects.length == 0"
                  clearable
                  filterable
                  size="small"
                  style="width: 100%"
                >
                  <el-option
                    v-for="(a, ai) in methodList"
                    :key="ai"
                    :label="a.label"
                    :value="a.value"
                  ></el-option>
                </el-select>
              </el-col>
            </el-row>
            <el-row style="width: 25%; margin-bottom: 16px">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                å•ä»·(元):</el-col
              >
              <el-col :span="16">
                <el-input
                  v-model="moreInfo.price"
                  :disabled="moreSelects.length == 0"
                  clearable
                  size="small"
                ></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                å·¥æ—¶ç³»æ•°ï¼š</el-col
              >
              <el-col :span="16">
                <el-input
                  v-model="moreInfo.manHour"
                  :disabled="moreSelects.length == 0"
                  clearable
                  size="small"
                ></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                æ¨¡æ¿ï¼š</el-col
              >
              <el-col :span="16">
                <el-select
                  v-model="moreInfo.templateId"
                  :disabled="moreSelects.length == 0"
                  filterable
                  placeholder="模板"
                  size="small"
                  style="width: 100%"
                >
                  <el-option
                    v-for="(a, ai) in templateList"
                    :key="ai"
                    :label="a.name"
                    :value="a.id"
                  ></el-option>
                </el-select>
              </el-col>
            </el-row>
            <el-row style="width: 25%">
              <el-col :span="6" style="text-align: right"> æ˜¯å¦å¯ç”¨ï¼š</el-col>
              <el-col :span="16">
                <el-select
                  v-model="moreInfo.state"
                  :disabled="moreSelects.length == 0"
                  clearable
                  filterable
                  placeholder="模板"
                  size="small"
                  style="width: 100%"
                >
                  <el-option :value="1" label="启用"></el-option>
                  <el-option :value="0" label="不启用"></el-option>
                </el-select>
              </el-col>
            </el-row>
            <el-row style="width: 100%; margin-top: 8px">
              <el-col
                :span="24"
                style="display: flex; align-items: center; justify-content: end"
              >
                <el-button size="small" type="danger" @click="clearProduct(1)"
                  >重置单价</el-button
                >
                <el-button size="small" type="danger" @click="clearProduct(2)"
                  >重置工时系数</el-button
                >
                <el-button
                  size="small"
                  type="primary"
                  @click="sectionUp(moreSelects)"
                  >设置区间</el-button
                >
                <el-button size="small" @click="moreEdit = false"
                  >取 æ¶ˆ</el-button
                >
                <el-button
                  :loading="moreEditLoad"
                  size="small"
                  type="primary"
                  @click="subMoreEdit"
                  >保 å­˜</el-button
                >
              </el-col>
            </el-row>
          </div>
        </div>
        <div v-loading="productTableLoading0" style="flex: 1; overflow-y: auto">
          <el-table
            ref="productTable0"
            :data="productList0"
            :fit="true"
            :row-key="(row) => row.id"
            border
            header-row-class-name="header-class"
            height="96%"
            highlight-current-row
            stripe
            style="width: 100%"
            tooltip-effect="dark"
            @select="handleSelectionChange0"
            @select-all="handleSelectAll0"
            @filter-change="filterHandler"
          >
            <el-table-column type="selection" width="50"> </el-table-column>
            <el-table-column
              label="产品"
              min-width="100"
              prop="sample"
              show-overflow-tooltip
            ></el-table-column>
            <el-table-column
              label="型号"
              min-width="100"
              prop="model"
              show-overflow-tooltip
            ></el-table-column>
            <el-table-column
              :filter-multiple="false"
              :filters="filters0"
              column-key="inspectionItem"
              filter-placement="bottom-start"
              label="检验项"
              min-width="140"
              prop="inspectionItem"
              show-overflow-tooltip
            ></el-table-column>
            <el-table-column
              :filter-multiple="false"
              :filters="filters1"
              column-key="inspectionItemSubclass"
              filter-placement="bottom-start"
              label="检验项子项"
              min-width="140"
              prop="inspectionItemSubclass"
              show-overflow-tooltip
            ></el-table-column>
            <el-table-column
              :filter-multiple="false"
              :filters="filters"
              column-key="sonLaboratory"
              filter-placement="bottom-start"
              label="子实验室"
              prop="sonLaboratory"
              show-overflow-tooltip
              width="130"
            ></el-table-column>
            <el-table-column
              label="要求值"
              min-width="200px"
              prop="ask"
            ></el-table-column>
            <el-table-column
              label="要求描述"
              min-width="220px"
              prop="tell"
            ></el-table-column>
            <el-table-column
              label="试验方法"
              prop="methodS"
              width="200"
            ></el-table-column>
            <el-table-column
              label="条件"
              prop="radius"
              width="200"
            ></el-table-column>
            <el-table-column
              label="计量单位"
              prop="unit"
              show-overflow-tooltip
              width="100"
            ></el-table-column>
            <el-table-column
              label="单价(元)"
              prop="price"
              width="120"
            ></el-table-column>
            <el-table-column
              label="工时系数"
              prop="manHour"
              width="120"
            ></el-table-column>
            <el-table-column
              label="工时分组"
              prop="manHourGroup"
              show-overflow-tooltip
              width="100"
            ></el-table-column>
            <el-table-column label="模板" prop="templateId" width="200">
              <template slot-scope="scope">
                {{
                  templateList.find((item) => item.id == scope.row.templateId)
                    ? templateList.find(
                        (item) => item.id == scope.row.templateId
                      ).name
                    : ""
                }}
              </template>
            </el-table-column>
            <el-table-column
              label="区间"
              prop="section"
              show-overflow-tooltip
              width="120"
            ></el-table-column>
          </el-table>
          <el-pagination
            :current-page="currentPage0"
            :page-size="100"
            :total="total0"
            layout="total, prev, pager, next, jumper"
            style="position: absolute; right: 16px; bottom: 4px"
            @current-change="handleCurrentChange0"
          >
          </el-pagination>
        </div>
      </div>
    </el-dialog>
    <el-dialog
      :close-on-click-modal="false"
      :visible.sync="sectionUpDia"
      title="区间设置"
      width="80%"
    >
      <div class="body" style="padding: 5px 0">
        <el-table :data="sectionList" border height="350px" style="width: 100%">
          <el-table-column align="center" label="序号" type="index" width="70">
          </el-table-column>
          <el-table-column align="center" label="区间">
            <template slot-scope="scope">
              <el-input
                v-model="scope.row.thing"
                clearable
                placeholder="区间"
                size="small"
              ></el-input>
            </template>
          </el-table-column>
          <el-table-column align="center" label="芯数">
            <template slot-scope="scope">
              <el-input
                v-model="scope.row.cores"
                clearable
                placeholder="芯数"
                size="small"
              ></el-input>
            </template>
          </el-table-column>
          <el-table-column align="center" label="要求值">
            <template slot-scope="scope">
              <el-input
                v-model="scope.row.ask"
                clearable
                placeholder="要求值"
                size="small"
              ></el-input>
            </template>
          </el-table-column>
          <el-table-column align="center" label="要求描述">
            <template slot-scope="scope">
              <el-input
                v-model="scope.row.tell"
                :autosize="{ minRows: 1, maxRows: 2 }"
                clearable
                placeholder="要求描述"
                size="small"
                type="textarea"
              ></el-input>
            </template>
          </el-table-column>
          <el-table-column align="center" label="导体材质">
            <template slot-scope="scope">
              <el-input
                v-model="scope.row.conductorMaterial"
                clearable
                placeholder="导体材质"
                size="small"
              ></el-input>
            </template>
          </el-table-column>
          <el-table-column align="center" label="导体类型">
            <template slot-scope="scope">
              <el-input
                v-model="scope.row.conductorType"
                clearable
                placeholder="导体类型"
                size="small"
              ></el-input>
            </template>
          </el-table-column>
          <!--          <el-table-column align="center" label="单价" width="120">-->
          <!--            <template slot-scope="scope">-->
          <!--              <el-input v-model="scope.row.price" clearable placeholder="单价" size="small"></el-input>-->
          <!--            </template>-->
          <!--          </el-table-column>-->
          <!--          <el-table-column align="center" label="工时系数" width="120">-->
          <!--            <template slot-scope="scope">-->
          <!--              <el-input v-model="scope.row.manHour" clearable placeholder="工时系数" size="small"></el-input>-->
          <!--            </template>-->
          <!--          </el-table-column>-->
          <el-table-column align="center" label="操作" width="70">
            <template slot-scope="scope">
              <el-button
                circle
                icon="el-icon-minus"
                size="mini"
                type="danger"
                @click="sectionList.splice(scope.$index, 1)"
              ></el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="sectionUpDia = false">取 æ¶ˆ</el-button>
        <el-button :loading="sectionLoad" type="primary" @click="sectionLoadAdd"
          >保 å­˜</el-button
        >
        <el-button
          icon="el-icon-plus"
          type="primary"
          @click="sectionList.push({ thing: '' })"
        ></el-button>
      </span>
    </el-dialog>
    <el-dialog :visible.sync="uploadDia" title="数据导入" width="500px">
      <div style="margin: 0 auto">
        <el-upload
          ref="upload"
          :action="
            VUE_APP_BASE_API + '/standardTree/inExcelOfTree/' + isEquipment
          "
          :auto-upload="false"
          :file-list="fileList"
          :headers="token"
          :limit="1"
          :on-change="beforeUpload"
          :on-error="onError"
          :on-success="onSuccess"
          accept=".xlsx"
          drag
          name="file"
        >
          <i class="el-icon-upload"></i>
          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        </el-upload>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="uploadDia = false">取 æ¶ˆ</el-button>
        <el-button :loading="uploading" type="primary" @click="submitUpload()"
          >上 ä¼ </el-button
        >
      </span>
    </el-dialog>
    <!-- <bindSupplierDensityDialogAsk v-if="bindSupplierDensityDialog"
                               :bindSupplierDensityDialog="bindSupplierDensityDialog"
                               :currentRow="currentSupplierDensityRow"
                               @closeBindPartDialog="closeBindSupplierDensityDialog"></bindSupplierDensityDialogAsk> -->
    <!-- <BatchCopy v-if="batchCopyDia" ref="BatchCopy" :selectTree1="selectTree"
               :standardId="standardId" @refreshList="refreshList"></BatchCopy> -->
  </div>
</template>
<script>
import Sortable from "sortablejs";
import draggable from "vuedraggable";
import {
  updateTreeSort,
  resetTreeDragBatch,
  delStandardTree,
  selectStandardTreeList,
  obtainItemParameterList,
  selectTestObjectByName,
  selectStandardMethods,
  addStandardMethodList,
  addStandardTree,
  updateStandardTree,
  selectsStandardMethodByFLSSM,
  upStandardProductList,
  delStandardMethodByFLSSM,
  delStandardProductByIds,
  addStandardProduct,
  selectStandardProductListByMethodId,
  updateSection,
  upStandardProducts,
  getStandardTemplate,
  selectStandardProductByMethodId,
  selectStandardProductEnumByMethodId,
  resetTreeOfPrice,
  resetTreeOfHour,
} from "@/api/standard/standardLibrary";
import { checkPermi } from "@/utils/permission"; // æƒé™åˆ¤æ–­å‡½æ•°
//   import bindSupplierDensityDialogAsk from "../do/a5-capacity-scope/bindSupplierDensityDialogAsk.vue";
//   import BatchCopy from "../do/a5-capacity-scope/BatchCopy.vue";
export default {
  components: {
    //   BatchCopy,
    //   bindSupplierDensityDialogAsk,
    draggable,
  },
  dicts: ["sys_factory", "sys_sub_lab", "sys_samp_type"],
  data() {
    return {
      tableKey: "productList",
      search: null,
      list: [],
      selectTree: "",
      factory: [],
      addDia: false,
      updateDia: false, // ä¿®æ”¹æ ‘名字弹框
      oldModel: "",
      addOb: {
        factory: null,
        laboratory: null,
        sampleType: null,
        sample: null,
        model: null,
      },
      laboratory: [],
      addLoad: false,
      updateLoad: false,
      sampleType: [],
      sample: [],
      treeLoad: false,
      addPower: false,
      standardList: [],
      standardEnum: [],
      addStandardDia: false,
      addLoad2: false,
      productList: [],
      productTableLoading: false,
      tableLoad: false,
      tableLoad2: false,
      selects: [],
      addProductDia: false,
      productId: null,
      addLoad3: false,
      productEnum: [],
      expandedKeys: [],
      filters: [],
      sectionUpDia: false,
      sectionLoad: false,
      sectionRow: null,
      sectionList: [],
      templateList: [],
      total: 0,
      currentPage: 1,
      standardId: 0,
      moreEdit: false,
      moreEditLoad: false,
      moreSelects: [],
      total0: 0,
      currentPage0: 1,
      productList0: [],
      moreInfo: {
        ask: "",
        tell: "",
        methodS: "",
        price: "",
        manHour: "",
        templateId: "",
        state: null,
      },
      methodList: [],
      productTableLoading0: false,
      filters0: [],
      filters1: [],
      pages: 1,
      inspectionItem: null,
      inspectionItemSubclass: null,
      sonLaboratory: null,
      uploadDia: false,
      token: null,
      fileList: [],
      uploading: false,
      isEquipment: true,
      isHaveChildren: {},
      sortTable: null,
      currentSupplierDensityRow: {}, // é€‰æ‹©é›¶ä»¶ç»‘定本条数据的信息
      bindSupplierDensityDialog: false,
      isShowCopy: false,
      batchCopyDia: false,
      VUE_APP_BASE_API: process.env.VUE_APP_BASE_API,
    };
  },
  watch: {
    moreEdit(val) {
      if (!val) {
        this.$refs.productTable0.clearSelection();
        this.moreSelects = [];
        this.currentPage0 = 1;
        this.productList0 = [];
        this.moreInfo = {
          ask: "",
          tell: "",
          methodS: "",
          price: "",
          manHour: "",
          templateId: "",
        };
      }
    },
  },
  mounted() {
    this.selectEnumByCategoryForFactory();
    this.selectStandardTreeList();
    this.obtainItemParameterList();
    this.selectTestObjectByName();
    this.selectStandardMethods();
    this.selectEnumByCategoryForSonLaboratory();
    this.getStandardTemplate();
    this.selectStandardMethodsSec();
    this.token = {
      token: sessionStorage.getItem("token"),
    };
  },
  methods: {
    checkPermi,
    // ä¿®æ”¹æœ€å­çº§åå­—
    editTreeName(info) {
      this.updateDia = true;
      this.oldModel = info.label;
    },
    // æ‹–拽时判定目标节点能否被放置
    // 'prev'、'inner' å’Œ 'next',前、插入、后
    allowDrop(draggingNode, dropNode, type) {
      if (draggingNode.level !== 3) return;
      if (draggingNode.data.level === dropNode.data.level) {
        if (draggingNode.data.parentId === dropNode.data.parentId) {
          return type === "prev" || type === "next";
        } else {
          return false;
        }
      } else {
        // ä¸åŒçº§è¿›è¡Œå¤„理
        return false;
      }
    },
    // tree拖拽成功完成时触发的事件
    handleDrop(draggingNode, dropNode, dropType, ev) {
      try {
        this.treeLoad = true;
        updateTreeSort(this.list).then((res) => {
          if (res.code === 200) {
            this.$message.success("操作成功");
          }
          this.treeLoad = false;
        });
      } catch (e) {
        this.treeLoad = false;
        console.log("e----", e);
      }
    },
    rowDrop(methodId) {
      const that = this;
      const tbody = document.querySelector(
        "#templateParamTable .el-table__body-wrapper tbody"
      );
      if (!this.sortTable) {
        this.sortTable = Sortable.create(tbody, {
          animation: 200, //动画时长
          handle: ".el-table__row", //可拖拽区域class
          //拖拽中事件
          onMove: ({ dragged, related }) => {
            const oldRow = that.productList[dragged.rowIndex]; //旧位置数据
            const newRow = that.productList[related.rowIndex]; //被拖拽的新数据
          },
          //拖拽结束事件
          onEnd: (evt) => {
            const curRow = that.productList.splice(evt.oldIndex, 1)[0]; // å½“前被拖拽的信息
            that.productList.splice(evt.newIndex, 0, curRow);
            let arr = [];
            this.productList.forEach((item, index) => {
              const obj = Object.assign({
                sort: index,
                id: item.id,
              });
              arr.push(obj);
            });
            this.productTableLoading = true;
            // æ‹–拽完成后传给后端保存数据
            resetTreeDragBatch({ params: arr }).then((res) => {
              if (res.code === 200) {
                this.$message.success("保存成功");
              }
              this.productTableLoading = false;
            });
          },
        });
      }
    },
    hasChildWithId(nodes, name) {
      for (let node of nodes) {
        const comName = node.label + node.code;
        if (comName == name) {
          //判断递归结束条件
          this.isHaveChildren = node;
          return node;
        } else if (node.children && node.children.length > 0) {
          //判断children是否有数据
          this.hasChildWithId(node.children, name); //递归调用
        }
      }
    },
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    },
    searchFilter() {
      this.$refs.tree.filter(this.search);
    },
    refresh() {
      this.upIndex++;
    },
    handleNodeClick(val, node, el) {
      //树的值
      if (node.childNodes.length === 0) {
        this.isShowCopy = true;
      } else {
        this.isShowCopy = false;
      }
      this.total = 0;
      this.currentPage = 1;
      this.selectTree = "";
      this.getNodeParent(node);
      this.selectTree = this.selectTree.replace(" - ", "");
      let data = this.selectTree.split(" - ");
      let data2 = "";
      for (let index = data.length - 1; index >= 0; index--) {
        data2 += " - " + data[index];
      }
      this.selectTree = data2.replace(" - ", "");
      if (node.childNodes.length === 0) {
        this.selectsStandardMethodByFLSSM();
      }
      let trees = this.selectTree.split(" - ");
      this.addOb.factory = trees[0];
      this.addOb.laboratory = trees[1];
      this.addOb.sampleType = trees[2];
      this.addOb.sample = trees[3];
    },
    getNodeParent(val) {
      if (val.parent != null) {
        if (val.data.children === null) {
          this.selectTree += " - " + val.label + " - " + "null";
        } else {
          this.selectTree += " - " + val.label;
        }
        this.getNodeParent(val.parent);
      }
    },
    remove(node, data) {
      this.$confirm("是否删除该层级", "提示", {
        type: "error",
      })
        .then(() => {
          // this.treeLoad = true
          this.selectTree = "";
          this.getNodeParent(node);
          this.selectTree = this.selectTree.replace(" - ", "");
          let data = this.selectTree.split(" - ");
          let data2 = "";
          for (let index = data.length - 1; index >= 0; index--) {
            data2 += " - " + data[index];
          }
          this.selectTree = data2.replace(" - ", "");
          delStandardTree({ tree: this.selectTree }).then((res) => {
            if (res.code == 201) return;
            this.$message.success("已删除");
            let arr = this.selectTree.split(" - ");
            this.deleteStandard(this.list, arr[arr.length - 1]);
            this.selectTree = "";
            this.standardList = [];
            this.productList = [];
          });
        })
        .catch((e) => {});
    },
    deleteStandard(arr, label) {
      arr.forEach((item, index) => {
        if (item.label == label) {
          arr.splice(index, 1);
        } else {
          item.children && this.deleteStandard(item.children, label);
        }
      });
    },
    nodeOpen(data, node, el) {
      $($(el.$el).find(".node_i")[0]).attr(
        "class",
        "node_i el-icon-folder-opened"
      );
    },
    nodeClose(data, node, el) {
      $($(el.$el).find(".node_i")[0]).attr("class", "node_i el-icon-folder");
    },
    selectEnumByCategoryForFactory() {
      this.getConfigKey("sys_factory").then((response) => {
        this.factory = response.msg;
      });
    },
    selectEnumByCategoryForSonLaboratory() {
      let arr = [];
      this.getConfigKey("sys_sub_lab").then((response) => {
        arr = response.msg;
      });
      arr.forEach((a) => {
        this.filters.push({
          text: a.label,
          value: a.value,
        });
      });
    },
    selectEnumByCategoryForsampleType() {
      this.getConfigKey("sys_samp_type").then((response) => {
        this.sampleType = response.msg;
      });
    },
    selectStandardTreeList() {
      this.treeLoad = true;
      selectStandardTreeList().then((res) => {
        this.list = res.data;
        this.list.forEach((a) => {
          this.expandedKeys.push(a.label);
        });
        this.treeLoad = false;
      });
    },
    obtainItemParameterList() {
      obtainItemParameterList().then((res) => {
        let data = [];
        res.data.forEach((a) => {
          data.push({
            label: a.laboratoryName,
            value: a.laboratoryName,
          });
        });
        this.laboratory = data;
      });
    },
    selectTestObjectByName() {
      selectTestObjectByName().then((res) => {
        let data = [];
        res.data.forEach((a) => {
          data.push({
            label: a.specimenName,
            value: a.specimenName,
          });
        });
        this.sampleType = data;
      });
    },
    selectStandardMethods() {
      selectStandardMethods().then((res) => {
        let data = [];
        res.data.forEach((a) => {
          data.push({
            label: a.name,
            value: a.id,
          });
        });
        this.standardEnum = data;
      });
    },
    addStandardMethodList() {
      if (this.standardId == null || this.standardId == "") {
        this.$message.error("标准方法未选择");
        return;
      }
      this.addLoad2 = true;
      addStandardMethodList({
        standardId: this.standardId,
        tree: this.selectTree,
      }).then((res) => {
        this.addLoad2 = false;
        this.addStandardDia = false;
        this.$message.success("添加成功");
        this.selectsStandardMethodByFLSSM();
      });
    },
    // æäº¤åˆ†ç±»æ·»åŠ 
    addStandardTree() {
      if (this.addOb.sampleType == null || this.addOb.sampleType == "") {
        this.$message.error("对象不存在");
        return;
      }
      if (this.addOb.model == null || this.addOb.model == "") {
        this.$message.error("请填写型号");
        return;
      }
      this.addLoad = true;
      addStandardTree(this.addOb)
        .then((res) => {
          if (res.code === 201) {
            this.addLoad = false;
            return;
          }
          this.$message.success("添加成功");
          this.addDia = false;
          this.list
            .find((a) => a.label == this.addOb.factory)
            .children.find((a) => a.label == this.addOb.laboratory)
            .children.find((a) => a.label == this.addOb.sampleType)
            .children.find((a) => a.label == this.addOb.sample)
            .children.push({
              code: "[5]",
              label: this.addOb.model,
              value: this.addOb.model,
            });
          this.addLoad = false;
        })
        .catch((e) => {
          this.addDia = false;
          this.addLoad = false;
        });
    },
    // ä¿®æ”¹åž‹å·
    updateStandardTree() {
      if (this.addOb.sampleType == null || this.addOb.sampleType == "") {
        this.$message.error("对象不存在");
        return;
      }
      if (this.addOb.model == null || this.addOb.model == "") {
        this.$message.error("请填写型号");
        return;
      }
      this.addOb.oldModel = this.oldModel;
      this.updateLoad = true;
      updateStandardTree(this.addOb)
        .then((res) => {
          if (res.code === 201) {
            this.updateLoad = false;
            return;
          }
          this.$message.success("添加成功");
          this.selectStandardTreeList();
          this.updateDia = false;
          this.updateLoad = false;
        })
        .catch((e) => {
          this.updateDia = false;
          this.updateLoad = false;
        });
    },
    selectsStandardMethodByFLSSM() {
      this.tableLoad = true;
      selectsStandardMethodByFLSSM({
        tree: this.selectTree,
      }).then((res) => {
        this.tableLoad = false;
        this.standardList = res.data.standardMethodList;
        if (this.standardList && this.standardList.length > 0) {
          this.$refs.standard.setCurrentRow(this.standardList[0]);
          this.rowClick(this.standardList[0]);
        } else {
          this.productList = [];
        }
      });
    },
    upStandardProductList(value, index) {
      upStandardProductList({
        str: JSON.stringify({
          id: index,
          ask: value,
        }),
      }).then((res) => {
        if (res.code == 201) {
          this.$message.error("未保存");
          return;
        }
        this.$message.success("已保存");
      });
    },
    upStandardProductListOfTell(value, index) {
      upStandardProductList({
        str: JSON.stringify({
          id: index,
          tell: value,
        }),
      }).then((res) => {
        if (res.code == 201) {
          this.$message.error("未保存");
          return;
        }
        this.$message.success("已保存");
      });
    },
    // æ ‡å‡†åº“选择实验方法的回调
    upStandardProductListOfMethodS(value, index) {
      upStandardProductList({
        str: JSON.stringify({
          id: index,
          methodS: value,
        }),
      }).then((res) => {
        if (res.code == 201) {
          this.$message.error("未保存");
          return;
        }
        this.$message.success("已保存");
      });
    },
    // æ ‡å‡†åº“选择条件的回调
    upStandardProductListOfRadius(value, index) {
      upStandardProductList({
        str: JSON.stringify({
          id: index,
          radius: value,
        }),
      }).then((res) => {
        if (res.code == 201) {
          this.$message.error("未保存");
          return;
        }
        this.$message.success("已保存");
      });
    },
    upStandardProductListOfPrice(value, index) {
      upStandardProductList({
        str: JSON.stringify({
          id: index,
          price: value,
        }),
      }).then((res) => {
        if (res.code == 201) {
          this.$message.error("未保存");
          return;
        }
        this.$message.success("已保存");
      });
    },
    upStandardProductListOfManHour(value, index) {
      upStandardProductList({
        str: JSON.stringify({
          id: index,
          manHour: value,
        }),
      }).then((res) => {
        if (res.code == 201) {
          this.$message.error("未保存");
          return;
        }
        this.$message.success("已保存");
      });
    },
    upStandardProductListOfTemplate(value, index) {
      upStandardProductList({
        str: JSON.stringify({
          id: index,
          templateId: value,
        }),
      }).then((res) => {
        if (res.code == 201) {
          this.$message.error("未保存");
          return;
        }
        this.$message.success("已保存");
      });
    },
    delStandardMethodByFLSSM(id) {
      this.$confirm("是否删除当前数据?", "警告", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          this.tableLoad = true;
          delStandardMethodByFLSSM({ id: id }).then((res) => {
            if (res.code == 201) {
              return;
            }
            this.$message.success("已删除");
            this.selectsStandardMethodByFLSSM();
          });
        })
        .catch(() => {});
    },
    handleSelectionChange(val) {
      this.selects = [];
      val.forEach((a) => {
        this.selects.push(a.id);
      });
    },
    delStandardProductByIds() {
      if (this.selects.length == 0) {
        this.$message.error("未选中数据");
        return;
      }
      this.$confirm(
        "是否删除当前选中 " + this.selects.length + " æ¡æ•°æ®?",
        "警告",
        {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning",
        }
      )
        .then(() => {
          this.tableLoad = true;
          delStandardProductByIds({
            ids: JSON.stringify(this.selects),
          }).then((res) => {
            if (res.code == 201) {
              return;
            }
            this.$message.success("已删除");
            this.selectsStandardMethodByFLSSM();
          });
        })
        .catch(() => {});
    },
    addStandardProductDo() {
      let selects = this.$refs.ValueTable.multipleSelection;
      if (selects.length == 0) {
        this.$message.error("未选择数据");
        return;
      }
      let select = [];
      selects.forEach((a) => {
        select.push(a.id);
      });
      this.tableLoad = true;
      addStandardProduct({
        ids: JSON.stringify(select),
        tree: this.selectTree,
      }).then((res) => {
        if (res.code == 201) {
          return;
        }
        this.$message.success("添加成功");
        this.selectsStandardMethodByFLSSM();
      });
      this.addProductDia = false;
    },
    refreshList() {
      this.batchCopyDia = false;
      const index = this.standardList.findIndex(
        (item) => item.id == this.standardId
      );
      if (index > -1) {
        this.rowClick(this.standardList[index]);
      }
    },
    rowClick(row, column, event) {
      this.currentPage = 1;
      this.tableLoad2 = true;
      this.standardId = row.id;
      selectStandardProductListByMethodId({
        id: row.id,
        tree: this.selectTree,
        page: this.currentPage,
      }).then((res) => {
        this.productList = res.data.productList;
        this.total = res.data.total;
        setTimeout(() => {
          this.productList.forEach((a) => {
            if (a.state == 1) this.toggleSelection(a);
          });
        }, 300);
        this.tableLoad2 = false;
        const tree = this.selectTree.split(" - ");
        // é€‰æ‹©æœ€åŽä¸€å±‚树才可以拖拽排序
        if (tree.length === 4) {
          const name = tree[3] + "[4]";
          this.hasChildWithId(this.list, name);
          if (
            this.isHaveChildren.children &&
            this.isHaveChildren.children.length > 0
          ) {
            if (this.sortTable) {
              this.sortTable.destroy();
              this.sortTable = null;
            }
            return;
          }
        } else if (tree.length < 4) {
          if (this.sortTable) {
            this.sortTable.destroy();
            this.sortTable = null;
          }
          return;
        }
        this.$nextTick(() => {
          this.rowDrop(row.id);
        });
      });
    },
    toggleSelection(row) {
      this.$refs.productTable.toggleRowSelection(row, true);
    },
    tableRowClassName({ row, rowIndex }) {
      if (row.state === 0) {
        return "warning-row";
      }
      return "";
    },
    upProductSelect(selection, row) {
      row.state = row.state == 1 ? 0 : 1;
      upStandardProductList({
        str: JSON.stringify({
          id: row.id,
          state: row.state,
        }),
      }).then((res) => {
        if (res.code == 201) {
          this.$message.error("未保存");
          return;
        }
        // this.$message.success('已保存')
      });
    },
    filterHandler(value) {
      for (let column in value) {
        if (value[column].length === 0) {
          if (column === "inspectionItem") {
            this.inspectionItem = null;
          } else if (column === "inspectionItemSubclass") {
            this.inspectionItemSubclass = null;
          } else if (column === "sonLaboratory") {
            this.sonLaboratory = null;
          }
        } else {
          if (column === "inspectionItem") {
            this.inspectionItem = value[column][0];
          } else if (column === "inspectionItemSubclass") {
            this.inspectionItemSubclass = value[column][0];
          } else if (column === "sonLaboratory") {
            this.sonLaboratory = value[column][0];
          }
        }
        this.getList();
      }
    },
    handleAll(e) {
      if (e.length > 0) {
        this.productList.map((m) => {
          m.state = 0;
          this.upProductSelect(null, m);
          return m;
        });
      } else {
        this.productList.map((m) => {
          m.state = 1;
          this.upProductSelect(null, m);
          return m;
        });
      }
    },
    // è®¾ç½®åŒºé—´
    sectionUp(row) {
      if (Array.isArray(row)) {
        // å€¼æ˜¯ä¸€ä¸ªæ•°ç»„
        if (row.length === 0) {
          return this.$message.error("请选择检验项");
        }
        this.sectionRow = {};
        this.sectionUpDia = true;
        this.sectionList = [];
      } else {
        // å€¼æ˜¯ä¸€ä¸ªå¯¹è±¡
        this.sectionRow = row;
        this.sectionUpDia = true;
        this.sectionList = [];
        if (this.sectionRow.section != null && this.sectionRow.section != "") {
          JSON.parse(this.sectionRow.section).forEach((a, ai) => {
            if (this.sectionRow.cores !== null) {
              this.sectionList.push({
                thing: a,
                ask: JSON.parse(this.sectionRow.ask)[ai],
                tell: JSON.parse(this.sectionRow.tell)[ai],
                // price: JSON.parse(this.sectionRow.price)[ai],
                // manHour: JSON.parse(this.sectionRow.manHour)[ai],
                cores: JSON.parse(this.sectionRow.cores)[ai],
                conductorMaterial:
                  this.sectionRow.conductorMaterial &&
                  JSON.parse(this.sectionRow.conductorMaterial)[ai],
                conductorType:
                  this.sectionRow.conductorType &&
                  JSON.parse(this.sectionRow.conductorType)[ai],
              });
            } else {
              this.sectionList.push({
                thing: a,
                ask: JSON.parse(this.sectionRow.ask)[ai],
                tell: JSON.parse(this.sectionRow.tell)[ai],
                // price: JSON.parse(this.sectionRow.price)[ai],
                // manHour: JSON.parse(this.sectionRow.manHour)[ai],
                conductorMaterial:
                  this.sectionRow.conductorMaterial &&
                  JSON.parse(this.sectionRow.conductorMaterial)[ai],
                conductorType:
                  this.sectionRow.conductorType &&
                  JSON.parse(this.sectionRow.conductorType)[ai],
              });
            }
          });
        }
      }
    },
    // æäº¤åŒºé—´æ‰€å¡«çš„æ•°æ®
    sectionLoadAdd() {
      let sectionList = [];
      let askList = [];
      let tellList = [];
      let priceList = [];
      let manHourList = [];
      let coresList = [];
      let conductorMaterialList = [];
      let conductorTypeList = [];
      this.sectionList.forEach((a) => {
        if (a.thing !== "") {
          sectionList.push(a.thing);
          askList.push(a.ask);
          tellList.push(a.tell);
          // priceList.push(a.price)
          // manHourList.push(a.manHour)
          coresList.push(a.cores);
          conductorMaterialList.push(a.conductorMaterial);
          conductorTypeList.push(a.conductorType);
        }
      });
      if (sectionList.length === 0) {
        this.sectionRow.section = null;
        this.sectionRow.ask = null;
        this.sectionRow.tell = null;
        // this.sectionRow.price = null
        // this.sectionRow.manHour = null
        this.sectionRow.cores = null;
        this.sectionRow.conductorMaterial = null;
        this.sectionRow.conductorType = null;
      } else {
        this.sectionRow.section = JSON.stringify(sectionList);
        this.sectionRow.ask = JSON.stringify(askList);
        this.sectionRow.tell = JSON.stringify(tellList);
        // this.sectionRow.price = JSON.stringify(priceList)
        // this.sectionRow.manHour = JSON.stringify(manHourList)
        this.sectionRow.cores = JSON.stringify(coresList);
        this.sectionRow.conductorMaterial = JSON.stringify(
          conductorMaterialList
        );
        this.sectionRow.conductorType = JSON.stringify(conductorTypeList);
      }
      this.sectionLoad = true;
      if (this.moreSelects.length === 0) {
        updateSection({
          str: JSON.stringify({
            id: this.sectionRow.id,
            section: this.sectionRow.section,
            ask: this.sectionRow.ask,
            tell: this.sectionRow.tell,
            // price: this.sectionRow.price,
            // manHour: this.sectionRow.manHour,
            cores: this.sectionRow.cores,
            conductorMaterial: this.sectionRow.conductorMaterial,
            conductorType: this.sectionRow.conductorType,
          }),
        }).then((res) => {
          this.sectionLoad = false;
          if (res.code == 201) {
            this.$message.error("未保存");
            return;
          }
          this.$message.success("已保存");
          this.sectionUpDia = false;
        });
      } else {
        upStandardProducts({
          ids: JSON.stringify(this.moreSelects.map((a) => a.id)),
          standardProductList: {
            section: this.sectionRow.section,
            ask: this.sectionRow.ask,
            tell: this.sectionRow.tell,
            // price: this.sectionRow.price,
            // manHour: this.sectionRow.manHour,
            cores: this.sectionRow.cores,
            conductorMaterial: this.sectionRow.conductorMaterial,
            conductorType: this.sectionRow.conductorType,
          },
        }).then((res) => {
          this.sectionLoad = false;
          if (res.code == 201) {
            this.$message.error("未保存");
            return;
          }
          this.$message.success("已保存");
          this.sectionUpDia = false;
          this.currentPage0 = 1;
          this.getList();
          this.rowClick({
            id: this.standardId,
          });
        });
      }
    },
    bindSupplierDensitySecond(row) {
      this.bindSupplierDensity(row);
    },
    // æ‰“开厂家绑定弹框
    bindSupplierDensity(row) {
      this.currentSupplierDensityRow = row;
      this.bindSupplierDensityDialog = true;
    },
    closeBindSupplierDensityDialog() {
      this.bindSupplierDensityDialog = false;
    },
    getStandardTemplate() {
      getStandardTemplate().then((res) => {
        this.templateList = res.data;
      });
    },
    handleCurrentChange(val) {
      this.currentPage = val;
      this.tableLoad2 = true;
      selectStandardProductListByMethodId({
        id: this.standardId,
        tree: this.selectTree,
        page: val,
      }).then((res) => {
        this.productList = res.data.productList;
        setTimeout(() => {
          this.productList.forEach((a) => {
            if (a.state == 1) this.toggleSelection(a);
          });
        }, 200);
        this.tableLoad2 = false;
      });
    },
    openCopyDia() {
      this.batchCopyDia = true;
      this.$nextTick(() => {
        this.$refs.BatchCopy.getList();
      });
    },
    async handleMore() {
      if (
        (!this.standardId && this.standardId != 0) ||
        this.standardList.length == 0
      ) {
        return this.$message.error("请选择实验室、样品");
      }
      await this.getList();
      this.moreEdit = true;
    },
    selectStandardMethodsSec() {
      selectStandardMethods().then((res) => {
        let data = [];
        res.data.forEach((a) => {
          data.push({
            label: a.code,
            value: a.code,
          });
        });
        this.methodList = data;
      });
    },
    subMoreEdit() {
      if (this.moreSelects.length === 0) {
        return this.$message.error("请选择检验项");
      }
      this.moreEditLoad = true;
      for (let a in this.moreInfo) {
        if (this.moreInfo[a] == "") {
          delete this.moreInfo[a];
        }
      }
      upStandardProducts({
        ids: JSON.stringify(this.moreSelects.map((a) => a.id)),
        standardProductList: this.moreInfo,
      }).then((res) => {
        this.moreEditLoad = false;
        if (res.code == 201) {
          this.$message.error("未保存");
          return;
        }
        this.$message.success("已保存");
        this.currentPage0 = 1;
        this.getList();
        this.rowClick({
          id: this.standardId,
        });
      });
    },
    handleSelectAll0(rows) {
      if (rows.length) {
        rows.forEach((a) => {
          if (!this.moreSelects.find((b) => a.id === b.id)) {
            this.moreSelects.push(a);
          }
        });
      } else {
        this.productList0.forEach((a) => {
          this.moreSelects = this.moreSelects.filter((b) => b.id != a.id);
        });
      }
    },
    handleSelectionChange0(val, row) {
      if (this.moreSelects.find((a) => a.id === row.id)) {
        this.moreSelects = this.moreSelects.filter((a) => a.id != row.id);
      } else {
        this.moreSelects.push(row);
      }
    },
    getList() {
      this.productTableLoading0 = true;
      this.getItemEnum();
      selectStandardProductByMethodId({
        id: this.standardId,
        tree: this.selectTree,
        page: this.currentPage0,
        laboratory: this.sonLaboratory,
        items: this.inspectionItemSubclass,
        item: this.inspectionItem,
      }).then((res) => {
        this.productList0 = res.data.records;
        this.total0 = res.data.total;
        this.productTableLoading0 = false;
        this.page = res.data.pages;
        this.$nextTick(() => {
          this.productList0.forEach((a, i) => {
            if (this.moreSelects.find((b) => a.id == b.id)) {
              this.$refs.productTable0.toggleRowSelection(
                this.productList0[i],
                true
              );
            }
          });
        });
      });
    },
    handleCurrentChange0(e) {
      this.currentPage0 = e;
      this.getList();
    },
    getItemEnum() {
      selectStandardProductEnumByMethodId({
        id: this.standardId,
        tree: this.selectTree,
        item: this.inspectionItem,
      }).then((res) => {
        this.filters0 = [];
        this.filters1 = [];
        res.data.item.forEach((a) => {
          this.filters0.push({
            text: a.inspectionItem,
            value: a.inspectionItem,
          });
        });
        res.data.items.forEach((a) => {
          if (a != null) {
            this.filters1.push({
              text: a.inspectionItemSubclass,
              value: a.inspectionItemSubclass,
            });
          }
        });
      });
    },
    beforeUpload(file, fileList) {
      if (
        file.raw.type !=
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
      ) {
        this.$message.error("上传文件格式不正确");
        this.$refs.upload.clearFiles();
        return false;
      }
    },
    submitUpload() {
      if (this.$refs.upload.uploadFiles.length == 0) {
        this.$message.error("未选择文件");
        return;
      }
      this.uploading = true;
      this.$refs.upload.submit();
    },
    onSuccess(response, file, fileList) {
      this.$refs.upload.clearFiles();
      this.uploadDia = false;
      this.uploading = false;
      if (response.code == 201) {
        this.$message.error(response.message);
        return;
      }
      this.$message.success("上传成功");
      this.standardList = [];
      this.productList = [];
      this.selectStandardTreeList();
    },
    onError(err, file, fileList) {
      this.$message.error("上传失败");
      this.$refs.upload.clearFiles();
      this.uploading = false;
    },
    clearProduct(type) {
      this.$confirm("是否清空?", "警告", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          if (type === 1) {
            resetTreeOfPrice({
              tree: this.selectTree,
              standardId: this.standardId,
            }).then((res) => {
              if (res.code == 201) {
                return;
              }
              this.$message.success("已清空");
              this.currentPage0 = 1;
              this.getList();
              this.rowClick({
                id: this.standardId,
              });
            });
          } else if (type === 2) {
            resetTreeOfHour({
              tree: this.selectTree,
              standardId: this.standardId,
            }).then((res) => {
              if (res.code == 201) {
                return;
              }
              this.$message.success("已清空");
              this.currentPage0 = 1;
              this.getList();
              this.rowClick({
                id: this.standardId,
              });
            });
          }
        })
        .catch(() => {});
    },
  },
};
</script>
vue.config.js
@@ -36,7 +36,7 @@
    proxy: {
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
        target: `http://192.168.1.36:8080`,
        target: `http://192.168.1.36:8002`,
        changeOrigin: true,
        pathRewrite: {
          ['^' + process.env.VUE_APP_BASE_API]: ''