MWF.xApplication.query = MWF.xApplication.query || {};
MWF.xApplication.query.Query = MWF.xApplication.query.Query || {};
MWF.require("MWF.widget.Common", null, false);
MWF.require("MWF.xScript.Macro", null, false);
MWF.require("o2.widget.Dialog", null, false);
MWF.xDesktop.requireApp("query.Query", "lp."+o2.language, null, false);
/** @classdesc Importer 数据中心的导入模型。
* @class
* @o2cn 导入模型
* @o2category QueryImporter
* @o2range {QueryImporter}
* @hideconstructor
* @example
* //在导入模型的事件中获取该类
* var view = this.target;
* */
MWF.xApplication.query.Query.Importer = MWF.QImporter = new Class(
/** @lends MWF.xApplication.query.Query.Importer# */
{
Implements: [Options, Events],
Extends: MWF.widget.Common,
options: {
"style": "default",
"moduleEvents": [
/**
* 加载importer(导入模型对象)的时候执行。可通过this.target获取当前对象。
* @event MWF.xApplication.query.Query.Importer#queryLoad
*/
"queryLoad",
/**
* 导入前触发,this.event指向导入的数据,您可以通过修改this.event来修改数据。
* @event MWF.xApplication.query.Query.Importer#beforeImport
* @example
*
this.event数据格式如下:
*[
* [ "标题一","张三","男","大学本科","计算机","2001-1-2","2019-9-2" ], //第一行数据
* [ "标题二","李四","男","大学专科","数学","1998-1-2","2018-9-2" ] //第二行数据
*]
*/
"beforeImport",
/**
* 前台校验成功,并且后台执行完导入后触发,this.event指向后台返回的导入结果。
* @event MWF.xApplication.query.Query.Importer#afterImport
* @example
* this.event格式如下:
* {
* "status": "导入成功", //导入结果:状态有 "导入成功","部分成功","导入失败"
* "data": {}, //前台组织好的需要导入的数据
* "rowList": [], //前台组织的行对象数组
* "count" : 10, //导入总数量
* "failCount": 0, //失败数量
* "distribution": "" //导入时候时的错误信息
* }
*/
"afterImport",
/**
* 数据已经生成,前台进行数据校验时触发,this.event指向导入的数据。
* @event MWF.xApplication.query.Query.Importer#validImport
* @example
* this.event数据格式如下:
* {
* "data" : [
* [ "标题一","张三","男","大学本科","计算机","2001-1-2","2019-9-2" ], //第一行数据
* [ "标题二","李四","男","大学专科","数学","1998-1-2","2018-9-2" ] //第二行数据
* ],
* "rowList": [], //导入的行对象,数据格式常见本章API的afterCreateRowData说明。
* "validted" : true //是否校验通过,可以在本事件中修改该参数,确定是否强制导入
* }
*/
"validImport",
/**
* 创建每行需要导入的数据前触发,this.event指向当前行对象,您可以通过修改this.event.importData来修改数据。
* @event MWF.xApplication.query.Query.Importer#beforeCreateRowData
*/
"beforeCreateRowData",
/**
* 创建每行需要导入的数据后触发,this.event指向当前行对象。
* @event MWF.xApplication.query.Query.Importer#afterCreateRowData
* @example
* this.event格式如下:
* {
* "importedData": [ "标题一","张三","男","大学本科","计算机","2001-1-2","2019-9-2" ], //导入的数据
* "data" : {//根据导入模型生成的业务数据
* {
* "subject", "标题一", //subject为导入模型列配置的路径
* "name" : "张三",
* ...
* },
* "document": { //如果导入目标是内容管理,则包含document对象
* "title": "标题一"
* "identity": "xxx@xxx@I"
* ...
* },
* "work": { //如果导入目标是流程管理,则包含work对象
* "title": "标题一"
* "identity": "xxx@xxx@I"
* ...
* },
* "errorTextList" : [], //错误信息
* "errorTextListExcel": [] //在出错界面导出Excel时的错误信息
* }
*/
"afterCreateRowData"
]
},
initialize: function(container, json, options, app, parentMacro){
this.setOptions(options);
this.path = "../x_component_query_Query/$Importer/";
this.cssPath = "../x_component_query_Query/$Importer/"+this.options.style+"/css.wcss";
this._loadCss();
this.lp = MWF.xApplication.query.Query.LP;
this.app = app;
this.json = json;
this.container = container;
this.parentMacro = parentMacro;
this.lookupAction = MWF.Actions.get("x_query_assemble_surface");
},
load: function(){
this.excelUtils = new MWF.xApplication.query.Query.Importer.ExcelUtils();
this.getImporterJSON( function () {
this.loadMacro( function () {
this._loadModuleEvents();
this.fireEvent("queryLoad");
this.importFromExcel();
}.bind(this));
}.bind(this));
},
loadMacro: function (callback) {
MWF.require("MWF.xScript.Macro", function () {
this.Macro = new MWF.Macro.ViewContext(this);
if (callback) callback();
}.bind(this));
},
createLoadding: function(){
this.loadingAreaNode = new Element("div", {"styles": this.css.viewLoadingAreaNode}).inject(this.contentAreaNode);
new Element("div", {"styles": {"height": "5px"}}).inject(this.loadingAreaNode);
var loadingNode = new Element("div", {"styles": this.css.viewLoadingNode}).inject(this.loadingAreaNode);
new Element("div", {"styles": this.css.viewLoadingIconNode}).inject(loadingNode);
var loadingTextNode = new Element("div", {"styles": this.css.viewLoadingTextNode}).inject(loadingNode);
loadingTextNode.set("text", "loading...");
},
getImporterJSON: function(callback){
if( this.importerJson && this.json ){
if (callback) callback();
}else{
if (this.json.name){
this.lookupAction.getImportModel(this.json.name, this.json.application, function(json){
this.importerId = json.data.id;
this.importerJson = JSON.decode(json.data.data);
json.data.data = this.importerJson;
this.json = Object.merge(this.json, json.data);
if (callback) callback();
}.bind(this));
}else{
this.lookupAction.getImportModelById(this.json.id, function(json){
this.importerId = json.data.id;
this.importerJson = JSON.decode(json.data.data);
json.data.data = this.importerJson;
this.json.application = json.data.query;
this.json = Object.merge(this.json, json.data);
if (callback) callback();
}.bind(this));
}
}
},
_loadModuleEvents : function(){
Object.each(this.json.data.events, function(e, key){
if (e.code){
if (this.options.moduleEvents.indexOf(key)!==-1){
this.addEvent(key, function(event, target){
return this.Macro.fire(e.code, target || this, event);
}.bind(this));
}
}
}.bind(this));
},
getDateColIndexArray: function(){
var dateColIndexArray = [];
this.json.data.columnList.each(function(columnJson, index){
var dataType = this.json.type === "dynamicTable" ? columnJson.dataType_Querytable : columnJson.dataType_CMSProcess;
if( ["date","dateTime"].contains(dataType) )dateColIndexArray.push( index );
}.bind(this));
return dateColIndexArray;
},
getOrgColIndexArray : function(){
var orgColIndexArray = [];
this.json.data.columnList.each(function(columnJson, index){
if( columnJson.isName ) {
orgColIndexArray.push(index);
}
// }else if( this.json.type === "cms" ){
// if( columnJson.isPublisher || columnJson.isAuthor || columnJson.isReader ){
// orgColIndexArray.push( index );
// }
// }
}.bind(this));
return orgColIndexArray;
},
importFromExcel : function(){
this.rowList = [];
this.identityMapImported = {};
this.personMapImported = {};
this.unitMapImported = {};
this.groupMapImported = {};
this.lookupAction.getUUID( function (json){
this.recordId = json.data;
}.bind(this), null, false);
this.excelUtils.upload( this.getDateColIndexArray(), function (importedData) {
importedData = importedData.filter(function (array) {
for( var i=0; i 0 )this.importedData.shift();
this.fireEvent("beforeImport", [this.importedData]);
Promise.resolve( this.importedData.promise ).then(function () {
this.listOrgDataFromDb(
this.getImportedOrgData(),
function () {
this.importedData.each( function( lineData, lineIndex ){
this.rowList.push( new MWF.xApplication.query.Query.Importer.Row( this, lineData, lineIndex ) )
}.bind(this));
var isValid = this.json.enableValid ? this.checkImportedData() : this.checkNecessaryImportedData();
Promise.resolve(isValid).then(function ( isValid1 ) {
if( isValid1 ){
this.doImportData();
}else{
this.openImportedErrorDlg();
}
}.bind(this));
}.bind(this)
);
}.bind(this));
}.bind(this)
});
this.progressBar.importerId = this.importerId;
}.bind(this));
},
getData : function(){
var data = ( this.rowList || [] ).map( function(row){
return row.getResult();
});
return data;
},
doImportData: function(){
//创建数据
// this.rowList.each( function( row, i ){
// row.createData();
// }.bind(this));
//再次校验数据(计算的内容)
var date = new Date();
//var flag = true;
// this.rowList.each( function(row, index){
// if( row.errorTextList.length )flag = false;
// }.bind(this));
// var arg = {
// validted : flag,
// data : this.importedData,
// rowList : this.rowList
// };
// this.fireEvent( "import", [arg] );
// Promise.resolve( arg.promise ).then(function(){
// flag = arg.validted;
//
// if( !flag ){
// this.openImportedErrorDlg();
// return;
// }
var data = this.getData();
// this.lookupAction.getUUID(function(json){
// this.recordId = json.data;
this.lookupAction.executImportModel(this.json.id, {
"recordId": this.recordId,
"data" : data
}, function () {
//this.showImportingStatus( data, date )
this.progressBar.showImporting( this.recordId, function( data ){
data.data = data;
data.rowList = this.rowList;
this.fireEvent("afterImport", data);
return data;
}.bind(this), date);
}.bind(this), function (xhr) {
var requestJson = JSON.parse(xhr.responseText);
this.app.notice(requestJson.message, "error");
this.progressBar.close();
}.bind(this))
// }.bind(this))
// }.bind(this))
},
objectToString: function (obj, type) {
if(!obj)return "";
var arr = [];
Object.each(obj, function (value, key) {
if( type === "style" ){
arr.push( key + ":"+ value +";" );
}else{
arr.push( key + "='"+ value +"'" );
}
})
return arr.join( " " )
},
openImportedErrorDlg : function(){
if(this.progressBar)this.progressBar.close();
var _self = this;
var div = new Element("div", { style : "padding:10px;" });
var dlg = o2.DL.open({
"style" : "user",
"title": this.lp.importFail,
"content": div,
"offset": {"y": 0},
"isMax": true,
"width": 1000,
"height": 700,
"buttonList": [
{
"type": "exportWithError",
"text": this.lp.exportExcel,
"action": function () { _self.exportWithImportDataToExcel(); }
},
{
"type": "cancel",
"text": this.lp.cancel,
"action": function () { dlg.close(); }
}
],
"onPostShow": function () {
var htmlArray = [""];
var titleStyle = this.objectToString( this.css.titleStyles, "style" );
var vaildTitleStyles = this.objectToString( this.css.vaildTitleStyles, "style" );
htmlArray.push( "" );
this.json.data.columnList.each( function (columnJson, i) {
htmlArray.push( ""+columnJson.displayName+" | " );
});
htmlArray.push( " "+this.lp.validationInfor +" | " );
htmlArray.push( "
" );
var contentStyles = Object.clone( this.css.contentStyles );
if( !contentStyles[ "border-bottom" ] && !contentStyles[ "border" ] )contentStyles[ "border-bottom" ] = "1px solid #eee";
var contentStyle = this.objectToString( Object.merge( contentStyles, {"text-align":"left"}) , "style" );
var validContentStyles = this.objectToString( this.css.validContentStyles, "style" );
this.rowList.each( function( row, lineIndex ){
var lineData = row.importedData;
htmlArray.push( "" );
this.json.data.columnList.each( function (columnJson, i) {
var d = lineData[ i ];
var text = typeOf(d) === "string" ? ( d || '' ).replace(/
/g,"
") : d;
htmlArray.push( ""+ text +" | " ); //换行符
});
htmlArray.push( ""+( row.errorTextList ? row.errorTextList.join(" ") : "" )+" | " );
htmlArray.push( "
" );
}.bind(this));
htmlArray.push( "
" );
div.set("html" , htmlArray.join(""));
}.bind(this),
"onPostClose": function(){
dlg = null;
}.bind(this)
});
},
//必须校验的数据
checkNecessaryImportedData: function(){
var flag = true;
var ps = this.rowList.each( function(row, index){
return row.checkNecessary();
}.bind(this));
return Promise.all( ps ).then(function (arr) {
for( var i=0; i 0 ) {
this.importedData.each(function (lineData, lineIndex) {
// if( lineIndex === 0 )return;
orgColIndexArray.each(function (colIndex, i) {
if (!lineData[colIndex]) return;
var arr = this.stringToArray(lineData[colIndex]);
arr.each(function (a) {
a = a.trim();
var flag = a.substr(a.length - 2, 2);
switch (flag.toLowerCase()) {
case "@i":
identityList.push(a);
break;
case "@p":
personList.push(a);
break;
case "@u":
unitList.push(a);
break;
case "@g":
groupList.push(a);
break;
default:
identityList.push(a);
personList.push(a);
unitList.push(a);
groupList.push(a);
break;
}
})
}.bind(this))
}.bind(this));
};
return {
identityList: identityList,
personList: personList,
unitList: unitList,
groupList: groupList
};
},
listOrgDataFromDb : function (importedOrgData, callback ) {
var identityList = importedOrgData.identityList;
var personList = importedOrgData.personList;
var unitList = importedOrgData.unitList;
var groupList = importedOrgData.groupList;
var pIdentity;
if( identityList && identityList.length ){
pIdentity = o2.Actions.load("x_organization_assemble_express").IdentityAction.listObject({ identityList : identityList.unique() });
}
var pPerson;
if( personList && personList.length ){
pPerson = o2.Actions.load("x_organization_assemble_express").PersonAction.listObject({ personList : personList.unique() });
}
var pUnit;
if( unitList && unitList.length ){
pUnit = o2.Actions.load("x_organization_assemble_express").UnitAction.listObject({ unitList : unitList.unique() });
}
var pGroup;
if( groupList && groupList.length ){
pGroup = o2.Actions.load("x_organization_assemble_express").GroupAction.listObject({ groupList : groupList.unique() });
}
return Promise.all( [pIdentity, pPerson, pUnit, pGroup] ).then(function (arr) {
if( arr[0] && arr[0].data && arr[0].data.length ){
arr[0].data.each( function (d) { if(d)this.identityMapImported[ d.matchKey ] = d; }.bind(this));
}
if( arr[1] && arr[1].data && arr[1].data.length ){
arr[1].data.each( function (d) { if(d)this.personMapImported[ d.matchKey ] = d; }.bind(this));
}
if( arr[2] && arr[2].data && arr[2].data.length ){
arr[2].data.each( function (d) { if(d)this.unitMapImported[ d.matchKey ] = d; }.bind(this));
}
if( arr[3] && arr[3].data && arr[3].data.length ){
arr[3].data.each( function (d) { if(d)this.groupMapImported[ d.matchKey ] = d; }.bind(this));
}
if( callback )callback();
return;
}.bind(this))
},
// listOrgDataFromDb : function (importedOrgData, callback ) {
//
// var identityList = importedOrgData.identityList;
// var personList = importedOrgData.personList;
// var unitList = importedOrgData.unitList;
// var groupList = importedOrgData.groupList;
//
// var identityLoaded, personLoaded, unitLoaded, groupLoaded;
// var check = function () {
// if( identityLoaded && personLoaded && unitLoaded && groupLoaded ){
// if(callback)callback();
// }
// };
//
// if( identityList && identityList.length ){
// identityList = identityList.unique();
// o2.Actions.load("x_organization_assemble_express").IdentityAction.listObject({ identityList : identityList }, function (json) {
// json.data.each( function (d) { if(d)this.identityMapImported[ d.matchKey ] = d; }.bind(this));
// identityLoaded = true;
// check();
// }.bind(this))
// }else{
// identityLoaded = true;
// check();
// }
//
// if( personList && personList.length ){
// personList = personList.unique();
// o2.Actions.load("x_organization_assemble_express").PersonAction.listObject({ personList : personList }, function (json) {
// json.data.each( function (d) { if(d)this.personMapImported[ d.matchKey ] = d; }.bind(this));
// personLoaded = true;
// check();
// }.bind(this))
// }else{
// personLoaded = true;
// check();
// }
//
// if( unitList && unitList.length ){
// unitList = unitList.unique();
// o2.Actions.load("x_organization_assemble_express").UnitAction.listObject({ unitList : unitList }, function (json) {
// json.data.each( function (d) { if(d)this.unitMapImported[ d.matchKey ] = d; }.bind(this));
// unitLoaded = true;
// check();
// }.bind(this))
// }else{
// unitLoaded = true;
// check();
// }
//
// if( groupList && groupList.length ){
// groupList = groupList.unique();
// o2.Actions.load("x_organization_assemble_express").GroupAction.listObject({ groupList : groupList }, function (json) {
// json.data.each( function (d) { if(d)this.groupMapImported[ d.matchKey ] = d; }.bind(this));
// groupLoaded = true;
// check();
// }.bind(this))
// }else{
// groupLoaded = true;
// check();
// }
// },
// showImportingStatus: function( improtedData, date ){
// this.progressBar.showImporting( this.recordId, function( data ){
// data.data = improtedData;
// data.rowList = this.rowList;
// this.fireEvent("afterImport", data)
// }.bind(this), date);
// },
exportWithImportDataToExcel : function ( importData ) {
if( !this.excelUtils ){
this.excelUtils = new MWF.xApplication.query.Query.Importer.ExcelUtils();
}
var exportTo = function () {
var resultArr = [];
var titleArr = this.getTitleArray();
titleArr.push( this.lp.validationInfor );
resultArr.push( titleArr );
if( importData ){
importData.each( function (lineData, lineIndex) {
var array = [];
if( o2.typeOf(lineData)==="array" ) {
lineData.each(function (d, i) {
array.push((d || '').replace(/
/g, "\n"));
});
}else if(o2.typeOf(lineData)==="object"){
this.json.data.columnList.each( function (columnJson, i) {
array.push( lineData[columnJson.path] || "" )
}.bind(this));
if( lineData["o2ErrorText"] ){
array.push( lineData["o2ErrorText"] );
}
}
resultArr.push( array );
}.bind(this));
}else{
this.rowList.each( function( row, lineIndex ){
var lineData = row.importedData;
var array = [];
for( var i=0; i0){
return false;
}
var p = this.createData();
return Promise.resolve( p ).then(function (flag) {
this.importer.json.data.calculateFieldList.each( function (fieldJson, i) {
if( !fieldJson.path )return;
if( fieldJson.isName ){
var sourceData = this.calculateFieldDataMap[fieldJson.path];
var arr = typeOf( sourceData ) === "array" ? sourceData : [sourceData];
arr = typeOf( arr ) === "array" ? arr : [arr];
arr.each(function (d, idx) {
if( !d )return d;
var a;
switch (typeOf( d )) {
case "string":
a = d; break;
case "object":
a = d.distinguishedName || d.unique || d.employee; break;
}
if( !a )return d;
var obj = this.importer.getOrgData( a );
if( obj.errorText ){
var errorText = (fieldJson.displayName || fieldJson.path) + ":" + obj.errorText + lp.fullstop;
errorTextList.push( errorText );
errorTextListExcel.push( errorText );
}
}.bind(this));
}
}.bind(this));
this.errorTextList = this.errorTextList.concat( errorTextList );
this.errorTextListExcel = this.errorTextListExcel.concat( errorTextListExcel );
if( this.errorTextList.length > 0 )return false;
if( this.importer.json.type === "cms" ){
this.checkCMS( true );
}else if( this.importer.json.type === "process" ){
this.checkProcess( true );
}
if(this.errorTextList.length>0){
return false;
}
return true;
}.bind(this));
},
checkNecessary: function(){
var lp = this.lp;
var columnText = lp.importValidationColumnText;
var columnTextExcel = lp.importValidationColumnTextExcel;
var errorTextList = [];
var errorTextListExcel = [];
this.importer.json.data.columnList.each( function (columnJson, i) {
var colName = this.importer.excelUtils.index2ColName( i );
var colInfor = columnText.replace( "{n}", (i+1)+"("+colName+")" );
var colInforExcel = columnTextExcel.replace( "{n}", colName );
var value = this.importedData[i] || "";
var dataType = this.importer.json.type === "dynamicTable" ? columnJson.dataType_Querytable : columnJson.dataType_CMSProcess;
if( columnJson.validFieldType !== false && value ){
switch ( dataType ) {
case "json":
case "stringMap":
value = value.replace(/
/g,"");
try{
var d = JSON.parse(value);
}catch (e) {
errorTextList.push(colInfor + value + lp.notValidJson + lp.fullstop );
errorTextListExcel.push( colInforExcel + value + lp.notValidJson + lp.fullstop );
}
break;
default:
break;
}
}
}.bind(this));
this.errorTextList = this.errorTextList.concat( errorTextList );
this.errorTextListExcel = this.errorTextListExcel.concat( errorTextListExcel );
if(this.errorTextList.length>0){
return false;
}
var p = this.createData();
return Promise.resolve(p).then(function () {
if( this.importer.json.type === "cms" ){
this.checkCMS();
}else if( this.importer.json.type === "process" ){
this.checkProcess();
}
if(this.errorTextList.length>0){
return false;
}
return true;
}.bind(this))
},
getCol: function(key, isExcel){
var text, lp = this.lp;
if( this.pathIndexMap && typeOf(this.pathIndexMap[key]) === "number"){
var i = this.pathIndexMap[key];
if( isExcel ){
text = lp.importValidationColumnTextExcel;
return text.replace( "{n}", this.importer.excelUtils.index2ColName( i ) );
}else{
text = lp.importValidationColumnText;
return text.replace( "{n}", i+1 );
}
}
return "";
},
checkCMS : function( notCheckName ){
var lp = this.lp;
var errorTextList = [];
var errorTextListExcel = [];
var data = this.document.identity;
if(!data){
errorTextList.push( this.getCol("identity", false) + lp.noDrafter + lp.fullstop );
errorTextListExcel.push( this.getCol("identity", true) + lp.noDrafter + lp.fullstop );
}else if(data.split("@").getLast().toLowerCase() !== "i"){
errorTextList.push( this.getCol("identity", false) + '"'+ data +'"'+ lp.drafterIsNotIdentity + lp.fullstop );
errorTextListExcel.push( this.getCol("identity", true) + '"'+ data +'"'+ lp.drafterIsNotIdentity + lp.fullstop );
}
data = this.document.publishTime;
if(!data){
errorTextList.push(this.getCol("publishTime", false) + lp.noPublishTime + lp.fullstop );
errorTextListExcel.push(this.getCol("publishTime", false) + lp.noPublishTime + lp.fullstop );
}else if( ! new Date(data).isValid() ){
errorTextList.push(this.getCol("publishTime", false) + '"'+ data +'"'+ lp.publishTimeFormatError + lp.fullstop );
errorTextListExcel.push(this.getCol("publishTime", false) + '"'+ data +'"'+ lp.publishTimeFormatError + lp.fullstop );
}
data = this.document.title;
if( data && data.length > 70){
errorTextList.push(this.getCol("title", false) + '"'+ data +'"'+ lp.cmsTitleLengthInfor + lp.fullstop );
errorTextListExcel.push(this.getCol("title", false) + '"'+ data +'"'+ + lp.cmsTitleLengthInfor + lp.fullstop );
}
data = this.document.summary;
if( data && data.length > 70 ){
errorTextList.push(this.getCol("summary", false) + '"'+ data +'"'+ lp.cmsSummaryLengthInfor + lp.fullstop );
errorTextListExcel.push( this.getCol("summary", false) + '"'+ data +'"'+ lp.cmsSummaryLengthInfor + lp.fullstop );
}
this.errorTextList = this.errorTextList.concat( errorTextList );
this.errorTextListExcel = this.errorTextListExcel.concat( errorTextListExcel );
if(errorTextList.length > 0){
return false;
}
return true;
},
checkProcess : function( notCheckName ){
var lp = this.lp;
var json = this.importer.json;
var columnText = lp.importValidationColumnText;
var columnTextExcel = lp.importValidationColumnTextExcel;
var errorTextList = [];
var errorTextListExcel = [];
var data = this.work.identity;
if(!data){
errorTextList.push( this.getCol("identity", false) + lp.noDrafter + lp.fullstop );
errorTextListExcel.push( this.getCol("identity", true) + lp.noDrafter + lp.fullstop );
}else if(data.split("@").getLast().toLowerCase() !== "i"){
errorTextList.push( this.getCol("identity", false) + '"'+ data +'"'+ lp.drafterIsNotIdentity + lp.fullstop );
errorTextListExcel.push( this.getCol("identity", true) + '"'+ data +'"'+ lp.drafterIsNotIdentity + lp.fullstop );
}
if( json.data.processStatus === "completed" ){
if(!this.work.form){
errorTextList.push( lp.noForm + lp.fullstop );
errorTextListExcel.push( lp.noForm + lp.fullstop );
}
data = this.work.startTime;
if(!data){
errorTextList.push(this.getCol("startTime", false) + lp.noStartTime + lp.fullstop );
errorTextListExcel.push(this.getCol("startTime", false) + lp.noStartTime + lp.fullstop );
}else if( ! new Date(data).isValid() ){
errorTextList.push(this.getCol("startTime", false) + '"'+ data +'"'+ lp.startTimeFormatError + lp.fullstop );
errorTextListExcel.push(this.getCol("startTime", false) + '"'+ data +'"'+ lp.startTimeFormatError + lp.fullstop );
}
data = this.work.completeTime;
if(!data){
errorTextList.push(this.getCol("completeTime", false) + lp.noEndTime + lp.fullstop );
errorTextListExcel.push(this.getCol("completeTime", false) + lp.noEndTime + lp.fullstop );
}else if( ! new Date(data).isValid() ){
errorTextList.push(this.getCol("completeTime", false) + '"'+ data +'"'+ lp.endTimeFormatError + lp.fullstop );
errorTextListExcel.push(this.getCol("completeTime", false) + '"'+ data +'"'+ lp.endTimeFormatError + lp.fullstop );
}
}
this.errorTextList = this.errorTextList.concat( errorTextList );
this.errorTextListExcel = this.errorTextListExcel.concat( errorTextListExcel );
if(errorTextList.length > 0){
return false;
}
return true;
},
createData : function(){
var json = this.importer.json;
if( json.type === "cms" ){
this.document = {
categoryId : json.data.category.id,
readerList : [],
authorList : [],
docData : this.data
};
}else if( json.type === "process" ){
this.work = {
processFlag : json.data.process.id,
data: this.data
};
}
this.importer.fireEvent("beforeCreateRowData", [this]);
json.data.columnList.each( function (columnJson, i) {
if(!columnJson.path)return;
var value = this.importedData[i] || "";
if( !value && columnJson.defaultValueScript ){
value = this.importer.Macro.exec(columnJson.defaultValueScript, this);
}
var dataType = (json.type === "dynamicTable" ? columnJson.dataType_Querytable : columnJson.dataType_CMSProcess);
if( !value && ["number","double","integer","long"].contains(dataType) ){
value = 0;
}
if( !value && (typeOf(value) === "null" || value === "") )return;
var data = this.parseData(value, dataType, columnJson);
if( !data && data !== 0 && data !== false )return;
if( json.type === "dynamicTable" ){
this.data[ columnJson.path ] = data;
}else{
this.setDataWithPath(this.data, columnJson.path, data);
}
var array;
if( json.type === "cms" ){
if( columnJson.isName ) {
if (columnJson.isAuthor) {
array = this.parseCMSReadAndAuthor(data, "作者");
this.document.authorList = this.document.authorList.concat(array)
}
if (columnJson.isReader) {
array = this.parseCMSReadAndAuthor(data, "阅读");
this.document.readerList = this.document.readerList.concat(array)
}
}
}
}.bind(this));
var calculateOrgData = [], caculateMap = {};
json.data.calculateFieldList.each( function (fieldJson, i) {
if( !fieldJson.path )return;
if( !fieldJson.valueScript )return;
var data = this.importer.Macro.exec(fieldJson.valueScript, this);
this.calculateFieldDataMap[fieldJson.path] = data;
caculateMap[fieldJson.path] = data;
if( fieldJson.isName && data ){
switch (o2.typeOf(data)) {
case "array":
if(data.length)calculateOrgData = calculateOrgData.concat(data); break;
default:
calculateOrgData.push(data); break;
}
}
}.bind(this));
var p = this.importer.getOrgExtendData( calculateOrgData );
return Promise.resolve(p).then(function () {
json.data.calculateFieldList.each( function (fieldJson, i) {
if( !fieldJson.path )return;
if( !fieldJson.valueScript )return;
var data;
if( fieldJson.isName ){
var arr = caculateMap[fieldJson.path];
arr = typeOf( arr ) === "array" ? arr : [arr];
data = arr.map(function (d, idx) {
if( !d )return d;
var a;
switch (typeOf( d )) {
case "string":
a = d; break;
case "object":
a = d.distinguishedName || d.unique || d.employee; break;
}
if( !a )return d;
return this.importer.getOrgData( a, true, true );
}.bind(this));
data = data.clean();
}else{
data = caculateMap[fieldJson.path];
}
if( o2.typeOf(data) === "null" )return;
if( json.type === "dynamicTable" ){
this.data[ fieldJson.path ] = data;
}else{
this.setDataWithPath(this.data, fieldJson.path, data);
}
if( json.type === "cms" ){
if( fieldJson.isAuthor ){
var array = this.parseCMSReadAndAuthor( data, "作者" );
this.document.authorList = this.document.authorList.concat( array )
}
if( fieldJson.isReader ){
var array = this.parseCMSReadAndAuthor( data, "阅读" );
this.document.readerList = this.document.readerList.concat( array )
}
}
}.bind(this));
var array;
if( json.type === "cms" ){
this.document.docData = this.data;
if( json.data.documentPublisher === "importer" ){
array = layout.session.user.identityList;
if( array && array.length ){
this.document.identity = array[0].distinguishedName;
}
}else{
this.setDataWithField(this.document, "documentPublisherField", "identity", true);
}
if( json.data.documentPublishTime === "importer" ){
this.document.publishTime = new Date().format("db");
}else{
this.setDataWithField(this.document, "documentPublisherTimeField", "publishTime", false);
}
this.setDataWithField(this.document, "documentTitleField", "title", false);
if( !this.document.title )this.document.title = "无标题";
this.setDataWithField(this.document, "documentSummaryField", "summary", false);
}else if( json.type === "process" ){
this.work.data = this.data;
if( json.data.processDrafter === "importer" ){
array = layout.session.user.identityList;
if( array && array.length ){
this.work.identity = array[0].distinguishedName
}
}else{
this.setDataWithField(this.work, "processDrafterField", "identity", true);
}
this.setDataWithField(this.work, "processTitleField", "title", false);
if( !this.work.title )this.work.title = "无标题";
if( json.data.processStatus === "completed" ){
this.work.form = json.data.processForm || "";
this.setDataWithField(this.work, "processSerialField", "serial", false);
this.setDataWithField(this.work, "processStartTimeField", "startTime", false);
this.setDataWithField(this.work, "processCompleteTimeField", "completeTime", false);
}
}
this.importer.fireEvent("afterCreateRowData", [ this]);
}.bind(this));
},
parseData: function(value, dataType, json){
var data;
var type = this.importer.json.type;
switch ( dataType ) {
case "string":
case "stringList":
if( json.isName ){
var arr = this.stringToArray(value);
if( type === "dynamicTable" ){
data = arr
}else{
data = arr.map( function(d, idx){
return this.importer.getOrgData( d, true, true ) || d;
}.bind(this)).clean();
}
}else{
if( dataType === "string" ){
var linebreak = type === "dynamicTable" ? json.lineBreak_Querytable : json.lineBreak_CMSProcess;
if( typeOf(value) !== 'string' ){
data = value.toString ? value.toString() : (value || "");
}else{
data = value.replace(/
/g, linebreak || "" );
}
}else{
data = this.stringToArray(value);
}
}
break;
case "number":
case "double":
debugger;
if( value === 0 ){
data = 0;
}else{
value = value.replace(/
/g,"");
data = parseFloat(value);
}
break;
case "integer":
case "long":
if( value === 0 ){
data = 0;
}else {
value = value.replace(/
/g, "");
data = parseInt(value);
}
break;
case "numberList":
case "doubleList":
data = this.stringToArray(value).map( function(d, idx){ return parseFloat( d ); }.bind(this)).clean();
break;
case "integerList":
case "longList":
data = this.stringToArray(value).map( function(d, idx){ return parseInt( d ); }.bind(this)).clean();
break;
case "date":
value = value.replace(/
/g,"");
data = Date.parse(value).format( "%Y-%m-%d" );
break;
case "dateTime":
value = value.replace(/
/g,"");
data = Date.parse(value).format( "db" );
break;
case "dateList":
data = this.stringToArray(value).map( function(d, idx){ return Date.parse(d).format( "%Y-%m-%d" ); }.bind(this)).clean();
break;
case "dateTimeList":
data = this.stringToArray(value).map( function(d, idx){ return Date.parse(d).format( "db" ); }.bind(this)).clean();
break;
case "boolean":
value = value.replace(/
/g,"");
data = value.trim().toLowerCase() !== "false";
break;
case "booleanList":
data = this.stringToArray(value).map( function(d, idx){ return value.trim().toLowerCase() !== "false"; }.bind(this)).clean();
break;
case "json":
case "stringMap":
value = value.replace(/
/g,"");
data = JSON.parse(value);
break;
default:
data = value.replace(/
/g,"");
break;
}
return data;
},
stringToArray: function(string){
return string.replace(/[\n\r]/g,",").replace(/
/g,",").split(/\s*,\s*/g ).filter(function(s){
return !!s;
});
},
setDataWithPath: function(obj, path, data){
var names = path.split(".");
var d = obj;
Array.each(names, function (n, idx) {
if( idx === names.length -1 )return;
if ( !d[n] ){
var value = this.isNumberString( names[idx+1] ) ? [] : {};
var n1 = this.isNumberString( n ) ? n.toInt() : n;
d[n1] = value;
d = d[n1];
}else{
d = d[n];
}
}.bind(this));
d[names[names.length -1]] = data;
},
setDataWithField: function(obj, fieldName, path, isName){
if(!this.pathIndexMap)this.pathIndexMap = {};
if( !path )return;
var json = this.importer.json;
if( json.data[fieldName] ){
var f = json.data[fieldName];
json.data.columnList.each(function(json, i){
if(json.path === f)this.pathIndexMap[path] = i;
}.bind(this));
var d = this.data;
Array.each( f.split("."), function (n) {
if(this.isNumberString(n))n = n.toInt();
if (d) d = d[n];
}.bind(this));
if(!d)return;
var _d = (typeOf(d) === "array" && d.length) ? d[0] : d;
if( _d ){
if(isName){
obj[path] = typeOf(_d) === "object" ? _d.distinguishedName : _d;
}else{
obj[path] = d;
}
}
}
},
isNumberString: function(string){
return string.toInt().toString() === string;
},
parseCMSReadAndAuthor : function( data, t ){
var cnArray = ["组织","群组","人员","人员","角色"];
var keyArray = ["U","G","I","P","R"];
if( typeOf(data) !== "array" )data = [data];
return data.map( function( d ){
var dn = typeOf( d ) === "string" ? d : d.distinguishedName;
var name;
if( typeOf(d) === "object" && d.name ){
name = d.name;
}else if( MWF.name && MWF.name.cn ){
name = MWF.name.cn( dn );
}else{
name = dn.split("@")[0];
}
var index = keyArray.indexOf(dn.substr(dn.length-1, 1));
if( index > -1 ){
return {
"permission" : t,
"permissionObjectType": cnArray[ index ],
"permissionObjectName": name,
"permissionObjectCode": dn
}
}
}).clean()
},
getSrcData: function(){
var srcData = {};
this.importer.json.data.columnList.each( function (columnJson, i) {
if(columnJson.path)srcData[ columnJson.path ] = this.importedData[i] || "";
}.bind(this));
return srcData;
},
getResult: function(){
if( this.importer.json.type === "cms" ){
this.document.srcData = this.getSrcData(); //this.importedData;
return this.document;
}else if( this.importer.json.type === "process" ){
this.work.srcData = this.getSrcData(); //this.importedData;
return this.work;
}else if( this.importer.json.type === "dynamicTable" ){
this.data.srcData = this.getSrcData(); //this.importedData;
return this.data;
}
}
});
MWF.xDesktop.requireApp("Template", "utils.ExcelUtils", null, false);
MWF.xApplication.query.Query.Importer.ExcelUtils = new Class({
Extends: MWF.xApplication.Template.utils.ExcelUtils,
initialize: function( options ){
if(options)this.setOptions(options);
this.sheet2JsonOptions = {header:1};
this.pollyfill();
}
});
MWF.xApplication.query.Query.Importer.ProgressBar = new Class({
Implements: [Options, Events],
Extends: o2.widget.Common,
options: {
zindex: null,
disableDetailButton: false
},
initialize : function( importer, options ){
this.setOptions(options);
this.importer = importer;
this.actions = this.importer.lookupAction;
this.lp = MWF.xApplication.query.Query.LP;
this.css = importer.css;
this.openDlg();
this.status = "ready";
},
openDlg: function () {
var _self = this;
this.contentNode = new Element("div",{"styles": this.css.processContentNode});
var opt = {
"style" : "user",
"title": this.lp.importRecordDetail,
"content": this.contentNode,
"offset": {"y": 0},
"isMax": false,
"width": 500,
"height": 200,
"zindex": this.options.zindex,
"buttonList": [
{
"type": "openImportRecordDetail",
"text": this.lp.openImportRecordDetail,
"action": function () { _self.openImportRecordDetail(); }
},
{
"type": "cancel",
"text": this.lp.close,
"action": function () { this.dlg.close(); }.bind(this)
}
],
"onPostShow": function(){
this.fireEvent("postShow");
}.bind(this),
"onPostLoad": function () {
this.titleAction.hide();
this.button.hide();
},
"onPostClose": function(){
this.dlg = null;
}.bind(this)
};
if( this.options.disableDetailButton ){
opt.buttonList.splice(0, 1);
}
this.dlg = o2.DL.open(opt);
},
createNode: function( noProgress ){
// var lp = this.lp;
// this.maskNode = new Element("div",{"styles": this.css.maskNode}).inject(this.importer.container);
//
// this.node = new Element("div", {"styles": this.css.progressBarNode}).inject(this.importer.container);
//
// this.topNode = new Element("div",{"styles": this.css.progressTopNode}).inject(this.node);
//
// this.subjectNode = new Element("div",{"styles": this.css.progressSubjectNode}).inject(this.topNode);
//
// this.topCloseAction = new Element("div.topCloseAction", {
// "styles": this.css.progressTopCloseAction,
// "text": "x"
// }).inject(this.topNode);
// this.topCloseAction.hide();
// this.topCloseAction.addEvent("click", function(){
// this.close();
// }.bind(this))
//
// this.contentNode = new Element("div",{"styles": this.css.processContentNode}).inject(this.node);
//
// this.bottomNode = new Element("div", {"styles": this.css.progressBottomNode}).inject(this.node);
// this.bottomNode.hide();
//
// this.closeAction = new Element("div.closeAction", {
// "styles": this.css.progressCloseAction,
// "text": lp.close
// }).inject(this.bottomNode);
// this.closeAction.addEvent("click", function(){
// this.close();
// }.bind(this))
},
setContentHtml: function(noProgress){
var lp = this.lp;
var contentHTML = "";
if (noProgress){
// contentHTML = ""+lp.readyToImportData1+"
" ;
contentHTML =
"" +
"
"+lp.readyToImportData1+"
"+
"
" ;
this.contentNode.set("html", contentHTML );
this.progressNode = null;
this.progressPercentNode = null;
this.progressInforNode = this.contentNode.getElement(".mwf_progressInforNode");
this.progressInforNode.setStyles(this.css.progressInforNode)
}else{
contentHTML =
""+
"
" +
"
"+lp.readyToImportData1+"
"+
"
" ;
this.contentNode.set("html", contentHTML );
this.progressNode = this.contentNode.getElement(".mwf_progressNode");
this.progressNode.setStyles(this.css.progressNode);
this.progressPercentNode = this.contentNode.getElement(".mwf_progressPercentNode");
this.progressPercentNode.setStyles(this.css.progressPercentNode);
this.progressInforNode = this.contentNode.getElement(".mwf_progressInforNode");
this.progressInforNode.setStyles(this.css.progressInforNode)
}
},
showCheckData : function(){
// this.node.show();
this.setContentHtml(true);
this.setMessageTitle( this.lp.checkDataTitle );
this.setMessageText( this.lp.checkDataContent );
this.status = "check";
// this.setSize();
},
showImporting: function( recordId, callback, date ){
// this.node.show();
this.setContentHtml();
this.recordId = recordId;
this.currentDate = date || new Date();
this.intervalId = window.setInterval( function(){
this.actions.getImportModelRecordStatus( this.recordId, function( json ){
var data = json.data;
this.status = data.status;
if( data.status === "待导入" ) { //有其他人正在导入或上次导入还未完成
this.setMessageTitle(this.lp.importWaitingTitle);
this.setMessageText(this.lp.importWaitingContent);
}else if( data.status === "导入中" ){ //导入中
this.setMessageTitle( this.lp.importDataTitle );
this.setMessageText( this.lp.importDataContent.replace( "{count}", data.executeCount));
this.updateProgress( data );
}else{ //已经结束, 状态有 "导入成功","部分成功","导入失败"
if( callback )callback( data );
if( data.promise && typeOf(data.promise.then) === "function" ){
Promise.resolve( data.promise ).then(function () {
if(this.intervalId)window.clearInterval( this.intervalId );
this.transferComplete( data );
}.bind(this))
}else{
if(this.intervalId)window.clearInterval( this.intervalId );
this.transferComplete( data );
}
}
}.bind(this), null)
}.bind(this), 500 );
// this.setSize();
},
showCloseAction: function(){
this.dlg.titleAction.show();
this.dlg.button.show();
// if( this.bottomNode )this.bottomNode.show();
// if( this.topCloseAction )this.topCloseAction.show();
// this.setSize();
},
close: function(){
// this.maskNode.destroy();
// this.node.destroy();
this.dlg.close();
},
// setSize: function(){
// var containerSize = this.importer.container.getSize();
// var nodeSize = this.node.getSize();
// var top = (containerSize.y - nodeSize.y) / 2;
// var left = (containerSize.x - nodeSize.x) / 2;
// this.node.setStyles({
// "top": (top-40)+"px",
// "left": left+"px"
// })
// },
updateProgress: function(data){
//status, data.executeCount, data.count, data.failCount
var lp = this.lp;
var total = data.count.toInt();
var processed = data.executeCount.toInt();
var failCount = data.failCount.toInt();
var percent = 100*(processed/total);
var sendDate = new Date();
var lastDate = this.lastTime || this.currentDate;
var ms = sendDate.getTime() - lastDate.getTime();
var speed = ( (processed - ( this.lastProcessed || 0 )) * 1000)/ms ;
var u = lp.importSpeed;
speed = speed.round(2);
this.progressPercentNode.setStyle("width", ""+percent+"%");
var text = lp.importingDataContent.replace("{speed}",speed).replace("{total}",total).replace("{remaining}",( total - processed ));
text += failCount ? lp.importingDataErrorContent.replace("{errorCount}",failCount) : "";
this.progressInforNode.set("text", text);
this.lastProcessed = processed;
this.lastTime = new Date();
},
transferComplete: function( data ){
var lp = this.lp;
var sendDate = new Date();
var ms = sendDate.getTime()-this.currentDate.getTime();
if(ms<1000)ms = 1000;
var timeStr = "";
if (ms>3600000){
var h = ms/3600000;
var m_s = ms % 3600000;
var m = m_s / 60000;
var s_s = m_s % 60000;
var s = s_s/1000;
timeStr = ""+h.toInt()+lp.hour+m.toInt()+lp.mintue+s.toInt()+lp.second;
}else if (ms>60000){
var m = ms / 60000;
var s_s = ms % 60000;
var s = s_s/1000;
timeStr = ""+m.toInt()+lp.mintue+s.toInt()+lp.second;
}else{
var s = ms/1000;
timeStr = ""+s.toInt()+lp.second;
}
if( data.status === "导入成功" ){
var size = data.count;
var speed = (size * 1000)/ms ;
var u = lp.importSpeed;
speed = speed.round(2);
this.setMessageTitle( lp.importSuccessTitle );
var text = lp.importSuccessContent.replace("{total}",size).replace("{speed}",speed).replace("{timeStr}",timeStr);
this.setMessageText( text );
}else if(data.status === "部分成功"){
var size = data.count;
var speed = (size * 1000)/ms ;
var u = lp.importSpeed;
speed = speed.round(2);
this.setMessageTitle( lp.importPartSuccessTitle );
var text = lp.importPartSuccessContent.replace("{total}",size).replace("{speed}",speed).replace("{errorCount}",data.failCount).replace("{timeStr}",timeStr);
this.setMessageText( text );
}else{ //导入失败
var size = data.count;
this.setMessageTitle( lp.importFailTitle );
var text = lp.importFailContent.replace("{errorInfo}",data.distribution || "").replace("{total}",size).replace("{timeStr}",timeStr);
this.setMessageText( text );
}
this.clearMessageProgress();
this.showCloseAction();
},
setMessageText: function( text){
this.progressInforNode.set("text", text);
},
setMessageTitle: function( text){
this.dlg.titleText.set("text", text);
},
clearMessageProgress: function(){
this.progressNode.destroy();
},
openImportRecordDetail: function () {
MWF.xDesktop.requireApp("query.Query", "ImporterRecord", function () {
var detail = new MWF.xApplication.query.Query.ImporterRecord.Detail(
this.importer.container,
this.importer.app,
{ importerId: this.importerId, recordId: this.recordId }
);
detail.load();
this.dlg.close();
}.bind(this), false);
}
});