Răsfoiți Sursa

物料清单修改

Glying 11 luni în urmă
părinte
comite
5147ba4592

+ 4 - 4
zkqy-ui/.env.development

@@ -8,18 +8,18 @@ ENV = 'development'
 VUE_APP_BASE_API = '/dev-api'
 
 # 图片路径
-VUE_APP_BASE_IMG_API = 'http://192.168.110.59:1025/dev-api'
+VUE_APP_BASE_IMG_API = 'http://192.168.110.15:1025/dev-api'
 
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
 
 #本项目地址
-# VUE_APP_BASE_API1 = 'http://192.168.110.83:8066/'
-VUE_APP_BASE_API1 = 'http://192.168.110.59:8066/'
+VUE_APP_BASE_API1 = 'http://192.168.110.15:8066/'
+# VUE_APP_BASE_API1 = 'http://192.168.110.59:8066/'
 # VUE_APP_BASE_API1 = 'http://192.168.110.76:8066/'
 
 # ws地址
-VUE_APP_BASE_WS_API = '//192.168.110.83:9000'
+VUE_APP_BASE_WS_API = '//192.168.110.15:9000'
 
 #数据引擎模块IP
 #VUE_APP_BASE_API2 = 'http://192.168.110.59:8099/'

+ 174 - 0
zkqy-ui/src/views/amichi/materiel/components/TableHeaderRender.vue

@@ -0,0 +1,174 @@
+<template>
+  <el-popover
+    placement="bottom"
+    width="200"
+    trigger="manual"
+    v-model="visible"
+    @show="showPopover"
+    popper-class="table-header-popover"
+  >
+    <div class="table-header-popover-template">
+      <el-input
+        placeholder="请输入内容"
+        v-model="value"
+        size="small"
+        clearable
+        @keyup.enter.native="confirm"
+        ref="sInput"
+      >
+        <!-- <el-button slot="append" icon="el-icon-search" @click="confirm"> -->
+        <!-- </el-button> -->
+      </el-input>
+    </div>
+    <div class="el-table-filter__bottom">
+      <button @click="confirm">筛选</button>
+      <button @click="resetData">重置</button>
+    </div>
+    <span
+      slot="reference"
+      style="margin-left: 5px"
+      @click.stop="popClick"
+      v-click-outside="closeOver"
+    >
+      <i
+        class="filter-icon el-icon-search"
+        :style="{ color: iconColor ? '#9a4b9b' : '#909399' }"
+      ></i>
+      <!-- <i class="el-icon-search" :style="{'color':iconColor}" ></i> -->
+      <!-- <svg
+        viewBox="64 64 896 896"
+        data-icon="search"
+        width="1em"
+        height="1em"
+        fill="currentColor"
+        :style="{
+          color: iconColor ? '#9A4B9B' : '',
+          'margin-right': '2px',
+          cursor: 'pointer',
+        }"
+      >
+        <path
+          d="M909.6 854.5L649.9 594.8C690.2 542.7 712 479 712 412c0-80.2-31.3-155.4-87.9-212.1-56.6-56.7-132-87.9-212.1-87.9s-155.5 31.3-212.1 87.9C143.2 256.5 112 331.8 112 412c0 80.1 31.3 155.5 87.9 212.1C256.5 680.8 331.8 712 412 712c67 0 130.6-21.8 182.7-62l259.7 259.6a8.2 8.2 0 0 0 11.6 0l43.6-43.5a8.2 8.2 0 0 0 0-11.6zM570.4 570.4C528 612.7 471.8 636 412 636s-116-23.3-158.4-65.6C211.3 528 188 471.8 188 412s23.3-116.1 65.6-158.4C296 211.3 352.2 188 412 188s116.1 23.2 158.4 65.6S636 352.2 636 412s-23.3 116.1-65.6 158.4z"
+        ></path>
+      </svg> -->
+    </span>
+  </el-popover>
+</template>
+
+<script>
+export default {
+  name: "tableHeaderRender",
+  data() {
+    return {
+      // input 绑定的值
+      value: "",
+      visible: false,
+      iconColor: false,
+    };
+  },
+  props: {
+    tableColumn: {
+      type: Object,
+      default: () => {},
+    },
+    columnProp: {
+      type: String,
+      default: "",
+    },
+    defaultValue: {
+      type: String,
+      default: "",
+    },
+    inputFilteredMap: {
+      type: Object,
+      default: () => {},
+    },
+  },
+  created() {
+    this.value = this.defaultValue;
+    this.iconColor = this.value.trim() ? true : false;
+  },
+  methods: {
+    showPopover() {
+      this.$nextTick(() => {
+        this.$refs.sInput.focus();
+      });
+    },
+    resetData() {
+      console.log("reset");
+      this.value = "";
+      this.visible = false;
+      this.iconColor = false;
+      const self = this;
+      if (this.inputFilteredMap[self.columnProp]) {
+        delete this.inputFilteredMap[self.columnProp];
+      }
+      self.$emit("resetChangeMethod", this.tableColumn, self.columnProp);
+    },
+    closeOver() {
+      this.visible = false;
+    },
+    popClick(e) {
+      // e.stopPropagation()
+      this.visible = !this.visible;
+    },
+    confirm() {
+      this.visible = false;
+      if (this.value.trim()) {
+        this.iconColor = true;
+        this.inputFilteredMap[this.columnProp] = this.value;
+        this.$emit(
+          "filterInputMethod",
+          this.tableColumn,
+          this.inputFilteredMap
+        );
+      } else {
+        // 如果搜索input输入为空,等同重置
+        this.resetData();
+      }
+    },
+  },
+
+  directives: {
+    clickOutside: {
+      bind(el, binding, vnode) {
+        function clickHandler(e) {
+          // 这里判断点击的元素是否是本身,是本身,则返回
+          if (el.contains(e.target)) {
+            return false;
+          }
+          // 判断指令中是否绑定了函数
+          if (binding.expression) {
+            // 如果绑定了函数 则调用那个函数,此处binding.value就是handleClose方法
+            binding.value(e);
+          }
+        }
+        // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听
+        el.__vueClickOutside__ = clickHandler;
+        document.addEventListener("click", clickHandler);
+      },
+      update() {},
+      unbind(el, binding) {
+        // 解除事件监听
+        document.removeEventListener("click", el.__vueClickOutside__);
+        delete el.__vueClickOutside__;
+      },
+    },
+  },
+};
+</script>
+
+<style>
+.filter-icon {
+  font-size: 14px;
+  color: #909399;
+  cursor: pointer;
+  font-weight: 400;
+}
+.table-header-popover {
+  padding: 0;
+}
+.table-header-popover .table-header-popover-template {
+  margin: 10px;
+}
+</style>

+ 779 - 0
zkqy-ui/src/views/amichi/materiel/components/operateTable.vue

@@ -0,0 +1,779 @@
+<template>
+  <div class="operateTable">
+    <el-dropdown
+      size="small"
+      trigger="click"
+      v-if="options.columnsSelect || options.columnsTreeSelect"
+      class="column-dropdown"
+    >
+      <el-button style="padding: 9px 10px!important" size="small">
+        <i style="font-size: 12px" class="el-icon-menu"></i>
+        <i class="el-icon-arrow-down el-icon--right"></i>
+      </el-button>
+      <el-dropdown-menu slot="dropdown">
+        <div style="margin:10px;" class="caoz_ft_warp" v-if="isInit||isSave">
+          <el-button
+            v-if="isInit"
+            size="small"
+            type="primary"
+            plain
+            style="width:70px;"
+            @click="initColumns(true)"
+          >初始化</el-button>
+          <el-button
+            v-if="isSave"
+            size="small"
+            type="primary"
+            plain
+            style="width:70px;"
+            @click="$emit('saveSettingColumns',checkedList)"
+           >保存</el-button>
+        </div>
+        <div style="margin:10px;" class="caoz_ft_warp">
+          <el-input size="small" placeholder="请输入关键字" v-model="cloumnKeyword" clearable></el-input>
+        </div>
+        <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange" style="padding-left:10px;">Select All</el-checkbox>
+        <el-checkbox-group
+          v-if="!options.columnsTreeSelect"
+          v-model="checkedList"
+          style="max-height: 300px"
+          @change="handleCheckedCitiesChange"
+        >
+          <div class="checkboxScorll">
+            <template v-for="(option, index) in checkBoxOptions">
+              <template v-if="cloumnKeyword && option.toLowerCase().indexOf(cloumnKeyword.toLowerCase())>-1">
+                <el-checkbox
+                  :key="index"
+                  class="checkbox"
+                  :label="option"
+                ></el-checkbox>
+              </template>
+              <template v-else-if="!cloumnKeyword">
+                <el-checkbox
+                  :key="index"
+                  class="checkbox"
+                  :label="option"
+                ></el-checkbox>
+              </template>
+              <template v-else></template>
+            </template>
+          </div>
+        </el-checkbox-group>
+        <div v-else class="checkboxTree">
+          <el-tree
+            ref="tree"
+            :check-on-click-node="true"
+            :data="treeColumn"
+            show-checkbox
+            node-key="label"
+            :default-expanded-keys="defaultExpanded"
+            :default-checked-keys="defaultChecked"
+            :props="{
+              children: 'children',
+              label: 'label',
+            }"
+            @check="checkChange"
+            style="max-height: 300px; overflow-y: auto"
+          >
+          </el-tree>
+        </div>
+      </el-dropdown-menu>
+    </el-dropdown>
+    <el-table
+      id="iTable"
+      ref="operateTable"
+      border
+      :data="dataSource"
+      :stripe="options.stripe"
+      :highlight-current-row="options.highlightCurrentRow"
+      :max-height="options.maxHeight"
+      :size="options.size"
+      :fit="options.fit"
+      :show-header="options.showHeader"
+      :empty-text="options.emptyText"
+      :default-sort="options.defaultSort"
+      :row-key="getRowKeys"
+      :default-expand-all="options.defaultExpandAll"
+      :tree-props="options.treeProps"
+      :lazy="options.lazy"
+      :load="load"
+      @cell-mouse-enter="cellMouseEnter"
+      @cell-mouse-leave="cellMouseLeave"
+      @cell-click="cellClick"
+      @cell-dblclick="cellDblclick"
+      @row-click="rowClick"
+      @row-contextmenu="rowContextmenu"
+      @row-dblclick="rowDblclick"
+      @header-click="headerClick"
+      @header-contextmenu="headerContextmenu"
+      @sort-change="sortChange"
+      @select="select"
+      @select-all="selectAll"
+      @selection-change="checkboxSelected"
+      @filter-change="filterChange"
+    >
+      <slot name="expandRow"></slot>
+      <!-- 复选框 -->
+      <el-table-column
+        :reserve-selection="options.reserveSelection"
+        :key="0"
+        type="selection"
+        :selectable="selectable"
+        width="40"
+        align="left"
+        v-if="options.showCheckBox"
+        :resizable="false"
+      >
+      </el-table-column>
+      <el-table-column
+        ref="fixedColumn"
+        label="操作"
+        align="left"
+        :width="operates.dropDown ? '50' : operates.width"
+        :fixed="operates.fixed"
+        :min-width="operates.minwidth"
+        :resizable="operates.resizable"
+        v-if="operates.list.length > 0"
+      >
+        <template slot-scope="scope">
+          <!-- 操作列 不折叠 全为icon-->
+          <div
+            class="operate-group"
+            v-if="!operates.dropDown && !operates.isText"
+          >
+            <template
+              v-for="item in operates.list[0] instanceof Array
+                ? operates.list[scope.$index]
+                : operates.list"
+            >
+              <div class="item" v-if="item.show" :key="item.id">
+                <el-switch
+                  v-if="item.type === 'switch'"
+                  v-model="scope.row[item.prop]"
+                  active-color="#13ce66"
+                  @change="item.method(scope.$index, scope.row)"
+                ></el-switch>
+                <el-tooltip
+                  v-else-if="item.type === 'tooltipIcon'"
+                  :enterable="false"
+                  effect="light"
+                  placement="bottom"
+                >
+                  <div slot="content">{{ item.tooltip }}</div>
+                  <el-button
+                    type="primary"
+                    plain
+                    :icon="item.icon"
+                    size="mini"
+                    :disabled="item.disabled"
+                    @click="item.method(scope.$index, scope.row)"
+                  ></el-button>
+                </el-tooltip>
+                <el-button
+                  v-else-if="item.type === 'icon'"
+                  type="primary"
+                  plain
+                  :icon="item.icon"
+                  size="mini"
+                  :disabled="item.disabled"
+                  @click="item.method(scope.$index, scope.row)"
+                ></el-button>
+              </div>
+            </template>
+          </div>
+          <!-- 操作列 不折叠 全为文字-->
+          <div
+            class="operate-group"
+            v-if="!operates.dropDown && operates.isText"
+          >
+            <template
+              v-for="item in operates.list[0] instanceof Array
+                ? operates.list[scope.$index]
+                : operates.list"
+            >
+              <div class="item" v-if="item.show" :key="item.id">
+                <el-button
+                  size="small"
+                  type="text"
+                  :disabled="item.disabled"
+                  @click.native.prevent="item.method(scope.$index, scope.row)"
+                  >{{ item.label }}</el-button
+                >
+              </div>
+            </template>
+          </div>
+          <!-- 操作列 折叠下拉-->
+          <div class="operate-group" v-else-if="operates.dropDown">
+            <el-dropdown
+              @command="handleCommand"
+              trigger="hover"
+              placement="bottom-start"
+            >
+              <span class="el-dropdown-link">
+                <i class="el-icon-s-unfold" style="font-size: 16px;"></i>
+              </span>
+              <!-- 根据operates.list 来渲染操作列下拉的内容 -->
+              <el-dropdown-menu slot="dropdown">
+                <el-dropdown-item
+                  v-for="(item, index) in operates.list[0] instanceof Array
+                    ? operates.list[scope.$index]
+                    : operates.list"
+                  :disabled="item.disabled"
+                  :key="index"
+                  :command="composeValue(item, scope.row, scope.$index)"
+                  >{{ item.label }}</el-dropdown-item
+                >
+              </el-dropdown-menu>
+            </el-dropdown>
+          </div>
+        </template>
+      </el-table-column>
+      <!--region 数据列-->
+      <template v-for="column in columns">
+        <!-- :filter-method="column.filters ? column.filterMethod : undefined" -->
+        <!-- v-if="
+            options.columnsSelect || options.columnsTreeSelect
+              ? checkedList.includes(column.label)
+              : true
+          " -->
+        <el-table-column
+          v-if="
+            options.columnsSelect || options.columnsTreeSelect
+              ? checkedList.includes(column.label)
+              : true
+          "
+          :prop="column.prop"
+          :key="column.label"
+          :label="column.label"
+          align="left"
+          :width="column.width"
+          :min-width="column.minwidth"
+          :resizable="column.resizable"
+          :sortable="column.sortable"
+          :filters="column.filters"
+          :filter-method="column.filters ? column.filterMethod : undefined"
+          :filtered-value="column.filteredValue"
+          :fixed="column.fixed"
+          :column-key="column.prop"
+        >
+          <template slot="header" slot-scope="scope"
+            >{{ column.label }}
+            <TableHeaderRender
+              v-if="column.filterInput"
+              :columnProp="column.prop"
+              :tableColumn="scope.column"
+              :defaultValue="column.defaultValue"
+              :inputFilteredMap="inputFilteredMap"
+              @filterInputMethod="filterInputMethod"
+              @resetChangeMethod="resetChangeMethod"
+            ></TableHeaderRender>
+          </template>
+          <!-- :filtered-value="column.filteredValue" -->
+          <template slot-scope="scope">
+            <!-- 如果传进来的column没有render函数执行以下代码 -->
+            <template v-if="!column.render">
+              <!-- 如果传进来的column没有render函数但有formatter函数执行以下代码 -->
+              <template v-if="column.formatter">
+                <span v-html="column.formatter(scope.row, column)"></span>
+              </template>
+              <!-- 如果传进来的column既没有render函数也没有formatter函数执行以下代码 -->
+              <template v-else>
+                <span>{{ scope.row[column.prop] }}</span>
+              </template>
+            </template>
+            <!-- 如果传进来的column有render函数执行以下代码 -->
+            <template v-else>
+              <expand-dom
+                :column="column"
+                :row="scope.row"
+                :render="column.render"
+                :index="scope.$index"
+              ></expand-dom>
+            </template>
+          </template>
+        </el-table-column>
+      </template>
+      <!--endregion-->
+    </el-table>
+  </div>
+</template>
+
+<script>
+import TableHeaderRender from "./TableHeaderRender.vue";
+export default {
+  name: "OperateTable",
+  props: {
+    // 表格的数据源
+    dataSource: {
+      type: Array,
+      default: () => [],
+    },
+    // 需要展示的列
+    columns: {
+      type: Array,
+      default: () => [{}],
+    },
+    // table 表格的控制参数
+    options: {
+      type: Object,
+      default: () => {
+        return {
+          stripe: true, // 是否为斑马纹 table
+        };
+      },
+    },
+    // 操作按钮组 === label: 文本,show:是否显示,icon:按钮图标,disabled:是否禁用,method:回调方法, 等等
+    operates: {
+      type: Object,
+      default: () => {
+        return {
+          list: [],
+        };
+      },
+    },
+    defaultSelectedColumn: {
+      type: Array,
+      default: () => [],
+    },
+    defaultColumn: {
+      type: Array,
+      default: () => [],
+    },
+    totalColumn: {
+      type: Array,
+      default: () => [],
+    },
+    treeColumn: {
+      type: Array,
+      default: () => [],
+    },
+    defaultChecked: {
+      type: Array,
+      default: () => [],
+    },
+    defaultExpanded: {
+      type: Array,
+      default: () => [],
+    },
+    isInit: {
+      type: Boolean,
+      default: false
+    },
+    isSave: {
+      type: Boolean,
+      default: false
+    }
+  },
+  components: {
+    TableHeaderRender,
+    expandDom: {
+      functional: true,
+      props: {
+        row: Object,
+        render: Function,
+        index: Number,
+        column: {
+          type: Object,
+          default: null,
+        },
+      },
+      render: (h, ctx) => {
+        const params = {
+          row: ctx.props.row,
+          index: ctx.props.index,
+        };
+        if (ctx.props.column) params.column = ctx.props.column;
+        return ctx.props.render(h, params);
+      },
+    },
+  },
+  data() {
+    return {
+      cloumnKeyword:"",//字段关键字搜索
+      isIndeterminate:true,//全选状态
+      checkAll:false,//字段全选
+      checkBoxOptions: [], // 全部表头
+      checkedList: [], // 选中表头
+      count: 0, // 用于判断表格是否刚渲染
+      isCheckBoxSort: false, // 用于判断是否是由自定义数据列引发的排序
+      // 以下是之前放于vuex中用于记录状态
+      preCheckedList: [], // 前一次的checkbox
+      // 排序的状态
+      sort: {
+        prop: "",
+        order: "",
+        label: "",
+      },
+      // 筛选的状态
+      checkBoxFilteredMap: {},
+      // input 所有的筛选
+      inputFilteredMap: {},
+      // columns label及prop对应的键值对
+      columnsLabelMap: {}
+    };
+  },
+  watch: {
+    // 监听defaultColumn,若这个发生变化,代表传入的默认column变化,即数据表格发生了切换
+    defaultColumn() {
+      this.initColumns();
+    },
+    checkedList() {
+      // if(this.checkedList.length>0){
+      //   this.$emit("selectedColumn",this.checkedList);
+      // }
+      // 处理当点击checkbox显示的是排序列时,恢复排序列的显示
+      let showLabelArray = this.checkboxShowLabel();
+      console.log("showLabelArray", showLabelArray);
+      // if (value.length !== 0) {
+      //   value.map((item) => {
+      //     this.handleStatusRevert(item);
+      //   });
+      this.columns.map((column, index) => {
+        this.handleStatusRevert(column, index, showLabelArray);
+      });
+    },
+  },
+  created() {
+    this.normalizeColumnsLabelMap();
+  },
+  mounted() {
+    if (!this.options.columnsTreeSelect) {
+      this.checkedList = this.$props.defaultColumn;
+      this.checkBoxOptions = this.$props.totalColumn;
+    } else {
+      this.checkedList = this.$refs.tree
+        .getCheckedNodes()
+        .map((item) => item.label);
+    }
+    // 挂载时将defaultSort属性传给vuex
+    this.handleDefaultSort();
+  },
+  // 动态切换表头的时候闪烁是因为表头重新计算高度导致的,以下方法解决此bug
+  beforeUpdate() {
+    this.$nextTick(() => {
+      //在数据加载完,重新渲染表格
+      this.$refs["operateTable"].doLayout();
+    });
+  },
+  methods: {
+    //全选字段
+    handleCheckAllChange(val){
+      this.checkedList = val ? this.checkBoxOptions : [];
+      this.isIndeterminate = false;
+    },
+    //反选
+    handleCheckedCitiesChange(value){
+      let checkedCount = value.length;
+      this.checkAll = checkedCount === this.checkBoxOptions.length;
+      this.isIndeterminate = checkedCount > 0 && checkedCount < this.checkBoxOptions.length;
+    },
+    //初始化字段
+    initColumns(flag){
+      if(flag){
+        this.checkedList = this.$props.defaultSelectedColumn;
+      }else{
+        this.checkedList = this.$props.defaultColumn;
+      }
+      this.checkBoxOptions = this.$props.totalColumn;
+    },
+    // 处理判断checkbox 点击时,显示的是哪个字段名
+    checkboxShowLabel() {
+      // 判断显示的字段是哪个字段,如果是树形,可能有多个,故更改为数组接收
+      let value = [];
+      console.log("this.checkedList", this.checkedList);
+      if (this.count === 0) {
+        this.saveCheckedList(this.checkedList);
+        // this.$componentsStore.commit("table/saveCheckedList", this.checkedList);
+        this.count++;
+      } else {
+        if (this.checkedList.length > this.preCheckedList.length) {
+          for (let index = 0; index < this.checkedList.length; index++) {
+            if (!this.preCheckedList.includes(this.checkedList[index])) {
+              value.push(this.checkedList[index]);
+            }
+            // if (this.checkedList[index] !== this.preCheckedList[index]) {
+            //   value = this.checkedList[index];
+            // }
+          }
+        }
+        this.saveCheckedList(this.checkedList);
+        // this.$componentsStore.commit("table/saveCheckedList", this.checkedList);
+      }
+      return value;
+    },
+    // 处理sort\filterd由隐藏变为显示状态的恢复
+    handleStatusRevert(column, index, showLabelArray) {
+      let compareLabel = column.label;
+      if (showLabelArray.includes(compareLabel)) {
+        // 如果是有checkbox 筛选的字段,恢复筛选
+        let filteredValue =
+          this.checkBoxFilteredMap[this.columnsLabelMap[compareLabel]];
+        // 如果是有input 筛选的字段,恢复筛选
+        let filteredInputValue =
+          this.inputFilteredMap[this.columnsLabelMap[compareLabel]];
+        this.columns[index].filteredValue = filteredValue;
+        this.columns[index].defaultValue = filteredInputValue;
+        this.$nextTick(() => {
+          this.$refs.operateTable.store.states.columns.map((column) => {
+            if (column.filteredValue && column.filteredValue.length) {
+              this.$refs.operateTable.store.commit("filterChange", {
+                column,
+                values: column.filteredValue,
+                silent: true,
+              });
+            }
+          });
+        });
+      } else {
+        this.columns[index].filteredValue = [];
+        this.columns[index].defaultValue = "";
+      }
+      // 如果是有排序的字段,恢复排序
+      if (showLabelArray.includes(this.sort.label)) {
+        this.$nextTick(() => {
+          //在数据加载完,重新渲染表格
+          this.isCheckBoxSort = true;
+          this.$refs.operateTable.sort(this.sort.prop, this.sort.order);
+        });
+      }
+      /**
+      // 如果是有checkbox 筛选的字段,恢复筛选
+      let filteredValue = this.checkBoxFilteredMap[this.columnsLabelMap[value]];
+      // 如果是有input 筛选的字段,恢复筛选
+      let filteredInputValue = this.inputFilteredMap[
+        this.columnsLabelMap[value]
+      ];
+      for (let i = 0; i < this.columns.length; i++) {
+        if (this.columns[i].label === value) {
+          this.columns[i].filteredValue = filteredValue;
+          this.columns[i].defaultValue = filteredInputValue;
+          this.$nextTick(() => {
+            this.$refs.operateTable.store.states.columns.map((column) => {
+              if (column.filteredValue && column.filteredValue.length) {
+                console.log("!11");
+                this.$refs.operateTable.store.commit("filterChange", {
+                  column,
+                  values: column.filteredValue,
+                  silent: true,
+                });
+              }
+            });
+          });
+        } else {
+          this.columns[i].filteredValue = [];
+          this.columns[i].defaultValue = "";
+        }
+      }
+      // for (let i = 0; i < this.columns.length; i++) {
+      //   if (this.columns[i].label === value) {
+      //     this.columns[i].defaultValue = filteredInputValue;
+      //   } else {
+      //     this.columns[i].defaultValue = "";
+      //   }
+      // }
+      // 如果是有排序的字段,恢复排序
+      if (value === this.sort.label) {
+        this.$nextTick(() => {
+          //在数据加载完,重新渲染表格
+          this.isCheckBoxSort = true;
+          this.$refs.operateTable.sort(this.sort.prop, this.sort.order);
+        });
+      }
+      */
+    },
+    // 处理生成columns 的label prop键值对
+    normalizeColumnsLabelMap() {
+      this.columns.map((column) => {
+        this.columnsLabelMap[column.label] = column.prop;
+      });
+    },
+    filterInputMethod(column, inputFilteredMap) {
+      console.log("column, inputFilteredMap", column, inputFilteredMap);
+      this.inputFilteredMap = inputFilteredMap;
+      this.$emit("filterInputMethod", column, inputFilteredMap);
+    },
+    resetChangeMethod(tableColumn, columnProp) {
+      this.$emit("resetChangeMethod", tableColumn, this.inputFilteredMap);
+    },
+    cellMouseEnter(row, column, cell, event) {
+      this.$emit("cell-mouse-enter", row, column, cell, event);
+    },
+    cellMouseLeave(row, column, cell, event) {
+      this.$emit("cell-mouse-leave", row, column, cell, event);
+    },
+    cellClick(row, column, cell, event) {
+      this.$emit("cell-click", row, column, cell, event);
+    },
+    cellDblclick(row, column, cell, event) {
+      this.$emit("cell-dblclick", row, column, cell, event);
+    },
+    rowClick(row, column, event) {
+      this.$emit("row-click", row, column, event);
+    },
+    rowContextmenu(row, column, event) {
+      this.$emit("row-contextmenu", row, column, event);
+    },
+    rowDblclick(row, column, event) {
+      this.$emit("row-dblclick", row, column, event);
+    },
+    headerClick(column, event) {
+      this.$emit("header-click", column, event);
+    },
+    headerContextmenu(column, event) {
+      this.$emit("header-contextmenu", column, event);
+    },
+    sortChange(sortObj) {
+      this.changeSort(sortObj);
+      // this.$componentsStore.commit("table/changeSort", sortObj);
+      if (!this.isCheckBoxSort) {
+        this.$emit("sort-change", sortObj);
+      }
+      // 还原isCheckBoxSort
+      this.isCheckBoxSort = false;
+    },
+    handleDefaultSort() {
+      if (this.options.defaultSort !== undefined) {
+        let column = { label: "" };
+        // for (let index = 0; index < this.columns.length; index++) {
+        //   if (this.columns[index].prop === this.options.defaultSort.prop) {
+        //     column.label = this.columns[index].label;
+        //     break;
+        //   }
+        // }
+        column.label = this.columnsLabelMap[this.options.defaultSort.prop];
+        this.changeSort({
+          ...this.options.defaultSort,
+          column,
+        });
+      }
+    },
+    // 点击操作的下拉项目后触发事件
+    handleCommand(command) {
+      if (command.method) {
+        command.method(command.index, command.row, command.label);
+      }
+    },
+    // 点击dropDown传参方法
+    composeValue(item, row, index) {
+      return {
+        label: item.label,
+        row: row,
+        index: index,
+        method: item.method,
+      };
+    },
+    select(selection, row) {
+      this.$emit("select", selection, row);
+    },
+    selectAll(selection) {
+      this.$emit("select-all", selection);
+    },
+    checkboxSelected(selection) {
+      this.$emit("selection-change", selection);
+    },
+    selectable(row, index) {
+      let data = true;
+      this.$emit("selectable", row, index, (val) => {
+        data = val;
+      });
+      return data;
+    },
+    getRowKeys(row) {
+      let data;
+      for (let index = 0; index < this.dataSource.length; index++) {
+        if (row === this.dataSource[index]) {
+          data = index;
+          break;
+        }
+      }
+      // this.dataSource.map((item, index) => {
+      //   if (row === item) {
+      //     data = index;
+      //   }
+      // });
+      this.$emit("row-key", row, (val) => {
+        data = val;
+      });
+      return data;
+    },
+    load(tree, treeNode, resolve) {
+      this.$emit("load", tree, treeNode, resolve);
+    },
+    // 记录表格总的筛选状态,用于列显示隐藏时保存checkbox状态
+    filterChange(filters) {
+      let currKey = Object.keys(filters)[0];
+      if (filters[currKey].length === 0) {
+        delete this.checkBoxFilteredMap[currKey];
+      } else {
+        this.checkBoxFilteredMap[currKey] = filters[currKey];
+      }
+      this.$emit("filter-change", filters);
+    },
+    checkChange(nodeObj, checkObj) {
+      this.checkedList = checkObj.checkedNodes.map((item) => {
+        return item.label;
+      });
+    },
+    // 之前写在vuex里的方法
+    changeSort(sort) {
+      this.sort.prop = sort.prop;
+      this.sort.order = sort.order;
+      this.sort.label = sort.column.label;
+    },
+    saveCheckedList(preCheckedList) {
+      this.preCheckedList = preCheckedList;
+    },
+  },
+};
+</script>
+
+<style>
+    .operateTable{
+        position: relative;
+        width: 100%;
+    }
+    .operateTable .column-dropdown{
+        position: absolute;
+        right: 0px;
+        top: -42px;
+        z-index: 99;
+    }
+    .caoz_ft_warp{
+      text-align: center;
+    }
+    .caoz_ft_warp .el-input.is-active .el-input__inner, .caoz_ft_warp .el-input__inner:focus{
+        border-color: #9A4B9B;
+        outline: 0;
+    }
+    .el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner {
+        background-color: #9a4b9b;
+        border-color: #9a4b9b;
+    }
+    .el-checkbox__inner:hover {
+        border-color: #9A4B9B;
+    }
+    .el-checkbox__input.is-focus .el-checkbox__inner{
+        border-color: #9A4B9B;
+    }
+    .el-checkbox__input.is-checked+.el-checkbox__label {
+        color: #9A4B9B;
+    }
+    .checkboxScorll .el-checkbox__input.is-checked + .el-checkbox__label {
+        color: #666;
+    }
+    .column-dropdown .el-button{margin-right: 0 !important;min-width:0;}
+    .column-dropdown .el-button:focus, .el-button:hover{
+        color: #9A4B9B;
+        border-color: #e1c9e1;
+        background-color: #f5edf5;
+    }
+    .checkboxScorll {
+        max-height: 300px;
+        overflow-y: auto;
+    }
+    .checkboxScorll .checkbox {
+        display: block;
+        margin-top: 10px;
+        padding-left: 20px;
+    }
+</style>

+ 116 - 15
zkqy-ui/src/views/amichi/materiel/index.vue

@@ -120,6 +120,7 @@
 <!--    /** 型号 */-->
 <!--    @Excel(name = "型号")-->
 <!--    private String modelNumber;-->
+      <div>111</div>
       <el-table
         class="sysDictInfoTable"
         :data="materialsList"
@@ -130,21 +131,12 @@
         :load="load"
         :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
         <el-table-column
-          prop="materialCode"
-          label="物料编码"
+          v-for="(item, index) in tableHeadData" :key="index"
+          :prop="item.value"
+          :label="item.label"
           align="center"
-          width="180">
-        </el-table-column>
-        <el-table-column
-          prop="materialName"
-          label="物料名称"
-          align="center"
-          width="180">
-        </el-table-column>
-        <el-table-column
-          prop="modelNumber"
-          align="center"
-          label="型号">
+          width="180"
+          >
         </el-table-column>
         <el-table-column
           prop="specification"
@@ -559,7 +551,116 @@ export default {
       form: {},
       // 表单校验
       rules: {
-      }
+      },
+      tableHeadData: [{
+        label: '物料名称',
+        value: 'materialName',
+        isCheck: true
+      },{
+        label: '物料编码',
+        value: 'materialCode',
+        isCheck: true
+      },{
+        label: '物料父级',
+        value: 'fid',
+        isCheck: true
+      },{
+        label: '型号',
+        value: 'modelNumber',
+        isCheck: true
+      },{
+        label: '规格',
+        value: 'specification',
+        isCheck: true
+      },{
+        label: '用量分子',
+        value: 'dosageMolecular',
+        isCheck: false
+      },{
+        label: '用量:分母',
+        value: 'usageDenominator',
+        isCheck: false
+      },{
+        label: '是否跳层',
+        value: 'skipOrNot',
+        isCheck: false
+      },{
+        label: '物料属性',
+        value: 'materialProperty',
+        isCheck: false
+      },{
+        label: '数据状态',
+        value: 'dataState',
+        isCheck: false
+      },{
+        label: 'BOM版本',
+        value: 'bomVersion',
+        isCheck: false
+      },{
+        label: '发料方式',
+        value: 'materialIssueMethod',
+        isCheck: false
+      },{
+        label: '作业',
+        value: 'job',
+        isCheck: false
+      },{
+        label: '标准用量',
+        value: 'materialName',
+        isCheck: false
+      },{
+        label: '实际数量',
+        value: 'actualQuantity',
+        isCheck: false
+      },{
+        label: '辅助属性',
+        value: 'fixedLoss',
+        isCheck: false
+      },{
+        label: '变动损耗率',
+        value: 'changeTheAttritionRate',
+        isCheck: false
+      },{
+        label: '替代策略',
+        value: 'alternativeStrategy',
+        isCheck: false
+      },{
+        label: '替代方式',
+        value: 'alternativeMode',
+        isCheck: false
+      },{
+        label: '替代主料',
+        value: 'substituteMaterial',
+        isCheck: false
+      },{
+        label: '生效日期',
+        value: 'effectiveDate',
+        isCheck: false
+      },{
+        label: '失效日期',
+        value: 'expirationDate',
+        isCheck: false
+      },{
+        label: '库存量',
+        value: 'inventory',
+        isCheck: false
+      },{
+        label: '存在联副产品',
+        value: 'presenceOfCobyproducts',
+        isCheck: false
+      },{
+        label: '标准子项清单',
+        value: 'standardSubitemUsage',
+        isCheck: false
+      },{
+        label: '实际子项用量',
+        value: 'actualSubitemUsage',
+        isCheck: false
+      },{
+        label: '备注',
+        value: 'remark',
+        isCheck: false
+      }]
     };
   },
   created() {

+ 1 - 1
zkqy-ui/src/views/login.vue

@@ -282,7 +282,7 @@ export default {
             Cookies.remove("rememberMe");
           }
           let form = {
-            uri: "?client_id=mestool&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.110.59:8066/oauth/callback",
+            uri: "?client_id=gly&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.110.15:8066/oauth/callback",
             ...this.loginForm,
             tenantID: this.tenantId,
           };

+ 2 - 2
zkqy-ui/vue.config.js

@@ -10,7 +10,7 @@ const CompressionPlugin = require('compression-webpack-plugin')
 
 const name = process.env.VUE_APP_TITLE || '客户端系统' // 网页标题
 
-const port = process.env.port || process.env.npm_config_port || 81 // 端口
+const port = process.env.port || process.env.npm_config_port || 1025 // 端口
 const isDev = process.env.NODE_ENV !== "production";
 // vue.config.js 配置说明
 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
@@ -39,7 +39,7 @@ module.exports = {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
         // target: `http://192.168.110.59:8066`,
-        target: `http://62.234.61.92:8066`,
+        target: `http://192.168.110.15:8066/`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''