Browse Source

产品清单首页

liu1tian 11 months ago
parent
commit
6774d3e94b

+ 7 - 0
src/router/index.js

@@ -394,6 +394,13 @@ export const constantRoutes = [
     component: () => import('@/views/material/extend/sale'),
     hidden: true,
   },
+  // 产品清单-主页
+  {
+    path: '/material/extend/indexMain',
+    name: "MaterialIndex",
+    component: () => import('@/views/material/extend/indexMain'),
+    hidden: true,
+  },
 ]
 
 

+ 4 - 4
src/views/ctyc/info/approval.vue

@@ -434,14 +434,14 @@ export default {
           value: '',
           label: '请选择'
         }, {
-          value: '风险A:风险较低,不影响继续合作',
-          label: '风险A:风险较低,不影响继续合作'
+          value: '风险A:风险较高,可能影响合作',
+          label: '风险A:风险较高,可能影响合作'
         }, {
           value: '风险B:风险一般,建议人工了解',
           label: '风险B:风险一般,建议人工了解'
         }, {
-          value: '风险C:风险较高,可能影响合作',
-          label: '风险C:风险较高,可能影响合作'
+          value: '风险C:风险较低,不影响继续合作',
+          label: '风险C:风险较低,不影响继续合作'
         }],
       // 详情弹出层标题
       alogTitle: "",

+ 18 - 10
src/views/ctyc/info/approvalMain.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="app-container">
     <el-tabs v-model="activeName" >
-      <el-tab-pane :label="num1" name="approval"></el-tab-pane>
-      <el-tab-pane :label="num2" name="approved"></el-tab-pane>
+      <el-tab-pane :label="num1" name="approval" @click="tabClick"></el-tab-pane>
+      <el-tab-pane :label="num2" name="approved" @click="tabClick"></el-tab-pane>
     </el-tabs>
     <component :is="currentPage"></component>
   </div>
@@ -27,17 +27,25 @@ export default {
       activeName: 'approval' // 默认激活第一个标签
     };
   },
+  watch: {
+    currentPage(newValue, oldValue) {
+        if(oldValue != newValue){
+          this.tabClick();
+        }
+      },
+    },
   created() {
-    listInfo(this.queryParams1).then(response => {
-      // 
-      this.num1 = "待审阅 ("+response.total+")";
-    });
-    listInfo(this.queryParams2).then(response => {
-      this.num2 = "已审阅 ("+response.total+")";
-    });
+    this.tabClick();
   },
   methods: {
-    
+    tabClick(){
+      listInfo(this.queryParams1).then(response => {
+        this.num1 = "待审阅 ("+response.total+")";
+      });
+      listInfo(this.queryParams2).then(response => {
+        this.num2 = "已审阅 ("+response.total+")";
+      });
+    }
   },
   components:{
     approval,

+ 5 - 5
src/views/ctyc/info/approved.vue

@@ -51,7 +51,7 @@
     </el-form>
 
     <el-row :gutter="10" class="mb8">
-      <h4><span>   备注: 风险A:风险较低,不影响继续合作; 风险B:风险一般,建议人工了解; 风险C:风险较高,可能影响合作。</span></h4>
+      <h4><span>   备注: 风险A:风险较高,可能影响合作; 风险B:风险一般,建议人工了解; 风险C:风险较低,不影响继续合作。</span></h4>
 
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
@@ -469,14 +469,14 @@ export default {
           value: '',
           label: '请选择'
         }, {
-          value: '风险A:风险较低,不影响继续合作',
-          label: '风险A:风险较低,不影响继续合作'
+          value: '风险A:风险较高,可能影响合作',
+          label: '风险A:风险较高,可能影响合作'
         }, {
           value: '风险B:风险一般,建议人工了解',
           label: '风险B:风险一般,建议人工了解'
         }, {
-          value: '风险C:风险较高,可能影响合作',
-          label: '风险C:风险较高,可能影响合作'
+          value: '风险C:风险较低,不影响继续合作',
+          label: '风险C:风险较低,不影响继续合作'
         }],
       // 详情弹出层标题
       alogTitle: "",

+ 226 - 0
src/views/material/basicFile/columns.js

@@ -367,3 +367,229 @@ export const OtherDictColumns = [
   },
   
 ]
+
+
+
+export const SearchColumnsExtend = [
+  {
+    item:{
+      key: "codes",
+      title: "物料编码",  
+    },
+    attr:{
+      clearable:true,
+      is: "el-popover-multiple-select-v2",
+      valueKey: "code",
+      referName: "MATERIAL_PARAM",
+    },
+  },
+  {
+    item: { key: "materialCodes", title: "物料编码" },
+    attr: {
+      clearable: true,
+      is: "el-input",
+      placeholder: '多物料编码使用 , 隔开',
+    },
+  },
+  {
+    item:{
+      key: "name",
+      title: "物料名称",  
+    },
+    attr:{
+      clearable:true,
+      is: "el-popover-select-v2",
+      valueKey: "name",
+      referName: "MATERIAL_PARAM",
+    },
+  },
+  // diCode
+  {
+    item:{
+      key: "diCode",
+      title: "DI",
+    },
+    attr: {
+      clearable:true,
+      is: "el-input",
+    },
+  },
+  {
+    item:{
+      key: "puPersonnelIdName",
+      title: "采购员",
+    },
+    attr: {
+      clearable:true,
+      is: "el-popover-select-v2",
+      referName: "CONTACTS_PARAM",
+      valueKey: "name",
+      dataMapping: {
+        puPersonnelId: "code",
+      },
+    },
+  },
+  {
+    item:{
+      key: "manufacturerIdName",
+      title: "生产厂家/代理人",  
+    },
+    attr:{
+      clearable:true,
+      is: "el-popover-select-v2",
+      valueKey: "name",
+      referName: "MANUFACTURER_PARAM",
+      dataMapping: {
+        manufacturerId: "id",
+      },
+    },
+  },
+  {
+    item:{
+      key: "isEnable",
+      title: "启用状态",  
+    },
+    attr:{
+      clearable:true,
+      is: "el-select",
+      dictName: "material_enable",
+    },
+  },
+  {
+    item:{
+      key: "isMedicine",
+      title: "是否医药物料",  
+    },
+    attr:{
+      clearable:true,
+      is: "el-select",
+      dictName: "sys_number_yes_no",
+    },
+  },
+  {
+    item:{
+      key: "medicalInstruments",
+      title: "管理类别",  
+    },
+    attr:{
+      clearable:true,
+      is: "el-select",
+      dictName: "medical_instruments",
+    },
+  },
+  {
+    item:{
+      key: "specification",
+      title: "规格",
+    },
+    attr: {
+      clearable:true,
+      is: "el-input",
+    },
+  },
+  {
+    item:{
+      key: "model",
+      title: "型号",
+    },
+    attr: {
+      clearable:true,
+      is: "el-input",
+    },
+  },
+  {
+    item:{
+      key: "version",
+      title: "版本号",
+    },
+    attr: {
+      clearable:true,
+      is: "el-input",
+    },
+  },
+  {
+    item:{
+      key: "registrant",
+      title: "注册人",
+    },
+    attr: {
+      clearable:true,
+      is: "el-input",
+    },
+  },
+  {
+    item:{
+      key: "registrationNo",
+      title: "注册证号",
+    },
+    attr: {
+      clearable:true,
+      is: "el-input",
+    },
+  },
+  {
+    item:{
+      key: "serialNoManager",
+      title: "是否序列号管理",  
+    },
+    attr:{
+      clearable:true,
+      is: "el-select",
+      dictName: "sys_number_yes_no",
+    },
+  },
+
+  {
+    item:{
+      key: "createByName",
+      title: "创建人",
+    },
+    attr: {
+      clearable:true,
+      is: "el-popover-select-v2",
+      referName: "CONTACTS_PARAM",
+      valueKey: "name",
+      dataMapping: {
+        createBy: "code",
+      },
+    },
+  },
+  
+  {
+    item:{
+      key: "updateByName",
+      title: "最后修改人",
+    },
+    attr: {
+      clearable:true,
+      is: "el-popover-select-v2",
+      referName: "CONTACTS_PARAM",
+      valueKey: "name",
+      dataMapping: {
+        updateBy: "code",
+      },
+    },
+  },
+  {
+    item:{
+      key: "createTimeQueue",
+      title: "创建时间",
+      span:12,
+    },
+    attr: {
+      clearable:true,
+      is: "el-date-wrapper",
+    },
+  },
+  {
+    item:{
+      key: "updateTimeQueue",
+      title: "修改时间",
+      span:12,
+    },
+    attr: {
+      clearable:true,
+      is: "el-date-wrapper",
+    },
+  }
+];

+ 1 - 1
src/views/material/basicFile/index.vue

@@ -235,7 +235,7 @@ export default {
     },
   },
   created() {
-    this.getTagList("material");
+    this.getTagList("material_list");
     this.useList();
   },
 };

+ 393 - 0
src/views/material/basicFile/indexExtend.vue

@@ -0,0 +1,393 @@
+<script>
+import materialApi from "@/api/material/basic";
+import { SearchColumnsExtend, OtherDictColumns } from "./columns";
+import { initDicts } from "@/utils/init.js";
+export default {
+  name: "material-basic",
+  dicts: [...initDicts([...SearchColumnsExtend, ...OtherDictColumns])],
+  components: {
+    ElSuperSearch: () => import("@/components/super-search/index.vue"),
+    ElDictTag: () => import("@/components/DictTag/index.vue"),
+    IsUsing: () => import("./isUsing/index.vue"),
+    detailDrawer: () => import("./details.vue"),
+    whlbButton: () => import("./wei-hu-lei-bie/index.vue"),
+    BatchImport: () => import("@/components/BatchImport/index.vue"),
+  },
+  props: {
+    parentData: String
+  },
+  watch: {
+    parentData(newValue, oldValue) {
+      // 当parentData变化时,这个函数会被调用
+      if(newValue != ''){
+        this.$set(this.params,'classifys',[newValue])
+        this.useList()
+      }
+    }
+  },
+  data() {
+    const params = this.$init.params(SearchColumnsExtend);
+    const page = this.$init.page();
+    return {
+      loading: false,
+      params: params,
+      SearchColumnsExtend: SearchColumnsExtend,
+      rowKey: "id",
+      size: "mini",
+      page: page,
+      taskList: [],
+      checkedList: [],
+      resizeHeight: 0,
+      tableHeader: [],
+    };
+  },
+  computed: {
+    tableHeight: {
+      get() {
+        return this.resizeHeight;
+      },
+      set() {},
+    },
+  },
+  directives: {
+    // 使用局部注册指令的方式
+    resize: {
+      // 指令的名称
+      bind(el, binding) {
+        // el为绑定的元素,binding为绑定给指令的对象
+        let width = "",
+          height = "";
+        function isReize() {
+          const style = document.defaultView.getComputedStyle(el);
+          if (width !== style.width || height !== style.height) {
+            binding.value(); // 关键
+          }
+          width = style.width;
+          height = style.height;
+        }
+        el.__vueSetInterval__ = setInterval(isReize, 300);
+      },
+      unbind(el) {
+        clearInterval(el.__vueSetInterval__);
+      },
+    },
+  },
+  methods: {
+    resize() {
+      this.resizeHeight =
+        document.getElementsByClassName("el-super-ux-table")[0].offsetHeight -
+        55;
+    },
+    // 列表
+    async useList() {
+      try {
+        this.loading = true;
+
+        this.checkedList = [];
+
+        let param = {
+          templateCode: "material",
+          ...this.params,
+          createTimeBegin:
+            (this.params.createTimeQueue && this.params.createTimeQueue[0]) ||
+            "",
+          createTimeEnd:
+            (this.params.createTimeQueue && this.params.createTimeQueue[1]) ||
+            "",
+          updateTimeBegin:
+            (this.params.updateTimeQueue && this.params.updateTimeQueue[0]) ||
+            "",
+          updateTimeEnd:
+            (this.params.updateTimeQueue && this.params.updateTimeQueue[1]) ||
+            "",
+        };
+
+        let {
+          code,
+          data: {
+            tableBody: { rows, total },
+          },
+        } = await materialApi.materialList(param, this.page);
+
+        if (code == 200) {
+          this.taskList = rows;
+          this.page.total = total;
+        }
+      } catch (error) {
+      } finally {
+        this.loading = false;
+      }
+    },
+    // 获取物料列表表头
+    async getTagList(templateCode) {
+      try {
+        let { code, data } = await materialApi.tagList({ templateCode });
+        if (code == 200) {
+          this.tableHeader = data;
+        }
+      } catch (error) {}
+    },
+    // 重置
+    useReset() {
+      this.params = this.$init.params(SearchColumnsExtend);
+      this.page = this.$init.page();
+      this.useList();
+    },
+    handleEdit() {
+      let { setVisible } = this.$refs.detailDrawer;
+      setVisible(true);
+      // this.$router.push({
+      //   path: `/material/basicFile/detail/${this.checkedList[0].id}`,
+      //   query: {
+      //     isEdit: true,
+      //   },
+      // });
+    },
+    // 确认导入
+    handelImport(fileList) {
+      let formData = new FormData();
+
+      formData.append("file", fileList[0].raw);
+      materialApi.fileImport(formData).then((res) => {
+        if (res.code == 200) {
+          if (res.data.flag) {
+            this.$modal.loading("加载中...");
+            console.log(res.data.datas);
+            let param = { failDatas: res.data.datas };
+            if (null != param) {
+              materialApi.exportMartial(param).then((res) => {
+                const blob = new Blob([res], {
+                  type: "application/vnd.ms-excel;charset=UTF-8",
+                }); // 创建一个类文件对象:Blob对象表示一个不可变的、原始数据的类文件对象
+                const downloadElement = document.createElement("a"); //创建a标签
+                const href = window.URL.createObjectURL(blob); // 创建下载的链接
+                downloadElement.href = href; //下载地址
+                downloadElement.download = "导入失败的物料基础档案数据.xlsx"; // 下载后文件名
+                document.body.appendChild(downloadElement);
+                downloadElement.click(); // 点击下载
+                document.body.removeChild(downloadElement); // 下载完成移除元素
+                window.URL.revokeObjectURL(href); // 释放blob对象
+                this.$modal.closeLoading();
+                let { setVisible } = this.$refs.batchImport;
+                setVisible(false);
+              });
+            }
+          }
+          this.$notify({
+            message: res.data.msg,
+            type: res.data.flag ? "warning" : "success",
+          });
+        } else {
+          this.$notify({
+            message: res.msg,
+            type: res.code == 200 ? "success" : "warning",
+          });
+        }
+      });
+    },
+    // 模板下载
+    handleTemDownload() {
+      this.download("/system/material/download", {}, `物料基本信息模板.xlsx`);
+    },
+    // 批量导出
+    useExport() {
+      let ids = this.checkedList.length
+        ? this.checkedList.map((i) => i.id)
+        : [];
+
+      if (ids.length) {
+        let params = {
+          // orgId: '1',
+          ids,
+        };
+        this.download(
+          "/system/material/export",
+          params,
+          `物料基本信息${new Date().getTime()}.xlsx`
+        );
+      } else {
+        let params = {
+          templateCode: "material",
+          ...this.params,
+          createTimeBegin:
+            (this.params.createTimeQueue && this.params.createTimeQueue[0]) ||
+            "",
+          createTimeEnd:
+            (this.params.createTimeQueue && this.params.createTimeQueue[1]) ||
+            "",
+          updateTimeBegin:
+            (this.params.updateTimeQueue && this.params.updateTimeQueue[0]) ||
+            "",
+          updateTimeEnd:
+            (this.params.updateTimeQueue && this.params.updateTimeQueue[1]) ||
+            "",
+        };
+        this.download(
+          "/system/material/export",
+          params,
+          `物料基本信息${new Date().getTime()}.xlsx`
+        );
+      }
+    },
+    useDbClick(e) {
+      // console.log("A:::" + JSON.stringify(e))
+      // this.checkedList = [{ ...e }];
+      // let { setVisible } = this.$refs.detailDrawer;
+      // setVisible(true);
+      this.$router.push({
+        path: `/material/extend/detailMain?materialId=${e.id}`,
+      });
+    },
+    // 行数据勾选操作
+    handleSelect(selection, row) {
+      this.checkedList = selection;
+    },
+    //手动勾选全选
+    handleSelectAll(selection) {
+      this.checkedList = selection;
+    },
+  },
+  created() {
+    this.getTagList("material");
+    this.useList();
+  },
+};
+</script>
+
+<template>
+  <el-card
+    v-loading="loading"
+    :body-style="{
+      height: '100%',
+      padding: 0,
+      display: 'flex',
+      'flex-direction': 'column',
+    }"
+  >
+    <!-- 查询条件 -->
+    <el-super-search
+      v-model="params"
+      :size="size"
+      :dict="dict"
+      :columns="SearchColumnsExtend"
+      @reset="useReset"
+      @submit="useList"
+    ></el-super-search>
+
+
+    <div
+      class="el-super-ux-table"
+      v-resize="resize"
+      style="
+        position: relative;
+        display: flex;
+        flex: 1;
+        flex-direction: column;
+        overflow: auto;
+      "
+    >
+      <ux-grid
+        v-if="tableHeader.length"
+        border
+        use-virtual
+        keep-source
+        beautify-table
+        :size="size"
+        :data="taskList"
+        :height="tableHeight"
+        ref="materialTable"
+        @cell-dblclick="useDbClick"
+        @select="handleSelect"
+        @select-all="handleSelectAll"
+        :header-row-style="{
+          color: '#515a6e',
+        }"
+        style="flex: 1"
+      >
+        <
+        <!-- 多选 -->
+        <ux-table-column
+          fixed="left"
+          width="60"
+          align="center"
+          type="checkbox"
+          resizable
+          reserve-selection
+          :column-key="rowKey"
+        ></ux-table-column>
+        <!-- 序号 -->
+        <ux-table-column
+          fixed="left"
+          width="50"
+          title="序号"
+          type="index"
+          align="center"
+          class="is-index"
+          resizable
+        ></ux-table-column>
+        <ux-table-column
+          width="150"
+          v-for="h in tableHeader"
+          v-if="h.show"
+          :title="h.name"
+          align="center"
+          resizable
+          show-overflow-tooltip
+        >
+          <template slot-scope="scope">
+            <span v-if="h.apiUrl">{{ scope.row[`${h.prop}Name`] }}</span>
+            <el-checkbox
+              v-else-if="h.attribute == 'checkbox'"
+              v-model="scope.row[h.prop]"
+              disabled
+              :size="size"
+              true-label="0"
+              false-label="2"
+            ></el-checkbox>
+            <el-dict-tag
+              v-else-if="h.dictId"
+              :size="size"
+              :value="scope.row[h.prop]"
+              :options="dict.type[h.dictId]"
+            ></el-dict-tag>
+
+            <!-- <span v-else>{{ scope.row[h.prop] || "--" }}</span> -->
+            <span v-else>{{ scope.row[h.prop] }}</span>
+          </template>
+        </ux-table-column>
+      </ux-grid>
+      <div
+        style="
+          height: 50px;
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+        "
+        :style="{
+          height: '50px',
+        }"
+      >
+        <pagination
+          :total="page.total"
+          :page.sync="page.pageNum"
+          :limit.sync="page.pageSize"
+          @pagination="useList"
+          style="height: 32px; padding: 0 !important; flex: 1; overflow-x: auto"
+        />
+      </div>
+    </div>
+
+    <detailDrawer
+      ref="detailDrawer"
+      :select-data.sync="checkedList"
+      @success="useList"
+    ></detailDrawer>
+  </el-card>
+</template>
+<style scoped lang="scss">
+.el-card {
+  width: calc(100% - 32px);
+  height: calc(100vh - 32px);
+  border-radius: 8px;
+}
+</style>

+ 6 - 2
src/views/material/extend/detailMain.vue

@@ -43,12 +43,16 @@ import { EventBus } from '@/views/material/extend/event/event-bus.js';
     data() {
       return {
         activeName: 'MaterialBaseInfo', // 默认激活第一个标签
-        materialId:'430016',
+        materialId:'',
         dataSave: {
         },
       };
     },
     created() {
+        console.log("1:::"+ this.materialId);
+        console.log("2:::"+ this.$route.query.materialId);
+        this.materialId = this.$route.query.materialId;
+        console.log("3:::"+ this.materialId);
         this.$set(this.dataSave, 'materialId', this.materialId);
     },
     mounted() {
@@ -103,7 +107,7 @@ import { EventBus } from '@/views/material/extend/event/event-bus.js';
             });
         },
         qx(){
-
+            this.$router.go(-1)
         }
     },
   };

+ 128 - 0
src/views/material/extend/indexMain.vue

@@ -0,0 +1,128 @@
+<template>
+  <el-card
+    v-loading="loading"
+    :body-style="{
+      height: '100%',
+      padding: 0,
+      display: 'flex',
+      'flex-direction': 'column',
+    }"
+  >
+    <el-row :gutter="20">
+      <el-col :span="6" style="border-right: 1px solid #e9e9e9">
+        <el-input
+          placeholder="输入关键字/编码进行过滤"
+          size="mini"
+          v-model="filterText"
+        >
+        </el-input>
+
+        <el-tree
+          class="filter-tree"
+          :data="data"
+          :props="defaultProps"
+          node-key="id"
+          @node-click="clickTree"
+          highlight-current
+          :default-expanded-keys="defaultExpanded"
+          :filter-node-method="filterNode"
+          ref="tree"
+        >
+          <span slot-scope="{ node, data }">
+            {{ data.code }}{{ data.materialType }}
+          </span>
+        </el-tree>
+      </el-col>
+
+      <el-col :span="18" >
+          <el-row
+              style="
+              display: flex;
+              justify-content: space-between;
+              margin: -32px 0;">
+                <indexExtend :parentData="dataFromParent">
+                </indexExtend>
+          </el-row>
+      </el-col>
+    </el-row>
+  </el-card>
+</template>
+
+<script>
+import {
+  getTree
+} from "@/api/classify/basic";
+import Treeselect from "@riophae/vue-treeselect";
+import indexExtend from "@/views/material/basicFile/indexExtend.vue";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+  export default {
+    name: "MaterialIndex",
+    components: {
+        Treeselect,
+        indexExtend
+    },
+    data() {
+      return {
+        filterText: "",
+        data: [],
+        defaultProps: {
+            children: "childrens",
+            label: "materialType",
+        },
+        defaultExpanded: [],
+        loading: false,
+        dataFromParent: '',
+      };
+    },
+    watch: {
+        filterText(val) {
+            this.$refs.tree.filter(val);
+        },
+    },
+    created() {
+        this.getTreeData();
+    },
+    methods: {
+        // 获取树形结构
+        getTreeData() {
+            this.loading = true;
+            getTree({}).then((res) => {
+                let { code, rows } = res;
+                if (code === 200) {
+                    this.data = rows;
+                }
+            }).finally(() => {
+                this.loading = false;
+            });
+        },
+        clickTree(data, node) {
+            this.dataFromParent = data.id;
+        },
+        filterNode(value, data) {
+            if (!value) return true;
+            return (
+                data.materialType.indexOf(value) !== -1 ||
+                data.code.indexOf(value) !== -1
+            );
+        },
+    },
+  };
+</script>
+
+<style scoped>
+    .el-card {
+    width: calc(100% - 32px);
+    height: calc(100vh - 32px);
+    margin: 16px;
+    padding: 16px;
+    border-radius: 8px;
+    }
+    .title {
+    font-weight: bold;
+    }
+    .filter-tree {
+    height: calc(100vh - 102px);
+    overflow-y: auto;
+    overflow-x: hidden;
+    }
+</style>