Procházet zdrojové kódy

Merge branch 'dev' into 'purchaseDev'

# Conflicts:
#   vue.config.js
黄梓星 před 2 roky
rodič
revize
09eda2e941

+ 50 - 0
src/api/canteen/basic.js

@@ -0,0 +1,50 @@
+import request from '@/utils/request'
+
+// 餐厅菜单新增
+export function addMenu(data) {
+  return request({
+    url: `/dh/menu/add`,
+    method: 'post',
+    data: data
+  })
+}
+// 餐厅菜单删除
+export function delMenu(ids) {
+  return request({
+    url: `/dh/menu/del/${ids}`,
+    method: 'DELETE',
+    // data: data
+  })
+}
+// 餐厅菜单列表
+export function menuList(params) {
+  return request({
+    url: `/dh/menu/list`,
+    method: 'get',
+    params: params
+  })
+}
+// 餐厅食材新增
+export function addFood(data) {
+  return request({
+    url: `/dh/record/add`,
+    method: 'post',
+    data: data
+  })
+}
+// 餐厅食材列表
+export function foodList(params) {
+  return request({
+    url: `/dh/record/listRecord`,
+    method: 'get',
+    params: params
+  })
+}
+// 餐厅食材删除(明细删除)
+export function delFood(ids) {
+  return request({
+    url: `/dh/recorditem/${ids}`,
+    method: 'DELETE',
+    // data: data
+  })
+}

+ 21 - 0
src/api/material/basic.js

@@ -415,6 +415,24 @@ const delPurchase = (data) => {
 }
 
 
+//  物料维护新版本 /system/material/versions
+const versions = (data) => {
+  return request({
+    url: `/system/material/versions`,
+    method: 'post',
+    data,
+  })
+}
+
+//  物料维护新版本保存 /system/material/versions/save
+const saveVersions = (data) => {
+  return request({
+    url: `/system/material/versions/save`,
+    method: 'post',
+    data,
+  })
+}
+
 export default {
   // 查询
   materialList,
@@ -465,4 +483,7 @@ export default {
   delPlan,
   delFinance,
   delPurchase,
+  // 维护新版本
+  versions,
+  saveVersions
 }

+ 62 - 0
src/api/material/label.js

@@ -59,6 +59,33 @@ export function remove(params) {
 }
 
 // 查询用户列表
+export function bindList(params) {
+  return request({
+    url: "/system/label/bindList",
+    method: "get",
+    params: params,
+  });
+}
+
+// 查询用户列表
+export function removeBind(params) {
+  return request({
+    url: "/system/label/removeBind",
+    method: "get",
+    params: params,
+  });
+}
+
+// 查询用户列表
+export function removeAllBind(params) {
+  return request({
+    url: "/system/label/removeAllBind",
+    method: "get",
+    params: params,
+  });
+}
+
+// 查询用户列表
 export function type(data, params) {
   return request({
     url: "/system/label/parentLabels",
@@ -67,3 +94,38 @@ export function type(data, params) {
     params: params,
   });
 }
+
+// 查询用户列表
+export function classifyTree() {
+  return request({
+    url: "/system/label/ClassifyTree",
+    method: "post",
+  });
+}
+
+// 查询用户列表
+export function autoBind(data) {
+  return request({
+    url: "/system/label/autoBind",
+    method: "post",
+    data,
+  });
+}
+
+// 查询用户列表
+export function manualBindQuery(data) {
+  return request({
+    url: "/system/label/manualBindQuery",
+    method: "post",
+    data,
+  });
+}
+
+// 查询用户列表
+export function manualBindOK(data) {
+  return request({
+    url: "/system/label/manualBindOK",
+    method: "post",
+    data,
+  });
+}

binární
src/assets/images/background.png


binární
src/assets/images/menu_bg.jpg


+ 43 - 30
src/components/PopDialog/fourClass.vue

@@ -12,23 +12,30 @@
       <el-container style="height: 500px">
         <el-container>
           <el-main>
-            <el-row :gutter="10" class="content">
-              <el-col :span="12">
+            <el-row :gutter="24" class="content">
+              <el-col :span="24">
                 <el-input
                   placeholder="输入关键字进行过滤"
                   size="small"
-                  v-model="filterText">
+                  v-model="filterText"
+                  style="margin-bottom: 16px"
+                >
                 </el-input>
 
                 <el-tree
                   class="filter-tree"
                   :data="threedata"
                   :props="defaultProps"
+                  accordion
                   node-key="id"
                   highlight-current
                   @node-click="clickTree"
                   :filter-node-method="filterNode"
-                  ref="tree">
+                  ref="tree"
+                >
+                  <span slot-scope="{ node, data }">
+                    {{ data.code }}{{ data.materialType }}
+                  </span>
                 </el-tree>
               </el-col>
             </el-row>
@@ -55,75 +62,81 @@
 </template>
 
 <script>
-import { getTree } from '@/api/classify/basic';
+import { getTree } from "@/api/classify/basic";
 export default {
   data() {
     return {
       loading: false,
       visible: false,
-      filterText: '',
+      filterText: "",
       threedata: [],
       defaultProps: {
-        children: 'childrens',
-        label: 'materialType'
+        children: "childrens",
+        label: "materialType",
       },
       // 判断是否为最末级节点
       isLast: false,
       // 选中的节点
-      choosePoint: {}
+      choosePoint: {},
     };
   },
   props: {},
   watch: {
-      filterText(val) {
-        this.$refs.tree.filter(val);
-      }
+    filterText(val) {
+      this.$refs.tree.filter(val);
+    },
   },
   methods: {
     init() {
       this.visible = true;
       this.$nextTick(() => {
-        this.refreshList()
+        this.refreshList();
       });
     },
     // 获取数据列表
     refreshList(data) {
       this.loading = true;
-      getTree({isEnable: '0'}).then(res => {
-        console.log('res',res)
-        if(res.code === 200) {
-          this.threedata = res.rows
+      getTree({ isEnable: "0" }).then((res) => {
+        console.log("res", res);
+        if (res.code === 200) {
+          this.threedata = res.rows.sort((a, b) => a.code - b.code);
         }
         this.loading = false;
       });
     },
     clickTree(data) {
-      console.log('树形节点信息:',data)
+      console.log("树形节点信息:", data);
       if (data.childrens.length == 0) {
-        this.isLast = true
+        this.isLast = true;
       } else {
-        this.isLast = false
+        this.isLast = false;
       }
-      this.choosePoint = data
+      this.choosePoint = data;
     },
     filterNode(value, data) {
-      console.log('value', value)
-      console.log('data', data)
-        if (!value) return true;
-        return data.materialType.indexOf(value) !== -1;
+      console.log("value", value);
+      console.log("data", data);
+      if (!value) return true;
+      return data.materialType.indexOf(value) !== -1;
     },
     doSubmit() {
-      if(this.isLast == false) {
+      if (this.isLast == false) {
         this.$message({
-          message: '请选择最末级节点',
-          type: 'warning'
+          message: "请选择最末级节点",
+          type: "warning",
         });
       } else {
-        console.log('子组件选择的数据',this.choosePoint)
+        console.log("子组件选择的数据", this.choosePoint);
         this.$emit("doSubmit", this.choosePoint);
         this.visible = false;
       }
     },
+    loadNode(node, resolve) {
+      console.log("node, resolve", node, resolve);
+      // if (!node.data.length)
+      //   resolve(node.data.childrens.sort((a, b) => a.code - b.code));
+      // else resolve(this.threedata);
+    },
   },
 };
 </script>
@@ -142,4 +155,4 @@ export default {
     }
   }
 }
-</style>
+</style>

+ 30 - 99
src/components/PopDialog/index.vue

@@ -1,123 +1,47 @@
 <template>
   <div>
-    <el-dialog
-      title="物料编码选择"
-      width="1000px"
-      :close-on-click-modal="false"
-      :append-to-body="true"
-      v-dialogDrag
-      class="userDialog"
-      :visible.sync="visible"
-    >
+    <el-dialog title="物料编码选择" width="1000px" :close-on-click-modal="false" :append-to-body="true" v-dialogDrag
+      class="userDialog" :visible.sync="visible">
       <el-container style="height: 500px">
         <el-container>
           <el-header style="text-align: left; font-size: 12px; height: 30px">
-            <el-form
-              size="small"
-              :inline="true"
-              ref="searchForm"
-              :model="searchForm"
-              @keyup.enter.native="refreshList()"
-              @submit.native.prevent
-            >
+            <el-form size="small" :inline="true" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()"
+              @submit.native.prevent>
               <el-form-item prop="code">
-                <el-input
-                  size="small"
-                  v-model="searchForm.code"
-                  placeholder="请输入物料编号查询"
-                  clearable
-                ></el-input>
+                <el-input size="small" v-model="searchForm.code" placeholder="请输入物料编号查询" clearable></el-input>
               </el-form-item>
               <el-form-item prop="name">
-                <el-input
-                  size="small"
-                  v-model="searchForm.name"
-                  placeholder="请输入物料名称查询"
-                  clearable
-                ></el-input>
+                <el-input size="small" v-model="searchForm.name" placeholder="请输入物料名称查询" clearable></el-input>
               </el-form-item>
               <el-form-item>
-                <el-button
-                  type="primary"
-                  @click="refreshList()"
-                  size="small"
-                  icon="el-icon-search"
-                  >查询</el-button
-                >
-                <el-button
-                  @click="resetSearch()"
-                  size="small"
-                  icon="el-icon-refresh-right"
-                >重置</el-button>
+                <el-button type="primary" @click="refreshList()" size="small" icon="el-icon-search">查询</el-button>
+                <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
               </el-form-item>
             </el-form>
           </el-header>
           <el-main>
-            <el-table
-              :data="dataList"
-              v-loading="loading"
-              size="small"
-              border
-              ref="contractTable"
-              @row-click="rowSelect"
-              @select="handleSelectionChange"
-              height="calc(100% - 40px)"
-              style="width: 100%"
-            >
-              <el-table-column
-                type="selection"
-                header-align="center"
-                align="center"
-                width="50"
-              >
+            <el-table :data="dataList" v-loading="loading" size="small" border ref="contractTable" @row-click="rowSelect"
+              @select="handleSelectionChange" height="calc(100% - 40px)" style="width: 100%">
+              <el-table-column type="selection" header-align="center" align="center" width="50">
               </el-table-column>
-              <el-table-column
-                prop="code"
-                header-align="center"
-                align="center"
-                sortable="custom"
-                min-width="90"
-                label="物料编码"
-              >
+              <el-table-column prop="code" header-align="center" align="center" sortable="custom" min-width="90"
+                label="物料编码">
               </el-table-column>
-              <el-table-column
-                prop="name"
-                header-align="center"
-                align="center"
-                sortable="custom"
-                min-width="90"
-                label="物料名称"
-              >
+              <el-table-column prop="name" header-align="center" align="center" sortable="custom" min-width="90"
+                label="物料名称">
               </el-table-column>
             </el-table>
 
-            <el-pagination
-              @size-change="sizeChangeHandle"
-              @current-change="currentChangeHandle"
-              :current-page="searchForm.pageNo"
-              :page-sizes="[5, 10, 15, 20]"
-              :page-size="searchForm.pageSize"
-              :total="total"
-              layout="total, sizes, prev, pager, next, jumper"
-            >
+            <el-pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle"
+              :current-page="searchForm.pageNo" :page-sizes="[5, 10, 15, 20]" :page-size="searchForm.pageSize"
+              :total="total" layout="total, sizes, prev, pager, next, jumper">
             </el-pagination>
           </el-main>
         </el-container>
       </el-container>
       <span slot="footer" class="dialog-footer">
-        <el-button
-          size="small"
-          @click="visible = false"
-          icon="el-icon-circle-close"
-          >关闭</el-button
-        >
-        <el-button
-          size="small"
-          type="primary"
-          icon="el-icon-circle-check"
-          @click="doSubmit()"
-          >确定</el-button
-        >
+        <el-button size="small" @click="visible = false" icon="el-icon-circle-close">关闭</el-button>
+        <el-button size="small" type="primary" icon="el-icon-circle-check" @click="doSubmit()">确定</el-button>
       </span>
     </el-dialog>
   </div>
@@ -177,8 +101,13 @@ export default {
       //     // orders: this.orders,
       //     // ...this.searchForm,
       //   },
-      getMaterialList(this.searchForm).then(({ data }) => {
-        console.log('data',data)
+      let params = {
+        ...this.searchForm,
+        // 默认查询已启用
+        isEnable: '0'
+      }
+      getMaterialList(params).then(({ data }) => {
+        console.log('data', data)
         this.dataList = data.tableBody.rows;
         this.total = data.tableBody.total;
         this.loading = false;
@@ -234,7 +163,7 @@ export default {
     },
     doSubmit() {
       this.visible = false;
-      console.log('选择的数据?',this.dataListAllSelections)
+      console.log('选择的数据?', this.dataListAllSelections)
       this.$emit("doSubmit", this.dataListAllSelections);
     },
   },
@@ -248,8 +177,10 @@ export default {
     font-size: 14px;
     word-break: break-all;
   }
+
   .el-main {
     padding: 20px 20px 5px 20px;
+
     .el-pagination {
       margin-top: 5px;
     }

+ 237 - 0
src/components/PopDialog/innerPackingUnit.vue

@@ -0,0 +1,237 @@
+<template>
+  <div>
+    <el-dialog
+      title="中包装单位选择"
+      width="1000px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-header style="text-align: left; font-size: 12px; height: 30px">
+            <el-form
+              size="small"
+              :inline="true"
+              ref="searchForm"
+              :model="searchForm"
+              @keyup.enter.native="refreshList()"
+              @submit.native.prevent
+            >
+            <el-form-item prop="param" label="名称/编号" >
+                <el-input
+                  size="small"
+                  v-model="searchForm.param"
+                  placeholder="输入名称/编号查询"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  @click="refreshList()"
+                  size="small"
+                  icon="el-icon-search"
+                  >查询</el-button
+                >
+                <el-button
+                  @click="resetSearch()"
+                  size="small"
+                  icon="el-icon-refresh-right"
+                >重置</el-button>
+              </el-form-item>
+            </el-form>
+          </el-header>
+          <el-main>
+            <el-table
+              :data="dataList"
+              v-loading="loading"
+              size="small"
+              border
+              ref="contractTable"
+              @select="handleSelectionChange"
+              @row-click="rowSelect"
+              height="calc(100% - 40px)"
+              style="width: 100%"
+            >
+              <el-table-column
+                type="selection"
+                header-align="center"
+                align="center"
+                width="50"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="code"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="code"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="name"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="名称"
+              >
+              </el-table-column>
+            </el-table>
+            <el-pagination
+              @size-change="sizeChangeHandle"
+              @current-change="currentChangeHandle"
+              :current-page="searchForm.pageNo"
+              :page-sizes="[5, 10, 15, 20]"
+              :page-size="searchForm.pageSize"
+              :total="total"
+              layout="total, sizes, prev, pager, next, jumper"
+            >
+            </el-pagination>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getUnit } from '@/api/requisition/basic'
+export default {
+  data() {
+    return {
+      searchForm: {
+        param: '',
+        pageNo: 1,
+        pageSize: 10,
+      },
+      dataListAllSelections: [], // 所有选中的数据包含跨页数据
+      idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+      dataList: [],
+      total: 0,
+      orders: [],
+      loading: false,
+      visible: false,
+    };
+  },
+  props: {
+    selectData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否启用单选
+    single: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData));
+        this.resetSearch();
+      });
+    },
+    // 获取数据列表
+    refreshList() {
+      this.loading = true;
+      getUnit(this.searchForm).then(({ data }) => {
+        console.log('data',data)
+        this.dataList = data.tableBody;
+        this.total = data.total;
+        this.loading = false;
+        this.$nextTick(() => {
+          this.setSelectRow();
+        });
+      });
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.searchForm.pageSize = val;
+      this.refreshList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.searchForm.pageNo = val;
+      this.refreshList();
+    },
+    // 排序
+    resetSearch() {
+      this.$refs['searchForm'].resetFields();
+      this.searchForm.pageNo = 1;
+      this.refreshList();
+    },
+    // 表格选中数据
+    rowSelect(row, column, event) {
+      this.$refs.contractTable.clearSelection();
+      this.$refs.contractTable.toggleRowSelection(row);
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 选中数据
+    handleSelectionChange(selection, row) {
+      console.log('selection11', selection)
+      if (this.single && selection.length > 1) {
+        this.$refs.contractTable.clearSelection();
+        this.$refs.contractTable.toggleRowSelection(row);
+      }
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 设置选中的方法
+    setSelectRow() {
+      this.$refs.contractTable.clearSelection();
+      if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+        return;
+      }
+      for (let i = 0; i < this.dataList.length; i++) {
+        if (this.dataListAllSelections.some(item => item[this.idKey] == this.dataList[i][this.idKey])) {
+          // 设置选中,记住table组件需要使用ref="table"
+          this.$refs.contractTable.toggleRowSelection(this.dataList[i], true);
+        }
+      }
+    },
+    doSubmit() {
+      this.visible = false;
+      console.log('选择的数据?',this.dataListAllSelections)
+      this.$emit("doSubmit", this.dataListAllSelections);
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 5 - 5
src/layout/components/Navbar.vue

@@ -2,12 +2,12 @@
   <div class="navbar">
     <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
 
-    <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
+    <!-- <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/> -->
     <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
 
     <div class="right-menu">
       <template v-if="device!=='mobile'">
-        <search id="header-search" class="right-menu-item" />
+        <!-- <search id="header-search" class="right-menu-item" /> -->
         
         <!-- <el-tooltip content="源码地址" effect="dark" placement="bottom">
           <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
@@ -17,11 +17,11 @@
           <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
         </el-tooltip> -->
 
-        <screenfull id="screenfull" class="right-menu-item hover-effect" />
+        <!-- <screenfull id="screenfull" class="right-menu-item hover-effect" /> -->
 
-        <el-tooltip content="布局大小" effect="dark" placement="bottom">
+        <!-- <el-tooltip content="布局大小" effect="dark" placement="bottom">
           <size-select id="size-select" class="right-menu-item hover-effect" />
-        </el-tooltip>
+        </el-tooltip> -->
 
       </template>
 

+ 1 - 1
src/permission.js

@@ -8,7 +8,7 @@ import { isRelogin } from '@/utils/request'
 
 NProgress.configure({ showSpinner: false })
 
-const whiteList = ['/login', '/register', '/test01']
+const whiteList = ['/login', '/register', '/test01', '/canteenAddFood', '/canteenAddMenu', '/menuScreen', '/foodScreen']
 
 router.beforeEach((to, from, next) => {
   NProgress.start()

+ 20 - 0
src/router/index.js

@@ -57,6 +57,26 @@ export const constantRoutes = [
     hidden: true
   },
   {
+    path: '/canteenAddFood',
+    component: () => import('@/views/canteen/addFood'),
+    hidden: true
+  },
+  {
+    path: '/canteenAddMenu',
+    component: () => import('@/views/canteen/addMenu'),
+    hidden: true
+  },
+  {
+    path: '/menuScreen',
+    component: () => import('@/views/canteen/menuScreen'),
+    hidden: true
+  },
+  {
+    path: '/foodScreen',
+    component: () => import('@/views/canteen/foodScreen'),
+    hidden: true
+  },
+  {
     path: '/404',
     component: () => import('@/views/error/404'),
     hidden: true

+ 197 - 0
src/views/canteen/addFood.vue

@@ -0,0 +1,197 @@
+<template>
+  <div id="canteenMenu">
+    <span>购买过程新增</span>
+    <el-form :model="menu" :rules="menuRules" ref="menuForm" label-width="100px" class="demo-ruleForm">
+      <el-form-item label="地址" prop="address">
+        <el-input style="width: 200px;" v-model="menu.address" placeholder="请输入地址"></el-input>
+      </el-form-item>
+      <el-form-item label="日期" prop="billDate">
+        <el-date-picker
+         style="width: 200px;"
+          v-model="menu.billDate"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-table
+        :data="menu.items"
+        style="width: 40%"
+        >
+          <el-table-column
+            prop="product"
+            label="食材"
+            align="left"
+            width="200"
+            >
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.product"></el-input>
+            </template>
+          </el-table-column>
+
+          <el-table-column
+            label="操作"
+            align="left"
+            >
+            <template slot-scope="scope">
+              <el-button
+                @click.native.prevent="deleteRow(scope.row)"
+                type="text"
+                size="small">
+                删除
+              </el-button>
+            </template>
+          </el-table-column>
+
+          <el-table-column align="center">
+          <template slot="header" slot-scope="scope">
+            <el-button
+              @click.native.prevent="addRow"
+              type="text"
+              size="small">
+              增行
+            </el-button>
+          </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+      <el-form-item>
+        <el-button size="small" type="primary" @click="submit">提交</el-button>
+        <el-button size="small" @click="reset('menuForm')">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <span>食材列表</span>
+    <div style="text-align: right;">
+      <el-button size="small" type="primary" @click="delitems">批量删除</el-button>
+    </div>
+    <el-table
+      :data="tableData"
+      @selection-change="handleSelectionChange"
+      max-height="500"
+      style="width: 100%">
+      <el-table-column
+      type="selection"
+      width="55">
+    </el-table-column>
+      <el-table-column
+        prop="billDate"
+        label="日期"
+        align="center"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="address"
+        label="地址"
+        align="center"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="product"
+        align="center"
+        label="食材">
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import {addFood, foodList, delFood} from '@/api/canteen/basic.js'
+export default {
+  data() {
+    return {
+      menu: {
+        address: '',
+        billDate: '',
+        items: [{product: '猪肉'}]
+      },
+      menuRules: {
+        address: [{ required: true, message: '请输入购买地址', trigger: 'blur' }],
+        billDate: [{ required: true, message: '请选择时段', trigger: 'change' }],
+      },
+      tableData: [],
+      nowDate: '',
+      ids: ''
+    }
+  },
+  created() {
+    this.getNow()
+    this.getList()
+  },
+  methods: {
+    submit() {
+      this.$refs['menuForm'].validate((valid) => {
+        if (valid) {
+          addFood(this.menu).then(res => {
+            if (res.code === 200 ) {
+              this.$modal.msgSuccess("操作成功");
+              this.getList()
+              this.reset('menuForm')
+            }
+          })
+       }
+      })
+    },
+    reset(formName) {
+      this.$refs[formName].resetFields();
+    },
+    delitems() {
+      if (this.ids) {
+        delFood(this.ids).then(res => {
+          if (res.code === 200) {
+            this.$modal.msgSuccess("操作成功");
+            this.getList()
+          }
+        })
+      } else {
+        this.$modal.alertWarning("请选择至少一条数据");
+      }
+    },
+    addRow() {
+      this.menu.items.push({product: ''})
+    },
+    deleteRow(rows) {
+      this.menu.items = this.menu.items.filter(item => {
+        return item.product !== rows.product
+      })
+    },
+    getList() {
+      this.getNow()
+      foodList({pageSize: 100,billDate: this.nowDate}).then(res => {
+        if (res.code === 200 ) {
+          this.tableData = res.rows
+        }
+      })
+    },
+    handleSelectionChange(selection) {
+      console.log('选中数据', selection)
+      let id = []
+      id = selection.map(item => item.productId)
+      console.log('id',id.join())
+      this.ids = id.join()
+    },
+    getNow() {
+      var date = new Date();
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      var day = date.getDate();
+      if (month < 10) {
+        month = "0" + month;
+      }
+      if (day < 10) {
+        day = "0" + day;
+      }
+      const nowDate = year + "-" + month + "-" + day;
+      this.nowDate = nowDate
+      this.menu.billDate = nowDate
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+ #canteenMenu {
+  padding: 10px;
+ }
+</style>

+ 178 - 0
src/views/canteen/addMenu.vue

@@ -0,0 +1,178 @@
+<template>
+  <div id="canteenMenu">
+    <span>菜单新增</span>
+    <el-form :model="menu" :rules="menuRules" ref="menuForm" label-width="100px" class="demo-ruleForm">
+      <el-form-item label="时段" prop="timeFrame">
+        <el-select style="width: 200px;" v-model="menu.timeFrame" placeholder="请选择">
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="菜名" prop="name">
+        <el-input style="width: 200px;" v-model="menu.name" placeholder="请输入菜名"></el-input>
+      </el-form-item>
+      <el-form-item label="价格" prop="price">
+        <el-input-number :min="0" style="width: 200px;" v-model="menu.price" placeholder="请输入价格"></el-input-number>
+      </el-form-item>
+      <el-form-item label="日期" prop="billDate">
+        <el-date-picker
+         style="width: 200px;"
+          v-model="menu.billDate"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button size="small" type="primary" @click="submit">提交</el-button>
+        <el-button size="small" @click="reset('menuForm')">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <span>菜单列表</span>
+    <div style="text-align: right;">
+      <el-button size="small" type="primary" @click="delitems">批量删除</el-button>
+    </div>
+    <el-table
+      :data="tableData"
+      @selection-change="handleSelectionChange"
+      max-height="500"
+      style="width: 100%">
+      <el-table-column
+      type="selection"
+      width="55">
+    </el-table-column>
+      <el-table-column
+        prop="billDate"
+        label="日期"
+        align="center"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="name"
+        label="菜名"
+        align="center"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="price"
+        align="center"
+        label="价格">
+        <template slot-scope="scope">
+            <span>¥{{ scope.row.price }}</span>
+          </template>
+      </el-table-column>
+      <el-table-column
+        prop="timeFrame"
+        align="center"
+        label="时段">
+        <template slot-scope="scope">
+          <span>{{ scope.row.timeFrame == '1' ? '早餐' : scope.row.timeFrame == '2' ? '午餐' : '晚餐' }}</span>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import {addMenu, menuList, delMenu} from '@/api/canteen/basic.js'
+export default {
+  data() {
+    return {
+      menu: {
+        timeFrame: '',
+        name: '',
+        price: '',
+        billDate: ''
+      },
+      options: [
+        {value: '1', label: '早餐'},
+        {value: '2', label: '午餐'},
+        {value: '3', label: '晚餐'}
+      ],
+      menuRules: {
+        timeFrame: [{ required: true, message: '请选择时段', trigger: 'change' }],
+        name: [{ required: true, message: '请输入菜名', trigger: 'blur' }],
+        price: [{ required: true, message: '请输入价格', trigger: 'blur' }],
+        billDate: [{ required: true, message: '请选择时段', trigger: 'change' }],
+      },
+      tableData: [],
+      nowDate: '',
+      ids: ''
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    submit() {
+      this.$refs['menuForm'].validate((valid) => {
+        if (valid) {
+          addMenu(this.menu).then(res => {
+            if (res.code === 200 ) {
+              this.$modal.msgSuccess("操作成功");
+              this.getList()
+              this.reset('menuForm')
+            }
+          })
+       }
+      })
+    },
+    reset(formName) {
+      this.$refs[formName].resetFields();
+    },
+    delitems() {
+      if (this.ids) {
+        delMenu(this.ids).then(res => {
+          if (res.code === 200) {
+            this.$modal.msgSuccess("操作成功");
+            this.getList()
+          }
+        })
+      } else {
+        this.$modal.alertWarning("请选择至少一条数据");
+      }
+    },
+    getList() {
+      this.getNow()
+      menuList({pageSize: 100, billDate: this.nowDate}).then(res => {
+        if (res.code === 200 ) {
+          this.tableData = res.rows
+        }
+      })
+    },
+    handleSelectionChange(selection) {
+      console.log('选中数据', selection)
+      let id = []
+      id = selection.map(item => item.id)
+      console.log('id',id.join())
+      this.ids = id.join()
+    },
+    getNow() {
+      var date = new Date();
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      var day = date.getDate();
+      if (month < 10) {
+        month = "0" + month;
+      }
+      if (day < 10) {
+        day = "0" + day;
+      }
+      const nowDate = year + "-" + month + "-" + day;
+      this.nowDate = nowDate
+      this.menu.billDate = nowDate
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+ #canteenMenu {
+  padding: 10px;
+ }
+</style>

+ 179 - 0
src/views/canteen/foodScreen.vue

@@ -0,0 +1,179 @@
+<template>
+  <div id="menuScreen">
+    <div class="title">今日食材</div>
+    <div class="title2">
+      <span>食材</span>
+      <span>地址</span>
+      <span>日期</span>
+    </div>
+
+    <div class="tables">
+      <div class="gun">
+        <el-table :cell-style="{ color: '#fff' }" :header-cell-style="{ color: '#fff' }" :data="tableData"
+          style="width: 100%;height:100%;font-size: 2.4vh;">
+          <el-table-column prop="product" align="center" label="">
+          </el-table-column>
+          <el-table-column prop="address" label="" align="center">
+          </el-table-column>
+          <el-table-column prop="billDate" label="" align="center">
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { foodList } from '@/api/canteen/basic.js'
+export default {
+  data() {
+    return {
+      tableData: [],
+      nowDate: '',
+      intervalId: null
+    }
+  },
+  created() {
+    this.getList()
+    this.dataRefreh()
+  },
+  destroyed(){
+    // 在页面销毁后,清除计时器
+    this.clear();
+  },
+  methods: {
+    getList() {
+      this.getNow()
+      // {billDate: this.nowDate}
+      foodList({pageSize: 100,billDate: this.nowDate}).then(res => {
+        if (res.code === 200) {
+          this.tableData = res.rows
+        }
+      })
+    },
+    getNow() {
+      var date = new Date();
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      var day = date.getDate();
+      if (month < 10) {
+        month = "0" + month;
+      }
+      if (day < 10) {
+        day = "0" + day;
+      }
+      const nowDate = year + "-" + month + "-" + day;
+      this.nowDate = nowDate
+    },
+   // 定时刷新数据函数
+   dataRefreh() {
+      // 计时器正在进行中,退出函数
+      if (this.intervalId != null) {
+        return;
+      }
+      // 计时器为空,操作
+      this.intervalId = setInterval(() => {
+        console.log("刷新" + new Date());
+        this.getList(); //加载数据函数
+      }, 1000*60*10);
+    },
+    // 停止定时器
+    clear() {
+      clearInterval(this.intervalId); //清除计时器
+      this.intervalId = null; //设置为null
+    },
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+#menuScreen {
+  width: 100%;
+  height: 100%;
+  // overflow: hidden;
+  background-image: url('../../assets/images/background.png');
+  background-repeat: no-repeat;
+  background-size: cover;
+}
+
+.title {
+  text-align: center;
+  font-size: 8vh;
+  color: #fff;
+  font-weight: 600;
+  // text-shadow: 0 0 5px #fff,
+  //   0 0 10px #fff,
+  //   0 0 15px #fff,
+  //   0 0 20px #00a67c,
+  //   0 0 35px #00a67c,
+  //   0 0 40px #00a67c,
+  //   0 0 50px #00a67c,
+  //   0 0 75px #00a67c;
+}
+
+.title2 {
+  text-align: center;
+  font-size: 3vh;
+  color: #fff;
+  font-weight: 600;
+  width: 80%;
+  color: #FFF;
+  margin: 2% auto;
+  display: flex;
+  justify-content: space-around;
+  //   text-shadow: 0 0 5px #fff,
+  //     0 0 10px #fff,
+  //     0 0 15px #fff,
+  //     0 0 20px #00a67c,
+  //     0 0 35px #00a67c,
+  //     0 0 40px #00a67c,
+  //     0 0 50px #00a67c,
+  //     0 0 75px #00a67c;
+  // }
+}
+
+.gun {
+  animation: tables 12s linear infinite;
+}
+
+.tables {
+  width: 80%;
+  height: 680px;
+  margin: 0 auto;
+  overflow: hidden;
+}
+
+@keyframes tables {
+  0% {
+    transform: translateY(0px)
+  }
+
+  100% {
+    transform: translateY(calc(-100% + 680px));
+  }
+}
+
+/*最外层透明*/
+::v-deep .el-table,
+::v-deep .el-table__expanded-cell {
+  // font-size: 18px;
+  background-color: transparent !important;
+}
+
+/* 表格内背景颜色 */
+::v-deep .el-table th,
+::v-deep .el-table tr,
+::v-deep .el-table td {
+  background-color: transparent !important;
+
+  border-top: 1px solid #808DA6;
+  border-bottom: none;
+}
+
+::v-deep .el-table .el-table__header-wrapper {
+  display: none;
+}
+::v-deep .el-table .cell {
+  line-height: normal;
+}
+</style>

+ 196 - 0
src/views/canteen/menuScreen.vue

@@ -0,0 +1,196 @@
+<template>
+  <div id="menuScreen">
+    <div class="title">德荣食堂</div>
+    <div class="title2">
+      <span>时段</span>
+      <span>菜名</span>
+      <span>价格</span>
+      <span>日期</span>
+    </div>
+    <div class="tables">
+      <!--  class="gun" -->
+      <div class="gun">
+        <el-table :cell-style="{ color: '#fff' }" :header-cell-style="{ color: '#fff' }" :data="tableData"
+          style="width: 100%;height:100%;font-size: 2.4vh;" ref="tableBox">
+
+          <el-table-column prop="timeFrame" align="center" label="">
+            <template slot-scope="scope">
+              <span>{{ scope.row.timeFrame == '1' ? '早餐' : scope.row.timeFrame == '2' ? '午餐' : '晚餐' }}</span>
+            </template>
+          </el-table-column>
+
+          <el-table-column prop="name" label="" align="center">
+          </el-table-column>
+
+          <el-table-column prop="price" align="center" label="">
+            <template slot-scope="scope">
+              <span>¥{{ scope.row.price }}</span>
+            </template>
+          </el-table-column>
+
+          <el-table-column prop="billDate" label="" align="center">
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { menuList } from '@/api/canteen/basic.js'
+export default {
+  data() {
+    return {
+      tableData: [],
+      nowDate: '',
+      intervalId: null
+    }
+  },
+  created() {
+    this.getList();
+    this.dataRefreh()
+  },
+  destroyed(){
+    // 在页面销毁后,清除计时器
+    this.clear();
+  },
+  methods: {
+    getList() {
+      this.getNow()
+      // {billDate: this.nowDate}
+      menuList({ pageSize: 100, billDate: this.nowDate }).then(res => {
+        if (res.code === 200) {
+          this.tableData = res.rows
+          this.tableData = this.tableData.map(data => {
+            data.billDate = data.billDate.substring(0, 11)
+            return data;
+          })
+          console.log(this.tableData, 'this.tableData');
+        }
+      })
+    },
+    getNow() {
+      var date = new Date();
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      var day = date.getDate();
+      if (month < 10) {
+        month = "0" + month;
+      }
+      if (day < 10) {
+        day = "0" + day;
+      }
+      const nowDate = year + "-" + month + "-" + day;
+      this.nowDate = nowDate
+    },
+   // 定时刷新数据函数
+   dataRefreh() {
+      // 计时器正在进行中,退出函数
+      if (this.intervalId != null) {
+        return;
+      }
+      // 计时器为空,操作
+      this.intervalId = setInterval(() => {
+        console.log("刷新" + new Date());
+        this.getList(); //加载数据函数
+      }, 1000*60*10);
+    },
+    // 停止定时器
+    clear() {
+      clearInterval(this.intervalId); //清除计时器
+      this.intervalId = null; //设置为null
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+#menuScreen {
+  width: 100%;
+  height: 100%;
+  background-image: url('../../assets/images/background.png');
+  background-repeat: no-repeat;
+  background-size: cover;
+  // overflow: hidden;
+}
+
+.title {
+  text-align: center;
+  font-size: 8vh;
+  color: #fff;
+  font-weight: 600;
+  // text-shadow: 0 0 5px #fff,
+  // 0 0 10px #fff,
+  // 0 0 15px #fff,
+  // 0 0 20px #00a67c,
+  // 0 0 35px #00a67c,
+  // 0 0 40px #00a67c,
+  // 0 0 50px #00a67c,
+  // 0 0 75px #00a67c;
+}
+
+.title2 {
+  text-align: center;
+  font-size: 3vh;
+  font-weight: 600;
+  color: #fff;
+  width: 80%;
+  color: #FFF;
+  margin: 2% auto;
+  display: flex;
+  justify-content: space-around;
+  // text-shadow: 0 0 5px #fff,
+  // 0 0 10px #fff,
+  // 0 0 15px #fff,
+  // 0 0 20px #00a67c,
+  // 0 0 35px #00a67c,
+  // 0 0 40px #00a67c,
+  // 0 0 50px #00a67c,
+  // 0 0 75px #00a67c;
+}
+
+.gun {
+  animation: tables 12s linear infinite;
+}
+
+.tables {
+  width: 80%;
+  height: 680px;
+  margin: 0 auto;
+  overflow: hidden;
+}
+
+@keyframes tables {
+  0% {
+    transform: translateY(0px)
+  }
+
+  100% {
+    transform: translateY(calc(-100% + 680px));
+  }
+}
+
+/*最外层透明*/
+::v-deep .el-table,
+::v-deep .el-table__expanded-cell {
+  background-color: transparent !important;
+}
+
+/* 表格内背景颜色 */
+::v-deep .el-table th,
+::v-deep .el-table tr,
+::v-deep .el-table td {
+  background-color: transparent !important;
+  // border-top-color: #808DA6;
+  // border-bottom-color: #808DA6;
+  border-top: 1px solid #808DA6;
+  border-bottom: none;
+}
+
+::v-deep .el-table .el-table__header-wrapper {
+  display: none;
+}
+::v-deep .el-table .cell {
+  line-height: normal;
+}
+</style>

+ 245 - 174
src/views/material/basicFile/details.vue

@@ -4,7 +4,26 @@
     <!-- 操作栏 -->
     <!-- 基本信息栏 -->
     <div v-if="activeMainTab == 'material'">
-      <el-row :gutter="10" class="mb10" v-if="!updateButtonGroup">
+
+      <!-- 基本信息修改状态下—— 保存、保存新增、更新导入、取消 -->
+      <el-row :gutter="10" class="mb10" v-if="updateButtonGroup || maintainNewVersion">
+        <el-col :span="1.5">
+          <el-button-group>
+            <el-button size="small" @click="handleSave"
+              v-hasPermi="['system:material:add', `${maintainNewVersion ? '' : 'system:material:versions'}`]">
+              保存
+            </el-button>
+          </el-button-group>
+        </el-col>
+
+        <el-col :span="1.5">
+          <el-button-group>
+            <el-button size="small" @click="handleCancel">取消</el-button>
+          </el-button-group>
+        </el-col>
+      </el-row>
+
+      <el-row :gutter="10" class="mb10" v-else>
         <!-- 新增、修改、删除、复制 -->
         <el-col :span="1.5">
           <el-button-group>
@@ -19,17 +38,6 @@
         <el-col :span="1.5">
           <el-button-group>
 
-          <!-- <el-dropdown size="small" @command="handleFilter">
-              <el-button size="small">
-                过滤<i class="el-icon-arrow-down el-icon--right"></i>
-              </el-button>
-              <el-dropdown-menu slot="dropdown">
-                <el-dropdown-item :command="filterCondition('stop')">显示停用</el-dropdown-item>
-                <el-dropdown-item :command="filterCondition('allot')">显示已分配</el-dropdown-item>
-              </el-dropdown-menu>
-            </el-dropdown>
-
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <el-button size="small" @click="handleQuery">查询</el-button> -->
             <el-button size="small" @click="handleRefresh">刷新</el-button>
 
           </el-button-group>
@@ -43,47 +51,19 @@
               <!-- 0:启用  2:停用 -->
               {{ basicData.value.isEnable == '已启用' ? '停用' : '启用' }}
             </el-button>
-          <!-- <el-dropdown split-button size="small" @click="handleIsInvoke(true)" @command="handleIsInvoke">
-              启用
-              <el-dropdown-menu slot="dropdown">
-                <el-dropdown-item :command="isInvoke(true)">启用</el-dropdown-item>
-                                                                                              <el-dropdown-item :command="isInvoke(false)">停用</el-dropdown-item></el-dropdown-menu></el-dropdown> -->
           </el-button-group>
         </el-col>
 
-        <!-- 申请单查询 -->
-      <!-- <el-col :span="1.5">
-          <el-button-group>
-            <el-button size="small" @click="handleQueryForm">申请单查询</el-button>
-          </el-button-group>
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        </el-col> -->
-
-        <!-- 导入导出 -->
-      <!-- <el-col :span="1.5">
-          <el-button-group>
-            <el-button size="small" @click="handleImport">批量导入</el-button>
-            <el-button size="small" @click="handleExport">批量导出</el-button>
-          </el-button-group>
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          </el-col> -->
-
-      </el-row>
-
-      <!-- 基本信息修改状态下—— 保存、保存新增、更新导入、取消 -->
-      <el-row :gutter="10" class="mb10" v-else>
+        <!-- 维护新版本 -->
         <el-col :span="1.5">
           <el-button-group>
-            <el-button size="small" @click="handleSave" v-hasPermi="['system:material:add']">保存</el-button>
-            <!-- <el-button size="small" @click="handleSaveAdd" :disabled="true">保存新增</el-button> -->
-            <!-- <el-button size="small" @click="handleUpdateImport">更新导入</el-button> -->
+            <el-button size="small" @click="handleNewVersion" v-hasPermi="['system:material:versions']">维护新版本</el-button>
           </el-button-group>
         </el-col>
 
-        <el-col :span="1.5">
-          <el-button-group>
-            <el-button size="small" @click="handleCancel">取消</el-button>
-          </el-button-group>
-        </el-col>
       </el-row>
+
+
     </div>
 
     <!-- 其他标签页操作  修改、删除 -->
@@ -94,7 +74,7 @@
           <el-button size="small" @click="handleOtherDel">删除</el-button>
         </el-button-group>
         <el-button-group>
-          <el-button size="small" @click="handleRefresh">刷新</el-button>
+          <el-button size="small" @click="handleOtherListRefresh">刷新</el-button>
         </el-button-group>
       </el-col>
     </el-row>
@@ -109,7 +89,7 @@
         <el-col :span="6" style="text-align: right;">
           <!-- 附件管理 -->
         <!-- <el-button-group>
-                                                                                          <el-button size="small" icon="el-icon-paperclip" @click="handleFile"></el-button></el-button-group> -->
+                                                                                                                                                      <el-button size="small" icon="el-icon-paperclip" @click="handleFile"></el-button></el-button-group> -->
 
           <!-- 切换 -->
         <!-- <el-button-group>
@@ -120,7 +100,7 @@
             <el-button size="small" icon="el-icon-arrow-right" :disabled="!handleBasicEdit"
               @click="handleChangePage('next')" />
             <el-button size="small" icon="el-icon-d-arrow-right" :disabled="!handleBasicEdit"
-                                                                                            @click="handleChangePage('end')" /></el-button-group> -->
+                                                                                                                                                    @click="handleChangePage('end')" /></el-button-group> -->
         </el-col>
       </el-row>
 
@@ -128,13 +108,13 @@
         <el-form :inline="true" label-position="right" :model="basicData.value">
           <!-- <el-form-item label="所属组织"></el-form-item> -->
           <el-form-item label="物料编码">
-            <el-input v-model="basicData.value.code" readonly size="small" placeholder="物料编码"></el-input>
+            <el-input v-model="basicData.value.code" readonly size="small"></el-input>
           </el-form-item>
           <el-form-item label="物料名称">
-            <el-input v-model="basicData.value.name" readonly size="small" placeholder="物料名称"></el-input>
+            <el-input v-model="basicData.value.name" readonly size="small"></el-input>
           </el-form-item>
           <el-form-item label="英文名称">
-            <el-input v-model="basicData.value.enName" readonly size="small" placeholder="英文名称"></el-input>
+            <el-input v-model="basicData.value.enName" readonly size="small"></el-input>
           </el-form-item>
           <!-- <el-form-item label="版本号"></el-form-item> -->
         </el-form>
@@ -181,14 +161,14 @@
                           </template>
 
                           <!-- 参照 -->
-                          <el-select v-if="f.apiUrl" v-model="basicData.value[`${f.prop}Name`]" :placeholder="f.name"
+                          <el-select v-if="f.apiUrl" v-model="basicData.value[`${f.prop}Name`]" placeholder="请选择"
                             :key="basicData.value[f.prop]" :disabled="handleJudge(f)"
                             @focus="f.apiUrl && handleQueryMore(f, '', { name: 'basicData', prop: f.prop })">
                             <div slot="empty"></div>
                           </el-select>
 
                           <!-- 字典 -->
-                          <el-select v-if="f.dictId" v-model="basicData.value[f.prop]" :placeholder="f.name"
+                          <el-select v-if="f.dictId" v-model="basicData.value[f.prop]" placeholder="请选择"
                             :key="basicData.value[f.prop]" :disabled="handleJudge(f)">
                             <el-option v-if="f.dictId" v-for="d in f.dictValue" :key="d.dictValue" :label="d.dictLabel"
                               :value="d.dictValue">
@@ -219,7 +199,7 @@
                           </template>
 
                           <el-input size="small" v-model="basicData.value[f.prop]" :type="f.attribute || 'text'"
-                            :readonly="handleJudge(f)" :placeholder="f.name">
+                            :readonly="handleJudge(f)">
                           </el-input>
                         </el-form-item>
 
@@ -276,8 +256,8 @@
                             <el-form-item v-else-if="m.attribute == 'select'" :label="m.name">
 
                               <!-- 参照弹窗 -->
-                              <el-select v-if="m.apiUrl" v-model="medcineData.value[`${m.prop}Name`]"
-                                :placeholder="m.name" :key="medcineData.value[m.prop]"
+                              <el-select v-if="m.apiUrl" v-model="medcineData.value[`${m.prop}Name`]" placeholder="请选择"
+                                :key="medcineData.value[m.prop]"
                                 :disabled="!(updateButtonGroup && m.edit && basicData.value.isMedicine == '0')"
                                 @focus="m.apiUrl && handleQueryMore(m, '', { name: 'medcineData', prop: m.prop })">
 
@@ -287,7 +267,7 @@
                               </el-select>
 
                               <!-- 下拉选择 -->
-                              <el-select v-else v-model="medcineData.value[m.prop]" :placeholder="m.name"
+                              <el-select v-else v-model="medcineData.value[m.prop]" placeholder="请选择"
                                 :key="medcineData.value[m.prop]"
                                 :disabled="!(updateButtonGroup && m.edit && basicData.value.isMedicine == '0')"
                                 @focus="m.apiUrl && handleQueryMore(m, '', { name: 'medcineData', prop: m.prop })">
@@ -308,7 +288,6 @@
                             <!-- 文本、数字、textarae -->
                             <el-form-item v-else :label="m.name">
                               <el-input size="small" v-model="medcineData.value[m.prop]" :type="m.attribute || 'text'"
-                                :placeholder="m.name"
                                 :readonly="!(updateButtonGroup && m.edit && basicData.value.isMedicine == '0')">
                               </el-input>
                             </el-form-item>
@@ -363,16 +342,16 @@
                 <el-divider content-position="left">审计信息</el-divider>
                 <el-form :inline="true" label-position="right" :model="basicData.value">
                   <el-form-item label="创建人">
-                    <el-input v-model="basicData.value.createByName" size="small" readonly placeholder="创建人"></el-input>
+                    <el-input v-model="basicData.value.createByName" size="small" readonly></el-input>
                   </el-form-item>
                   <el-form-item label="创建时间">
-                    <el-input v-model="basicData.value.createTime" size="small" readonly placeholder="创建时间"></el-input>
+                    <el-input v-model="basicData.value.createTime" size="small" readonly></el-input>
                   </el-form-item>
                   <el-form-item label="最后修改人">
-                    <el-input v-model="basicData.value.updateByName" size="small" readonly placeholder="最后修改人"></el-input>
+                    <el-input v-model="basicData.value.updateByName" size="small" readonly></el-input>
                   </el-form-item>
                   <el-form-item label="最后修改时间">
-                    <el-input v-model="basicData.value.updateTime" size="small" readonly placeholder="最后修改时间"></el-input>
+                    <el-input v-model="basicData.value.updateTime" size="small" readonly></el-input>
                   </el-form-item>
 
                 </el-form>
@@ -421,23 +400,20 @@
               true-label="0" false-label="2" v-model="scope.row[mt.prop]" />
 
             <!-- 下拉框 / 参照弹窗---- 药品类别编码 scope.row[`${mt.prop}Name`] -->
-            <el-select size="small" v-else-if="mt.attribute == 'select' && mt.apiUrl"
+            <el-select size="small" v-else-if="mt.attribute == 'select' && mt.apiUrl" placeholder="请选择"
               :disabled="!(materialType.isEdit && mt.edit)" v-model="scope.row[mt.prop]" :key="scope.row[mt.prop]"
-              :placeholder="mt.name"
               @focus="mt.apiUrl && handleQueryMore(mt, '', { name: 'materialType', prop: scope.row })">
               <div slot="empty"></div>
             </el-select>
 
-          <!-- <el-select size="small" v-else-if="mt.attribute == 'select' && mt.dictId"
-              :disabled="!(materialType.isEdit && mt.edit)" v-model="scope.row[mt.prop]" :key="scope.row[mt.prop]"
-              :placeholder="mt.name">
+          <!-- <el-select size="small" v-else-if="mt.attribute == 'select' && mt.dictId"  placeholder="请选择"
+              :disabled="!(materialType.isEdit && mt.edit)" v-model="scope.row[mt.prop]" :key="scope.row[mt.prop]">
               <el-option v-if="mt.dictId" v-for="d in mt.dictId" :key="d.dictValue" :label="d.dictLabel"
                 :value="d.dictValue">
-                </el-option></el-select> -->
+                                                                                                                                                                  </el-option></el-select> -->
 
             <!-- 其他类型 -->
-            <el-input v-else size="small" v-model="scope.row[mt.prop]" :readonly="!(materialType.isEdit && mt.edit)"
-              :placeholder="mt.name" />
+            <el-input v-else size="small" v-model="scope.row[mt.prop]" :readonly="!(materialType.isEdit && mt.edit)" />
           </template>
 
         </el-table-column>
@@ -484,13 +460,13 @@
           <el-collapse-item title="物料基本信息" name="basic">
             <el-form :inline="true" label-position="right" :model="basicData.value">
               <el-form-item label="物料编码">
-                <el-input v-model="basicData.value.code" size="small" readonly placeholder="物料编码"></el-input>
+                <el-input v-model="basicData.value.code" size="small" readonly></el-input>
               </el-form-item>
               <el-form-item label="物料名称">
-                <el-input v-model="basicData.value.name" size="small" readonly placeholder="物料名称"></el-input>
+                <el-input v-model="basicData.value.name" size="small" readonly></el-input>
               </el-form-item>
               <el-form-item label="英文名称">
-                <el-input v-model="basicData.value.enName" size="small" readonly placeholder="英文名称"></el-input>
+                <el-input v-model="basicData.value.enName" size="small" readonly></el-input>
               </el-form-item>
 
             </el-form>
@@ -515,7 +491,7 @@
                       <!-- 下拉框 - 弹窗参照 -->
                       <el-form-item v-else-if="f.attribute == 'select'" :label="f.name">
 
-                        <el-select v-if="f.apiUrl" v-model="otherDeatils.value[`${f.prop}Name`]" :placeholder="f.name"
+                        <el-select v-if="f.apiUrl" v-model="otherDeatils.value[`${f.prop}Name`]" placeholder="请选择"
                           :key="otherDeatils.value[f.prop]" :disabled="!(otherDeatils.isEdit && f.edit)"
                           @focus="f.apiUrl && handleQueryMore(f, '', { name: 'otherDeatils', prop: f.prop })">
 
@@ -523,7 +499,7 @@
                         </el-select>
 
                         <!-- 字典-下拉 -->
-                        <el-select v-if="f.disctId" v-model="otherDeatils.value[`${f.prop}Name`]" :placeholder="f.name"
+                        <el-select v-if="f.dictId" v-model="otherDeatils.value[`${f.prop}Name`]" placeholder="请选择"
                           :key="otherDeatils.value[f.prop]" :disabled="!(otherDeatils.isEdit && f.edit)">
                           <el-option v-if="f.dictId" v-for="d in f.dictValue" :key="d.dictValue" :label="d.dictLabel"
                             :value="d.dictValue">
@@ -541,7 +517,7 @@
                       <!--attribute 文本 数字 文本域 为null -->
                       <el-form-item v-else :label="f.name">
                         <el-input size="small" v-model="otherDeatils.value[f.prop]" :type="f.attribute || 'text'"
-                          :placeholder="f.name" :readonly="!(otherDeatils.isEdit && f.edit)">
+                          :readonly="!(otherDeatils.isEdit && f.edit)">
                         </el-input>
                       </el-form-item>
                     </template>
@@ -557,16 +533,16 @@
             <div class="md-auditInfo">
               <el-form :inline="true" label-position="right" :model="basicData.value">
                 <el-form-item label="创建人">
-                  <el-input v-model="basicData.value.createByName" size="small" readonly placeholder="创建人"></el-input>
+                  <el-input v-model="basicData.value.createByName" size="small" readonly></el-input>
                 </el-form-item>
                 <el-form-item label="创建时间">
-                  <el-input v-model="basicData.value.createTime" size="small" readonly placeholder="创建时间"></el-input>
+                  <el-input v-model="basicData.value.createTime" size="small" readonly></el-input>
                 </el-form-item>
                 <el-form-item label="最后修改人">
-                  <el-input v-model="basicData.value.updateByName" size="small" readonly placeholder="最后修改人"></el-input>
+                  <el-input v-model="basicData.value.updateByName" size="small" readonly></el-input>
                 </el-form-item>
                 <el-form-item label="最后修改时间">
-                  <el-input v-model="basicData.value.updateTime" size="small" readonly placeholder="最后修改时间"></el-input>
+                  <el-input v-model="basicData.value.updateTime" size="small" readonly></el-input>
                 </el-form-item>
               </el-form>
 
@@ -635,6 +611,8 @@ export default {
     return {
       count: 1,
       loading: false,
+      // 维护新版本
+      maintainNewVersion: false,
       // 详情固定标签页
       detailsTabs,
       defaultProps: {
@@ -764,9 +742,20 @@ export default {
   methods: {
     // 判断效期管理
     handleJudge(attribute) {
+      // 维护新版本才能修改:批号及库存状态管理(isInventoryStatus)、
+      if (attribute.prop == 'isInventoryStatus') {
+        return !(this.maintainNewVersion && attribute.edit);
+      }
+      // 序列号管理(serialNoManager):维护新版本 && 批号及库存状态管理
+      else if (attribute.prop == 'serialNoManager') {
 
+        if (this.basicData.value['isInventoryStatus'] == '2') this.basicData.value['serialNoManager'] = '2';
+
+        return !(this.maintainNewVersion && attribute.edit && this.basicData.value['isInventoryStatus'] == '0');
+
+      }
       // 批号及库存状态管理(isInventoryStatus) 控制 效期管理是否展示(expiryDateManagerment)
-      if (attribute.prop == 'expiryDateManagerment') {
+      else if (attribute.prop == 'expiryDateManagerment') {
 
         if (this.basicData.value['isInventoryStatus'] == '2') this.basicData.value['expiryDateManagerment'] = '2';
 
@@ -831,59 +820,7 @@ export default {
       this.collapseActive.splice(1, 1, this.activeMainTab);
       console.log(this.collapseActive, 'this.collapseActive');
 
-      switch (this.activeMainTab) {
-
-        // 基本信息
-        case 'material':
-          this.getTagList('material', (form) => {
-            this.basicData.form = form;
-            this.getMaterialDetails(this.materialId, 'material');
-          })
-          break;
-        // 财物信息
-        case 'material_finance':
-          this.getTagList('material_finance', (form) => {
-            this.mainMsg.form = form;
-            this.getFinanceList(this.materialId);
-          });
-          break;
-        // 利润中心信息
-        case 'profit_center':
-          this.getTagList('profit_center', (form) => {
-            this.mainMsg.form = form;
-            this.getCenterList(this.materialId);
-          });
-          break;
-        // 采购信息
-        case 'material_purchase':
-          this.getTagList('material_purchase', (form) => {
-            this.mainMsg.form = form;
-            this.getPurchaseList(this.materialId);
-          });
-          break;
-        // 库存信息
-        case 'material_inventory':
-          this.getTagList('material_inventory', (form) => {
-            this.mainMsg.form = form;
-            this.getInventoryList(this.materialId);
-          });
-          break;
-        // 计划信息
-        case 'material_plan':
-          this.getTagList('material_plan', (form) => {
-            this.mainMsg.form = form;
-            this.getPlanList(this.materialId);
-          });
-          break;
-        // 成本信息
-        case 'material_cost':
-          this.getTagList('material_cost', (form) => {
-            this.mainMsg.form = form;
-            this.getCostList(this.materialId);
-          });
-          break;
-        default: break;
-      }
+      this.handleOtherListRefresh();
 
     },
     // 切换副表信息
@@ -905,7 +842,7 @@ export default {
           this.getTagList('material_unit', (form) => {
             console.log(form, 'form');
             this.unitDetails.form = form;
-            this.getUnitList('');
+            this.getUnitList(this.materialId);
           });
           break;
         // 辅助属性
@@ -1288,16 +1225,16 @@ export default {
       materialApi.unitDetails(materialId).then(res => {
         console.log(res, '辅助计量单位基本信息');
         if (res.code == 200) {
-          this.unitDetails.value = res.data.data || [];
+          this.unitDetails.value = res.data.tableBody.rows || [];
         }
       })
     },
-    //获取辅计量管理列表信息+表头字段
-    getUnitList() {
-      materialApi.unitList().then(res => {
+    //获取辅计量管理列表信息
+    getUnitList(materialId) {
+      materialApi.unitList({ materialId }).then(res => {
         console.log(res, '辅计量管理列表信息');
         if (res.code == 200) {
-          this.unitDetails.value = res.data.data || [];
+          this.unitDetails.value = res.data.tableBody.rows || [];
         }
       })
     },
@@ -1427,16 +1364,72 @@ export default {
         });
       }
     },
+    // 其他标签页刷新
+    handleOtherListRefresh() {
+      switch (this.activeMainTab) {
+
+        // 基本信息
+        case 'material':
+          this.getTagList('material', (form) => {
+            this.basicData.form = form;
+            this.getMaterialDetails(this.materialId, 'material');
+          })
+          break;
+        // 财物信息
+        case 'material_finance':
+          this.getTagList('material_finance', (form) => {
+            this.mainMsg.form = form;
+            this.getFinanceList(this.materialId);
+          });
+          break;
+        // 利润中心信息
+        case 'profit_center':
+          this.getTagList('profit_center', (form) => {
+            this.mainMsg.form = form;
+            this.getCenterList(this.materialId);
+          });
+          break;
+        // 采购信息
+        case 'material_purchase':
+          this.getTagList('material_purchase', (form) => {
+            this.mainMsg.form = form;
+            this.getPurchaseList(this.materialId);
+          });
+          break;
+        // 库存信息
+        case 'material_inventory':
+          this.getTagList('material_inventory', (form) => {
+            this.mainMsg.form = form;
+            this.getInventoryList(this.materialId);
+          });
+          break;
+        // 计划信息
+        case 'material_plan':
+          this.getTagList('material_plan', (form) => {
+            this.mainMsg.form = form;
+            this.getPlanList(this.materialId);
+          });
+          break;
+        // 成本信息
+        case 'material_cost':
+          this.getTagList('material_cost', (form) => {
+            this.mainMsg.form = form;
+            this.getCostList(this.materialId);
+          });
+          break;
+        default: break;
+      }
+    },
     // 修改
     handleBasicEdit() {
       console.log('修改基本信息');
       this.updateButtonGroup = true;
       // this.count++;
       //需要禁止点击其他标签
-      this.detailsTabs = this.detailsTabs.map(item => {
-        item['disabled'] = true;
-        return item
-      })
+      // this.detailsTabs = this.detailsTabs.map(item => {
+      //   item['disabled'] = true;
+      //   return item
+      // })
       console.log(this.detailsTabs, 'this.detailsTabs ');
 
     },
@@ -1481,30 +1474,52 @@ export default {
     // 启用
     handleIsInvoke(e) {
       console.log('启用', this.basicData.value.isEnable);
-      if (this.basicData.value.isEnable == '已启用') {
-        this.basicData.value.isEnable = '2';
-      } else {
-        // this.basicData.isEnable 为空或者为2
-        this.basicData.value.isEnable = '0';
-      }
-      this.handleSave();
-    },
-    isInvoke(val) {
-      return val;
-    },
-    // 申请单查询
-    handleQueryForm() {
-      console.log('申请单查询');
-    },
-    // 批量导入
-    handleImport() {
-      console.log('批量导入');
+
+      let param = {
+        isEnable: this.basicData.value.isEnable == '已启用' ? '2' : '0',
+        id: this.basicData.value.id
+      };
+      console.log(param, '启用/停用param');
+      materialApi.updateEnableMaterial(param).then(res => {
+        console.log(res, '启用/停用');
+        if (res.code == 200) this.handleRefresh();
+      })
     },
-    // 批量导出
-    handleExport() {
-      console.log('批量导出');
+    // 维护新版本
+    handleNewVersion() {
+      let _this = this;
+      let data = {
+        // 物料编码
+        code: this.basicData.value.code
+      }
+      materialApi.versions(data).then(res => {
+        console.log(res, '维护新版本');
+        if (res.code == 200) {
+          _this.maintainNewVersion = res.data.result;
+        }
+      })
     },
+    // 维护物料保存
+    handleSaveNewVersion(cb) {
+      let data = {
+        // 物料编码
+        materialCode: this.basicData.value.code,
+        //序列号管理; 2= 否,0= 是	
+        serialNoManager: this.basicData.value.serialNoManager,
+        // 批号及库存状态管理;2=否,0=是
+        isInventoryStatus: this.basicData.value.isInventoryStatus,
+      }
+      materialApi.saveVersions(data).then(res => {
+        console.log(res, '维护物料保存');
 
+        if (res.code == 200) {
+          cb();
+        }
+      })
+        .catch((error) => {
+          this.loading = false;
+        })
+    },
     // 取消保存
     handleCancel() {
       console.log('取消保存');
@@ -1514,10 +1529,18 @@ export default {
     // 保存修改
     handleSave() {
       console.log('保存修改');
-      this.handleSaveMaterial(() => {
+      this.loading = true;
+      // 普通保存修改
+      this.updateButtonGroup && this.handleSaveMaterial(() => {
         this.updateButtonGroup = false;
         this.handleRefresh();
       });
+
+      // 维护新版本保存修改
+      this.maintainNewVersion && this.handleSaveNewVersion(() => {
+        this.maintainNewVersion = false;
+        this.handleRefresh();
+      })
     },
     // 物料类别列表选中
     handleSelectionType(list) {
@@ -1699,18 +1722,27 @@ export default {
     // 确认弹窗操作
     handleComfirmOption() {
       console.log('确认弹窗操作');
+
       this.optionDialog.show = false;
-      this.updateButtonGroup = false;
-      this.handleRest();
 
-      //需要禁止点击其他标签
-      this.detailsTabs = this.detailsTabs.map(item => {
-        item['disabled'] = false;
-        return item;
-      })
+      // 取消基本信息修改
+      if (this.updateButtonGroup) {
+        this.updateButtonGroup = false;
+        this.handleRest();
 
+      }
+
+      // 取消其他主页签详情弹窗修改
       if (this.otherDeatils.isEdit) {
         this.otherDeatils.isEdit = false;
+        this.handleOtherRefresh();
+      }
+
+      // 取消维护新版本修改
+      if (this.maintainNewVersion) {
+        console.log('取消维护新版本修改');
+        this.maintainNewVersion = false;
+        this.handleRefresh();
       }
     },
     // 参照弹窗过滤
@@ -1884,11 +1916,15 @@ export default {
         materialMedcine: this.medcineData.value,
         materialMedcineItem: {}
       };
-      // basicData  this.medcineData.value    materialMedcine
+      // diCode
+      param.diCode = param.diCode.replace(/ /g, '');
       console.log(param, '保存物料以及相关页签param');
       materialApi.insertMaterialInfo(param).then(res => {
+        
         console.log(res, '保存物料以及相关页签');
         if (res.code == 200) cb();
+      }).catch((error)=>{
+        this.loading = false;
       })
     },
     // 保存财务信息——单个数据
@@ -1967,6 +2003,26 @@ export default {
     },
 
   },
+
+  watch: {
+    // 监听主标签修改标识,控制其他标签是否禁止点击
+    'updateButtonGroup': function (nVal, oVal) {
+      console.log(nVal, 'nVal', oVal, 'oVal');
+      this.detailsTabs = this.detailsTabs.map(item => {
+        item['disabled'] = nVal;
+        return item;
+      })
+    },
+    'maintainNewVersion': function (nVal, oVal) {
+      console.log(nVal, 'nVal', oVal, 'oVal');
+      this.detailsTabs = this.detailsTabs.map(item => {
+        item['disabled'] = nVal;
+        return item;
+      })
+    },
+
+  },
+
   created() {
 
     // 基本信息
@@ -2002,9 +2058,12 @@ export default {
 
   .md-content {
     margin-top: 12px;
-    height: calc(100vh - 260px);
+    // height: calc(100vh - 260px);
+    height: calc(100vh - 228px);
     box-sizing: border-box;
 
+
+
     .md-basic {
       overflow: auto;
 
@@ -2012,6 +2071,10 @@ export default {
         // height: calc(100vh - 625px);
         margin-bottom: 10px;
 
+        .el-table__body {
+          // height: calc(100vh - 300px);
+        }
+
         .el-form {
           max-height: 200px;
           overflow-y: auto;
@@ -2039,6 +2102,10 @@ export default {
 
   }
 
+  // .md-content>.el-tabs {
+  //   height: calc(100vh - 280px);
+  // }
+
   .otherDialog {
 
     .el-collapse-item__content {
@@ -2223,6 +2290,10 @@ export default {
   overflow-x: auto;
 }
 
+/* .md-main>>>.el-table .el-table__body {
+  height: calc(100vh - 300px);
+} */
+
 /* .otherDialog>>>.el-collapse-item__content {
   padding-bottom: 12px;
 }

+ 46 - 24
src/views/material/basicFile/index.vue

@@ -27,7 +27,7 @@
               <el-dropdown-item :command="filterCondition('stop')">显示停用</el-dropdown-item>
               <el-dropdown-item :command="filterCondition('allot')">显示已分配</el-dropdown-item>
             </el-dropdown-menu>
-                                                                </el-dropdown> -->
+                                                                                                                                                                                            </el-dropdown> -->
 
             <!-- <el-button size="small" @click="handleQuery">查询</el-button> -->
             <el-button size="small" @click="handleRefresh">刷新</el-button>
@@ -46,13 +46,6 @@
           </el-button-group>
         </el-col>
 
-        <!-- 申请单查询 -->
-      <!-- <el-col :span="1.5">
-        <el-button-group>
-          <el-button size="small" @click="handleQueryForm">申请单查询</el-button>
-        </el-button-group>
-                                                                                                                                                                                                                        </el-col> -->
-
         <!-- 导入导出 -->
         <el-col :span="1.5">
           <el-button-group>
@@ -65,7 +58,7 @@
       </el-row>
 
       <!-- 查询条件 -->
-      <el-row :gutter="10" >
+      <el-row :gutter="10">
         <el-col :span="1.5">
           <el-form :inline="true" :model="queryForm" class="mb-query" @submit.native.prevent>
             <el-form-item label="物料编码">
@@ -101,8 +94,10 @@
 
     <!-- 主体列表 -->
     <el-card class="material-list" v-loading="loading">
-      <el-table :data="taskList" @cell-dblclick="handledbClick" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="30" />
+      <el-table :data="taskList" ref="materialTable" @cell-dblclick="handledbClick" :row-key="getRowKey"
+        @selection-change="handleSelectionChange" @select="handleSelect" @select-all="handleSelectAll">
+        <!--  -->
+        <el-table-column type="selection" width="30" :reserve-selection="true" />
         <el-table-column type="index" label="序号" width="55" align="center" />
         <el-table-column width="150" v-for="h in  tableHeader" v-if="h.show" :label="h.name" align="center"
           show-overflow-tooltip>
@@ -230,14 +225,9 @@ export default {
             isEdit: true
           }
         });
-      } else if (this.checkedList.length > 1) {
-        this.$message({
-          message: '修改只能选择单个数据!',
-          type: 'warning'
-        });
       } else {
         this.$message({
-          message: '请选择需要修改的信息!',
+          message: `${this.checkedList.length > 1 ? '修改只能选择单个数据!' : '请选择需要修改的信息!'}`,
           type: 'warning'
         });
       }
@@ -371,11 +361,20 @@ export default {
 
       let ids = this.checkedList.length ? this.checkedList.map(i => i.id) : [];
 
-      let params = {
-        // orgId: '1',
-        ids,
+      if (ids.length) {
+
+        let params = {
+          // orgId: '1',
+          ids,
+        }
+        this.download('/system/material/export', params, `物料基本信息${new Date().getTime()}.xlsx`);
+      } else {
+        this.$message({
+          message: '请选择需要导出的数据!',
+          type: 'warning'
+        });
       }
-      this.download('/system/material/export', params, `物料基本信息${new Date().getTime()}.xlsx`)
+
     },
     // 下载模板
     handleDownTemplate() {
@@ -410,10 +409,33 @@ export default {
         path: `/material/basicFile/detail/${e.id}`,
       });
     },
+    // 绑定row-key
+    getRowKey(row) {
+      return row.id;
+    },
+    // 对象数组去重
+    handleUnique(arr, key) {
+      // arr  需要去重的数组   type:作为去重依据的key
+      const res = new Map();
+      return arr.filter((arr) => !res.has(arr[key]) && res.set(arr[key], 1))
+    },
     // 选中数据改变
     handleSelectionChange(list) {
-      this.checkedList = list;
-      this.$emit('headerOption', JSON.stringify({ checkedList: [...list] }))
+      // this.checkedList = this.handleUnique([...this.checkedList, ...list], 'id');
+      // console.log(this.checkedList, '选中数据改变');
+      // this.$emit('headerOption', JSON.stringify({ checkedList: [... this.checkedList] }))
+    },
+    // 行数据勾选操作 
+    handleSelect(selection, row) {
+      this.checkedList = selection;
+      // // true就是选中,0或者false是取消选中
+      // let selected = selection.length && selection.indexOf(row) !== -1
+
+    },
+    //手动勾选全选 
+    handleSelectAll(selection) {
+      // console.log(selection, '手动勾选全选--------------');
+      this.checkedList = selection;
     },
     // 获取物料列表信息
     getMaterialList(templateCode, query) {
@@ -428,7 +450,7 @@ export default {
         templateCode,
         ...this.queryForm
       }
-      console.log(param, 'param');
+      // console.log(param, 'param');
       materialApi.materialList(param, page).then((res) => {
         _this.loading = false;
         console.log(res, '获取物料列表信息以及表头字段');

+ 79 - 167
src/views/material/changeApply/add.vue

@@ -30,20 +30,10 @@
             </el-col>
             <el-col :span="8">
               <el-form-item label="医药物料" prop="medicineMaterial">
-                <el-select
-                    v-model="basicForm.medicineMaterial"
-                    placeholder="医药物料"
-                    clearable
-                    :disabled="disable"
-                    @change="controlMedic"
-                  >
-                    <el-option
-                      v-for="item in options"
-                      :key="item.value"
-                      :label="item.label"
-                      :value="item.value"
-                    />
-                  </el-select>
+                <el-select v-model="basicForm.medicineMaterial" placeholder="医药物料" clearable :disabled="disable"
+                  @change="controlMedic">
+                  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
               </el-form-item>
             </el-col>
             <el-col :span="8">
@@ -68,20 +58,9 @@
             </el-col>
             <el-col :span="8">
               <el-form-item label="生产厂家/代理人" prop="factory">
-                <el-select
-                    ref="factoryOrman"
-                    v-model="basicForm.factory"
-                    placeholder="生产厂家/代理人"
-                    clearable
-                    :disabled="disable"
-                    @focus="chooseFactory"
-                  >
-                    <el-option
-                      v-for="item in factoryOptions"
-                      :key="item.id"
-                      :label="item.name"
-                      :value="item.id"
-                    />
+                <el-select ref="factoryOrman" v-model="basicForm.factory" placeholder="生产厂家/代理人" clearable
+                  :disabled="disable" @focus="chooseFactory">
+                  <el-option v-for="item in factoryOptions" :key="item.id" :label="item.name" :value="item.id" />
                 </el-select>
                 <!-- <el-input :disabled="disable" v-model="basicForm.factory">
                   <el-button :disabled="disable" slot="append" icon="el-icon-more" @click="test02"></el-button>
@@ -97,36 +76,18 @@
             </el-col>
             <el-col :span="8">
               <el-form-item label="存储条件" prop="storageConditions">
-                <el-select
-                    v-model="basicForm.storageConditions"
-                    placeholder="存储条件"
-                    clearable
-                    :disabled="disable"
-                  >
-                    <el-option
-                      v-for="dict in dict.type.sys_storage_condition"
-                      :key="dict.value"
-                      :label="dict.label"
-                      :value="dict.value"
-                    />
-                  </el-select>
+                <el-select v-model="basicForm.storageConditions" placeholder="存储条件" clearable :disabled="disable">
+                  <el-option v-for="dict in dict.type.sys_storage_condition" :key="dict.value" :label="dict.label"
+                    :value="dict.value" />
+                </el-select>
               </el-form-item>
             </el-col>
             <el-col :span="8">
               <el-form-item label="运输条件" prop="transportCondition">
-                <el-select
-                    v-model="basicForm.transportCondition"
-                    placeholder="运输条件"
-                    clearable
-                    :disabled="disable"
-                  >
-                    <el-option
-                      v-for="dict in dict.type.sys_conditions_carriage"
-                      :key="dict.value"
-                      :label="dict.label"
-                      :value="dict.value"
-                    />
-                  </el-select>
+                <el-select v-model="basicForm.transportCondition" placeholder="运输条件" clearable :disabled="disable">
+                  <el-option v-for="dict in dict.type.sys_conditions_carriage" :key="dict.value" :label="dict.label"
+                    :value="dict.value" />
+                </el-select>
               </el-form-item>
             </el-col>
           </el-row>
@@ -173,19 +134,10 @@
           <el-row :gutter="20">
             <el-col :span="8">
               <el-form-item label="药品" prop="drug">
-                <el-select
-                    v-model="basicForm2.drug"
-                    placeholder="请选择"
-                    clearable
-                    :disabled="disable || isControl"
-                  >
-                    <el-option
-                      v-for="dict in dict.type.sys_medicine"
-                      :key="dict.value"
-                      :label="dict.label"
-                      :value="dict.value"
-                    />
-                  </el-select>
+                <el-select v-model="basicForm2.drug" placeholder="请选择" clearable :disabled="disable || isControl">
+                  <el-option v-for="dict in dict.type.sys_medicine" :key="dict.value" :label="dict.label"
+                    :value="dict.value" />
+                </el-select>
               </el-form-item>
             </el-col>
             <el-col :span="8">
@@ -195,38 +147,22 @@
             </el-col>
             <el-col :span="8">
               <el-form-item label="医疗器械" prop="medicalDevices">
-                <el-select
-                    v-model="basicForm2.medicalDevices"
-                    placeholder="请选择"
-                    clearable
-                    :disabled="disable || isControl"
-                  >
-                    <el-option
-                      v-for="dict in dict.type.medical_instruments"
-                      :key="dict.value"
-                      :label="dict.label"
-                      :value="dict.value"
-                    />
-                  </el-select>
+                <el-select v-model="basicForm2.medicalDevices" placeholder="请选择" clearable
+                  :disabled="disable || isControl">
+                  <el-option v-for="dict in dict.type.medical_instruments" :key="dict.value" :label="dict.label"
+                    :value="dict.value" />
+                </el-select>
               </el-form-item>
             </el-col>
           </el-row>
           <el-row :gutter="20">
             <el-col :span="8">
               <el-form-item label="养护类型" prop="maintenanceType">
-                <el-select
-                    v-model="basicForm2.maintenanceType"
-                    placeholder="请选择"
-                    clearable
-                    :disabled="disable || isControl"
-                  >
-                    <el-option
-                      v-for="dict in dict.type.curing_type"
-                      :key="dict.value"
-                      :label="dict.label"
-                      :value="dict.value"
-                    />
-                  </el-select>
+                <el-select v-model="basicForm2.maintenanceType" placeholder="请选择" clearable
+                  :disabled="disable || isControl">
+                  <el-option v-for="dict in dict.type.curing_type" :key="dict.value" :label="dict.label"
+                    :value="dict.value" />
+                </el-select>
               </el-form-item>
             </el-col>
           </el-row>
@@ -268,10 +204,7 @@
       </el-tab-pane>
 
       <el-tab-pane label="修改记录" name="third">
-        <el-table 
-          :data="basicForm.changeRecords"
-          class="request-table"
-          >
+        <el-table :data="basicForm.changeRecords" class="request-table">
           <el-table-column label="字段名称" align="center" prop="pageCondtion" />
           <el-table-column label="变更前" align="center" prop="beforeChangeValue" />
           <el-table-column label="变更后" align="center" prop="afterChangeValue" />
@@ -327,16 +260,8 @@
             </el-col> -->
             <el-col :span="8">
               <el-form-item label="单据状态" prop="status">
-                <el-select 
-                  v-model="basicForm.status"
-                  size="small"
-                  disabled
-                  >
-                  <el-option
-                    v-for="item in statusOptions"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value">
+                <el-select v-model="basicForm.status" size="small" disabled>
+                  <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
                   </el-option>
                 </el-select>
                 <!-- <el-input disabled v-model="basicForm.status"></el-input> -->
@@ -349,7 +274,8 @@
 
     <div class="btn_group">
       <el-col :span="1.5">
-        <el-button type="primary" size="small" plain @click="save" v-if="pageStu == 'add' || pageStu == 'edit'">保存</el-button>
+        <el-button type="primary" size="small" plain @click="save"
+          v-if="pageStu == 'add' || pageStu == 'edit'">保存</el-button>
       </el-col>
       <el-col :span="1.5" style="margin: 0 10px;">
         <el-button type="primary" size="small" plain @click="submit" v-if="pageStu == 'edit'">提交</el-button>
@@ -359,26 +285,11 @@
       </el-col>
     </div>
 
-    <popDialog
-      ref="contractSelect"
-      @doSubmit="selectionsToInput"
-      :selectData="selectData"
-      :single="true"
-    />
+    <popDialog ref="contractSelect" @doSubmit="selectionsToInput" :selectData="selectData" :single="true" />
 
-    <factory
-      ref="factory"
-      @doSubmit="acceptFactory"
-      :selectData="selectData2"
-      :single="true"
-    />
+    <factory ref="factory" @doSubmit="acceptFactory" :selectData="selectData2" :single="true" />
 
-    <fourClass
-      ref="fourClass"
-      @doSubmit="acceptFourClass"
-      :selectData="selectData3"
-      :single="true"
-    />
+    <fourClass ref="fourClass" @doSubmit="acceptFourClass" :selectData="selectData3" :single="true" />
   </div>
 </template>
 
@@ -406,7 +317,7 @@ export default {
     event: 'jugislist'
   },
   data() {
-    return{
+    return {
       factoryOptions: [],
       tabValue: 'first',
       isControl: true,
@@ -414,7 +325,7 @@ export default {
         code: '',
         orgId: '德荣集团',
         // 物料id
-        materialId:'',
+        materialId: '',
         materialCode: '',
         materialName: '',
         materialClassifyId: '',
@@ -436,7 +347,7 @@ export default {
         // 单据信息字段
         createBy: '',
         applicationTime: '',
-        createTime:'',
+        createTime: '',
         updateBy: '',
         updateTime: '',
         approver: '',
@@ -446,30 +357,30 @@ export default {
       options: [{
         value: '0',
         label: '是'
-      },{
+      }, {
         value: '2',
         label: '否'
       }],
       statusOptions: [{
         value: '0', label: '未提交'
-      },{
+      }, {
         value: '1', label: '审批中'
-      },{
+      }, {
         value: '2', label: '已完成'
-      },{
+      }, {
         value: '3', label: '已驳回'
       },],
       basicRules: {
-        materialCode: [{  required: true, message: '请选择物料编码', trigger: 'blur' }],
-        materialName: [{required: true, message: '请填写物料名称', trigger: 'blur'}],
-        specification: [{required: true, message: '请填写规格', trigger: 'blur'}],
-        materialClassifyId: [{required: true, message: '请选择物料分类', trigger: 'blur'}],
-        model: [{required: true, message: '请填写型号', trigger: 'blur'}],
-        factory: [{required: true, message: '请选择生产厂家/代理人', trigger: 'blur'}],
-        registrant: [{required: true, message: '请填写注册人/上市许可持有人', trigger: 'blur'}],
-        storageConditions: [{required: true, message: '请选择存储条件', trigger: 'blur'}],
-        transportCondition: [{required: true, message: '请选择运输条件', trigger: 'blur'}],
-        leadTime: [{required: true, message: '请填写交货周期', trigger: 'blur'}],
+        materialCode: [{ required: true, message: '请选择物料编码', trigger: 'blur' }],
+        materialName: [{ required: true, message: '请填写物料名称', trigger: 'blur' }],
+        specification: [{ required: true, message: '请填写规格', trigger: 'blur' }],
+        materialClassifyId: [{ required: true, message: '请选择物料分类', trigger: 'blur' }],
+        // model: [{required: true, message: '请填写型号', trigger: 'blur'}],
+        factory: [{ required: true, message: '请选择生产厂家/代理人', trigger: 'blur' }],
+        registrant: [{ required: true, message: '请填写注册人/上市许可持有人', trigger: 'blur' }],
+        storageConditions: [{ required: true, message: '请选择存储条件', trigger: 'blur' }],
+        // transportCondition: [{required: true, message: '请选择运输条件', trigger: 'blur'}],
+        leadTime: [{ required: true, message: '请填写交货周期', trigger: 'blur' }],
       },
       basicForm2: {
         drug: '',
@@ -518,9 +429,9 @@ export default {
   mounted() {
     this.$nextTick(() => {
       // console.log('页面状态',this.pageStu)
-      if(this.pageStu == 'check') {
+      if (this.pageStu == 'check') {
         // alert('详情页面:')
-        console.log('页面状态',this.pageStu)
+        console.log('页面状态', this.pageStu)
         console.log('数据', this.row)
         this.getDetails(this.row)
         // 生产厂家代理人用于回显
@@ -529,7 +440,7 @@ export default {
         }
       } else if (this.pageStu == 'edit') {
         // alert('修改页面')
-        console.log('页面状态',this.pageStu)
+        console.log('页面状态', this.pageStu)
         console.log('数据', this.row)
         this.getDetails(this.row)
         // 控制医药属性是否能够填写
@@ -542,24 +453,24 @@ export default {
         if (this.row.factory) {
           this.getFactoryDetails(this.row.factory)
         }
-      } else if(this.pageStu == 'add') {
+      } else if (this.pageStu == 'add') {
         // alert('新增页面')
-        console.log('页面状态',this.pageStu)
+        console.log('页面状态', this.pageStu)
       }
     })
   },
   methods: {
     // 生产厂家/代理人用于回显
     getFactoryDetails(id) {
-       getProductFactory({id:id}).then(res => {
-        if(res.code === 200) {
+      getProductFactory({ id: id }).then(res => {
+        if (res.code === 200) {
           this.factoryOptions = res.data.tableBody
         }
-       })
+      })
     },
     // 选择是否医药物料时控制医药属性
     controlMedic(val) {
-      console.log('val',val)
+      console.log('val', val)
       if (val == '0') {
         this.isControl = false
       } else {
@@ -572,12 +483,12 @@ export default {
     },
     handleClick(tab, event) {
       console.log(tab, event);
-      console.log('页面状态',this.pageStu)
+      console.log('页面状态', this.pageStu)
     },
     // 如果是详情进入,则调用详情接口
     getDetails(row) {
       getChangeDetails(row.id).then(res => {
-        if(res.code === 200) {
+        if (res.code === 200) {
           this.basicForm = res.data
           if (res.data.medicineChange) {
             this.basicForm2 = res.data.medicineChange
@@ -587,13 +498,13 @@ export default {
     },
     save() {
       // alert('保存传status:0')
-      let sparams = {...this.basicForm, ...{status: 0}}
+      let sparams = { ...this.basicForm, ...{ status: 0 } }
       sparams.medicineChange = this.basicForm2
       console.log('保存参数', sparams)
       this.$refs['basic'].validate((valid) => {
         if (valid) {
           addChangeList(sparams).then(res => {
-            if(res.code === 200) {
+            if (res.code === 200) {
               this.$message({
                 message: res.msg,
                 type: 'success'
@@ -606,13 +517,13 @@ export default {
     },
     submit() {
       // alert('提交传status:1')
-      let sparams = {...this.basicForm, ...{status: 1}}
+      let sparams = { ...this.basicForm, ...{ status: 1 } }
       sparams.medicineChange = this.basicForm2
       console.log('提交参数', sparams)
       this.$refs['basic'].validate((valid) => {
-        if(valid) {
+        if (valid) {
           editChangeList(sparams).then(res => {
-            if(res.code === 200) {
+            if (res.code === 200) {
               this.$message({
                 message: res.msg,
                 type: 'success'
@@ -666,12 +577,12 @@ export default {
     //   console.log('暂存总表单', params)
     // },
     // 设置选中
-    selectionsToInput (selections) {
+    selectionsToInput(selections) {
       console.log('父组件拿到的:', selections)
       this.selectData = selections
       this.$emit('getInfo', this.selectData)
       getMaterialDetails(selections[0].id).then(res => {
-        console.log('res',res)
+        console.log('res', res)
         if (res.code === 200) {
           let data = res.data.data
           // 物料id
@@ -692,10 +603,10 @@ export default {
           this.basicForm.storageConditions = data.storageCondition
           this.basicForm.transportCondition = data.transportationCondition
           this.basicForm.leadTime = data.deliveryPeriod
-          if(data.manufacturerId) {
+          if (data.manufacturerId) {
             this.getFactoryDetails(data.manufacturerId)
           }
-          if(data.medcines.length !== 0) {
+          if (data.medcines.length !== 0) {
             this.basicForm2.drug = data.medcines[0].isDrug
             this.basicForm2.registrationNo = data.medcines[0].registrationNo
             this.basicForm2.medicalDevices = data.medcines[0].medicalInstruments
@@ -724,8 +635,8 @@ export default {
     //   this.$refs.contractSelect2.init()
     // },
     // 选择生产厂家/代理人
-    acceptFactory (selections) {
-      console.log('选择的数据',selections)
+    acceptFactory(selections) {
+      console.log('选择的数据', selections)
       this.factoryOptions = selections
       this.basicForm.factory = selections[0].id
       this.getFactoryDetails(selections[0].id)
@@ -737,7 +648,7 @@ export default {
     },
     // 选择四级分类
     acceptFourClass(selections) {
-      console.log('收到的四级分类',selections)
+      console.log('收到的四级分类', selections)
       this.basicForm.materialClassifyId = selections.id
       this.getTreeDetails(selections.id)
     },
@@ -761,12 +672,13 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-  .apply_add {
+.apply_add {
   height: calc(100vh - 84px);
   padding: 12px;
   box-sizing: border-box;
   overflow-y: auto;
 }
+
 .btn_group {
   width: 100%;
   margin: 20px 0;

+ 2 - 8
src/views/material/classify/index.vue

@@ -16,12 +16,6 @@
           >删除</el-button
         >
       </el-col>
-      <!-- <el-col :span="1.5">
-        <el-button type="primary" size="small" plain>启用</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button type="primary" size="small" plain>停用</el-button>
-      </el-col> -->
     </el-row>
 
     <el-card v-loading="loading">
@@ -46,7 +40,7 @@
             ref="tree"
           >
             <span slot-scope="{ node, data }">
-              {{ data.materialType }} {{ data.code }}
+              {{ data.code }}{{ data.materialType }}
             </span>
           </el-tree>
         </el-col>
@@ -221,7 +215,7 @@ export default {
   watch: {
     filterText(val) {
       this.$refs.tree.filter(val);
-    }
+    },
   },
   created() {
     this.getTreeData();

+ 9 - 0
src/views/material/label/index.vue

@@ -2,12 +2,18 @@
 import LabelTable from "./label-table.vue";
 import LabelAddDialog from "./label-add-dialog.vue";
 import LabelEditDialog from "./label-edit-dialog.vue";
+import LabelBindDialog from "./label-bind-dialog.vue";
+import LabelAutoBindDialog from "./label-auto-bind-dialog.vue";
+import LabelHandBindDialog from "./label-hand-bind-dialog.vue";
 export default {
   name: "MaterialLabel",
   components: {
     LabelTable,
     LabelAddDialog,
     LabelEditDialog,
+    LabelBindDialog,
+    LabelAutoBindDialog,
+    LabelHandBindDialog,
   },
   data() {
     return {};
@@ -21,6 +27,9 @@ export default {
     <label-table></label-table>
     <label-add-dialog></label-add-dialog>
     <label-edit-dialog></label-edit-dialog>
+    <label-bind-dialog></label-bind-dialog>
+    <label-auto-bind-dialog></label-auto-bind-dialog>
+    <label-hand-bind-dialog></label-hand-bind-dialog>
   </el-container>
 </template>
 

+ 21 - 16
src/views/material/label/label-add-dialog.vue

@@ -1,25 +1,25 @@
 <script>
 import { add, type } from "@/api/material/label";
 export default {
-  name: "MaterialAddLabelDialog",
+  name: "AddDialog",
   data() {
     const initDict = {
-      label_type: [
+      labelType: [
         { label: "类别", value: 1 },
         { label: "标签", value: 2 },
       ],
-      parent_id: [],
+      parentId: [],
     };
     const initColumns = [
       {
         type: "select",
-        prop: "label_type",
+        prop: "labelType",
         label: "标签类别",
         required: true,
       },
       {
         type: "select",
-        prop: "parent_id",
+        prop: "parentId",
         label: "上级类别",
         required: false,
       },
@@ -54,7 +54,7 @@ export default {
       this.loading = true;
       type()
         .then((res) => {
-          this.dict.parent_id = res.map((item) => ({
+          this.dict.parentId = res.map((item) => ({
             value: item.id,
             label: item.name,
           }));
@@ -64,11 +64,16 @@ export default {
         });
     },
 
+    fetchItem() {
+      this.dialogFormVisible = true;
+      this.fetchType();
+    },
+
     onSubmit(formName) {
       this.$refs[formName].validate((valid) => {
         if (valid) {
           this.loading = true;
-          if (this.form.label_type === 1) this.form.parent_id = 0;
+          if (this.form.labelType === 1) this.form.parentId = 0;
           add(this.form)
             .then((res) => {
               let { code } = res;
@@ -90,7 +95,7 @@ export default {
     },
   },
   created() {
-    this.fetchType();
+
   },
 };
 </script>
@@ -98,10 +103,10 @@ export default {
 <template>
   <el-dialog destroy-on-close title="新增" :visible.sync="dialogFormVisible">
     <el-form :model="form" ref="addForm" label-position="top">
-      <el-form-item prop="label_type" label="标签类别" required>
-        <el-select v-model="form.label_type">
+      <el-form-item prop="labelType" label="标签类别" required>
+        <el-select v-model="form.labelType">
           <el-option
-            v-for="item in dict.label_type"
+            v-for="item in dict.labelType"
             :key="item.value"
             :label="item.label"
             :value="item.value"
@@ -109,14 +114,14 @@ export default {
         </el-select>
       </el-form-item>
       <el-form-item
-        v-if="form.label_type === 2"
-        prop="parent_id"
+        v-if="form.labelType === 2"
+        prop="parentId"
         label="上级类别"
-        :required="form.label_type === 2"
+        :required="form.labelType === 2"
       >
-        <el-select v-model="form.parent_id">
+        <el-select v-model="form.parentId">
           <el-option
-            v-for="item in dict.parent_id"
+            v-for="item in dict.parentId"
             :key="item.value"
             :label="item.label"
             :value="item.value"

+ 147 - 0
src/views/material/label/label-auto-bind-dialog.vue

@@ -0,0 +1,147 @@
+<script>
+import { classifyTree, autoBind } from "@/api/material/label";
+export default {
+  name: "AutoBindDialog",
+  data() {
+    return {
+      loading: false,
+      dialogFormVisible: false,
+      options: [],
+      form: {},
+    };
+  },
+  methods: {
+    async fetchItem(prop) {
+      this.dialogFormVisible = true;
+      this.form = { ...this.form, labelId: prop.id };
+    },
+
+    async fetchClassifyTree() {
+      let data = await classifyTree();
+      this.options = data;
+    },
+
+    onOpen() {
+      this.fetchClassifyTree();
+    },
+
+    onClose() {
+      this.$parent.$children
+        .find((el) => el.$vnode.tag.indexOf("BindDialog") > -1)
+        .fetchItem({});
+    },
+
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          let p = {
+            ...this.form,
+
+            classifyId: Array.isArray(this.form.classifyId)
+              ? this.form.classifyId[this.form.classifyId.length - 1]
+              : "",
+          };
+          this.loading = true;
+          autoBind(p)
+            .then((res) => {
+              let { code } = res;
+              if (code === 200) {
+                this.dialogFormVisible = false;
+                this.$message.success("success");
+                this.form = {};
+              }
+            })
+            .finally(() => {
+              this.loading = false;
+            });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+  },
+  created() {},
+};
+</script>
+
+<template>
+  <el-dialog
+    title="自动绑定"
+    :visible.sync="dialogFormVisible"
+    append-to-body
+    @open="onOpen"
+    @close="onClose"
+  >
+    <el-form ref="form" :model="form" label-width="80px">
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="匹配类别" prop="flag" required>
+            <el-select
+              v-model="form.flag"
+              placeholder="请选择"
+              style="width: 100%"
+            >
+              <el-option label="物料分类" value="1"></el-option>
+              <el-option label="特殊属性" value="2"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col v-show="form.flag === '1'" :span="24">
+          <el-form-item label="物料名称" required>
+            <el-input v-model="form.name"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col>
+          <el-form-item label="物料分类">
+            <el-cascader
+              v-model="form.classifyId"
+              :options="options"
+              :props="{
+                checkStrictly: true,
+                value: 'id',
+                label: 'materialType',
+                children: 'childrens',
+              }"
+              clearable
+              style="width: 100%"
+            ></el-cascader>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row v-show="form.flag === '2'" :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="颜色">
+            <el-input v-model="form.color"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="长度">
+            <el-input v-model="form.length"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="宽度">
+            <el-input v-model="form.width"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="试用范围">
+            <el-input v-model="form.scope"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="包装">
+            <el-input v-model="form.wrap"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="onSubmit('form')">立即创建</el-button>
+      <el-button @click="dialogFormVisible = false">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<style scoped></style>

+ 208 - 0
src/views/material/label/label-bind-dialog.vue

@@ -0,0 +1,208 @@
+<script>
+import {
+  add,
+  bindList,
+  removeBind,
+  removeAllBind,
+  classifyTree,
+} from "@/api/material/label";
+export default {
+  name: "BindDialog",
+  data() {
+    const initDict = {
+      labelType: [
+        { label: "类别", value: 1 },
+        { label: "标签", value: 2 },
+      ],
+      parentId: [],
+    };
+    const initColumns = () => [
+      {
+        type: "text",
+        prop: "materialCode",
+        label: "物料编码",
+        required: true,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "select",
+        prop: "materialName",
+        label: "物料名称",
+        required: true,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "materialClassifyId",
+        label: "物料分类",
+        required: false,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "materialState",
+        label: "物料状态",
+        required: false,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "createTime",
+        label: "创建时间",
+        required: false,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "bindTime",
+        label: "绑定时间",
+        required: false,
+        showOverflowTooltip: true,
+      },
+    ];
+    const initForm = () => {
+      let form = {};
+      initColumns().forEach((item) => (form[item.prop] = ""));
+      return form;
+    };
+    return {
+      loading: false,
+      dialogFormVisible: false,
+      autoInnerVisible: false,
+      handInnerVisible: false,
+      form: initForm(),
+      columns: initColumns(),
+      tableData: [],
+      page: { pageNum: 1, pageSize: 25, total: 0 },
+      dict: initDict,
+      filterText: "",
+      options: [],
+      innerForm: {},
+    };
+  },
+  methods: {
+    async fetchList(prop) {
+      this.loading = true;
+      let { pageNum, pageSize } = this.page;
+      await bindList({ ...prop, pageNum, pageSize })
+        .then((res) => {
+          this.tableData = res.rows;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+
+    async fetchItem(prop) {
+      // console.log(prop);
+      // return;
+      this.dialogFormVisible = true;
+      this.form = { ...this.form, ...prop };
+      await this.fetchList({ labelId: this.form.id });
+    },
+
+    async fetchClassifyTree() {
+      let data = await classifyTree();
+      this.options = data;
+    },
+
+    onAutoBindLabel(prop) {
+      this.$parent.$children
+        .find((el) => el.$vnode.tag.indexOf("AutoBindDialog") > -1)
+        .fetchItem(prop);
+    },
+
+    onHandBindLabel(prop) {
+      this.$parent.$children
+        .find((el) => el.$vnode.tag.indexOf("HandBindDialog") > -1)
+        .fetchItem(prop);
+    },
+
+    async onUnbind(prop) {
+      const { materialId: id } = prop;
+      await removeBind({ id });
+      await this.fetchList({ labelId: this.form.id });
+    },
+
+    async onAllUnbind(prop) {
+      const { id } = prop;
+      await removeAllBind({ id });
+      await this.fetchList({ labelId: id });
+    },
+
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.loading = true;
+          if (this.form.labelType === 1) this.form.parentId = 0;
+          add(this.form)
+            .then((res) => {
+              let { code } = res;
+              if (code === 200) {
+                this.dialogFormVisible = false;
+                this.$message.success("success");
+                this.$parent.$children[0].fetchList();
+                this.form = {};
+              }
+            })
+            .finally(() => {
+              this.loading = false;
+            });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+  },
+  created() {},
+};
+</script>
+
+<template>
+  <el-dialog destroy-on-close title="绑定" :visible.sync="dialogFormVisible">
+    <el-button :disabled="loading" @click="onAutoBindLabel(form)">
+      自动绑定
+    </el-button>
+    <el-button :disabled="loading" @click="onHandBindLabel(form)">
+      手动绑定
+    </el-button>
+    <el-button :disabled="loading" @click="onAllUnbind(form)">
+      全部解绑
+    </el-button>
+    <el-table
+      v-loading="loading"
+      lazy
+      border
+      row-key="id"
+      :data="tableData"
+      style="margin-top: 16px"
+    >
+      <el-table-column
+        v-for="column in columns"
+        :key="column.prop"
+        :prop="column.prop"
+        :label="column.label"
+        :show-overflow-tooltip="column.showOverflowTooltip"
+      >
+      </el-table-column>
+      <el-table-column fixed="right" label="操作" width="225">
+        <template slot-scope="scope">
+          <el-button @click.native.prevent="onUnbind(scope.row)" size="small">
+            解绑
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div slot="footer" class="dialog-footer">
+      <el-button :disabled="loading" @click="dialogFormVisible = false"
+        >取 消</el-button
+      >
+      <el-button type="primary" :disabled="loading" @click="onSubmit('addForm')"
+        >确 定</el-button
+      >
+    </div>
+  </el-dialog>
+</template>
+
+<style scoped></style>

+ 21 - 21
src/views/material/label/label-edit-dialog.vue

@@ -1,25 +1,25 @@
 <script>
-import { add, type } from "@/api/material/label";
+import { edit, type } from "@/api/material/label";
 export default {
-  name: "MaterialAddLabelDialog",
+  name: "EditDialog",
   data() {
     const initDict = {
-      label_type: [
+      labelType: [
         { label: "类别", value: 1 },
         { label: "标签", value: 2 },
       ],
-      parent_id: [],
+      parentId: [],
     };
     const initColumns = [
       {
         type: "select",
-        prop: "label_type",
+        prop: "labelType",
         label: "标签类别",
         required: true,
       },
       {
         type: "select",
-        prop: "parent_id",
+        prop: "parentId",
         label: "上级类别",
         required: false,
       },
@@ -54,7 +54,7 @@ export default {
       this.loading = true;
       type()
         .then((res) => {
-          this.dict.parent_id = res.map((item) => ({
+          this.dict.parentId = res.map((item) => ({
             value: item.id,
             label: item.name,
           }));
@@ -65,16 +65,18 @@ export default {
     },
 
     fetchItem(prop) {
+      console.log(prop);
       this.dialogFormVisible = true;
       this.form = prop;
+      this.fetchType();
     },
 
     onSubmit(formName) {
       this.$refs[formName].validate((valid) => {
         if (valid) {
           this.loading = true;
-          if (this.form.label_type === 1) this.form.parent_id = 0;
-          add(this.form)
+          if (this.form.labelType === 1) this.form.parentId = 0;
+          edit(this.form)
             .then((res) => {
               let { code } = res;
               if (code === 200) {
@@ -94,19 +96,17 @@ export default {
       });
     },
   },
-  created() {
-    this.fetchType();
-  },
+  created() {},
 };
 </script>
 
 <template>
-  <el-dialog destroy-on-close title="新增" :visible.sync="dialogFormVisible">
+  <el-dialog destroy-on-close title="编辑" :visible.sync="dialogFormVisible">
     <el-form :model="form" ref="addForm" label-position="top">
-      <el-form-item prop="label_type" label="标签类别" required>
-        <el-select v-model="form.label_type">
+      <el-form-item prop="labelType" label="标签类别" required>
+        <el-select v-model="form.labelType" disabled>
           <el-option
-            v-for="item in dict.label_type"
+            v-for="item in dict.labelType"
             :key="item.value"
             :label="item.label"
             :value="item.value"
@@ -114,14 +114,14 @@ export default {
         </el-select>
       </el-form-item>
       <el-form-item
-        v-if="form.label_type === 2"
-        prop="parent_id"
+        v-if="form.labelType === 2"
+        prop="parentId"
         label="上级类别"
-        :required="form.label_type === 2"
+        :required="form.labelType === 2"
       >
-        <el-select v-model="form.parent_id">
+        <el-select v-model="form.parentId">
           <el-option
-            v-for="item in dict.parent_id"
+            v-for="item in dict.parentId"
             :key="item.value"
             :label="item.label"
             :value="item.value"

+ 232 - 0
src/views/material/label/label-hand-bind-dialog.vue

@@ -0,0 +1,232 @@
+<script>
+import {
+  manualBindQuery,
+  classifyTree,
+  manualBindOK,
+} from "@/api/material/label";
+export default {
+  name: "HandBindDialog",
+  data() {
+    const initDict = {
+      labelType: [
+        { label: "类别", value: 1 },
+        { label: "标签", value: 2 },
+      ],
+      parentId: [],
+    };
+    const initColumns = () => [
+      {
+        type: "text",
+        prop: "orgId",
+        label: "使用组织",
+        required: true,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "code",
+        label: "物料编码",
+        required: true,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "name",
+        label: "物料名称",
+        required: true,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "id",
+        label: "物料分类",
+        required: false,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "isEnable",
+        label: "物料状态",
+        required: false,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "createTime",
+        label: "创建时间",
+        required: false,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "bindTime",
+        label: "绑定时间",
+        required: false,
+        showOverflowTooltip: true,
+      },
+    ];
+    const initForm = () => {
+      let form = {};
+      initColumns().forEach((item) => (form[item.prop] = ""));
+      return form;
+    };
+    return {
+      loading: false,
+      dialogFormVisible: false,
+      form: initForm(),
+      columns: initColumns(),
+      tableData: [],
+      page: { pageNum: 1, pageSize: 25, total: 0 },
+      dict: initDict,
+      options: [],
+      multipleSelection: [],
+    };
+  },
+  methods: {
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    async fetchList(prop) {
+      this.loading = true;
+      await manualBindQuery(prop)
+        .then((res) => {
+          this.tableData = res;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+
+    async fetchItem(prop) {
+      this.dialogFormVisible = true;
+      this.form = { ...this.form, ...prop };
+      this.fetchClassifyTree();
+      // await this.fetchList({ classifyid: prop.id });
+    },
+
+    async fetchClassifyTree() {
+      let data = await classifyTree();
+      this.options = data;
+    },
+
+    onSearch(prop) {
+      const classifyid = prop.classifyid || "";
+      const code = prop.code ? prop.code[prop.code.length - 1] : "";
+      this.fetchList({ code, classifyid });
+    },
+
+    onClose() {
+      this.$parent.$children
+        .find((el) => el.$vnode.tag.indexOf("BindDialog") > -1)
+        .fetchItem({});
+    },
+
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.loading = true;
+          const labelId = this.form.id;
+          const material = this.multipleSelection.map((item) => ({
+            ...item,
+            materialId: item.id,
+          }));
+          manualBindOK({ labelId, material })
+            .then((res) => {
+              let { code } = res;
+              if (code === 200) {
+                this.dialogFormVisible = false;
+                this.$message.success("success");
+                this.form = {};
+              }
+            })
+            .finally(() => {
+              this.loading = false;
+            });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+  },
+  created() {},
+};
+</script>
+
+<template>
+  <el-dialog
+    title="手动绑定"
+    :visible.sync="dialogFormVisible"
+    append-to-body
+    @close="onClose"
+  >
+    <el-form ref="form" :model="form" label-width="80px">
+      <el-row :gutter="20">
+        <el-col :span="8">
+          <el-form-item label="物料分类">
+            <el-cascader
+              v-model="form.code"
+              :options="options"
+              :show-all-levels="false"
+              :props="{
+                checkStrictly: true,
+                value: 'code',
+                label: 'materialType',
+                children: 'childrens',
+              }"
+              clearable
+              style="width: 100%"
+            ></el-cascader>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="物料编码">
+            <el-input v-model="form.classifyid"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-button :disabled="loading" @click="onSearch(form)">
+            搜索
+          </el-button>
+        </el-col>
+        <el-col :span="24">
+          <el-table
+            v-loading="loading"
+            lazy
+            border
+            row-key="id"
+            :data="tableData"
+            @selection-change="handleSelectionChange"
+            style="margin-top: 16px"
+          >
+            <el-table-column type="selection" width="55"> </el-table-column>
+            <el-table-column
+              v-for="column in columns"
+              :key="column.prop"
+              :prop="column.prop"
+              :label="column.label"
+              :show-overflow-tooltip="column.showOverflowTooltip"
+            >
+            </el-table-column>
+            <!-- <el-table-column fixed="right" label="操作" width="225">
+              <template slot-scope="scope">
+                <el-button
+                  @click.native.prevent="onUnbind(scope.row)"
+                  size="small"
+                >
+                  解绑
+                </el-button>
+              </template>
+            </el-table-column> -->
+          </el-table>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="onSubmit('form')">立即创建</el-button>
+      <el-button @click="dialogFormVisible = false">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<style scoped></style>

+ 17 - 22
src/views/material/label/label-table.vue

@@ -112,35 +112,28 @@ export default {
       this.fetchList();
     },
 
+    onBindLabel(prop) {
+      this.$parent.$children
+        .find((el) => el.$vnode.tag.indexOf("BindDialog") > -1)
+        .fetchItem(prop);
+    },
+
     onAddLabel() {
-      console.log("this", this);
-      this.getAddDialogRef().dialogFormVisible = true;
+      this.$parent.$children
+        .find((el) => el.$vnode.tag.indexOf("AddDialog") > -1)
+        .fetchItem();
     },
 
     onEditLabel(prop) {
-      // let { id } = prop;
-      // item({ id }).then((res) => {
-      //   let { code } = res;
-      //   if (code === 200) {
-      //     this.$message.success("success");
-      //   }
-      // });
-      console.log(prop);
-      this.getEditDialogRef().fetchItem(prop);
+      this.$parent.$children
+        .find((el) => el.$vnode.tag.indexOf("EditDialog") > -1)
+        .fetchItem(prop);
     },
 
     onLoad(tree, treeNode, resolve) {
       setTimeout(() => {
         resolve(tree.childrens);
-      }, 1000);
-    },
-
-    getAddDialogRef() {
-      return this.$parent.$children[1];
-    },
-
-    getEditDialogRef() {
-      return this.$parent.$children[2];
+      }, 200);
     },
   },
   created() {
@@ -230,12 +223,14 @@ export default {
         <el-table-column fixed="right" label="操作" width="225">
           <template slot-scope="scope">
             <el-button
-              @click.native.prevent="onAuthTemplate(scope.row)"
+              v-if="scope.row.labelType === 2"
+              @click.native.prevent="onBindLabel(scope.row)"
               size="small"
             >
-              授权
+              绑定
             </el-button>
             <el-button
+              v-if="scope.row.labelType === 2"
               @click.native.prevent="onEditLabel(scope.row)"
               size="small"
             >

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 436 - 651
src/views/material/requisition/add.vue


+ 1 - 0
vue.config.js

@@ -36,6 +36,7 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
+        // target: `http://172.16.100.107:8080/drp-admin`, //测试
         target: `http://release-sy.derom.com/drp-admin`, //测试
         // target: `http://sy.derom.com/drp-admin`, //生产
         // target: `http://172.16.63.202:8000/drp-admin`, // D本地

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů