spring
2025-03-07 ae5a56abad5cade3427d8ccac8588de9ce209ef3
搬迁供应商管理80%
已添加6个文件
已修改5个文件
1132 ■■■■■ 文件已修改
src/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js 129 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/systemManagement/correctiveAction.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/externalService/supplierManage/component/CardPanel.vue 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/externalService/supplierManage/component/ConsumableOverview.vue 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/externalService/supplierManage/component/Contents.vue 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/externalService/supplierManage/component/Edit.vue 217 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/externalService/supplierManage/component/QualifiedSuppliers.vue 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/externalService/supplierManage/index.vue 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/complaint/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/correctiveAction/components/correctiveInfo.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js
@@ -1,38 +1,64 @@
import request from '@/utils/request'
import request from "@/utils/request";
// åˆ†é¡µæŸ¥è¯¢
// ä¾›åº”æ ‘
export function suppliersDirectoryContentsListing(query) {
  return request({
    url: "/suppliersDirectoryContents/suppliersDirectoryContentsListing",
    method: "get",
    params: query,
  });
}
// ä¾›åº”商目录详情
export function selectSuppliersDirectoryContentsById(query) {
  return request({
    url: "/suppliersDirectoryContents/selectSuppliersDirectoryContentsById",
    method: "get",
    params: query,
  });
}
// æ–°å¢žèŠ‚ç‚¹
export function addSuppliersDirectoryContents(data) {
  return request({
    url: "/suppliersDirectoryContents/addSuppliersDirectoryContents",
    method: "post",
    data: data,
  });
}
// ç¼–辑节点
export function updateSuppliersDirectoryContents(data) {
  return request({
    url: "/suppliersDirectoryContents/updateSuppliersDirectoryContents",
    method: "post",
    data: data,
  });
}
//删除节点
export function deleteSuppliersDirectoryContentsById(query) {
  return request({
    url: "/suppliersDirectoryContents/deleteSuppliersDirectoryContentsById",
    method: "delete",
    params: query,
  });
}
// æŸ¥è¯¢æ‰€æœ‰èŠ‚ç‚¹
export function getSuppliersDirectoryContentsNodeNames(query) {
  return request({
    url: "/suppliersDirectoryContents/getSuppliersDirectoryContentsNodeNames",
    method: "get",
    params: query,
  });
}
// åˆ†é¡µæŸ¥è¯¢åˆæ ¼ä¾›æ–¹å
export function selectQualifiedSupplierManagementPage(query) {
  return request({
    url: '/supplierManagement/selectQualifiedSupplierManagementPage',
    method: 'get',
    params: query
  })
}
// ç¼–辑供应商
export function updateSupplierManagement(query) {
  return request({
    url: '/supplierManagement/updateSupplierManagement',
    method: 'post',
    data: query
  })
}
// æ–°å¢žä¾›åº”商
export function addSupplierManagement(query) {
  return request({
    url: '/supplierManagement/addSupplierManagement',
    method: 'post',
    data: query
  })
}
// å¯¼å‡ºä¾›åº”商
export function exportSupplierManagement(query) {
  return request({
    url: "/supplierManagement/exportSupplierManagement",
    url: "/supplierManagement/selectQualifiedSupplierManagementPage",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
@@ -40,13 +66,44 @@
// åˆ é™¤ä¾›åº”商
export function delSupplierManagement(query) {
  return request({
    url: '/supplierManagement/delSupplierManagement',
    method: 'delete',
    params: query
  })
    url: "/supplierManagement/delSupplierManagement/" + query,
    method: "delete",
    // params: query,
  });
}
// å¯¼å‡ºä¾›åº”商
export function exportSupplierManagement(query) {
  return request({
    url: "/supplierManagement/exportSupplierManagement/" + query,
    method: "get",
    responseType: "blob",
  });
}
// æ–°å¢žä¾›åº”商
export function addSupplierManagement(data) {
  return request({
    url: "/supplierManagement/addSupplierManagement",
    method: "post",
    data: data,
  });
}
// ç¼–辑供应商
export function updateSupplierManagement(data) {
  return request({
    url: "/supplierManagement/updateSupplierManagement",
    method: "post",
    data: data,
  });
}
// åˆ†é¡µæŸ¥è¯¢ä¾›æ–¹åå½•
export function selectSupplierManagementByParentId(query) {
  return request({
    url: "/supplierManagement/selectSupplierManagementByParentId/" + query,
    method: "get",
    // params: query,
  });
}
src/api/cnas/systemManagement/correctiveAction.js
@@ -15,9 +15,7 @@
  return request({
    url: "/qualitySupervise/exportSuperviseDetaillCorrect",
    method: "get",
    headers: {
      responseType: "blob",
    },
    params: query,
  });
}
src/views/CNAS/externalService/supplierManage/component/CardPanel.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
<template>
  <div class="card-container" @click="handleCard">
    <div class="card-panel" :class="[isActive == index ? 'isActive' : '']">
      <el-image style="width: 80%; height: 70px" :src="javaApi + '/img/' + data.logo" fit="scale-down" />
    </div>
    <div class="title">
      {{ data.supplierName }}
    </div>
  </div>
</template>
<script>
export default {
  props: {
    data: {
      type: Object,
      default: () => { },
    },
    index: {
      type: Number,
      default: -1,
    },
    isActive: {
      type: Number,
      default: -1,
    },
  },
  data() {
    return {};
  },
  methods: {
    handleCard() {
      this.$emit("handleCard", this.data, this.index);
    },
  },
};
</script>
<style scoped>
.card-container {
  margin: 10px 10px 10px 0;
  text-align: center;
}
.card-panel {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 90%;
  height: 90px;
  box-shadow: 0px 0px 20px 0px #0000001a;
  cursor: pointer;
  border-radius: 5px;
  border: 1px solid transparent;
}
.card-panel:hover {
  border: 1px solid #409eff;
  //background: #1D56C50D;
}
.isActive {
  border: 1px solid #409eff;
  //background: #1D56C50D;
}
.title {
  margin-top: 15px;
  margin-left: 10px;
  width: 80%;
  height: 30px;
  font-size: 13px;
  white-space: normal;
  word-break: break-all;
  overflow-wrap: break-word;
}
</style>
src/views/CNAS/externalService/supplierManage/component/ConsumableOverview.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
<template>
  <div>
    <el-row class="card-box">
      <el-col :span="4" v-for="(item, index) in cardList" :key="index">
        <CardPanel :isActive="isActive" :data="item" :index="index" @handleCard="handleCard" />
      </el-col>
    </el-row>
    <TableCard title="供应商信息" :showForm="false" style="margin-top: 5px">
      <template v-slot:table>
        <limsTable style="margin-top: 18px; padding: 0 15px" :height="'150px'" :column="columns"
          :table-data="tableData">
          <div slot="action" slot-scope="scope">
            <el-button type="text" @click="showDialog(scope)">查看</el-button>
          </div>
        </limsTable>
      </template>
    </TableCard>
    <Edit ref="editRef" @submit="getTableData" />
  </div>
</template>
<script>
import CardPanel from "./CardPanel.vue";
import TableCard from "@/components/TableCard/index.vue";
import limsTable from "@/components/Table/lims-table.vue";
import Edit from "./Edit.vue";
import {
  selectSupplierManagementByParentId,
} from "@/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js";
export default {
  components: { CardPanel, TableCard, limsTable, Edit },
  props: {
    contentsId: {
      type: Number,
      default: 0,
    },
  },
  data() {
    return {
      columns: [
        {
          label: "供应商编号",
          prop: "supplierRef",
        },
        {
          label: "供应商名称",
          prop: "supplierName",
        },
        {
          label: "地址",
          prop: "adress",
        },
        {
          label: "联系人",
          prop: "contacts",
        },
        {
          label: "联系电话",
          prop: "phone",
        },
        {
          label: "传真",
          prop: "fax",
        },
        {
          label: "网址",
          prop: "website",
        },
        {
          label: "邮箱",
          prop: "email",
        },
        {
          label: "上次更新时间",
          prop: "updateTime",
        },
        {
          fixed: "right",
          dataType: "slot",
          slot: "action",
          label: "操作",
        },
      ],
      cardList: [],
      tableData: [],
      isActive: -1,
    };
  },
  watch: {
    contentsId(newVal) {
      if (newVal !== 0) {
        this.getTableData();
      }
    },
  },
  mounted() {
    this.getTableData(this.contentsId);
  },
  methods: {
    // èŽ·å–è¡¨æ ¼æ•°æ®
    async getTableData() {
      const { code, data } = await selectSupplierManagementByParentId(this.contentsId);
      if (code == 200) {
        this.cardList = data;
      }
    },
    handleCard(data, index) {
      this.isActive = index;
      this.tableData = [data];
    },
    showDialog(row) {
      this.$refs.editRef.openDialog(row);
    },
  },
};
</script>
<style scoped>
.card-box {
  width: 100%;
  padding-left: 5px;
  padding-right: 5px;
  height: 45vh;
  overflow-y: auto;
}
</style>
src/views/CNAS/externalService/supplierManage/component/Contents.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,211 @@
<template>
  <div class="parent-class">
    <div style="display: flex; justify-content: flex-end; margin-right: 20px">
      <el-button type="primary" @click="addContents" size="small" icon="el-icon-plus">添加子节点</el-button>
      <el-button type="danger" @click="deletetContents" size="small" icon="el-icon-delete">删除子节点</el-button>
      <el-button type="warning" @click="updateContents" size="small" icon="el-icon-edit">更新子节点</el-button>
    </div>
    <el-form label-width="100px">
      <el-form-item label="节点名称">
        <el-input v-model="form.nodeName" style="width: 200px" size="small"></el-input>
      </el-form-item>
      <el-form-item label="代号">
        <el-input v-model="form.code" style="width: 200px" size="small"></el-input>
      </el-form-item>
    </el-form>
    <!-- æ–°å¢žå¼¹æ¡† -->
    <el-dialog title="添加节点" :visible.sync="dialogVisible" width="40%">
      <el-form label-width="100px" :model="addForm" ref="addForm" :rules="rules">
        <el-form-item label="父节点名称">
          <el-cascader v-model="addForm.parentId" :options="treeData"
            :props="{ checkStrictly: true, value: 'id', label: 'nodeName' }" clearable></el-cascader>
        </el-form-item>
        <el-form-item label="节点名称" prop="nodeName">
          <el-input v-model="addForm.nodeName" style="width: 200px" size="small"></el-input>
        </el-form-item>
        <el-form-item label="代号">
          <el-input v-model="addForm.code" style="width: 200px" size="small"></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import {
  selectSuppliersDirectoryContentsById,
  addSuppliersDirectoryContents,
  updateSuppliersDirectoryContents,
  deleteSuppliersDirectoryContentsById,
  getSuppliersDirectoryContentsNodeNames,
} from "@/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js";
import { selectUserCondition } from "@/api/system/user";
export default {
  props: {
    id: {
      type: Number,
      default: 0,
    },
    treeData: {
      type: Array,
      default: () => [],
    },
    from: {
      type: String,
      default: ""
    }
  },
  data() {
    return {
      nodeNames: [],
      users: [],
      dialogVisible: false,
      form: {
        nodeName: "",
        code: "",
      },
      addForm: {
        nodeName: "",
        code: "",
        parentId: null,
      },
      rules: {
        nodeName: [
          { required: true, message: "请输入节点名称", trigger: "blur" },
        ],
      },
    };
  },
  mounted() {
    if (this.id !== 0) {
      this.getContentsDetail();
    }
    this.getNodeNames();
    this.getUserList();
  },
  watch: {
    id(newVal, oldVal) {
      if (newVal !== 0) {
        console.log(newVal, oldVal);
        this.getContentsDetail();
      }
    },
  },
  methods: {
    // èŽ·å–ç›®å½•è¯¦æƒ…
    getContentsDetail() {
      selectSuppliersDirectoryContentsById({ id: this.id }).then((res) => {
        if (res.data == null) {
          this.form = {
            nodeName: "",
            code: "",
          };
          return;
        }
        this.form = res.data;
      });
    },
    // æ–°å»º
    addContents() {
      this.dialogVisible = true;
      this.resetForm();
    },
    resetForm() {
      this.addForm = {
        nodeName: "",
        code: "",
        parentId: null,
      };
    },
    submitForm() {
      let flag = true;
      this.$refs.addForm.validate((valid) => {
        if (!valid) {
          flag = false;
          return false;
        }
      });
      if (this.addForm.parentId) {
        this.addForm.parentId =
          this.addForm.parentId[this.addForm.parentId.length - 1];
      }
      if (!flag) {
        return;
      }
      addSuppliersDirectoryContents(this.addForm).then((res) => {
        if (res.code === 200) {
          this.$message.success("添加成功");
          this.dialogVisible = false;
          this.$emit("contentsUpdate", res.data);
          this.getContentsDetail();
        }
      });
    },
    // æ›´æ–°
    updateContents() {
      Object.keys(this.form).forEach((key) => {
        if (key == "children") {
          delete this.form[key];
        }
      });
      updateSuppliersDirectoryContents(this.form).then((res) => {
        if (res.code === 200) {
          this.$message.success("更新成功");
          this.$emit("contentsUpdate", this.id);
          this.dialogVisible = false;
          this.getContentsDetail();
        }
      });
    },
    // åˆ é™¤
    deletetContents() {
      if (
        this.form.id == null ||
        this.form.id == "" ||
        this.form.id == undefined
      ) {
        this.$message.error("请选择要删除的节点");
        return;
      }
      this.$confirm("此操作将删除该节点, æ˜¯å¦ç»§ç»­?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      }).then(() => {
        deleteSuppliersDirectoryContentsById({ id: this.form.id }).then((res) => {
          if (res.code == 200) {
            this.$message.success("删除成功");
            this.$emit("contentsUpdate", this.form.parentId, true);
            this.getContentsDetail();
          }
        });
      });
    },
    // èŽ·å–æ‰€æœ‰ç›®å½•èŠ‚ç‚¹
    getNodeNames() {
      getSuppliersDirectoryContentsNodeNames().then((res) => {
        this.nodeNames = res.data;
      });
    },
    // èŽ·å–æ‰€æœ‰ç”¨æˆ·
    getUserList() {
      selectUserCondition().then((res) => {
        this.users = res.data;
      });
    },
  },
  created() { },
};
</script>
<style scoped>
.parent-class {
  margin-top: 20px;
}
</style>
src/views/CNAS/externalService/supplierManage/component/Edit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,217 @@
<template>
  <el-dialog title="供应商详情" width="40%" :visible.sync="dialogVisible">
    <el-form :model="model" label-width="auto">
      <el-row>
        <el-col :span="12">
          <el-form-item label="供应商">
            <el-input v-model="model.supplierName" placeholder="请输入" />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="编号">
            <el-input v-model="model.supplierRef" placeholder="请输入" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="供应商物品服务名称">
            <el-input v-model="model.supplierItemServiceName" placeholder="请输入" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="12">
          <el-form-item label="邮编">
            <el-input v-model="model.postalCode" placeholder="请输入" />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="地址">
            <el-input v-model="model.adress" placeholder="请输入" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="logo">
            <div class="rows">
              <el-input placeholder="请输入" v-model="model.logo" style="width: 100%" />
              <el-upload ref="upload" style="float: left; margin: 0 12px 0 20px" :action="action"
                :show-file-list="false" :on-success="onSuccess">
                <el-button class="uploadFile" slot="trigger" type="primary">浏览</el-button>
              </el-upload>
            </div>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="12">
          <el-form-item label="联系人">
            <el-input v-model="model.contacts" placeholder="请输入" />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="联系电话">
            <el-input v-model="model.phone" placeholder="请输入" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="12">
          <el-form-item label="户名">
            <el-input v-model="model.householdName" placeholder="请输入" />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="传真">
            <el-input v-model="model.fax" placeholder="请输入" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="12">
          <el-form-item label="开户行">
            <el-input v-model="model.openingName" placeholder="请输入" />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="网址">
            <el-input v-model="model.website" placeholder="请输入" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="12">
          <el-form-item label="账号">
            <el-input v-model="model.accountName" placeholder="请输入" />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="Email">
            <el-input v-model="model.email" placeholder="请输入" />
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <span slot="footer">
      <el-button @click="dialogVisible = false">取 æ¶ˆ</el-button>
      <el-button type="primary" @click="submit">保 å­˜</el-button>
    </span>
  </el-dialog>
</template>
<script>
import {
  addSupplierManagement,
  updateSupplierManagement,
} from "@/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js";
export default {
  props: {
    contentsId: {
      type: Number,
      default: 0,
    },
  },
  data() {
    return {
      dialogVisible: false,
      model: {
        parentId: null,
        supplierManagementId: undefined,
        supplierName: undefined, // ä¾›åº”商
        supplierRef: undefined, // ç¼–号
        supplierItemServiceName: undefined, // ä¾›åº”商物品服务名称
        postalCode: undefined, // é‚®ç¼–
        adress: undefined, // åœ°å€
        logo: undefined, // logo
        contacts: undefined, // è”系人
        phone: undefined, // è”系电话
        householdName: undefined, // æˆ·å
        fax: undefined, // ä¼ çœŸ
        openingName: undefined, // å¼€æˆ·è¡Œ
        website: undefined, // ç½‘址
        accountName: undefined, // è´¦å·
        email: undefined, // Email
      },
    };
  },
  computed: {
    action() {
      return `${this.javaApi}/personBasicInfo/saveCNASFile`;
    },
  },
  methods: {
    openDialog(form) {
      console.log("12--", this.contentsId);
      if (form) {
        this.model.supplierManagementId = form.row.supplierManagementId;
        this.model.supplierName = form.row.supplierName;
        this.model.supplierRef = form.row.supplierRef;
        this.model.supplierItemServiceName = form.row.supplierItemServiceName;
        this.model.postalCode = form.row.postalCode;
        this.model.adress = form.row.adress;
        this.model.logo = form.row.logo;
        this.model.contacts = form.row.contacts;
        this.model.phone = form.row.phone;
        this.model.householdName = form.row.householdName;
        this.model.fax = form.row.fax;
        this.model.openingName = form.row.openingName;
        this.model.website = form.row.website;
        this.model.accountName = form.row.accountName;
        this.model.email = form.row.email;
        this.model.parentId = form.row.parentId;
      } else {
        this.model = {
          parentId: this.contentsId,
          supplierManagementId: undefined,
          supplierName: undefined, // ä¾›åº”商
          supplierRef: undefined, // ç¼–号
          supplierItemServiceName: undefined, // ä¾›åº”商物品服务名称
          postalCode: undefined, // é‚®ç¼–
          adress: undefined, // åœ°å€
          logo: undefined, // logo
          contacts: undefined, // è”系人
          phone: undefined, // è”系电话
          householdName: undefined, // æˆ·å
          fax: undefined, // ä¼ çœŸ
          openingName: undefined, // å¼€æˆ·è¡Œ
          website: undefined, // ç½‘址
          accountName: undefined, // è´¦å·
          email: undefined, // Email
        };
      }
      // this.model.parentId = this.contentsId;
      this.dialogVisible = true;
    },
    async submit() {
      if (this.model.supplierManagementId) {
        const { code } = await updateSupplierManagement(this.model);
        if (code == 200) {
          this.$message.success("修改成功");
          this.$emit("submit");
          this.dialogVisible = false;
        }
      } else {
        const { code } = await addSupplierManagement(this.model);
        if (code == 200) {
          this.$message.success("新增成功");
          this.$emit("submit");
          this.dialogVisible = false;
        }
      }
    },
    async onSuccess(response) {
      this.$set(this.model, "logo", response.data);
    },
  },
};
</script>
<style scoped>
.rows {
  width: 100%;
  display: flex;
  justify-content: space-between;
}
</style>
src/views/CNAS/externalService/supplierManage/component/QualifiedSuppliers.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
<template>
  <div>
    <TableCard :showTitle="false">
      <template slot="form">
        <div class="action-box">
          <div></div>
          <div class="flex">
            <el-button :disabled="contentsId == 0" icon="el-icon-plus" type="primary" @click="showDialog()">
              æ–°å»º
            </el-button>
            <el-button icon="el-icon-upload2" @click="exportExcel">
              å¯¼å‡ºExcel
            </el-button>
          </div>
        </div>
      </template>
      <template v-slot:table>
        <limsTable :column="columns" :height="'calc(100vh - 300px)'" :isSelection="true" :table-data="tableData"
          style="margin-top: 18px; padding: 0 15px;" :page="page" @pagination="pagination">
          <div slot="action" slot-scope="scope">
            <el-button type="text" @click="showDialog(scope)">编辑</el-button>
            <el-button type="text" @click="delRow(scope)">
              <span style="color: #F56C6C">删除</span>
            </el-button>
          </div>
        </limsTable>
      </template>
    </TableCard>
    <Edit ref="editRef" :contentsId="contentsId" @submit="getTableData" />
  </div>
</template>
<script>
import TableCard from '@/components/TableCard/index.vue';
import limsTable from "@/components/Table/lims-table.vue";
import Edit from "./Edit.vue"
import {
  selectQualifiedSupplierManagementPage,
  delSupplierManagement,
  exportSupplierManagement,
} from "@/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js";
export default {
  components: {
    TableCard, limsTable, Edit
  },
  props: {
    contentsId: {
      type: Number,
      default: 0
    }
  },
  data() {
    return {
      columns: [
        {
          label: "供应商编号",
          prop: "supplierRef"
        },
        {
          label: "供应商",
          prop: "supplierName"
        },
        {
          label: "供应物品(服务)名称",
          prop: "supplierItemServiceName"
        },
        {
          label: "地址",
          prop: "adress"
        },
        {
          label: "联系电话",
          prop: "phone"
        },
        {
          fixed: "right",
          dataType: "slot",
          slot: "action",
          label: "操作"
        }
      ],
      tableData: [],
      page: {
        current: 1,
        size: 20,
        total: 0
      },
    }
  },
  mounted() {
    this.getTableData()
  },
  watch: {
    contentsId(newVal) {
      if (newVal !== 0) {
        this.getTableData();
      }
    },
  },
  methods: {
    // èŽ·å–è¡¨æ ¼æ•°æ®
    async getTableData() {
      const { code, data } = await selectQualifiedSupplierManagementPage({
        ...this.page,
        parentId: this.contentsId
      })
      if (code == 200) {
        this.tableData = data.records;
        this.page.total = data.total;
        this.page.current = data.current;
        this.page.size = data.size;
      }
    },
    showDialog(scope) {
      this.$refs.editRef.openDialog(scope)
    },
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.getTableData();
    },
    // åˆ é™¤æ•°æ®
    delRow(scope) {
      this.$confirm('此操作将永久删除该文件, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(async () => {
        const { code } = await delSupplierManagement(scope.row.supplierManagementId)
        if (code == 200) {
          this.$message.success('删除成功')
          this.getTableData()
        } else {
          this.$message.error('删除失败')
        }
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      })
    },
    async exportExcel() {
      const res = await exportSupplierManagement(this.contentsId)
      const blob = new Blob([res], { type: 'application/octet-stream' });
      this.$download.saveAs(blob, '合格供应商.xlsx')
    }
  }
}
</script>
<style scoped>
.flex {
  display: flex;
}
.action-box {
  width: 100%;
  padding-top: 10px;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.pagination {
  padding-top: 15px;
  padding-right: 10px;
  display: flex;
  justify-content: space-between
}
</style>
src/views/CNAS/externalService/supplierManage/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,149 @@
<template>
  <div class="purchase-page">
    <div class="purchase-left">
      <el-input v-model="form.nodeName" placeholder="请输入节点名称" suffix-icon="el-icon-search" size="small" clearable
        @keyup.enter.native="searchFilter(treeData)" @blur="searchFilter(treeData)" @clear="searchFilter(treeData)">
      </el-input>
      <el-tree ref="tree" highlight-current :data="treeData" :props="defaultProps" @node-click="handleNodeClick"
        :default-expanded-keys="expandedKeys" node-key="id">
      </el-tree>
    </div>
    <div class="purchase-right">
      <el-tabs v-model="activeName" @tab-click="handleClick" style="height: 100%">
        <el-tab-pane label="总览" name="1" style="height: 100%">
          <ConsumableOverview v-if="activeName == '1'" ref="consumableOverviewRef" :contentsId="contentsId"
            style="height: 100%"></ConsumableOverview>
        </el-tab-pane>
        <el-tab-pane label="合格供方名录" name="2">
          <QualifiedSuppliers v-if="activeName == '2'" :contentsId="contentsId"></QualifiedSuppliers>
        </el-tab-pane>
        <el-tab-pane label="目录维护" name="3">
          <Contents v-if="activeName == '3'" :id="contentsId" :treeData="treeData" @contentsUpdate="contentsUpdate"
            from="供应树"></Contents>
        </el-tab-pane>
      </el-tabs>
    </div>
  </div>
</template>
<script>
import Contents from "./component/Contents.vue";
import ConsumableOverview from "./component/ConsumableOverview.vue";
import QualifiedSuppliers from "./component/QualifiedSuppliers.vue";
import { suppliersDirectoryContentsListing } from "@/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js";
export default {
  components: {
    ConsumableOverview,
    QualifiedSuppliers,
    Contents,
  },
  data() {
    return {
      contentsId: 0,
      activeName: "1",
      form: {
        nodeName: "",
      },
      treeData: [],
      expandedKeys: [],
      defaultProps: {
        children: "children",
        label: "nodeName",
      },
    };
  },
  mounted() {
    this.getTreeData();
  },
  methods: {
    searchFilter() {
      this.treeData = JSON.parse(JSON.stringify(this.treeData));
      this.expandedKeys = [];
      if (this.form.nodeName == "") {
        return;
      }
      const findNodesWithFiber = (nodes) => {
        nodes.forEach((node) => {
          if (node.nodeName && node.nodeName.includes(this.form.nodeName)) {
            this.expandedKeys.push(node.id);
          }
          if (node.children && node.children.length > 0) {
            findNodesWithFiber(node.children);
          }
        });
      };
      findNodesWithFiber(this.treeData);
    },
    // ç›®å½•维护更新
    contentsUpdate(val, flag = false) {
      if (val) {
        this.getTreeData();
        this.expandedKeys = [];
        if (flag) {
          const findNodesWithFiber = (nodes) => {
            nodes.forEach((item) => {
              if (item.parentId == val) {
                this.expandedKeys.push(item.id);
              }
              if (item.children && item.children.length > 0) {
                findNodesWithFiber(item.children);
              }
            });
          };
          findNodesWithFiber(this.treeData);
          this.expandedKeys = this.expandedKeys.filter((item) => item !== val);
        } else {
          this.expandedKeys.push(val);
        }
      } else {
        this.getTreeData();
      }
    },
    // æŸ¥è¯¢æ‰€æœ‰ç›®å½•
    getTreeData() {
      suppliersDirectoryContentsListing().then((res) => {
        this.treeData = res.data;
      });
    },
    // ç‚¹å‡»æ ‘节点
    handleNodeClick(data) {
      this.contentsId = data.id;
      // this.$refs.consumableOverviewRef.getTableData(data.id)
    },
    handleClick(tab, event) { },
  },
};
</script>
<style scoped>
.purchase-left {
  width: 250px;
  height: 100%;
  background: #fff;
  margin-right: 10px;
  border-radius: 16px;
  box-sizing: border-box;
  padding: 10px 16px;
  flex-shrink: 0;
}
.purchase-right {
  background: #fff;
  width: calc(100% - 15em);
  height: 100%;
  border-radius: 16px;
  box-sizing: border-box;
  padding: 10px 16px;
}
.purchase-page {
  display: flex;
  padding-top: 10px;
  padding-bottom: 10px;
  box-sizing: border-box;
  width: 100%;
}
>>>.el-tabs__content {
  height: calc(100% - 40px);
}
</style>
src/views/CNAS/process/complaint/index.vue
@@ -456,7 +456,7 @@
    },
    // æŸ¥çœ‹æŠ•诉
    handleLook(row) {
      addProcessComplain({ id: row.id }).then((res) => {
      getProcessComplain({ id: row.id }).then((res) => {
        this.currentInfo = res.data
        this.currentInfo0 = this.HaveJson(res.data)
        this.title = '查看投诉'
src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue
@@ -10,14 +10,8 @@
        <el-form-item label="相关附件" prop="file">
          <div class="table-between">
            <el-input v-model="acceptance.file" style="width: 80%;" disabled></el-input>
            <el-upload
              ref="upload"
              style="float: right;"
              :headers="uploadHeader"
              :action="action"
              :show-file-list="false"
              :on-success="onSuccess"
            >
            <el-upload ref="upload" style="float: right;" :headers="uploadHeader" :action="action"
              :show-file-list="false" :on-success="onSuccess">
              <el-button type="primary">
                é™„件上传
              </el-button>
@@ -46,28 +40,17 @@
        </el-form-item>
      </el-col>
      <el-col :span="12">
        <el-form-item label="清单" prop="substanceId"
                      :rule="[{ required: true, message: '请选择清单', trigger: 'change' }]">
        <el-form-item label="清单" prop="substanceId" :rule="[{ required: true, message: '请选择清单', trigger: 'change' }]">
          <el-select v-model="acceptance.substanceId" placeholder="请选择" style="width: 100%">
            <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.name"
              :value="item.id">
            <el-option v-for="item in options" :key="item.value" :label="item.name" :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
      </el-col>
      <el-col :span="12">
        <el-form-item label="到货日期" prop="arriveDate">
          <el-date-picker
            v-model="acceptance.arriveDate"
            align="right"
            type="date"
            placeholder="选择日期"
            style="width: 100%"
            value-format="yyyy-MM-dd"
          >
          <el-date-picker v-model="acceptance.arriveDate" align="right" type="date" placeholder="选择日期"
            style="width: 100%" value-format="yyyy-MM-dd">
          </el-date-picker>
        </el-form-item>
      </el-col>
src/views/CNAS/systemManagement/correctiveAction/components/correctiveInfo.vue
@@ -6,19 +6,6 @@
        <table border="1" cellspacing="10" class="tables">
          <tr>
            <td class="td-title">
              <p>培训计划:</p>
            </td>
            <td class="td-info" colspan="3">
              <el-select v-model="form.personTrainingDetailedId" clearable filterable style="width: 100%" disabled
                placeholder="请选择" size="small">
                <el-option v-for="item in yearTrainingDetailed" :key="item.id" :label="item.trainingObjectives"
                  :value="item.id">
                </el-option>
              </el-select>
            </td>
          </tr>
          <tr>
            <td class="td-title">
              <p>不合格或偏离事实的描述:</p>
            </td>
            <td class="td-info" colspan="3">
@@ -154,7 +141,6 @@
<script>
import {
  getSuperviseDetailCorrect,
  getThisYearTrainingDetailed,
} from '@/api/cnas/systemManagement/correctiveAction.js'
export default {
  name: 'correctiveInfo',
@@ -164,7 +150,6 @@
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      formDia: false,
      yearTrainingDetailed: [],
      form: {
        superviseDetailsId: '',
        raiseResult: '',
@@ -197,7 +182,6 @@
      this.formDia = true
      this.searchInfo(row)
      this.form.superviseDetailsId = row.superviseDetailsId
      this.getYearTrainingDetailed() // èŽ·å–åŸ¹è®­è®¡åˆ’
    },
    // æŸ¥è¯¢ç›‘控计划详情实施信息
    searchInfo(row) {
@@ -207,11 +191,6 @@
        this.form = res.data
      }).catch(err => {
        console.log('err---', err);
      })
    },
    getYearTrainingDetailed() {
      getThisYearTrainingDetailed().then(res => {
        this.yearTrainingDetailed = res.data
      })
    },
    // å…³é—­å¼¹æ¡†