fieldParseHelper.js 8.92 KB
define(['mUtil'], function (mUtil) {
    var fieldExp = new RegExp('[\'"]?fieldid[\'"]?:[\'"]?([0-9]+)[\'"]?', 'g'),
        variablesExp = new RegExp("{(.*?)}", "gi"),
		fieldValueExp = new RegExp("{(\\w+\\.)?(\\w+)((\\[id\\])|(\\[text\\]))}", "g");
	return {
		replaceVal: function(text, dataObj){
			if(!mUtil.containsVariables(text) && !mUtil.containsVarParser(text)) return text;
			var matches;
			variablesExp.lastIndex = 0;
			var textStr = text;
			while((matches = variablesExp.exec(text)) != null){
				if(matches[1].indexOf("d1.") == 0){
					var matchStr = matches[0].replace("d1.", "d_");
					textStr = textStr.replace(matches[0], matchStr);
				}else if(matches[1].indexOf("t1.") == 0){
					var matchStr = matches[0].replace("t1.", "");
					textStr = textStr.replace(matches[0], matchStr);
				}
			}
			text = textStr;

			//解析{xxx[id]}/{xxx[text]}字符串
			fieldValueExp.lastIndex = 0;
			while((matches = fieldValueExp.exec(text)) != null){
				var needReplace = true;
				if(dataObj[matches[2]] === undefined) needReplace = false;
				if(matches[0].indexOf("[id]")> -1 && needReplace) textStr = textStr.replace(matches[0], matches[0].replace("[id]", ""));
				if(matches[0].indexOf("[text]")> -1 && needReplace) textStr = textStr.replace(matches[0], (dataObj[matches[2] + "_showvalue"]));
			}
			text = textStr;

			text = mUtil.replaceValAndVarParser(text, dataObj);
			return text;
		},
		parseFieldIds: function(text){
			var ids = [];
			var match;
			fieldExp.lastIndex = 0;
			while((match = fieldExp.exec(text)) != null){
				var fieldid = Number(match[1]);
				if(fieldid != 0 && fieldid != -1 && ids.indexOf(fieldid) == -1){
					ids.push(Number(match[1]));
				}
			}

			var fieldNames = [];
			fieldValueExp.lastIndex = 0;
			while((match = fieldValueExp.exec(text)) != null){
				if((match[0].indexOf("[text]")> -1) && (fieldNames.indexOf(match[2]) == -1)){
					if((match[0].indexOf("d1.")> -1)){
						fieldNames.push("d_" + match[2]);
					}else{
						fieldNames.push(match[2]);
					}
				}
			}

			return ids.join(',') + "," + fieldNames.join(',');
		},
		isSettingValue: function(fieldobj){
			if(mUtil.isObject(fieldobj)){
				var fieldid = Number(fieldobj.fieldid);
				return !isNaN(fieldid) && (fieldid > 0 || fieldid == -1);
			}
			return false;
		},
		getFieldValue: function(fieldobj, billdata, fieldmap, imgfield, imgPreview){
			var fieldid = Number(fieldobj.fieldid);
			if(fieldid > 0){
				//字段值转化后map
				var convertDataMap = billdata.convertDataMap, dataMap = billdata.dataMap || {}, empowStr = dataMap.empowstr || "";
				var fieldModel = fieldmap[fieldid];
				if(convertDataMap.hasOwnProperty(fieldid)){
					var fieldValue = convertDataMap[fieldid], fieldHtmlType = fieldModel.fieldhtmltype, fieldtype = fieldModel.fieldtype;
					if(fieldHtmlType == 6){
						if(!fieldValue){
							if(fieldtype == 2 && imgfield){	//左侧图片字段
								return "<img class=\"wev-img\" src=\"/mobilemode/images/mec/img-space1_wev8.png\"/>";
							}else{
								return "";
							}
						}
						if(mUtil.isArray(fieldValue)){
							var valueTmp = "";
							var getClassName = function(className, suffix){
								if (~["jpg", "jpeg", "png", "gif", "bmp"].indexOf(suffix)) {
									className += " wev-pic-file";
								} else if (suffix == "doc" || suffix == "docx") {
									className += " wev-word-file";
								} else if (suffix == "xls" || suffix == "xlsx") {
									className += " wev-excel-file";
								} else if (suffix == "pdf") {
									className += " wev-pdf-file";
								} else if (suffix == "htm" || suffix == "html") {
									className += " wev-html-file";
								} else if (suffix == "ppt") {
									className += " wev-ppt-file";
								}
								return className;
							};
							if(fieldtype == 1){//附件
								var showHtml = '';
								fieldValue.forEach(function(meta){
									showHtml += '<li class="'+getClassName("wev-file", meta.suffix)+'" data-id="'+meta.imagefileid+'" data-docid="'+meta.docid+'" data-authorize="'+empowStr+'" data-name="'+encodeURIComponent(meta.name)+'">' +
										'<span>'+ meta.name + '(' + meta.size + ')'+'</span>' +
										'</li>';
								});
								valueTmp = '<ul class="wev-file-wrapper">'+showHtml+'</ul>';
							}else{//图片
								var viewImgAttr = imgPreview ? "data-groupid=\"group_"+mUtil.UUID()+"\"" : "";
								for(var i in fieldValue){
									var value = fieldValue[i];
									if(imgfield){	//左侧图片字段
										valueTmp += "<img class=\"wev-img lazyload\" data-src=\""+mUtil.getAttachUrl(value, empowStr)+"\" "+viewImgAttr+"/>";
										break;
									}else{
										if(i == 0){
											valueTmp += "<div class=\"wev-img-wrapper\">";
										}
										valueTmp += "<img class=\"wev-img lazyload\" data-src=\""+mUtil.getAttachUrl(value, empowStr)+"\" "+viewImgAttr+"/>";
										if(i == (fieldValue.length - 1)){
											valueTmp += "</div>";
										}
									}
								}
							}
							fieldValue = valueTmp;
						}
					}else if((fieldHtmlType == 1 || fieldHtmlType == 2) && fieldtype == 1){
						fieldValue = new String(fieldValue).replace(/\n/gi, "<br>").replace(/\s/gi, "&nbsp;");
					}
					return fieldValue;
				}else{
					return "Field("+JSON.stringify(fieldobj)+") does not exist.";
				}
			}else if(fieldid == -1){
				//后台解析方法$m.convertToImage()解析图片字段时只解析一张。如列表的左侧,和大图列表图片。
				var fielddesc = fieldobj.fielddesc || "";
				if (imgfield){
					var billdataCopy = JSON.parse(JSON.stringify(billdata));
					var billdataMap = billdataCopy.dataMap;
					var fieldName = "";
					if(fielddesc) {
						var regex = new RegExp(/\$m\.convertToImage\("\{((d1\.)?\w{1,})\}".*\)/);
						var matchs = regex.exec(fielddesc);
						if (matchs){
							fieldName = matchs[1].indexOf("d1.") == -1 ? matchs[1] : matchs[1].replace("d1.","d_");
						}
					}
					if (fieldName && billdataMap.hasOwnProperty(fieldName)){
						var imgfieldValue = billdataMap[fieldName];
						if (imgfieldValue.indexOf(",") != -1 ){
							billdataMap[fieldName] = imgfieldValue.split(",")[0];
						}
					}
					return this.replaceVal(fielddesc, billdataMap);
				}
				return this.replaceVal(fielddesc, billdata.dataMap);
			}else{
				return "";
			}
		},
		convertFieldMockData : function(mockData, pageNo, pageSize, searchKey, matchFields){
			if(mUtil.isArray(mockData)){
			    if(searchKey && matchFields){
			        matchFields = matchFields.map(function(field) {
                        return field.replace(/\{|\}/g, "");
                    });
			        mockData = mockData.filter(function(mockItem){
			            for(var i = 0; i < matchFields.length; i++){
			                var field = matchFields[i];
			                if(mockItem[field] && new String(mockItem[field]).toLowerCase().indexOf(searchKey.toLowerCase()) != -1){
                                return true;
                            }
			            }
                    });
			    }
			    
				pageNo = pageNo || 1;
				pageSize = pageSize || 10;
				
				var fieldMap = {}, keyfiled, fieldRel = {},
					index = 0,
					totalSize = mockData.length;
				
				var totalPageCount = totalSize%pageSize > 0 ? parseInt(totalSize/pageSize) + 1 : parseInt(totalSize/pageSize);
				for (var key in mockData[0]) {
					index++;
					if(index == 1)  keyfiled = key;
					fieldRel[index] = key;
					
					var field = {};
					field.fieldhtmltype = "1";
					field.fieldid = index;
					field.fieldname = key;
					fieldMap[index] = field;
				}
				
				if(pageNo < totalPageCount){
					mockData = mockData.slice((pageNo-1)*pageSize, pageNo*pageSize);
				}else if(pageNo == totalPageCount){
					mockData = mockData.slice((pageNo-1)*pageSize);
				} else{
					mockData = [];
				}
				
				var dataArr = [];
				mockData.forEach(function(mock){
					var data = {}, convertDataMap = {}, fieldIndex = index;
					while(fieldIndex > 0){
						convertDataMap[fieldIndex] = mock[fieldRel.fieldIndex];
						fieldIndex--;
					}
					
					data.keyfiled = keyfiled;
					data.keyvalue = mock[keyfiled];
					data.dataMap = mock;
					data.convertDataMap = convertDataMap;
					
					dataArr.push(data);
				});
				
				var result = {};
				result.datas = dataArr;
				result.fieldMap = fieldMap;
				result.totalSize = totalSize;
				result.totalPageCount = totalPageCount;
				
				return result;
			}else{
				return "";
			}
		},
		/**
		 * 获取$m.convertToImage()中配置字段的第一条数据
		 * @param fielddesc 字段配置信息
		 * @param dataObj 原始数据
		 */
		getFirstDataByFielddesc: function(fielddesc, dataObj){
			if (!mUtil.isObject(dataObj)){
				return dataObj;
			}
			var regex = new RegExp(/\$m\.convertToImage\("\{(\w{1,})\}".*\)/);
			if (!fielddesc || !regex.test(fielddesc)) return dataObj;
			var fieldName = regex.exec(fielddesc)[1];
			var fieldData = dataObj[fieldName] || "";
			var result = {};
			fieldData = fieldData.indexOf(",") == -1 ? fieldData : fieldData.split(",")[0];
			result[fieldName] = fieldData;
			return result;
		},
	};
});