|  | @@ -187,6 +187,54 @@ module.exports = app => {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              return this.stageImData.main;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        async getMonthProgress(tid) {
 | 
	
		
			
				|  |  | +            const helper = this.ctx.helper;
 | 
	
		
			
				|  |  | +            await this.ctx.service.tender.checkTender(tid);
 | 
	
		
			
				|  |  | +            const tender = this.ctx.tender;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            const stages = await this.ctx.service.stage.getValidStages(tender.id);
 | 
	
		
			
				|  |  | +            const lastStage = stages.length > 0 ? stages[0] : null;
 | 
	
		
			
				|  |  | +            if (lastStage) {
 | 
	
		
			
				|  |  | +                await this.ctx.service.stage.checkStageGatherData(lastStage);
 | 
	
		
			
				|  |  | +                tender.gather_tp = helper.add(lastStage.contract_tp, lastStage.qc_tp);
 | 
	
		
			
				|  |  | +                tender.end_contract_tp = helper.add(lastStage.contract_tp, lastStage.pre_contract_tp);
 | 
	
		
			
				|  |  | +                tender.end_qc_tp = helper.add(lastStage.qc_tp, lastStage.pre_qc_tp);
 | 
	
		
			
				|  |  | +                tender.end_gather_tp = helper.add(tender.end_contract_tp, tender.end_qc_tp);
 | 
	
		
			
				|  |  | +                tender.pre_gather_tp = helper.add(lastStage.pre_contract_tp, lastStage.pre_qc_tp);
 | 
	
		
			
				|  |  | +                tender.yf_tp = lastStage.yf_tp;
 | 
	
		
			
				|  |  | +                tender.qc_ratio = helper.mul(helper.div(tender.end_qc_tp, tender.info.deal_param.contractPrice, 2), 100);
 | 
	
		
			
				|  |  | +                tender.sum = helper.add(tender.total_price, tender.end_qc_tp);
 | 
	
		
			
				|  |  | +                tender.pre_ratio = helper.mul(helper.div(tender.pre_gather_tp, tender.sum, 2), 100);
 | 
	
		
			
				|  |  | +                tender.cur_ratio = helper.mul(helper.div(tender.gather_tp, tender.sum, 2), 100);
 | 
	
		
			
				|  |  | +                tender.other_tp = helper.sub(helper.sub(tender.sum, tender.pre_gather_tp), tender.gather_tp);
 | 
	
		
			
				|  |  | +                tender.other_ratio = Math.max(0, 100 - tender.pre_ratio - tender.cur_ratio);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            const monthProgress = [];
 | 
	
		
			
				|  |  | +            for (const s of stages) {
 | 
	
		
			
				|  |  | +                if (s.s_time) {
 | 
	
		
			
				|  |  | +                    let progress = monthProgress.find(function (x) {
 | 
	
		
			
				|  |  | +                        return x.month === s.s_time;
 | 
	
		
			
				|  |  | +                    });
 | 
	
		
			
				|  |  | +                    if (!progress) {
 | 
	
		
			
				|  |  | +                        progress = {month: s.s_time};
 | 
	
		
			
				|  |  | +                        monthProgress.push(progress);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    progress.tp = helper.add(helper.add(progress.tp, s.contract_tp), s.qc_tp);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            monthProgress.sort(function (x, y) {
 | 
	
		
			
				|  |  | +                return Date.parse(x.month) - Date.parse(y.month);
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +            let sum = 0;
 | 
	
		
			
				|  |  | +            for (const p of monthProgress) {
 | 
	
		
			
				|  |  | +                p.ratio = helper.mul(helper.div(p.tp, tender.sum, 4), 100);
 | 
	
		
			
				|  |  | +                sum = helper.add(sum, p.tp);
 | 
	
		
			
				|  |  | +                p.end_tp = sum;
 | 
	
		
			
				|  |  | +                p.end_ratio = helper.mul(helper.div(p.end_tp, tender.sum, 4), 100);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return monthProgress;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      return ReportMemory;
 |