| 
					
				 | 
			
			
				@@ -196,69 +196,81 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getStageImTzData(tid, sid, fields, readCache = true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (readCache) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const cache = await this._getReportMemoryCache('mem_stage_im_tz', tid, sid, this.ctx.stage.cacheTime, stageImVersion); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (cache) return cache; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (readCache) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const cache = await this._getReportMemoryCache('mem_stage_im_tz', tid, sid, this.ctx.stage.cacheTime, stageImVersion); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (cache) return cache; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (!this.stageImData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this.stageImData = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    await this._generateStageIm(tid, sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (err.stack) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        this.ctx.logger.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!this.stageImData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.stageImData = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        await this._generateStageIm(tid, sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (err.stack) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            this.ctx.logger.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.stageImData.main = err.stack ? '数据错误' : err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.stageImData.bills = this.stageImData.main; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.stageImData.main = err.stack ? '数据错误' : err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.stageImData.bills = this.stageImData.main; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return this.stageImData.main; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return this.stageImData.main; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getStageImTzBillsData(tid, sid, fields, readCache = true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (readCache) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const cache = await this._getReportMemoryCache('mem_stage_im_tz_bills', tid, sid, this.ctx.stage.cacheTime, stageImVersion); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (cache) return cache; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (readCache) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const cache = await this._getReportMemoryCache('mem_stage_im_tz_bills', tid, sid, this.ctx.stage.cacheTime, stageImVersion); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (cache) return cache; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!this.stageImData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.stageImData = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        await this._generateStageIm(tid, sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (err.stack) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            this.ctx.logger.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.stageImData.main = err.stack ? '数据错误' : err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.stageImData.bills = this.stageImData.main; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return this.stageImData.bills; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        async getStageImZlData(tid, sid, fields, readCache = true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (readCache) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const cache = await this._getReportMemoryCache('mem_stage_im_zl', tid, sid, this.ctx.stage.cacheTime, stageImVersion); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (cache) return cache; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (!this.stageImData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.stageImData = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    await this._generateStageIm(tid, sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await this._generateStageIm(tid, sid, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (err.stack) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         this.ctx.logger.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.stageImData.main = err.stack ? '数据错误' : err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.stageImData.bills = this.stageImData.main; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.stageImData.main = err.statck ? '数据错误' : err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return this.stageImData.bills; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        async getStageImZlData(tid, sid, fields, readCache = true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (readCache) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const cache = await this._getReportMemoryCache('mem_stage_im_zl', tid, sid, this.ctx.stage.cacheTime, stageImVersion); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (cache) return cache; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.stageImData = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                await this._generateStageIm(tid, sid, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return this.stageImData.main; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (err.stack) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.ctx.logger.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this.stageImData.main = err.statck ? '数据错误' : err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return this.stageImData.main; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getMonthProgress(tid, fields) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -343,67 +355,71 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getStageBillsData(tid, sid, fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (sid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (sid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const billsData = await this.ctx.service.ledger.getData(this.ctx.tender.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExist(fields, billsFields.stageDgn)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const dgnData = await this.ctx.service.stageBillsDgn.getDgnData(this.ctx.tender.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (const d of dgnData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const l = this.ctx.helper._.find(billsData, {id: d.id}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.ctx.helper._.assignIn(l, d); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const billsData = await this.ctx.service.ledger.getData(this.ctx.tender.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExist(fields, billsFields.stageDgn)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const dgnData = await this.ctx.service.stageBillsDgn.getDgnData(this.ctx.tender.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const d of dgnData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const l = this.ctx.helper._.find(billsData, {id: d.id}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.ctx.helper._.assignIn(l, d); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExist(fields, billsFields.stage)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (this.ctx.stage.readOnly) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const curStage = await this.ctx.service.stageBills.getAuditorStageData(this.ctx.tender.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        this.ctx.stage.id, this.ctx.stage.curTimes, this.ctx.stage.curOrder); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.ctx.helper.assignRelaData(billsData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        {data: curStage, fields: ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp', 'postil'], prefix: '', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const curStage = await this.ctx.service.stageBills.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExist(fields, billsFields.stage)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (this.ctx.stage.readOnly) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const curStage = await this.ctx.service.stageBills.getAuditorStageData(this.ctx.tender.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            this.ctx.stage.id, this.ctx.stage.curTimes, this.ctx.stage.curOrder); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.ctx.helper.assignRelaData(billsData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            {data: curStage, fields: ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp', 'postil'], prefix: '', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const curStage = await this.ctx.service.stageBills.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.ctx.helper.assignRelaData(billsData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            {data: curStage, fields: ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp', 'postil'], prefix: '', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExist(fields, billsFields.stageEnd)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const preStage = this.ctx.stage.order > 1 ? await this.ctx.service.stageBillsFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     this.ctx.helper.assignRelaData(billsData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        {data: curStage, fields: ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp', 'postil'], prefix: '', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        {data: preStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExist(fields, billsFields.stageEnd)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const preStage = this.ctx.stage.order > 1 ? await this.ctx.service.stageBillsFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this.ctx.helper.assignRelaData(billsData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    {data: preStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.billsTree.loadDatas(billsData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.billsTree.calculateAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExist(fields, billsFields.bgl)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await this._calcBillsBgl(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExist(fields, billsFields.leafXmj)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this._calcLeafXmjRela(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return this.billsTree.getDatas([ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'code', 'b_code', 'name', 'unit', 'unit_price', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'deal_qty', 'deal_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'dgn_qty1', 'dgn_qty2', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'drawing_code', 'memo', 'node_type', 'is_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'final_tp', 'final_ratio', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'qc_bgl_code', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'chapter', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'leaf_xmj_id', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'sgfh_expr', 'sjcl_expr', 'qtcl_expr', 'contract_expr', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'deal_dgn_qty1', 'deal_dgn_qty2', 'c_dgn_qty1', 'c_dgn_qty2', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch(err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.billsTree.loadDatas(billsData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.billsTree.calculateAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExist(fields, billsFields.bgl)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                await this._calcBillsBgl(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExist(fields, billsFields.leafXmj)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this._calcLeafXmjRela(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return this.billsTree.getDatas([ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'code', 'b_code', 'name', 'unit', 'unit_price', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'deal_qty', 'deal_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'dgn_qty1', 'dgn_qty2', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'drawing_code', 'memo', 'node_type', 'is_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'final_tp', 'final_ratio', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'qc_bgl_code', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'chapter', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'leaf_xmj_id', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'sgfh_expr', 'sjcl_expr', 'qtcl_expr', 'contract_expr', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'deal_dgn_qty1', 'deal_dgn_qty2', 'c_dgn_qty1', 'c_dgn_qty2', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async _calcPosBgl() { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -430,40 +446,44 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getStagePosData(tid, sid, fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (sid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (sid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const posData = await this.ctx.service.pos.getAllDataByCondition({ where: {tid: this.ctx.tender.id }}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExist(fields, posFields.stage)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (this.ctx.stage.readOnly) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const curPosStage = await this.ctx.service.stagePos.getAuditorStageData2(this.ctx.tender.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        this.ctx.stage.id, this.ctx.stage.curTimes, this.ctx.stage.curOrder); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.ctx.helper.assignRelaData(posData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        {data: curPosStage, fields: ['contract_qty', 'qc_qty', 'contract_expr', 'postil'], prefix: '', relaId: 'pid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const curPosStage = await this.ctx.service.stagePos.getLastestStageData2(this.ctx.tender.id, this.ctx.stage.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const posData = await this.ctx.service.pos.getAllDataByCondition({ where: {tid: this.ctx.tender.id }}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExist(fields, posFields.stage)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (this.ctx.stage.readOnly) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const curPosStage = await this.ctx.service.stagePos.getAuditorStageData2(this.ctx.tender.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            this.ctx.stage.id, this.ctx.stage.curTimes, this.ctx.stage.curOrder); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.ctx.helper.assignRelaData(posData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            {data: curPosStage, fields: ['contract_qty', 'qc_qty', 'contract_expr', 'postil'], prefix: '', relaId: 'pid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const curPosStage = await this.ctx.service.stagePos.getLastestStageData2(this.ctx.tender.id, this.ctx.stage.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.ctx.helper.assignRelaData(posData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            {data: curPosStage, fields: ['contract_qty', 'qc_qty', 'contract_expr', 'postil'], prefix: '', relaId: 'pid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExist(fields, posFields.stageEnd)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const prePosStage = this.ctx.stage.order > 1 ? await this.ctx.service.stagePosFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     this.ctx.helper.assignRelaData(posData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        {data: curPosStage, fields: ['contract_qty', 'qc_qty', 'contract_expr', 'postil'], prefix: '', relaId: 'pid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        {data: prePosStage, fields: ['contract_qty', 'qc_qty'], prefix: 'pre_', relaId: 'pid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExist(fields, posFields.stageEnd)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const prePosStage = this.ctx.stage.order > 1 ? await this.ctx.service.stagePosFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this.ctx.helper.assignRelaData(posData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    {data: prePosStage, fields: ['contract_qty', 'qc_qty'], prefix: 'pre_', relaId: 'pid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.pos.loadDatas(posData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.pos.calculateAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.pos.loadDatas(posData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.pos.calculateAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExist(fields, posFields.bgl)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                await this._calcPosBgl(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExist(fields, posFields.bgl)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await this._calcPosBgl(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return this.pos.getDatas(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return this.pos.getDatas(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         _getStageValidRole () { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -492,193 +512,205 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getStageBillsCompareData(tid, sid, fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this._getStageValidRole(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const stage = this.ctx.stage, helper = this.ctx.helper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const validRole = this.stageValidRole; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const billsData = await this.ctx.service.ledger.getData(this.ctx.tender.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const allStageBills = await this.ctx.service.stageBills.getAllDataByCondition({where: {sid: sid}}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const stageBillsIndex = {}, timesLen = 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (const role of validRole) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const stageBills = this.ctx.helper._.filter(allStageBills, function (x) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return x.times < stage.curTimes || (x.times === stage.curTimes && x.order <= role.dataOrder); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this.ctx.helper._.pullAll(allStageBills, stageBills); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (const sb of stageBills) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const key = 'sb-' + sb.lid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const sbi = stageBillsIndex[key]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (sbi) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if ((sbi.times * timesLen + sbi.order) < (sb.times * timesLen + sb.order)) stageBillsIndex[key] = sb; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stageBillsIndex[key] = sb; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this._getStageValidRole(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const stage = this.ctx.stage, helper = this.ctx.helper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const validRole = this.stageValidRole; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const billsData = await this.ctx.service.ledger.getData(this.ctx.tender.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const allStageBills = await this.ctx.service.stageBills.getAllDataByCondition({where: {sid: sid}}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const stageBillsIndex = {}, timesLen = 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (const role of validRole) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const stageBills = this.ctx.helper._.filter(allStageBills, function (x) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return x.times < stage.curTimes || (x.times === stage.curTimes && x.order <= role.dataOrder); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.ctx.helper._.pullAll(allStageBills, stageBills); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const sb of stageBills) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const key = 'sb-' + sb.lid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const sbi = stageBillsIndex[key]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (sbi) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if ((sbi.times * timesLen + sbi.order) < (sb.times * timesLen + sb.order)) stageBillsIndex[key] = sb; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            stageBillsIndex[key] = sb; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const filterStageBills = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const prop in stageBillsIndex) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        filterStageBills.push(stageBillsIndex[prop]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.ctx.helper.assignRelaData(billsData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        {data: filterStageBills, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'r' + role.flowOrder + '_', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const filterStageBills = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (const prop in stageBillsIndex) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    filterStageBills.push(stageBillsIndex[prop]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this.ctx.helper.assignRelaData(billsData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    {data: filterStageBills, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'r' + role.flowOrder + '_', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExist(fields, billsFields.stageEnd)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const preStage = this.ctx.stage.order > 1 ? await this.ctx.service.stageBillsFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this.ctx.helper.assignRelaData(billsData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    {data: preStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.billsTree.loadDatas(billsData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExist(fields, billsFields.stageEnd)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const preStage = this.ctx.stage.order > 1 ? await this.ctx.service.stageBillsFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.ctx.helper.assignRelaData(billsData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        {data: preStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.billsTree.loadDatas(billsData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.billsTree.setting.calcFields = ['deal_tp', 'total_price', 'pre_contract_tp', 'pre_qc_tp', 'pre_gather_tp']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (const role of validRole) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const prefix = 'r' + role.flowOrder + '_'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this.billsTree.setting.calcFields.push(prefix + 'contract_tp', prefix + 'qc_tp', prefix + 'gather_tp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.billsTree.setting.calcFields = ['deal_tp', 'total_price', 'pre_contract_tp', 'pre_qc_tp', 'pre_gather_tp']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (const role of validRole) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const prefix = 'r' + role.flowOrder + '_'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.billsTree.setting.calcFields.push(prefix + 'contract_tp', prefix + 'qc_tp', prefix + 'gather_tp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.billsTree.calculateAll(function(node) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                let prefix = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (node.children && node.children.length === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    node.pre_gather_qty = helper.add(node.pre_contract_qty, node.pre_qc_qty); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.billsTree.calculateAll(function(node) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    let prefix = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (node.children && node.children.length === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        node.pre_gather_qty = helper.add(node.pre_contract_qty, node.pre_qc_qty); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for (const role of validRole) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            prefix = 'r' + role.flowOrder + '_'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            node[prefix + 'gather_qty'] = helper.add(node[prefix + 'contract_qty'], node[prefix + 'qc_qty']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    node.pre_gather_tp = helper.add(node.pre_contract_tp, node.pre_qc_tp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     for (const role of validRole) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         prefix = 'r' + role.flowOrder + '_'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        node[prefix + 'gather_qty'] = helper.add(node[prefix + 'contract_qty'], node[prefix + 'qc_qty']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        node[prefix + 'gather_tp'] = helper.add(node[prefix + 'contract_tp'], node[prefix + 'qc_tp']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExist(fields, billsFields.leafXmj)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this._calcLeafXmjRela(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                node.pre_gather_tp = helper.add(node.pre_contract_tp, node.pre_qc_tp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (const role of validRole) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    prefix = 'r' + role.flowOrder + '_'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    node[prefix + 'gather_tp'] = helper.add(node[prefix + 'contract_tp'], node[prefix + 'qc_tp']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExist(fields, billsFields.leafXmj)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this._calcLeafXmjRela(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return this.billsTree.getDefaultDatas(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // return this.billsTree.getDatas([ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',                 //8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'code', 'b_code', 'name', 'unit', 'unit_price',                                                         //5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'deal_qty', 'deal_tp', 'quantity', 'total_price', 'dgn_qty1', 'dgn_qty2',                               //6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'drawing_code', 'memo', 'node_type', 'is_tp',                                                           //4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'r0_contract_qty', 'r0_contract_tp', 'r0_qc_qty', 'r0_qc_tp', 'r0_gather_qty', 'r0_gather_tp',          //6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'r1_contract_qty', 'r1_contract_tp', 'r1_qc_qty', 'r1_qc_tp', 'r1_gather_qty', 'r1_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'r2_contract_qty', 'r2_contract_tp', 'r2_qc_qty', 'r2_qc_tp', 'r2_gather_qty', 'r2_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'r3_contract_qty', 'r3_contract_tp', 'r3_qc_qty', 'r3_qc_tp', 'r3_gather_qty', 'r3_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'r4_contract_qty', 'r4_contract_tp', 'r4_qc_qty', 'r4_qc_tp', 'r4_gather_qty', 'r4_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'r5_contract_qty', 'r5_contract_tp', 'r5_qc_qty', 'r5_qc_tp', 'r5_gather_qty', 'r5_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'r6_contract_qty', 'r6_contract_tp', 'r6_qc_qty', 'r6_qc_tp', 'r6_gather_qty', 'r6_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'r7_contract_qty', 'r7_contract_tp', 'r7_qc_qty', 'r7_qc_tp', 'r7_gather_qty', 'r7_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'r8_contract_qty', 'r8_contract_tp', 'r8_qc_qty', 'r8_qc_tp', 'r8_gather_qty', 'r8_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'r9_contract_qty', 'r9_contract_tp', 'r9_qc_qty', 'r9_qc_tp', 'r9_gather_qty', 'r9_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'r10_contract_qty', 'r10_contract_tp', 'r10_qc_qty', 'r10_qc_tp', 'r10_gather_qty', 'r10_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     'chapter',                                                                                              //1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return this.billsTree.getDefaultDatas(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // return this.billsTree.getDatas([ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',                 //8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'code', 'b_code', 'name', 'unit', 'unit_price',                                                         //5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'deal_qty', 'deal_tp', 'quantity', 'total_price', 'dgn_qty1', 'dgn_qty2',                               //6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'drawing_code', 'memo', 'node_type', 'is_tp',                                                           //4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'r0_contract_qty', 'r0_contract_tp', 'r0_qc_qty', 'r0_qc_tp', 'r0_gather_qty', 'r0_gather_tp',          //6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'r1_contract_qty', 'r1_contract_tp', 'r1_qc_qty', 'r1_qc_tp', 'r1_gather_qty', 'r1_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'r2_contract_qty', 'r2_contract_tp', 'r2_qc_qty', 'r2_qc_tp', 'r2_gather_qty', 'r2_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'r3_contract_qty', 'r3_contract_tp', 'r3_qc_qty', 'r3_qc_tp', 'r3_gather_qty', 'r3_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'r4_contract_qty', 'r4_contract_tp', 'r4_qc_qty', 'r4_qc_tp', 'r4_gather_qty', 'r4_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'r5_contract_qty', 'r5_contract_tp', 'r5_qc_qty', 'r5_qc_tp', 'r5_gather_qty', 'r5_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'r6_contract_qty', 'r6_contract_tp', 'r6_qc_qty', 'r6_qc_tp', 'r6_gather_qty', 'r6_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'r7_contract_qty', 'r7_contract_tp', 'r7_qc_qty', 'r7_qc_tp', 'r7_gather_qty', 'r7_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'r8_contract_qty', 'r8_contract_tp', 'r8_qc_qty', 'r8_qc_tp', 'r8_gather_qty', 'r8_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'r9_contract_qty', 'r9_contract_tp', 'r9_qc_qty', 'r9_qc_tp', 'r9_gather_qty', 'r9_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'r10_contract_qty', 'r10_contract_tp', 'r10_qc_qty', 'r10_qc_tp', 'r10_gather_qty', 'r10_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //     'chapter',                                                                                              //1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getStagePosCompareData(tid, sid, fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this._getStageValidRole(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const stage = this.ctx.stage, helper = this.ctx.helper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const validRole = this.stageValidRole; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const allStagePos = await this.ctx.service.stagePos.getAllDataByCondition({where: {sid: sid}}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const posData = await this.ctx.service.pos.getAllDataByCondition({ where: {tid: this.ctx.tender.id }}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const prePosStage = this.ctx.stage.order > 1 ? await this.ctx.service.stagePosFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.ctx.helper.assignRelaData(posData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                {data: prePosStage, fields: ['contract_qty', 'qc_qty'], prefix: 'pre_', relaId: 'pid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const stagePosIndex = {}, timesLen = 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (const role of validRole) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const stagePos = this.ctx.helper._.filter(allStagePos, function (x) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return x.times < stage.curTimes || (x.times === stage.curTimes && x.order <= role.dataOrder); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this.ctx.helper._.pullAll(allStagePos, stagePos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (const sp of stagePos) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const key = 'sp-' + sp.pid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const spi = stagePosIndex[key]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (spi) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if ((spi.times * timesLen + spi.order) < (sp.times * timesLen + sp.order)) stagePosIndex[key] = sp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stagePosIndex[key] = sp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const filterStagePos = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (const prop in stagePosIndex) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    filterStagePos.push(stagePosIndex[prop]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this._getStageValidRole(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const stage = this.ctx.stage, helper = this.ctx.helper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const validRole = this.stageValidRole; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const allStagePos = await this.ctx.service.stagePos.getAllDataByCondition({where: {sid: sid}}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const posData = await this.ctx.service.pos.getAllDataByCondition({ where: {tid: this.ctx.tender.id }}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const prePosStage = this.ctx.stage.order > 1 ? await this.ctx.service.stagePosFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.ctx.helper.assignRelaData(posData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    {data: filterStagePos, fields: ['contract_qty', 'qc_qty'], prefix: 'r' + role.flowOrder + '_', relaId: 'pid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    {data: prePosStage, fields: ['contract_qty', 'qc_qty'], prefix: 'pre_', relaId: 'pid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.pos.loadDatas(posData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.pos.calculateAll(function (p) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                p.pre_gather_qty = helper.add(p.pre_contract_qty, p.pre_qc_qty); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const stagePosIndex = {}, timesLen = 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 for (const role of validRole) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const prefix = 'r' + role.flowOrder + '_'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    p[prefix + 'gather_qty'] = helper.add(p[prefix + 'contract_qty'], p[prefix + 'qc_qty']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const stagePos = this.ctx.helper._.filter(allStagePos, function (x) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return x.times < stage.curTimes || (x.times === stage.curTimes && x.order <= role.dataOrder); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.ctx.helper._.pullAll(allStagePos, stagePos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const sp of stagePos) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const key = 'sp-' + sp.pid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const spi = stagePosIndex[key]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (spi) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if ((spi.times * timesLen + spi.order) < (sp.times * timesLen + sp.order)) stagePosIndex[key] = sp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            stagePosIndex[key] = sp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const filterStagePos = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const prop in stagePosIndex) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        filterStagePos.push(stagePosIndex[prop]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.ctx.helper.assignRelaData(posData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        {data: filterStagePos, fields: ['contract_qty', 'qc_qty'], prefix: 'r' + role.flowOrder + '_', relaId: 'pid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.pos.loadDatas(posData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.pos.calculateAll(function (p) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    p.pre_gather_qty = helper.add(p.pre_contract_qty, p.pre_qc_qty); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const role of validRole) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const prefix = 'r' + role.flowOrder + '_'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        p[prefix + 'gather_qty'] = helper.add(p[prefix + 'contract_qty'], p[prefix + 'qc_qty']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return this.pos.getDatas(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return this.pos.getDatas(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getStagePayData(tid, sid, fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const stage = this.ctx.stage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const stage = this.ctx.stage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const dealPay = await this.ctx.service.stagePay.getStagePays(this.ctx.stage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const dealPay = await this.ctx.service.stagePay.getStagePays(this.ctx.stage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (!this.ctx.stage.readOnly) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 计算 本期金额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const PayCalculator = require('../lib/pay_calc'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const payCalculator = new PayCalculator(this.ctx, this.ctx.stage, this.ctx.tender.info); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                await payCalculator.calculateAll(dealPay); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExist(fields, ['start_stage_order']) && this.ctx.stage.status !== audit.stage.status.checked) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (const dp of dealPay) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (!dp.start_stage_order || dp.start_stage_order === this.ctx.stage.order) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        dp.start_stage_order = this.ctx.helper.checkZero(dp.tp) ? null : this.ctx.stage.order; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!this.ctx.stage.readOnly) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 计算 本期金额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const PayCalculator = require('../lib/pay_calc'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const payCalculator = new PayCalculator(this.ctx, this.ctx.stage, this.ctx.tender.info); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await payCalculator.calculateAll(dealPay); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExist(fields, ['start_stage_order']) && this.ctx.stage.status !== audit.stage.status.checked) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const dp of dealPay) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (!dp.start_stage_order || dp.start_stage_order === this.ctx.stage.order) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            dp.start_stage_order = this.ctx.helper.checkZero(dp.tp) ? null : this.ctx.stage.order; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (this._checkFieldsExistReg(fields, 'r[0-9]+_tp')) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this._getStageValidRole(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const allStagePays = await this.ctx.service.stagePay.getAllDataByCondition({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    where: {sid: stage.id, stimes: stage.curTimes} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this._checkFieldsExistReg(fields, 'r[0-9]+_tp')) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this._getStageValidRole(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const allStagePays = await this.ctx.service.stagePay.getAllDataByCondition({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        where: {sid: stage.id, stimes: stage.curTimes} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (const [i, role] of this.stageValidRole.entries()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (i < this.stageValidRole.length - 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        const stagePays = this.ctx.helper._.filter(allStagePays, function (x) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            return x.stimes === stage.curTimes && x.sorder === role.dataOrder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        this.ctx.helper._.pullAll(allStagePays, stagePays); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        for (const sp of stagePays) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            const dp = dealPay.find(function (x) {return x.pid === sp.pid}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if (dp) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                dp['r' + role.flowOrder + '_tp'] = sp.tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const [i, role] of this.stageValidRole.entries()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (i < this.stageValidRole.length - 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            const stagePays = this.ctx.helper._.filter(allStagePays, function (x) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                return x.stimes === stage.curTimes && x.sorder === role.dataOrder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            this.ctx.helper._.pullAll(allStagePays, stagePays); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            for (const sp of stagePays) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                const dp = dealPay.find(function (x) {return x.pid === sp.pid}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                if (dp) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    dp['r' + role.flowOrder + '_tp'] = sp.tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            for (const dp of dealPay) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                dp['r' + role.flowOrder + '_tp'] = dp.tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        for (const dp of dealPay) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            dp['r' + role.flowOrder + '_tp'] = dp.tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return dealPay; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return dealPay; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         _getChangeConstName(define, value) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -755,58 +787,78 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getChangeData(tid, sid, fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this._generateChange(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return this.changeData.change; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this._generateChange(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return this.changeData.change; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getChangeBillsData(tid, sid, fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this._generateChange(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return this.changeData.bills; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this._generateChange(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return this.changeData.bills; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getStageJgcl(tid, sid, fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const data = await this.ctx.service.stageJgcl.getStageData(this.ctx.stage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const preData = await this.ctx.service.stageJgcl.getPreStageData(this.ctx.stage.order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (const d of data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const pd = this.ctx.helper._.find(preData, {uuid: d.uuid}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (pd) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    d.pre_arrive_qty = pd.arrive_qty; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    d.pre_arrive_tp = pd.arrive_tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    d.pre_deduct_qty = pd.deduct_qty; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    d.pre_deduct_tp = pd.deduct_tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const data = await this.ctx.service.stageJgcl.getStageData(this.ctx.stage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const preData = await this.ctx.service.stageJgcl.getPreStageData(this.ctx.stage.order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (const d of data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const pd = this.ctx.helper._.find(preData, {uuid: d.uuid}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (pd) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        d.pre_arrive_qty = pd.arrive_qty; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        d.pre_arrive_tp = pd.arrive_tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        d.pre_deduct_qty = pd.deduct_qty; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        d.pre_deduct_tp = pd.deduct_tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getStageBonus(tid, sid, fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const data = await this.ctx.service.stageBonus.getEndStageData(this.ctx.stage.order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const data = await this.ctx.service.stageBonus.getEndStageData(this.ctx.stage.order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getStageOther(tid, sid, fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.stage.checkStage(sid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const data = await this.ctx.service.stageOther.getStageData(this.ctx.stage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const preData = await this.ctx.service.stageOther.getPreStageData(this.ctx.stage.order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (const d of data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const pd = this.ctx.helper._.find(preData, {uuid: d.uuid}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (pd) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    d.pre_tp = pd.tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const data = await this.ctx.service.stageOther.getStageData(this.ctx.stage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const preData = await this.ctx.service.stageOther.getPreStageData(this.ctx.stage.order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (const d of data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const pd = this.ctx.helper._.find(preData, {uuid: d.uuid}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (pd) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        d.pre_tp = pd.tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getMaterial(tender_id, material_order, memFieldKeys) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -861,58 +913,62 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getSumStageBillsData(tid, sid, fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.ctx.service.tender.checkTender(tid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const billsData = await this.ctx.service.ledger.getData(this.ctx.tender.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const checkStageField = function (stageOrder) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (const f of fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (f.indexOf('s' + stageOrder + '_') >= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const billsData = await this.ctx.service.ledger.getData(this.ctx.tender.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const checkStageField = function (stageOrder) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const f of fields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (f.indexOf('s' + stageOrder + '_') >= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const calcFields = ['deal_tp', 'total_price'], calcPrefix = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const stages = this.ctx.service.stage.getValidStages(this.ctx.tender.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (const stage of stages) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (!checkStageField(stage.order)) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await this.ctx.service.stage.doCheckStage(stage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    calcFields.push('s' + stage.order + '_contract_tp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    calcFields.push('s' + stage.order + '_qc_tp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    calcFields.push('s' + stage.order + '_gather_tp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    calcFields.push('s' + stage.order + '_'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const curStage = stage.readOnly 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ? await this.ctx.service.stageBills.getAuditorStageData(this.ctx.tender.id, stage.id, stage.curTimes, stage.curOrder) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        : await this.ctx.service.stageBills.getLastestStageData(this.ctx.tender.id, stage.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.ctx.helper.assignRelaData(billsData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        {data: curStage, fields: ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp'], prefix: 's' + stage.order + '_', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const calcFields = ['deal_tp', 'total_price'], calcPrefix = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const stages = this.ctx.service.stage.getValidStages(this.ctx.tender.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (const stage of stages) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (!checkStageField(stage.order)) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                await this.ctx.service.stage.doCheckStage(stage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                calcFields.push('s' + stage.order + '_contract_tp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                calcFields.push('s' + stage.order + '_qc_tp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                calcFields.push('s' + stage.order + '_gather_tp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                calcFields.push('s' + stage.order + '_'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const curStage = stage.readOnly 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    ? await this.ctx.service.stageBills.getAuditorStageData(this.ctx.tender.id, stage.id, stage.curTimes, stage.curOrder) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    : await this.ctx.service.stageBills.getLastestStageData(this.ctx.tender.id, stage.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                this.ctx.helper.assignRelaData(billsData, [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    {data: curStage, fields: ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp'], prefix: 's' + stage.order + '_', relaId: 'lid'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const billsTree = new Ledger.billsTree(this.ctx, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                id: 'ledger_id', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                pid: 'ledger_pid', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                order: 'order', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                level: 'level', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                rootId: -1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                keys: ['id', 'tender_id', 'ledger_id'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                stageId: 'id', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                calcFields: calcFields, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                calc: function (node) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    for (const prefix of calcPrefix) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (node.children && node.children.length === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            node[prefix + 'gather_qty'] = self.ctx.helper.add(node[prefix + 'contract_qty'], node[prefix + 'qc_qty']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const billsTree = new Ledger.billsTree(this.ctx, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    id: 'ledger_id', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    pid: 'ledger_pid', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    order: 'order', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    level: 'level', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    rootId: -1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    keys: ['id', 'tender_id', 'ledger_id'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stageId: 'id', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    calcFields: calcFields, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    calc: function (node) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for (const prefix of calcPrefix) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if (node.children && node.children.length === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                node[prefix + 'gather_qty'] = self.ctx.helper.add(node[prefix + 'contract_qty'], node[prefix + 'qc_qty']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            node[prefix + 'gather_tp'] = self.ctx.helper.add(node[prefix + 'contract_tp'], node[prefix + 'qc_tp']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        node[prefix + 'gather_tp'] = self.ctx.helper.add(node[prefix + 'contract_tp'], node[prefix + 'qc_tp']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            billsTree.loadDatas(billsData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            billsTree.calculateAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return billsTree.getDefaultDatas(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                billsTree.loadDatas(billsData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                billsTree.calculateAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return billsTree.getDefaultDatas(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |