SelectCur.vue 6.23 KB
<template>
	<el-select :id="id" v-model="model" :style="{'border-bottom': isShowRed ? `1px solid ${isShowRed}` : ''}" v-bind="$attrs" filterable v-bind:disabled="isDisable" :clearable="clearable" v-on="$listeners" :placeholder="placeholderEnable" @change="handleChange" @keyup.delete.native="deleteValue">
		<slot>
			<template>
				<el-option v-for="item in dbCodeList" :key="item.value" :label="formatShowLableForCur(item)" :value="item.value" >
			</el-option>
			</template>
		</slot>
	</el-select>
</template>

<script>
import { getSelectList } from "~/service/business/codeTable";
import commonDepend from "~/mixin/commonDepend.js";
import markSetShowRed from "~/components/business/componentMixins/markSetShowRed.js";

export default {
  inject: {
    root: {
      default: () => null
    }
  },

  mixins: [commonDepend, markSetShowRed],
  props: {
    value: {
      type: [String, Array, Number],
      default: undefined
    },
    disabled: {
      type: Boolean,
      default: false
    },
    clearable: {
      type: Boolean,
      default: true
    },
    id: {
      type: String,
      default: undefined
    },
    // 静态显示codeTable中的字段
    code: {
      type: Array,
      default: function() {
        return [];
      }
    },
    // 动态获取下拉列表数据的关键字
    dbCode: {
      type: String,
      default: undefined
    },
    //是否从缓存中读取,false每次调接口
    isCache: {
      type: Boolean,
      default: true
    },
    // 此对象为markset或者modifySet所在的对象,如果传了此对象可以标记当前对象下的字段为红色下划线
    markSetData: {
      type: Object,
      default: () => null
    },
    customModifykey: {
      type: String,
      default: null
    },
    // 总下拉列表数据中过滤出以下数组key
    filterKey: {
      type: Array,
      default: () => []
    },
    // 码表语言类型-可选值:英文(en)-默认;中文(cn);
    uil: {
      type: String,
      default: "EN"
    },
    placeholder: {
      type: String,
      default: null
		},
		// 总下拉列表数据中排除以下数组key
      expKey:{
        type: Array,
        default: () => []
      },
    // 排序方式--值有两种:COD和SRT
    sort: {
      type: String,
      default: "COD"
    },
    //下拉框是否跟随页面滚动
    isFixed: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      dbCodeList: [],
    };
  },
  computed: {
    model: {
      get() {
        return this.value;
      },
      set(newVal) {
        this.$emit("input", newVal);
      }
    },
    mode() {
      return this.$store.state.Status.mode;
    },
    isDisable() {
      return this.mode === "display" || this.disabled;
    },
    placeholderEnable() {
      return this.isDisable ? "" : this.placeholder;
    },
    highlight() {
      return this.$store.state.Status.highlights.indexOf(this.id) !== -1;
    }
  },
  watch: {
    dbCode: {
      handler(newVal) {
        this.init();
      }
    },
    filterKey: {
      handler(newVal) {
        this.init();
      }
		},
		expKey: {
      handler(newVal) {
        this.init()
      }
    },
    disabled(newVal) {
      if (newVal) {
        this.resetValidate()
      }
    }
  },
  mounted() {
    this.init();
  },
  methods: {
    init() {
      if (this.dbCode) {
        let localCodes = localStorage.getItem("localCodes");
        let codesData = {};
        if (localCodes) {
          codesData = JSON.parse(localCodes);
        }
        let lang = this.root && this.root.lang ? this.root.lang : this.uil;
        // 判断缓存中是否存在此码表,存在去缓存,不存在重新拉取接口
        if (codesData[`${this.dbCode}_${lang}_${this.sort}`] && this.isCache) {
          let curList = codesData[`${this.dbCode}_${lang}_${this.sort}`];
					this.dbCodeList = this.filterList(curList);
					this.formatDbCodeListForCur()
        } else {
          this.getDBCode();
        }
      } else {
				this.dbCodeList = this.filterList(this.code);
				this.formatDbCodeListForCur()
      }
		},
		formatDbCodeListForCur(){
				let list =[]
				this.dbCodeList.map((item)=>{
					list.push({
						label:item.label,
						value:item.value+"1"
					})
				})
				this.dbCodeList = list
		},
    //键盘按delete键清空内容
    deleteValue() {
      this.model = "";
		},
		formatShowLableForCur(item){
				let value = item.value
        return value.substr(0,value.length-1) + " " + item.label;
		},
    // 筛查数据
    filterList(list) {
      if (this.filterKey.length) {
        return list.filter(item => {
          return this.filterKey.includes(item.value);
        });
			}
			if(this.expKey.length){
          return list.filter((item) => {
            return !this.expKey.includes(item.value)
          })
        }
      return list;
    },
    handleChange(val) {
      if (!this.customModifykey) {
        // 添加isModify属性
        this.changeModify();
			}
			this.$emit('input', val.substr(0,val.length-1))
    },
    getDBCode() {
      let lang = this.root && this.root.lang ? this.root.lang : this.uil;
      let args = {
        codeType: this.dbCode.toUpperCase(),
        uil: lang,
        sort: this.sort
      };
      getSelectList(args).then(rtnmsg => {
        if (rtnmsg.respCode == SUCCESS) {
          let curList = rtnmsg.data.map(item => ({
            value: item.codeValue,
            label: item.codeName
          }));
					this.dbCodeList = this.filterList(curList);
					this.formatDbCodeListForCur()
          if (this.isCache) {
            let dataOld = localStorage.getItem("localCodes")
              ? JSON.parse(localStorage.getItem("localCodes"))
              : {};
            let localNewData = JSON.stringify({
              ...dataOld,
              [`${this.dbCode}_${lang}_${this.sort}`]: curList
            });
            localStorage.setItem("localCodes", localNewData);
          } else {
            let dataOld = localStorage.getItem("localCodes")
              ? JSON.parse(localStorage.getItem("localCodes"))
              : {};
            let localNewData = JSON.stringify({
              ...dataOld,
              [`${this.dbCode}_${lang}_${this.sort}`]: null
            });
          }
        }
      });
    }
  }
};
</script>

<style scoped lang="less">
</style>