|  | @@ -23,72 +23,127 @@ let exportUtil = {
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      getIndexBills:function (bills) {
 | 
	
		
			
				|  |  |          return gljUtil.getIndexBills(bills,fixedFlag,_,scMathUtil);
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    getProjectInfo :async function (data) {
 | 
	
		
			
				|  |  | +        let result = await ajaxPost("/pm/api/exportProject",data);
 | 
	
		
			
				|  |  | +        return result;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    getProjectFile:async function(projectID,projectName){
 | 
	
		
			
				|  |  | +        let spString = "|----|";
 | 
	
		
			
				|  |  | +        let sumString = "";
 | 
	
		
			
				|  |  | +        let result = await exportUtil.getProjectInfo({projectID:projectID,type:"main",user_id: userID});
 | 
	
		
			
				|  |  | +        let result_arr = result.split(spString);
 | 
	
		
			
				|  |  | +        sumString = result_arr[0];
 | 
	
		
			
				|  |  | +        if(result_arr.length == 2){
 | 
	
		
			
				|  |  | +            let tenders = JSON.parse(result_arr[1]);
 | 
	
		
			
				|  |  | +            for(let t of tenders){
 | 
	
		
			
				|  |  | +                let tenderString = await exportUtil.getProjectInfo({projectID:t,rootProjectID:projectID,type:"sub",user_id: userID});
 | 
	
		
			
				|  |  | +                await  setTimeoutSync(null,500);//设置间隔
 | 
	
		
			
				|  |  | +                sumString = sumString + spString +tenderString;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }else {
 | 
	
		
			
				|  |  | +            throw new Error("数据错误 导出建设项目失败!");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        let blob = new Blob([sumString], {type: 'text/plain;charset=utf-8'});
 | 
	
		
			
				|  |  | +        return {
 | 
	
		
			
				|  |  | +            blob: blob,
 | 
	
		
			
				|  |  | +            fileName: projectName+".ybp"
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    exprotZBFX:async function (codes) {
 | 
	
		
			
				|  |  | +        let pr = new SCComponent.InitProgressBar();
 | 
	
		
			
				|  |  | +        pr.start('导出数据接口', '正在导出,请稍候……');
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            if(SEIObject.fileCache.length== 2){
 | 
	
		
			
				|  |  | +                let tem = SEIObject.fileCache.shift();
 | 
	
		
			
				|  |  | +                let fileArry =await XML_EXPORT_BASE.getExtractFile(codes,tem.extractData);
 | 
	
		
			
				|  |  | +                //添加招投标数据文件
 | 
	
		
			
				|  |  | +                SEIObject.fileCache = SEIObject.fileCache.concat(fileArry);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //导出建设项目数据
 | 
	
		
			
				|  |  | +                let projectFile = await exportUtil.getProjectFile(projectObj.project.property.rootProjectID,$("#rootProjectName").val());
 | 
	
		
			
				|  |  | +                //导出压缩包
 | 
	
		
			
				|  |  | +                SEIObject.fileCache.push(projectFile);
 | 
	
		
			
				|  |  | +                await saveZBFX(SEIObject.fileCache);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }catch (e){
 | 
	
		
			
				|  |  | +            console.log(e);
 | 
	
		
			
				|  |  | +            alert(e.message);
 | 
	
		
			
				|  |  | +        }finally {
 | 
	
		
			
				|  |  | +            pr.end();
 | 
	
		
			
				|  |  | +            $('#exportCode').modal('hide');
 | 
	
		
			
				|  |  | +            $('#exportIndex').modal('hide');
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        async function saveZBFX(fileData) {
 | 
	
		
			
				|  |  | +            let zip = new JSZip();
 | 
	
		
			
				|  |  | +            for (let file of fileData) {
 | 
	
		
			
				|  |  | +                zip.file(file.fileName, file.blob, {binary: true});
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            let zipFile = await zip.generateAsync({type: 'blob'});
 | 
	
		
			
				|  |  | +            saveAs(zipFile, '经济指标.ZBFX');
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -let SEIObject = {};
 | 
	
		
			
				|  |  | +let SEIObject = {
 | 
	
		
			
				|  |  | +    exporting:false,
 | 
	
		
			
				|  |  | +    fileCache:[],
 | 
	
		
			
				|  |  | +    errorMap:{},
 | 
	
		
			
				|  |  | +    selfChecked:false
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  async function selfChecking(projectID,exprotCall=false) {//自检和正式导出共用接口
 | 
	
		
			
				|  |  | -    let pr = new SCComponent.InitProgressBar();
 | 
	
		
			
				|  |  | -   if(!exprotCall) pr.start('导出数据接口', '正在自检,请稍候……');
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    //先检查招投标数据  - todo
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    //检查重庆指标接口数量
 | 
	
		
			
				|  |  | -    if(_.isEmpty(SEIObject.errorMap)){
 | 
	
		
			
				|  |  | -        let [errorMap,SEIFile] = await getSEIIndexFile(projectID);
 | 
	
		
			
				|  |  | -        if(errorMap) {
 | 
	
		
			
				|  |  | -            SEIObject.errorMap = errorMap;
 | 
	
		
			
				|  |  | -        }else {
 | 
	
		
			
				|  |  | -            SEIObject.fileCache.push(SEIFile);
 | 
	
		
			
				|  |  | +    if(SEIObject.selfChecked == false){//自检过了就不用重复自检了
 | 
	
		
			
				|  |  | +        let extraData = await XML_EXPORT_BASE.getExtractData();
 | 
	
		
			
				|  |  | +        SEIObject.errorMap = extraData.failList;
 | 
	
		
			
				|  |  | +        SEIObject.fileCache.push(extraData);
 | 
	
		
			
				|  |  | +        //检查重庆指标接口数量
 | 
	
		
			
				|  |  | +        if(_.isEmpty(SEIObject.errorMap)){
 | 
	
		
			
				|  |  | +            let [errorMap,SEIFile] = await getSEIIndexFile(projectID);
 | 
	
		
			
				|  |  | +            if(errorMap) {
 | 
	
		
			
				|  |  | +                SEIObject.errorMap = errorMap;
 | 
	
		
			
				|  |  | +            }else {
 | 
	
		
			
				|  |  | +                SEIObject.fileCache.push(SEIFile);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    _.isEmpty(SEIObject.errorMap)?alert("自检完成,未检测到错误数据。"): showExportError(SEIObject.errorMap);
 | 
	
		
			
				|  |  | +    if(_.isEmpty(SEIObject.errorMap)){
 | 
	
		
			
				|  |  | +        if(!exprotCall) alert("自检完成,未检测到错误数据。")
 | 
	
		
			
				|  |  | +    }else{
 | 
	
		
			
				|  |  | +        showExportError(SEIObject.errorMap);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      SEIObject.selfChecked = true;
 | 
	
		
			
				|  |  | -    if(!exprotCall) pr.end();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  async function exportSEI(projectID){
 | 
	
		
			
				|  |  |      if(!_.isEmpty(SEIObject.errorMap)) return showExportError(SEIObject.errorMap);//如果自检的时候已经有错误,直接提示;
 | 
	
		
			
				|  |  |      let pr = new SCComponent.InitProgressBar();
 | 
	
		
			
				|  |  | -    pr.start('导出数据接口', '正在导出文件,请稍候……');
 | 
	
		
			
				|  |  |      SEIObject.exporting = true;
 | 
	
		
			
				|  |  |      try {
 | 
	
		
			
				|  |  | -        if(!SEIObject.selfChecked){//没有经过自检,则从招投标接口开始取数据
 | 
	
		
			
				|  |  | -            await selfChecking(projectID,true);
 | 
	
		
			
				|  |  | -            if(!_.isEmpty(SEIObject.errorMap)) return  pr.end();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        //导出建设项目数据
 | 
	
		
			
				|  |  | -        //导出压缩包
 | 
	
		
			
				|  |  | -       // saveZBFX(SEIObject.fileCache);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        if(!SEIObject.selfChecked)  pr.start('导出数据接口', '正在自检,请稍候……');
 | 
	
		
			
				|  |  | +        await selfChecking(projectID,true);
 | 
	
		
			
				|  |  | +        pr.end();
 | 
	
		
			
				|  |  | +        await setTimeoutSync(null,300);//设置间隔
 | 
	
		
			
				|  |  | +        $('#exportCode').modal('show');
 | 
	
		
			
				|  |  |      }catch (e){
 | 
	
		
			
				|  |  |          console.log(e);
 | 
	
		
			
				|  |  | -    }finally {
 | 
	
		
			
				|  |  |          pr.end();
 | 
	
		
			
				|  |  | -        $('#exportCode').modal('show');
 | 
	
		
			
				|  |  | -        //SEIObject.exporting = false;
 | 
	
		
			
				|  |  | +        alert(e.message);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    async function saveZBFX(fileData) {
 | 
	
		
			
				|  |  | -        let zip = new JSZip();
 | 
	
		
			
				|  |  | -        for (let file of fileData) {
 | 
	
		
			
				|  |  | -            zip.file(file.fileName, file.blob, {binary: true});
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        let zipFile = await zip.generateAsync({type: 'blob'});
 | 
	
		
			
				|  |  | -        saveAs(zipFile, '经济指标.ZBFX');
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -function showExportError(errorMap) {
 | 
	
		
			
				|  |  | +function showExportError(errorMap) {//errorMap 如果是一个数组,则是招投标接口传过来的
 | 
	
		
			
				|  |  |      let infoList = [];
 | 
	
		
			
				|  |  | -    for(let name in errorMap){
 | 
	
		
			
				|  |  | -        infoList.push(`<span style="font-weight: bold">单位工程“${name}”下:</span>`);
 | 
	
		
			
				|  |  | -        for(let err of errorMap[name]){
 | 
	
		
			
				|  |  | -            infoList.push(err);
 | 
	
		
			
				|  |  | +    if(Array.isArray(errorMap)){
 | 
	
		
			
				|  |  | +        infoList = errorMap;
 | 
	
		
			
				|  |  | +    }else {
 | 
	
		
			
				|  |  | +        for(let name in errorMap){
 | 
	
		
			
				|  |  | +            infoList.push(`<span style="font-weight: bold">单位工程“${name}”下:</span>`);
 | 
	
		
			
				|  |  | +            for(let err of errorMap[name]){
 | 
	
		
			
				|  |  | +                infoList.push(err);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      if(infoList.length > 20){
 | 
	
	
		
			
				|  | @@ -578,8 +633,17 @@ async function getSEIIndexFile(projectID) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  $(function () {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    $("#export-index-check").click( function (){
 | 
	
		
			
				|  |  | -        selfChecking(projectObj.project.property.rootProjectID);
 | 
	
		
			
				|  |  | +    $("#export-index-check").click(async function (){
 | 
	
		
			
				|  |  | +        let pr = new SCComponent.InitProgressBar();
 | 
	
		
			
				|  |  | +        pr.start('导出数据接口', '正在自检,请稍候……');
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +           await selfChecking(projectObj.project.property.rootProjectID);
 | 
	
		
			
				|  |  | +        }catch (e){
 | 
	
		
			
				|  |  | +            console.log(e);
 | 
	
		
			
				|  |  | +        }finally {
 | 
	
		
			
				|  |  | +            pr.end();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |      $("#export-index-confirm").click(async function (){
 | 
	
		
			
				|  |  |          await  exportSEI(projectObj.project.property.rootProjectID);
 |