<template> <div class="codelist"> <span v-if="ifEmpty">{{$t('codelist.'+tag+'.empty')}}</span> <template v-if="!ifEmpty"> <template v-for="(item, index) in items"> <div class="codelist-item" :key="index"> <i v-if="item.iconcls" :class="item.iconcls"></i> <img v-if="item.icon" :src="getIcon(item.icon)" /> <span :class="item.class" :style="{ color: item.color }"> {{ isUseLangres ? $t(item.text) : item.text }} </span> <span v-if="index != items.length-1">{{ textSeparator }}</span> </div> </template> </template> </div> </template> <script lang="ts"> import { Vue, Component, Prop, Model, Watch } from 'vue-property-decorator'; import CodeListService from "@/codelist/codelist-service"; import { Environment } from '@/environments/environment'; @Component({}) export default class CodeList extends Vue { /** * 代码表服务对象 * * @type {CodeListService} * @memberof CodeList */ public codeListService:CodeListService = new CodeListService({ $store: this.$store }); /** * 代码表标识 * * @type {string} * @memberof CodeList */ @Prop() public tag!: string; /** * 代码表类型 * * @type {string} * @memberof CodeList */ @Prop() public codelistType?: string; /** * 当前值 * @type {any} * @memberof CodeList * */ @Prop() public value?: string; /** * 获取或模式 * @type {boolean} * @memberof CodeList */ @Prop({default:"STR"}) public renderMode?: string; /** * 文本分隔符 * @type {boolean} * @memberof CodeList */ @Prop({default:'、'}) public textSeparator?: string; /** * 值分隔符 * @type {boolean} * @memberof CodeList */ @Prop({default:','}) public valueSeparator?: string; /** * 传入表单数据 * * @type {*} * @memberof CodeList */ @Prop() public data?: any; /** * 局部上下文导航参数 * * @type {any} * @memberof CodeList */ @Prop() public localContext!:any; /** * 局部导航参数 * * @type {any} * @memberof CodeList */ @Prop() public localParam!:any; /** * 视图上下文 * * @type {*} * @memberof CodeList */ @Prop() public context!: any; /** * 视图参数 * * @type {*} * @memberof CodeList */ @Prop() public viewparams!: any; /** * 是否为空 * * @memberof CodeList */ public ifEmpty:boolean = false; /** * 显示数据集合 * * @type {any[]} * @memberof CodeList */ public items: any[] = []; /** * vue 生命周期 * * @memberof CodeList */ public created() { this.dataHandle(); } /** * 是否使用多语言资源 * @type {boolean} * @memberof CodeList */ public isUseLangres:boolean = false; /** * 数据值变化 * * @param {*} newval * @param {*} val * @returns * @memberof CodeList */ @Watch('value') public onValueChange(newVal: any, oldVal: any) { this.dataHandle(); } /** * 监听表单数据变化 * * @memberof CodeList */ @Watch('data',{immediate:true,deep:true}) onDataChange(newVal: any, oldVal: any) { if(newVal){ this.dataHandle(); } } /** * 数据处理 * * @memberof CodeList */ private dataHandle(){ this.isUseLangres = false; let _this = this; // 空值判断 if(Object.is(this.$util.typeOf(this.value), 'undefined') || Object.is(this.$util.typeOf(this.value), 'null')){ this.ifEmpty = true; return; } this.ifEmpty = false; // 动态代码表处理 if (Object.is(this.codelistType, "DYNAMIC")) { // 公共参数处理 let data: any = {}; this.handlePublicParams(data); // 参数处理 let _context = data.context; let _param = data.param; this.codeListService.getItems(this.tag,_context,_param).then((res:any) => { let items = res; _this.setItems(items, _this); }).catch((error: any) => { console.log(`----${_this.tag}----${(this.$t('app.commonWords.codeNotExist') as string)}`); }); // 静态处理 } else if(Object.is(this.codelistType, "STATIC")){ this.isUseLangres = true; let items = this.$store.getters.getCodeListItems(this.tag); _this.setItems(items, _this); } } /** * 解析代码表和vlaue,设置items * * @private * @param {any[]} items 代码表数据 * @param {*} value * @returns {*} * @memberof CodeList */ private setItems(items: any[], _this: any){ if (items) { let result:any = []; if(Object.is(_this.renderMode,"NUM")){ _this.isUseLangres = false; items.map((_item: any, index: number)=>{ const nValue = parseInt((_this.value as any), 10); const codevalue = _item.value; if((parseInt(codevalue, 10) & nValue) > 0){ result.push(_item); } }); } else { let values: any[] = Object.is(_this.$util.typeOf(_this.value), 'number') ? [_this.value] : [...(_this.value as any).split(_this.valueSeparator)]; values.map((value:any ,index: number)=>{ const item = _this.getItem(items, value); if(item){ result.push(item); } }); } // 设置items if(result.length != 0){ _this.items = result; }else{ _this.items = [{text:_this.value}]; } } } /** * 获取代码项 * * @private * @param {any[]} items * @param {*} value * @returns {*} * @memberof CodeList */ private getItem(items: any[], value: any): any { let result: any = {}; const arr: Array<any> = items.filter(item => {return item.value == value}); if (arr.length !== 1) { return undefined; } result = { ...arr[0] }; if(Object.is(this.codelistType,'STATIC')){ let value = JSON.parse(JSON.stringify(result)); value.text = 'codelist.'+this.tag+'.'+value.value; return value; }else{ return result; } } /** * 公共参数处理 * * @param {*} arg * @returns * @memberof CodeList */ public handlePublicParams(arg: any) { // 合并表单参数 arg.param = this.viewparams ? JSON.parse(JSON.stringify(this.viewparams)) : {}; arg.context = this.context ? JSON.parse(JSON.stringify(this.context)) : {}; // 附加参数处理 if (this.localContext && Object.keys(this.localContext).length >0) { let _context = this.$util.computedNavData(this.data,arg.context,arg.param,this.localContext); Object.assign(arg.context,_context); } if (this.localParam && Object.keys(this.localParam).length >0) { let _param = this.$util.computedNavData(this.data,arg.param,arg.param,this.localParam); Object.assign(arg.param,_param); } } /** * 获取图片路径 * * @param {*} arg * @returns * @memberof CodeList */ public getIcon(arg:any){ if(!arg){ return; } if(Object.prototype.toString.call(arg)=="[object String]"){ try { let targetData:any = JSON.parse(arg); if(Object.prototype.toString.call(targetData) == "[object Array]"){ if(targetData && targetData.length >0){ let fileId:string = targetData[0] && targetData[0].id; return Environment.BaseUrl + Environment.ExportFile + fileId; } }else if(Object.prototype.toString.call(targetData) === '[object Object]'){ let fileId:string = targetData && targetData.id; return Environment.BaseUrl + Environment.ExportFile + fileId; } } catch (error) { return arg; } }else if(Object.prototype.toString.call(arg) == "[object Array]"){ if(arg && arg.length >0){ let fileId:string = arg[0] && arg[0].id; return Environment.BaseUrl + Environment.ExportFile + fileId; } }else if(Object.prototype.toString.call(arg) === '[object Object]'){ let fileId:string = arg && arg.id; return Environment.BaseUrl + Environment.ExportFile + fileId; }else{ return arg; } } } </script> <style lang='less'> .codelist { display: flex; white-space: nowrap; text-overflow: ellipsis; word-break: break-all; overflow: hidden; .codelist-item{ display: flex; align-items: center; max-height: 32px; padding: 0px 3px; > img{ max-height: 32px; width: auto; margin-right: 6px; border-radius: 50%; } } } </style>