package com.gx.obe.evaluation.step.composite;

import java.math.BigDecimal;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.dom4j.Document;
import org.eclipse.swt.SWT;
import org.eclipse.swt.core.ImageResolver;
import org.eclipse.swt.core.MessageDialog;
import org.eclipse.swt.core.listener.RoundBorderLineListener;
import org.eclipse.swt.core.utils.WidgetUtils;
import org.eclipse.swt.core.widgets.ELink;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;

import com.gx.obe.ColorConstants;
import com.gx.obe.business.vo.PriceEvaluationFactor;
import com.gx.obe.common.file.enumeration.FileConstants;
import com.gx.obe.common.file.utils.ParsingXmlUtils;
import com.gx.obe.common.icons.IconsActivator;
import com.gx.obe.components.core.I18NEnum;
import com.gx.obe.components.core.enumeration.BidPriceEnum;
import com.gx.obe.components.core.enumeration.CommonEnum;
import com.gx.obe.components.core.util.MoneyUtils;
import com.gx.obe.evaluation.step.calculator.PriceScoreCalculator;
import com.gx.obe.evaluation.step.entity.CalculationResult;
import com.gx.obe.evaluation.step.inter.IPriceEvaluationTable;
import com.gx.obe.evaluation.step.listener.PriceReviewEvaluationListener;
import com.gx.obe.formula.PriceParam;
import com.gx.obe.message.Messages;
import com.gx.obe.util.utils.BigDecimalUtils;
import com.gx.obe.util.utils.NumberFormatUtils;
import com.gx.obe.util.utils.ObjectUtils;
import com.gx.obe.util.utils.SortUtils;
import com.gx.obe.util.utils.UuidUtils;
import com.gx.obe.util.utils.XmlUtils;
import com.gx.obe.web.entity.EvaluationFactorResult;
import com.gx.obe.web.entity.Supplier;
import com.gx.obe.web.entity.SupplierOpeningResult;
import com.gx.obe.web.entity.evaluation.EvaluationFactor;
import com.gx.obe.web.entity.evaluation.EvaluationStep;
import com.gx.obe.web.entity.expert.Expert;
import com.gx.obe.web.entity.expert.ExpertEvaluationResult;
import com.gx.obe.web.entity.price.BidPrice;
import com.gx.obe.web.entity.price.BidPriceResult;
import com.gx.obe.web.entity.tender.TenderProjectEntity;
import com.gx.obe.web.entity.tender.TenderProjectRuleEntity;
import com.gx.obe.web.service.BidPriceResultService;
import com.gx.obe.web.service.BidPriceService;
import com.gx.obe.web.service.SupplierService;
import com.gx.obe.web.service.evaluation.EvaluationFactorResultService;
import com.gx.obe.web.service.evaluation.EvaluationFactorService;
import com.gx.obe.web.service.expert.ExpertEvaluationResultService;
import com.gx.obe.web.service.expert.ExpertEvaluationStepService;
import com.swtdesigner.ResourceManager;
import com.swtdesigner.SWTResourceManager;

import de.kupzog.ktable.KTable;
import de.kupzog.ktable.KTableCellSelectionAdapter;
import de.kupzog.ktable.SWTX;
import de.kupzog.ktable.editors.KTableCellEditorText;
import de.kupzog.ktable.model.CommonKtableCModel;
import de.kupzog.ktable.renderers.CellAlignmentRender;
import de.kupzog.ktable.renderers.CellContentRender;
import de.kupzog.ktable.renderers.CellEditContentRender;
import de.kupzog.ktable.renderers.CellEditorRender;
import de.kupzog.ktable.renderers.CellImageRender;
import de.kupzog.ktable.renderers.CellRender;
import de.kupzog.ktable.renderers.CellTooltipRender;
import de.kupzog.ktable.renderers.FixedWrapCellRenderer;
import de.kupzog.ktable.renderers.TextWrapCellRenderer;

/**
 * @Description: 价格评审面板
 * @author guoyr
 */
public class PriceEvaluationTableComposite extends Composite implements IPriceEvaluationTable{

	private TenderProjectEntity tenderProjectEntity;
	private EvaluationStep evaluationStep;
	private TenderProjectRuleEntity tenderProjectRuleEntity;
	private Expert CURRENT_EXPERT;
	private ImageResolver imageResolver = new ImageResolver();
	private EvaluationFactorService evaluationFactorService = new EvaluationFactorService();
	private SupplierService supplierService = new SupplierService();
	private ExpertEvaluationStepService expertEvaluationStepService ;
	private EvaluationFactorResultService evaluationFactorResultService = new EvaluationFactorResultService();
	private ExpertEvaluationResultService expertEvaluationResultService;
	private BidPriceService bidPriceService ;
	private BidPriceResultService bidPriceResultService;
	private Composite evaluationComposite;
	private Composite composite_5;
	private Composite evaluationTableComposite;
	private StyledText evaluation_factor_memo;
	private StyledText computerDetailText;
	private List<EvaluationFactor> evaluationFactorList = new ArrayList<EvaluationFactor>();
	private List<PriceEvaluationFactor> priceEvaluationFactorList;
	private int maxLevel = 1;
	private List<Supplier> supplierList;
	private KTable resultKTable;
	private CommonKtableCModel commKTableModel;
	private int curRow = 0;
	private int curCol = 0;
	private boolean resultChanged = true;
	private String supplierName;
//	private Map<String, BigDecimal> defaultEvaluationFactorResultMap = null;
	// 记录供应商每个指标的评审结果
	private Map<String, BidPriceResult> supplierBidPriceResultMap;
	private Map<String, Map<String, EvaluationFactorResult>> supplierEvaluationFactorResultMap;
	// 价格得分计算公式
	private Map<String, PriceScoreCalculator> priceScoreCalculatorMap;
	// 记录专家对供应商的评审汇总结果
	private Map<String, ExpertEvaluationResult> expertEvaluationResultMap;
//	private User curUser;
	private boolean isShowError = false;
	private boolean hasFactorWeight = false;;
	private boolean hasBidPriceTotal = false;
	private int scoreRound = 2;
	private PriceReviewEvaluationListener listener;
	private boolean changeBasePrice = false;
	private boolean changePriceScore = false;
	private ELink goReviewButton;
	private boolean hasCalculator = false;
	private Composite tipsComposite;
	private ELink recalculation;
	private Label priceScoreTips;

	/**
	 * Create the composite.
	 * @param parent
	 * @param style
	 */
	public PriceEvaluationTableComposite(Composite parent, int style) {
		super(parent, style);
		GridLayout gridLayout = new GridLayout(1, false);
		gridLayout.marginHeight = 0;
		gridLayout.marginWidth = 0;
		setLayout(gridLayout);
		
		evaluationComposite = new Composite(this, SWT.NONE);
		evaluationComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		evaluationComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
		GridLayout gl_evaluationComposite = new GridLayout(1, false);
		gl_evaluationComposite.verticalSpacing = 0;
		gl_evaluationComposite.horizontalSpacing = 0;
		gl_evaluationComposite.marginHeight = 0;
		gl_evaluationComposite.marginWidth = 0;
		evaluationComposite.setLayout(gl_evaluationComposite);
		
		composite_5 = new Composite(evaluationComposite, SWT.NONE);
		GridData gd_composite_5 = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
		gd_composite_5.widthHint = 500;
		composite_5.setLayoutData(gd_composite_5);
		GridLayout gl_composite_5 = new GridLayout(1, false);
		gl_composite_5.marginHeight = 1;
		gl_composite_5.marginWidth = 1;
		gl_composite_5.verticalSpacing = 0;
		gl_composite_5.horizontalSpacing = 0;
		composite_5.setLayout(gl_composite_5);
		composite_5.setBackgroundMode(SWT.INHERIT_FORCE);
		
		evaluation_factor_memo = new StyledText(composite_5, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
		evaluation_factor_memo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		evaluation_factor_memo.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL));
		evaluation_factor_memo.setText("");
		
		computerDetailText = new StyledText(composite_5, SWT.MULTI | SWT.WRAP);
		computerDetailText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		computerDetailText.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL));
		computerDetailText.setText("");
		
		tipsComposite = new Composite(evaluationComposite, SWT.NONE);
		GridLayout gl_tipsComposite = new GridLayout(4, false);
		gl_tipsComposite.marginWidth = 0;
		gl_tipsComposite.marginHeight = 0;
		gl_tipsComposite.horizontalSpacing = 0;
		tipsComposite.setLayout(gl_tipsComposite);
		tipsComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
		
//		CLabel tips = new CLabel(tipsComposite, SWT.NONE);
//		tips.setForeground(ColorConstants.FONT_BLACK_COLOR);
//		tips.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL));
//		tips.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/tips_blue.png"));
//		tips.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true, 1, 1));
//		tips.setText("");
		
		priceScoreTips = new Label(tipsComposite, SWT.WRAP);
		priceScoreTips.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
		priceScoreTips.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL));
		GridData gd_tips = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
		gd_tips.widthHint = 500;
		priceScoreTips.setLayoutData(gd_tips);
		priceScoreTips.setText(Messages.Tips_checkScoreBeforeSavePriceEvaluation);
	
		goReviewButton = new ELink(tipsComposite, SWT.NONE);
		goReviewButton.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/edit.png"));
		goReviewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseUp(MouseEvent e) {
				listener.priceReviewEvaluation();
			}
		});
		goReviewButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, true, 1, 1));
		goReviewButton.setText(Messages.Button_correctionBidPrice);
		
		recalculation = new ELink(tipsComposite, SWT.NONE);
		recalculation.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/refresh.png"));
		recalculation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
		recalculation.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL));
		recalculation.setText(Messages.Button_recalculatePriceScore);
		recalculation.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseUp(MouseEvent e) {
				recalculationAction();
			}
		});
		
		evaluationTableComposite = new Composite(evaluationComposite, SWT.NONE);
		evaluationTableComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
		evaluationTableComposite.addPaintListener(new RoundBorderLineListener(ColorConstants.BORDER_LINE_COLOR));
		GridLayout gl_evaluationTableComposite = new GridLayout(1, false);
		gl_evaluationTableComposite.marginHeight = 1;
		gl_evaluationTableComposite.marginWidth = 1;
		evaluationTableComposite.setLayout(gl_evaluationTableComposite);
		GridData gd_evaluationTableComposite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
		gd_evaluationTableComposite.minimumHeight = 200;
		evaluationTableComposite.setLayoutData(gd_evaluationTableComposite);
		expertEvaluationStepService = new ExpertEvaluationStepService();
		bidPriceService = new BidPriceService();
		expertEvaluationResultService = new ExpertEvaluationResultService();
	}
	
	/**
	 * @Description: 重新计算报价得分按钮点击事件
	 * @author chenxw 
	 */
	private void recalculationAction() {
		if (!MessageDialog.openConfirm(getShell(), Messages.Button_recalculatePriceScore, MessageFormat.format(Messages.Tips_confirmOperate, Messages.Button_recalculatePriceScore), new String[]{Messages.Button_confirm, Messages.Button_cancel})) {
			return;
		}
		if (expertEvaluationResultService.deleteExpertEvaluationAndFactorResult(tenderProjectEntity.getId(), evaluationStep.getId(), CURRENT_EXPERT.getUserId())) {
			drawLeftSupplierEvaluationTable();
		}
	}

	/**
	 * @Description: 初始化
	 * @author guoyr
	 */
	public void refresh(TenderProjectEntity tenderProjectEntity, TenderProjectRuleEntity tenderProjectRuleEntity, Expert curExpert, EvaluationStep evaluationStep, List<Supplier> supplierList){
		this.tenderProjectEntity = tenderProjectEntity;
		this.tenderProjectRuleEntity = tenderProjectRuleEntity;
		this.evaluationStep = evaluationStep;
		this.CURRENT_EXPERT = curExpert;
		this.supplierList = supplierList;
		
		if(!ObjectUtils.equals(tenderProjectRuleEntity.getCorrectPrice(), CommonEnum.YES)){
			WidgetUtils.setControlVisible(goReviewButton, false);
		}
		
		supplierName = com.gx.obe.components.core.I18N.getString(I18NEnum.SUPPLIERNAME, tenderProjectEntity.getTenderType());
		curRow = 0;
		curCol = 0;
		// 修改评标专家的评审记录
//		expertEvaluationStepService.updateExpertEvaluationStatus(CommonEnum.IN_PROGRESS, tenderProjectEntity.getId(), evaluationStep, CURRENT_EXPERT.getUserId());
		scoreRound = tenderProjectRuleEntity.getScoreRoundIntVal();
		hasBidPriceTotal = evaluationFactorService.hasTotalBidPriceFactor(tenderProjectEntity.getId(), null);
		
		changeBasePrice = evaluationStep.getEvaluationParamByKey(com.gx.obe.components.core.enumeration.EvaluationStepEnum.PARAM_CHANGEBASEPRICE, Boolean.class);
		changePriceScore = evaluationStep.getEvaluationParamByKey(com.gx.obe.components.core.enumeration.EvaluationStepEnum.PARAM_CHANGEPRICESCORE, Boolean.class);
		
		
		drawLeftSupplierEvaluationTable();
		resultChanged = true;
	}
	
	/**
	 * @Description: 初始化当前评标步骤的评审指标
	 * @author guoyr
	 */
	private void initEvaluationStepFactor(){
		evaluationFactorList.clear();
		maxLevel = 1;
		List<EvaluationFactor> evaluationTopFactorList = evaluationFactorService.getEvaluationStepFactorTreeList(tenderProjectEntity.getId(), evaluationStep);
		hasFactorWeight = false;
		if(null != evaluationTopFactorList && evaluationTopFactorList.size() > 0){
			for(EvaluationFactor topFactor : evaluationTopFactorList){
				// 当前评标步骤是否存在权重
				if(null != topFactor.getFactorWeight() && (topFactor.getFactorWeight().compareTo(BigDecimal.ZERO) >0 && topFactor.getFactorWeight().compareTo(new BigDecimal(100)) < 0)){
					hasFactorWeight = true;
				}
				initAddChildEvaluationFactor(topFactor);
			}
		}
	}
	
	/**
	 * @Description: 递归获取所有的评审叶子指标
	 * @author guoyr
	 * @param evalFactor
	 */
	private void initAddChildEvaluationFactor(EvaluationFactor evalFactor){
		if(null != evalFactor.getChildFactorList() && evalFactor.getChildFactorList().size() > 0){
			for(EvaluationFactor childFactor : evalFactor.getChildFactorList()){
				childFactor.setLevel(evalFactor.getLevel() + 1);
				initAddChildEvaluationFactor(childFactor);
			}
		}else {
			maxLevel = Math.max(maxLevel, evalFactor.getLevel());
			evaluationFactorList.add(evalFactor);
		}
	}
	
	/**
	 * @Description: 评审表格点击事件
	 * @author guoyr
	 * @param row
	 * @param col
	 */
	private void resultClickEventAction(Supplier supplier, EvaluationFactor evaluationFactor, EvaluationFactorResult  evalFactorResult){
		
		evaluation_factor_memo.setText("");
		if(null != evaluationFactor){
			PriceParam priceParam = PriceParam.deserializePriceParam(evaluationFactor.getComputerParams());
			String evalStructMessage = priceParam.getEvalStructMessage();
			StringBuilder evaluationFactorMemo = new StringBuilder();
			evaluationFactorMemo.append(Messages.ScoreRange + ":[").append(null != evaluationFactor.getFactorMinScore() ? NumberFormat.getInstance().format(evaluationFactor.getFactorMinScore()) : " ").append("-").append(null != evaluationFactor.getFactorMaxScore() ? NumberFormat.getInstance().format(evaluationFactor.getFactorMaxScore()) : "").append(Messages.Points + "]");
			if(null != evaluationFactor.getFactorWeight()){
				evaluationFactorMemo.append("("+Messages.Weight+"").append(BigDecimalUtils.round(evaluationFactor.getFactorWeight(), 2).toString()).append("%)");
			}
			StyleRange styleScoreRange = new StyleRange(); 
			styleScoreRange.start = Messages.ScoreRange.length() + 1; 
			styleScoreRange.length = evaluationFactorMemo.length() - (Messages.ScoreRange.length() + 1); 
			styleScoreRange.foreground = SWTResourceManager.getColor(77, 163, 19); 
			styleScoreRange.fontStyle = SWT.BOLD; 
			evaluationFactorMemo.append("   ");
			
			int startIndex = evaluationFactorMemo.length();
			evaluationFactorMemo.append(Messages.EvalFactor + ":");
			StyleRange factorNameTitleStyleRange = getTitleStyleRange(startIndex, Messages.EvalFactor.length() + 1);
			
			StyleRange styleFactorNameRange = new StyleRange(); 
			styleFactorNameRange.start = startIndex + Messages.EvalFactor.length() + 1; 
			styleFactorNameRange.length = evaluationFactor.getFactorName().length(); 
			styleFactorNameRange.foreground = SWTResourceManager.getColor(20, 20, 20); 
			styleFactorNameRange.fontStyle = SWT.NORMAL; 
			evaluationFactorMemo.append(evaluationFactor.getFactorName());
			
			StyleRange factorMemoTitleStyleRange = null;
			StyleRange factorMemoTitleStyleRange1 = null;
			StyleRange styleFactorMemoRange = null;
			if(null != evaluationFactor.getMemo() && evaluationFactor.getMemo().length() > 0){
				evaluationFactorMemo.append("\r\n");
				startIndex = evaluationFactorMemo.length();
				if(parserStructProject()) {
					evaluationFactorMemo.append(Messages.EvalExplainPrice).append(":").append(evalStructMessage).append(evalStructMessage.contains("\n") ? "" : "\n");
					factorMemoTitleStyleRange = getTitleStyleRange(startIndex, Messages.EvalExplainPrice.length() + 1);
					styleFactorMemoRange = new StyleRange(); 
					styleFactorMemoRange.start = startIndex + Messages.EvalExplainPrice.length() + 1; 
					styleFactorMemoRange.length = evalStructMessage.length(); 
					styleFactorMemoRange.foreground = SWTResourceManager.getColor(100, 100, 100); 
					styleFactorMemoRange.fontStyle = SWT.NORMAL;
					startIndex = evaluationFactorMemo.length();
					evaluationFactorMemo.append(Messages.BidExplainPrice).append(":").append(evaluationFactor.getMemo());
					factorMemoTitleStyleRange1 = getTitleStyleRange(startIndex, Messages.BidExplainPrice.length() + 1);
					StyleRange styleFactorMemoRange1 = new StyleRange(); 
					styleFactorMemoRange1.start = startIndex + Messages.BidExplainPrice.length() + 1; 
					styleFactorMemoRange1.length = evaluationFactor.getMemo().length(); 
					styleFactorMemoRange1.foreground = SWTResourceManager.getColor(100, 100, 100); 
					styleFactorMemoRange1.fontStyle = SWT.NORMAL;
					
				}else {
					factorMemoTitleStyleRange = getTitleStyleRange(startIndex, Messages.EvalExplain.length() + 1);
					evaluationFactorMemo.append(Messages.EvalExplain + ":").append(evaluationFactor.getMemo());
					styleFactorMemoRange = new StyleRange(); 
					styleFactorMemoRange.start = startIndex + Messages.EvalExplain.length() + 1; 
					styleFactorMemoRange.length = evaluationFactor.getMemo().length(); 
					styleFactorMemoRange.foreground = SWTResourceManager.getColor(100, 100, 100); 
					styleFactorMemoRange.fontStyle = SWT.NORMAL; 
				}
				
				
			}
			evaluation_factor_memo.setText(evaluationFactorMemo.toString());
			evaluation_factor_memo.setStyleRange(getTitleStyleRange(0, Messages.EvalExplain.length() + 1));
			evaluation_factor_memo.setStyleRange(styleScoreRange);
			evaluation_factor_memo.setStyleRange(factorNameTitleStyleRange);
			evaluation_factor_memo.setStyleRange(styleFactorNameRange);
			GridData gridData = (GridData)evaluation_factor_memo.getLayoutData();
			if(evaluation_factor_memo.computeSize(SWT.DEFAULT, SWT.DEFAULT).y > 58){
				gridData.heightHint = evaluation_factor_memo.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
			}

			if(null != factorMemoTitleStyleRange){
				evaluation_factor_memo.setStyleRange(factorMemoTitleStyleRange);
				if(factorMemoTitleStyleRange1 != null) {
					evaluation_factor_memo.setStyleRange(factorMemoTitleStyleRange1);
				}
				evaluation_factor_memo.setStyleRange(styleFactorMemoRange);
			}
		}
		
		if(null != evalFactorResult && null != evalFactorResult.getEvaluationOpinion() && evalFactorResult.getEvaluationOpinion().length() > 0){
			computerDetailText.setText(Messages.ComputationalProcess + ":"+evalFactorResult.getEvaluationOpinion());
			StyleRange computerDetailStyleRange = getTitleStyleRange(Messages.ComputationalProcess.length() + 1, evalFactorResult.getEvaluationOpinion().length());
			computerDetailStyleRange.foreground = SWTResourceManager.getColor(77, 163, 19); 
//			computerDetailStyleRange.fontStyle = SWT.NORMAL; 
			computerDetailText.setStyleRange(getTitleStyleRange(0, Messages.ComputationalProcess.length() + 1));
			computerDetailText.setStyleRange(computerDetailStyleRange);
			((GridData)computerDetailText.getLayoutData()).exclude = false;
			computerDetailText.setVisible(true);
		}else {
			((GridData)computerDetailText.getLayoutData()).exclude = true;
			computerDetailText.setVisible(false);
		}
		
		computerDetailText.getParent().layout();
		evaluationComposite.layout();
	}
	
	private StyleRange getTitleStyleRange(int start, int length){
		StyleRange styleRange = new StyleRange(); 
		styleRange.start = start; 
		styleRange.length = length; 
//		styleRange.foreground = SWTResourceManager.getColor(SWT.COLOR_WHITE); 
		styleRange.foreground = SWTResourceManager.getColor(SWT.COLOR_BLUE);
		styleRange.fontStyle = SWT.BOLD; 
		return styleRange;
	}
	
	/**
	 * @Description: 初始化评标结果
	 * @author guoyr 
	 */
	private void initEvaluationResult(){
		
		initEvaluationStepFactor();
		if(null == evaluationFactorList)evaluationFactorList = new ArrayList<EvaluationFactor>();
		priceEvaluationFactorList = new ArrayList<PriceEvaluationFactor>();
		
		// 记录供应商每个指标的评审结果
		supplierEvaluationFactorResultMap = new HashMap<String, Map<String, EvaluationFactorResult>>();
		
		// 记录供应商的评审汇总结果
//		supplierEvaluationStepResultMap = new HashMap<String, SupplierEvaluationStep>();
		
		// 价格得分计算公式
		priceScoreCalculatorMap = new HashMap<String, PriceScoreCalculator>();
		hasCalculator = false;
		// 记录专家对供应商的评审汇总结果
		expertEvaluationResultMap = new HashMap<String, ExpertEvaluationResult>();
		
		// 评审当前评标专家所有的评标结果
		List<EvaluationFactorResult> expertEvaluateFactorResultList = evaluationFactorResultService.getExpertEvaluationFactorResult(tenderProjectEntity.getId(), evaluationStep.getId(), CURRENT_EXPERT.getUserId(), null);
		
		List<ExpertEvaluationResult> queryExpertEvaluationResultList = expertEvaluationResultService.getExpertStepAllSupplierEvaluationResultList(tenderProjectEntity.getId(), evaluationStep.getId(), CURRENT_EXPERT.getUserId());
		
		Map<String, EvaluationFactorResult> priceFactorResultMap = null;
		if(null != expertEvaluateFactorResultList && expertEvaluateFactorResultList.size() > 0){
			priceFactorResultMap = new HashMap<String, EvaluationFactorResult>();
			for(EvaluationFactorResult factorResult : expertEvaluateFactorResultList){
				priceFactorResultMap.put(factorResult.getSupplierId()+factorResult.getFactorId(), factorResult);
			}
		}
		
		Supplier firstSupplier = null;
		EvaluationFactor firstEvaluationFactor = null;
		EvaluationFactorResult firstEvaluationFactorResult = null;
		List<Double> sortList = new ArrayList<Double>();
		for(Supplier supplier : supplierList){
			
			// 获取评标专家对投标人的评审记录
			ExpertEvaluationResult expertEvaluationResult = null;
			if(null != queryExpertEvaluationResultList && queryExpertEvaluationResultList.size() > 0){
				for(ExpertEvaluationResult queryExpertEvaluationResult : queryExpertEvaluationResultList){
					if(ObjectUtils.equals(queryExpertEvaluationResult.getSupplierId(), supplier.getId())){
						expertEvaluationResult = queryExpertEvaluationResult;
					}
				}
			}
			if(null == expertEvaluationResult){
				expertEvaluationResult = new ExpertEvaluationResult();
				expertEvaluationResult.setTenderId(tenderProjectEntity.getId());
				expertEvaluationResult.setStepId(evaluationStep.getId());
				expertEvaluationResult.setUserId(CURRENT_EXPERT.getUserId());
				expertEvaluationResult.setSupplierId(supplier.getId());
			}
			Map<String, EvaluationFactorResult> evaluationFactorResultMap = new HashMap<String, EvaluationFactorResult>();
			BigDecimal totalEvaluationScore = null;
			BigDecimal totalEvaluationFinalScore = null;
			
			for(EvaluationFactor evaluationFactor : evaluationFactorList){
				// 获得已评审的结果
				EvaluationFactorResult evaluationFactorResult = null;
				if(null != expertEvaluateFactorResultList && expertEvaluateFactorResultList.size() > 0){
					for(EvaluationFactorResult factorResult : expertEvaluateFactorResultList){
						if(ObjectUtils.equals(supplier.getId(), factorResult.getSupplierId()) && ObjectUtils.equals(evaluationFactor.getId(), factorResult.getFactorId())){
							evaluationFactorResult = factorResult;
							break;
						}
					}
				}
				if(null == evaluationFactorResult){
					evaluationFactorResult = new EvaluationFactorResult();
					evaluationFactorResult.setTenderId(tenderProjectEntity.getId());
					evaluationFactorResult.setStepId(evaluationStep.getId());
					evaluationFactorResult.setUserId(CURRENT_EXPERT.getUserId());
					evaluationFactorResult.setSupplierId(supplier.getId());
					evaluationFactorResult.setFactorId(evaluationFactor.getId());
					evaluationFactorResult.setFactorName(evaluationFactor.getFactorName());
					evaluationFactorResult.setId(UuidUtils.getUUID());
				}
			
				if(null != evaluationFactorResult.getEvaluationScore()){
					totalEvaluationScore = BigDecimalUtils.add(totalEvaluationScore, evaluationFactorResult.getEvaluationScore());
				}
				evaluationFactorResult.setEvaluationFinalScore(getEvaluationFinalScore(evaluationFactor, evaluationFactorResult.getEvaluationScore()));
				if(null != evaluationFactorResult.getEvaluationFinalScore()){
					totalEvaluationFinalScore = BigDecimalUtils.add(totalEvaluationFinalScore, evaluationFactorResult.getEvaluationFinalScore());
				}
				
				evaluationFactorResultMap.put(evaluationFactor.getId(), evaluationFactorResult);
				
				if(null == firstEvaluationFactor){
					firstEvaluationFactor = evaluationFactor;
				}
				if(null == firstEvaluationFactorResult){
					firstEvaluationFactorResult = evaluationFactorResult;
				}
			}
			
			expertEvaluationResult.setAccessment(com.gx.obe.components.core.enumeration.EvaluationStepEnum.QUALIFIED);
			expertEvaluationResult.setEvaluationScore(totalEvaluationScore);
			expertEvaluationResult.setEvaluationFinalScore(totalEvaluationFinalScore);
			expertEvaluationResultMap.put(supplier.getId(), expertEvaluationResult);
			if(null != totalEvaluationFinalScore){
				sortList.add(totalEvaluationFinalScore.doubleValue());
			}
			if(null == firstSupplier){
				firstSupplier = supplier;
			}
		
			supplierEvaluationFactorResultMap.put(supplier.getId(), evaluationFactorResultMap);
		}
		
		List<BidPrice> bidPriceList = null;
		if(!hasBidPriceTotal){
			bidPriceList = bidPriceService.getTenderBidPriceList(tenderProjectEntity.getId());
		}
		
		// 记录供应商分项报价的结果
		supplierBidPriceResultMap = new HashMap<String, BidPriceResult>();
		int index = 0;
		for(EvaluationFactor evaluationFactor : evaluationFactorList){
			index ++;
			BidPrice factorBidPrice = null;
			PriceEvaluationFactor priceEvaluationFactorFinalScore = new PriceEvaluationFactor(evaluationFactor);
			if(null != bidPriceList && bidPriceList.size() > 0){
				for(BidPrice bidPrice : bidPriceList){
					// 如果当前指标是分项报价,且已设置公式,则说明对该报价用公式进行价格得分计算
					if(null != evaluationFactor.getBidPriceCode() && evaluationFactor.getBidPriceCode().equals(bidPrice.getBidPriceCode()) && null != evaluationFactor.getComputerParams()){
						factorBidPrice = bidPrice;
						break;
					}
				}
			}
			
			
			priceEvaluationFactorFinalScore.setBidPrice(factorBidPrice);
			
			if(null != factorBidPrice){
				// 添加报表列
				priceEvaluationFactorList.add(priceEvaluationFactorFinalScore.clone(PriceEvaluationFactor.BID_PRICE));
				// 添加基准价列
				priceEvaluationFactorList.add(priceEvaluationFactorFinalScore.clone(PriceEvaluationFactor.BASE_PRICE));
				priceEvaluationFactorList.add(priceEvaluationFactorFinalScore);
				if(null != evaluationFactor.getFactorWeight()){//null != evaluationFactor.getFactorFinalWeight()){
					// 添加价格得分列
					priceEvaluationFactorList.add(priceEvaluationFactorFinalScore.clone(PriceEvaluationFactor.PRICE_FINAL_SCORE));
				}
			}else if(null != evaluationFactor.getBidPriceCode() && evaluationFactor.getBidPriceCode().equals(BidPrice.BID_PRICE_TOTAL_CODE)){
				// 添加报价列
				priceEvaluationFactorList.add(priceEvaluationFactorFinalScore.clone(PriceEvaluationFactor.BID_EVAL_PRICE_TOTAL));
				// 添加基准价列
				priceEvaluationFactorList.add(priceEvaluationFactorFinalScore.clone(PriceEvaluationFactor.BASE_PRICE));
				priceEvaluationFactorList.add(priceEvaluationFactorFinalScore);
				if(null != evaluationFactor.getFactorWeight()){// null != evaluationFactor.getFactorFinalWeight()){
					// 添加价格得分列
					priceEvaluationFactorList.add(priceEvaluationFactorFinalScore.clone(PriceEvaluationFactor.PRICE_FINAL_SCORE));
				}
			}else {
				priceEvaluationFactorList.add(priceEvaluationFactorFinalScore);
				if(null != evaluationFactor.getFactorWeight()){//null != evaluationFactor.getFactorFinalWeight()){
					// 添加价格得分列
					priceEvaluationFactorList.add(priceEvaluationFactorFinalScore.clone(PriceEvaluationFactor.PRICE_FINAL_SCORE));
				}
			}
			refreshCalculator(priceEvaluationFactorFinalScore, null, null == priceFactorResultMap);
		}
		reSetSortNo();
		resultClickEventAction(firstSupplier, firstEvaluationFactor, firstEvaluationFactorResult);
		
		WidgetUtils.setControlVisible(recalculation, hasCalculator);
		tipsComposite.layout();
	}
	
	/**
	 * @Description: 设置排名
	 * @author guoyr 
	 */
	private void reSetSortNo(){
		List<Double> sortList = new ArrayList<Double>();
		
		// 每次进入评审界面都采用公式重新计算的
		for(Supplier supplier : supplierList){
			BigDecimal evaluationFinalScoreSum = null;
			BigDecimal evaluationScoreSum = null;
			Map<String, EvaluationFactorResult> evaluationFactorResultMap = supplierEvaluationFactorResultMap.get(supplier.getId());
			for(Entry<String,  EvaluationFactorResult> evaluationFactorResultEntry : evaluationFactorResultMap.entrySet()){
				EvaluationFactorResult evaluationFactorResult = evaluationFactorResultEntry.getValue();
				evaluationFinalScoreSum = BigDecimalUtils.add(evaluationFinalScoreSum, evaluationFactorResult.getEvaluationFinalScore());
				evaluationScoreSum = BigDecimalUtils.add(evaluationScoreSum, evaluationFactorResult.getEvaluationScore());
			}
			ExpertEvaluationResult expertEvaluationResult = expertEvaluationResultMap.get(supplier.getId());
			if(null != expertEvaluationResult){
				if(null != evaluationFinalScoreSum){
					expertEvaluationResult.setEvaluationScore(evaluationScoreSum);
					expertEvaluationResult.setEvaluationFinalScore(evaluationFinalScoreSum);
					sortList.add(evaluationFinalScoreSum.doubleValue());
				}else if(null != expertEvaluationResult.getEvaluationFinalScore()){
					sortList.add(expertEvaluationResult.getEvaluationFinalScore().doubleValue());
				}
			}
		}
		SortUtils sortUtil = new SortUtils(sortList);
		for(Entry<String, ExpertEvaluationResult> expertEvaluationResultEntry : expertEvaluationResultMap.entrySet()){
			ExpertEvaluationResult expertEvaluationResult = expertEvaluationResultEntry.getValue();
			if(null != expertEvaluationResult.getEvaluationFinalScore()){
				expertEvaluationResultEntry.getValue().setSortNo(sortUtil.getSortNo(expertEvaluationResult.getEvaluationFinalScore().doubleValue()));
			}else {
				expertEvaluationResultEntry.getValue().setSortNo(0);
			}
		}
	}
	
	/**
	 * @Description: 左边是供应商表格
	 * @author guoyr 
	 */
	private void drawLeftSupplierEvaluationTable(){
		priceScoreTips.setText(Messages.Tips_checkScoreBeforeSavePriceEvaluation);
		
		initEvaluationResult();
		if(null != resultKTable && !resultKTable.isDisposed()){
			resultKTable.dispose();
		}
		resultKTable = new KTable(evaluationTableComposite, SWTX.AUTO_SCROLL /*| SWT.FULL_SELECTION */| SWTX.FILL_WITH_LASTCOL | SWTX.EDIT_ON_KEY);
		resultKTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		resultKTable.setLayout(new GridLayout(1, false));
		boolean hasFinalSumScore = false;// 标记是否存在最终得分
		boolean hasSumScore = false;// 标记是否存在得分汇总
		if(evaluationFactorList.size() > 1){
			hasFinalSumScore = true;
			commKTableModel = new CommonKtableCModel(resultKTable, 2, 1, supplierList.size() , priceEvaluationFactorList.size() + (hasFactorWeight ? 3 : 2));
			if(hasFactorWeight){
				hasSumScore = true;
			}
		}else {
			commKTableModel = new CommonKtableCModel(resultKTable, 1, 1, supplierList.size() , priceEvaluationFactorList.size() + 1);
		}
		commKTableModel.addRowSpan(0, 0, commKTableModel.getFixedRowCount());
		
		commKTableModel.setColumnMinWidth(0, 100);
		
		final Map<String, String> tableTitleMap = new HashMap<String, String>();
		
		// 排名列
		final int sortCol = commKTableModel.getColCount() -1;
		commKTableModel.addRowSpan(0, sortCol, commKTableModel.getFixedRowCount());
		commKTableModel.setColumnWidth(sortCol, 40);
		commKTableModel.setColumnMaxWidth(sortCol, 80);
		tableTitleMap.put("0_"+ sortCol, Messages.SortNo);
		// 最终得分列
		final int finalScoreSumCol= hasFinalSumScore?commKTableModel.getColCount() -2:-1;
		if(finalScoreSumCol > 0){
			commKTableModel.setColumnWidth(finalScoreSumCol, 40);
			commKTableModel.setColumnMaxWidth(finalScoreSumCol, 80);
			commKTableModel.addRowSpan(0, finalScoreSumCol, commKTableModel.getFixedRowCount());
			if(hasFactorWeight){
				tableTitleMap.put("0_"+ finalScoreSumCol, Messages.FinalScore);
			}else {
				tableTitleMap.put("0_"+ finalScoreSumCol, Messages.TotalScore);
			}
		}
		// 得分汇总列
		final int scoreSumCol = hasSumScore?commKTableModel.getColCount() -3 : -1;
		if(scoreSumCol > 0){
			commKTableModel.addRowSpan(0, scoreSumCol, commKTableModel.getFixedRowCount());
			commKTableModel.setColumnWidth(scoreSumCol, 40);
			commKTableModel.setColumnMaxWidth(scoreSumCol, 80);
			tableTitleMap.put("0_"+ scoreSumCol, Messages.TotalScore);
		}
		
		tableTitleMap.put("0_0", MessageFormat.format(Messages.Supplier, Messages.Name));
		commKTableModel.addRowSpan(0, 0, commKTableModel.getFixedRowCount());
		int col = commKTableModel.getFixedColumnCount();
		int margerColCount = 0;
		String preFactorId = null;
		
		for(PriceEvaluationFactor priceEvaluationFactor : priceEvaluationFactorList){
			EvaluationFactor evaluationFactor = priceEvaluationFactor.getEvaluationFactor();
			if(commKTableModel.getFixedRowCount() > 1){
				if(null == preFactorId){
					preFactorId = evaluationFactor.getId();
				}
				tableTitleMap.put("0_"+col, evaluationFactor.getFactorName());
				if(null != preFactorId && !evaluationFactor.getId().equals(preFactorId)){
					commKTableModel.addColSpan(0, col - margerColCount, margerColCount);
					margerColCount = 0;
					preFactorId = evaluationFactor.getId();
				}
				margerColCount ++;
			}
			if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BID_PRICE || priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BID_EVAL_PRICE_TOTAL){
				BidPrice bidPrice = priceEvaluationFactor.getBidPrice();
				String priceUnit = null != tenderProjectRuleEntity ? ("\r\n("+ tenderProjectRuleEntity.getEvalPriceUnit()+")") : "";
				if(null != bidPrice && BidPriceEnum.IS_RATE.equals(bidPrice.getPriceType())) {
					priceUnit = "("+bidPrice.getPriceUnitCN("%")+")";
				}
				tableTitleMap.put((commKTableModel.getFixedRowCount() -1)+"_"+col, Messages.EvaluationPrice+priceUnit);
			}else if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BASE_PRICE){
				BidPrice bidPrice = priceEvaluationFactor.getBidPrice();
				String priceUnit = null != tenderProjectRuleEntity ? ("\r\n("+ tenderProjectRuleEntity.getEvalPriceUnit()+")") : "";
				if(null != bidPrice && BidPriceEnum.IS_RATE.equals(bidPrice.getPriceType())) {
					priceUnit = "("+bidPrice.getPriceUnitCN("%")+")";
				}
				tableTitleMap.put((commKTableModel.getFixedRowCount() -1)+"_"+col, Messages.BasePrice+ priceUnit);
				commKTableModel.addRowSpan(commKTableModel.getFixedRowCount(), col, supplierList.size());
			}else if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.PRICE_SCORE){
				tableTitleMap.put((commKTableModel.getFixedRowCount() -1)+"_"+col, Messages.PriceScore);
			}else if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.PRICE_FINAL_SCORE){
				if(null != evaluationFactor.getFactorFinalWeight()){
					tableTitleMap.put((commKTableModel.getFixedRowCount() -1)+"_"+col, Messages.WeightScore +"\r\n(" + NumberFormat.getInstance().format(evaluationFactor.getFactorFinalWeight())+"%)");
				}else {
					tableTitleMap.put((commKTableModel.getFixedRowCount() -1)+"_"+col, Messages.PriceScore);
					// 如果存在多个指标(多表头),且当前指标是分值录入的指标,且没有权重,则合并行
					if(margerColCount == 1 && commKTableModel.getFixedRowCount() > 1){
						commKTableModel.addRowSpan(0, col, commKTableModel.getFixedRowCount());
					}
				}
			}
			commKTableModel.setColumnWidth(col, 80);
			col ++;
		}
		if(margerColCount > 0){
			commKTableModel.addColSpan(0, col - margerColCount, margerColCount);
		}
		
		// 设置单元格内容
		CellContentRender contentRender = new CellContentRender(){
			public Object receiveContent(int row, int col) {
				// 表头
				if(row < commKTableModel.getHeadRow()){
					if(null != tableTitleMap.get(row+"_"+col)){
						return tableTitleMap.get(row+"_"+col);
					}else {
						return "";
					}
				}else {
					Supplier supplier = supplierList.get(row - commKTableModel.getFixedRowCount());
					if(col < commKTableModel.getFixedColumnCount()){
						return supplier.getSupplierName();
					}else if(col < commKTableModel.getFixedColumnCount() + priceEvaluationFactorList.size()){
						
						PriceEvaluationFactor priceEvaluationFactor = priceEvaluationFactorList.get(col - commKTableModel.getFixedColumnCount());
						EvaluationFactor evaluationFactor = priceEvaluationFactor.getEvaluationFactor();
						BidPrice bidPrice = priceEvaluationFactor.getBidPrice();
						if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BID_EVAL_PRICE_TOTAL){
							SupplierOpeningResult supplierOpeningResult = supplier.getSupplierOpeningResult();
							if(null != supplierOpeningResult && null != supplierOpeningResult.getEvaluationPrice()){
								if(null != bidPrice && BidPriceEnum.IS_RATE.equals(bidPrice.getPriceType())) {
									return NumberFormatUtils.format(supplierOpeningResult.getEvaluationPrice());
								}else {
									return MoneyUtils.getMoneyFormatByUnit(supplierOpeningResult.getEvaluationPrice(), tenderProjectRuleEntity.getEvalPriceUnit());
								}
							}
						}else if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BID_PRICE){
							if(null != bidPrice){
								BidPriceResult bidPriceResult = supplierBidPriceResultMap.get(supplier.getId()+"_"+bidPrice.getId());
								if(null != bidPriceResult){
									if(null != bidPrice && BidPriceEnum.IS_RATE.equals(bidPrice.getPriceType())) {
										return NumberFormatUtils.format(bidPriceResult.getEvaluationPrice());
									}else {
										return MoneyUtils.getMoneyFormatByUnit(bidPriceResult.getEvaluationPrice(), tenderProjectRuleEntity.getEvalPriceUnit());
									}
								}
							}
						}else {
							EvaluationFactorResult evalFactorResult = supplierEvaluationFactorResultMap.get(supplier.getId()).get(evaluationFactor.getId());
							if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BASE_PRICE){
								if(null != evalFactorResult.getBasePrice()){
									if(null != bidPrice && BidPriceEnum.IS_RATE.equals(bidPrice.getPriceType())) {
										return NumberFormatUtils.format(evalFactorResult.getBasePrice());
									}else {
										
										return MoneyUtils.getMoneyFormatByUnit(evalFactorResult.getBasePrice(), tenderProjectRuleEntity.getEvalPriceUnit());
									}
								}
							}else  if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.PRICE_SCORE){
								if(null != evalFactorResult.getEvaluationScore()){
									return NumberFormatUtils.format(evalFactorResult.getEvaluationScore(), scoreRound);
								}
							}else if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.PRICE_FINAL_SCORE){
								if(null != evalFactorResult.getEvaluationFinalScore()){
									return NumberFormatUtils.format(evalFactorResult.getEvaluationFinalScore(), scoreRound);
								}
							}
						}
					}else {
						//供应商的汇总
						ExpertEvaluationResult expertEvaluationResult = expertEvaluationResultMap.get(supplier.getId());
						if(null != expertEvaluationResult){
							if(col == scoreSumCol){
								if(null != expertEvaluationResult.getEvaluationScore()){
									return NumberFormatUtils.format(expertEvaluationResult.getEvaluationScore(), scoreRound);
								}
							}else if(col == finalScoreSumCol){
								if(null != expertEvaluationResult.getEvaluationFinalScore()){
									return NumberFormatUtils.format(expertEvaluationResult.getEvaluationFinalScore(), scoreRound);
								}
							}else if(col == sortCol){
								if(expertEvaluationResult.getSortNoIntValue() > 0){
									return expertEvaluationResult.getSortNoIntValue();
								}
							}
						}
					}
				}
				return "";
		}};
		commKTableModel.setCellContentRender(contentRender);
		
		final TextWrapCellRenderer textCellRenderer = new TextWrapCellRenderer();
		textCellRenderer.setAlignment(SWT.CENTER);
		// 设置单元格渲染器
		CellRender cellRender = new CellRender(){
			public Object receiveCellRender(int row, int col) {
				if(commKTableModel.isFixedCell(col, row)){
					return new FixedWrapCellRenderer();
				}else if(row >= commKTableModel.getFixedRowCount() && col >= commKTableModel.getFixedColumnCount() && col < commKTableModel.getFixedColumnCount() + priceEvaluationFactorList.size()){
//					return new TextWrapCellRenderer();
					return textCellRenderer;
				}
				return textCellRenderer;
		}};
		commKTableModel.setCellRender(cellRender);
		
		// 设置单元格编辑器
        final KTableCellEditorText text = new KTableCellEditorText();
		text.setSingleClickEdit(true);
		CellEditorRender cellEditorRender = new CellEditorRender(){
			public Object receiveCellEditor(int row, int col) {
				if(row >= commKTableModel.getFixedRowCount() && col >= commKTableModel.getFixedColumnCount() && col < commKTableModel.getFixedColumnCount() + priceEvaluationFactorList.size()){
//					Supplier supplier = supplierList.get(row - commKTableModel.getFixedRowCount());
					PriceEvaluationFactor priceEvaluationFactor = priceEvaluationFactorList.get(col - commKTableModel.getFixedColumnCount());
					EvaluationFactor evaluationFactor = priceEvaluationFactor.getEvaluationFactor();
//					EvaluationFactorResult evalFactorResult = supplierEvaluationFactorResultMap.get(supplier.getId()).get(evaluationFactor.getId());
					if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BASE_PRICE){
						if(changeBasePrice){
							return text;
						}
					}else if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.PRICE_SCORE){
						if(changePriceScore || null == evaluationFactor.getBidPriceCode()){
							return text;
						}
					}else if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.PRICE_FINAL_SCORE){
						// 只有不带权重的指标才允许修改最终得分
						if(null == evaluationFactor.getFactorFinalWeight()){
							return text;
						}
					}
				}
				return null;
			}};
		commKTableModel.setCellEditorRender(cellEditorRender);
		
		final Image editImage = ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/edit.png");
		// 设置单元格图片
		CellImageRender cellImageRender = new CellImageRender() {
			public Image receiveCellImage(int row, int col) {
				if(row >= commKTableModel.getFixedRowCount() && col >= commKTableModel.getFixedColumnCount() && col < commKTableModel.getFixedColumnCount() + priceEvaluationFactorList.size()){
					PriceEvaluationFactor priceEvaluationFactor = priceEvaluationFactorList.get(col - commKTableModel.getFixedColumnCount());
					EvaluationFactor evaluationFactor = priceEvaluationFactor.getEvaluationFactor();
					if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BASE_PRICE && changeBasePrice){
						return editImage;
					}else if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.PRICE_SCORE && (changePriceScore || null == evaluationFactor.getBidPriceCode())){
						return editImage;
					}else if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.PRICE_FINAL_SCORE){
						// 只有不带权重的指标才允许修改最终得分
						if(null == evaluationFactor.getFactorFinalWeight()){
							return editImage;
						}
					}
				}
				return null;
		}};
		commKTableModel.setCellImageRender(cellImageRender);
		// 编辑单元格内容
		CellEditContentRender editContentRender = new CellEditContentRender(){
			public void receiveContent(int row, int col, Object content) {
				if(null != content && !"".equals(content.toString())){
					if(row >= commKTableModel.getFixedRowCount() && col >= commKTableModel.getFixedColumnCount() && col < commKTableModel.getFixedColumnCount() + priceEvaluationFactorList.size()){
						Supplier supplier = supplierList.get(row - commKTableModel.getFixedRowCount());
						PriceEvaluationFactor priceEvaluationFactor = priceEvaluationFactorList.get(col - commKTableModel.getFixedColumnCount());
						EvaluationFactor evaluationFactor = priceEvaluationFactor.getEvaluationFactor();
						EvaluationFactorResult evalFactorResult = supplierEvaluationFactorResultMap.get(supplier.getId()).get(evaluationFactor.getId());
						if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BASE_PRICE){
							BigDecimal basePrice = MoneyUtils.getMoneyFromText(content.toString(), tenderProjectRuleEntity.getEvalPriceUnit());
							if(null != basePrice){
								if(basePrice.doubleValue() > 0 && (null == evalFactorResult.getBasePrice() || basePrice.compareTo(evalFactorResult.getBasePrice()) != 0)){
									// 基准价前一列就是投标报价
									PriceEvaluationFactor bidPriceEvaluationFactor = priceEvaluationFactorList.get(col - commKTableModel.getFixedColumnCount() -1);
									refreshCalculator(bidPriceEvaluationFactor, basePrice, true);
								}
							}
						}else {
							BigDecimal evaluationScore = ObjectUtils.getObjBigDecimal(content);
							if(null != evaluationScore){
								
								if(evaluationScore.doubleValue() < 0 || evaluationScore.doubleValue() > evaluationFactor.getFactorScore().doubleValue()){
									if(!isShowError){
										isShowError = true;
//										MessageDialog.openShortMessage("请输入0-"+NumberFormatUtils.format(evaluationFactor.getFactorScore())+"范围的分值!");
										isShowError = false;
									}
									return;
								}
								// 对所有供应商的当前指标重新设置基准价,并通过公式计算价格得分
								Map<String, EvaluationFactorResult> evaluationFactorResultMap = supplierEvaluationFactorResultMap.get(supplier.getId());
								EvaluationFactorResult evaluationFactorResult = evaluationFactorResultMap.get(evaluationFactor.getId());

								PriceScoreCalculator priceScoreCalculator = priceScoreCalculatorMap.get(evaluationFactor.getId());
								if(null != priceScoreCalculator){
									evaluationScore = priceScoreCalculator.getPriceScoreRound(evaluationScore);
									evaluationFactorResult.setEvaluationScore(evaluationScore);
									evaluationFactorResult.setEvaluationFinalScore(priceScoreCalculator.getScoreByWeight(evaluationFactorResult.getEvaluationScore()));
								}else {
									
									evaluationScore = BigDecimalUtils.round(evaluationScore, scoreRound);
									evaluationFactorResult.setEvaluationScore(evaluationScore);
									evaluationFactorResult.setEvaluationFinalScore(getEvaluationFinalScore(evaluationFactor, evaluationFactorResult.getEvaluationScore()));
								}
								evaluationFactorResult.setEvaluationOpinion(null);
							
							}
						}
					}
				}
				resultChanged = true;
				reSetSortNo();
				resultKTable.redraw();
			}
		};
		commKTableModel.setCellEditContentRender(editContentRender);
		
		// 编辑单元格对齐方式
		CellAlignmentRender cellAlignmentRender = new CellAlignmentRender(){
			public int receiveCellAlignment(int row, int col) {
				if(row < commKTableModel.getFixedRowCount()){
					return SWTX.ALIGN_VERTICAL_CENTER | SWTX.ALIGN_HORIZONTAL_CENTER;
				}else {
					if(col < commKTableModel.getFixedColumnCount()){
						return SWTX.ALIGN_VERTICAL_CENTER | SWTX.ALIGN_HORIZONTAL_LEFT;
					}else if(col < commKTableModel.getFixedColumnCount() + priceEvaluationFactorList.size()){
						PriceEvaluationFactor priceEvaluationFactor = priceEvaluationFactorList.get(col - commKTableModel.getFixedColumnCount());
						if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BID_EVAL_PRICE_TOTAL){
							return SWTX.ALIGN_VERTICAL_CENTER | SWTX.ALIGN_HORIZONTAL_RIGHT;
						}else if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BID_PRICE){
							return SWTX.ALIGN_VERTICAL_CENTER | SWTX.ALIGN_HORIZONTAL_RIGHT;
						}else if(priceEvaluationFactor.getFactorType() == PriceEvaluationFactor.BASE_PRICE){
							return SWTX.ALIGN_VERTICAL_CENTER | SWTX.ALIGN_HORIZONTAL_RIGHT;
						}
					}
				}
				return SWTX.ALIGN_VERTICAL_CENTER | SWTX.ALIGN_HORIZONTAL_CENTER;
			}
		};
		commKTableModel.setCellAlignmentRender(cellAlignmentRender);
		
		// 设置单元格内容
		CellTooltipRender cellTooltipRender = new CellTooltipRender(){
			public String receiveCellTooltip(int row, int col) {
				if(row >= commKTableModel.getFixedRowCount() && col >= commKTableModel.getFixedColumnCount() && col < commKTableModel.getFixedColumnCount() + priceEvaluationFactorList.size()){
					Supplier supplier = supplierList.get(row - commKTableModel.getFixedRowCount());
					PriceEvaluationFactor priceEvaluationFactor = priceEvaluationFactorList.get(col - commKTableModel.getFixedColumnCount());
					EvaluationFactor evaluationFactor = priceEvaluationFactor.getEvaluationFactor();
					EvaluationFactorResult evalFactorResult = supplierEvaluationFactorResultMap.get(supplier.getId()).get(evaluationFactor.getId());
					if(null != evalFactorResult && null != evalFactorResult.getEvaluationOpinion()){
						return evalFactorResult.getEvaluationOpinion();
					}
				}
				return "";
			}
		};	
		commKTableModel.setCellTooltipRender(cellTooltipRender);
		resultKTable.addCellSelectionListener(new KTableCellSelectionAdapter(){
			@Override
			public void cellSelected(int col, int row, int statemask) {
				if(curCol == col && curRow == row){
					return;
				}
				curCol = col; 
				curRow = row;
				if(row >= commKTableModel.getFixedRowCount() && col >= commKTableModel.getFixedColumnCount() && col < commKTableModel.getFixedColumnCount() + priceEvaluationFactorList.size()){
					Supplier supplier = supplierList.get(row - commKTableModel.getFixedRowCount());
					PriceEvaluationFactor priceEvaluationFactor = priceEvaluationFactorList.get(col - commKTableModel.getFixedColumnCount());
					EvaluationFactor evaluationFactor = priceEvaluationFactor.getEvaluationFactor();
					EvaluationFactorResult evalFactorResult = supplierEvaluationFactorResultMap.get(supplier.getId()).get(evaluationFactor.getId());
					resultClickEventAction(supplier, evaluationFactor, evalFactorResult);
				}
				return;
			}
			@Override
			public void fixedCellSelected(int col, int row, int statemask) {
				resultKTable.setSelection(curCol > commKTableModel.getFixedColumnCount()?curCol:commKTableModel.getFixedColumnCount(), row, true);
			}
		});
		resultKTable.setModel(commKTableModel);
		evaluationTableComposite.layout();
	}
	
	/**
	 * @Description: 刷新公式计算
	 * @author guoyr
	 * @param priceEvaluationFactor
	 * @param basePrice 
	 */
	private void refreshCalculator(PriceEvaluationFactor priceEvaluationFactor, BigDecimal basePrice, boolean useCalculator){
		if(null == bidPriceResultService){
			bidPriceResultService = new BidPriceResultService();
		}
		EvaluationFactor evaluationFactor = priceEvaluationFactor.getEvaluationFactor();
		
		if(null != evaluationFactor && null != evaluationFactor.getComputerParams()){
			BidPrice factorBidPrice = priceEvaluationFactor.getBidPrice();
			
			List<BigDecimal> evalPriceList = new ArrayList<BigDecimal>();
			
			if(null != factorBidPrice){
				List<BidPriceResult> bidPriceResultList = bidPriceResultService.getBidPriceResultList(tenderProjectEntity.getId(), factorBidPrice.getId());
				if(null != bidPriceResultList && bidPriceResultList.size() > 0){
					for(Supplier supplier : supplierList){
						for(BidPriceResult bidPriceResult : bidPriceResultList){
							if(null != bidPriceResult.getSupplierId() && supplier.getId().equals(bidPriceResult.getSupplierId())){
								supplierBidPriceResultMap.put(bidPriceResult.getSupplierId()+"_"+bidPriceResult.getBidPriceId(), bidPriceResult);
								if(null != bidPriceResult.getEvaluationPrice()){
									evalPriceList.add(bidPriceResult.getEvaluationPrice());
								}
								break;
							}
						}
					}
				}
			}else if(null != evaluationFactor.getBidPriceCode() && evaluationFactor.getBidPriceCode().equals(BidPrice.BID_PRICE_TOTAL_CODE)){
				for(Supplier supplier : supplierList){
					SupplierOpeningResult supplierOpeningResult = supplier.getSupplierOpeningResult();
					if(null != supplierOpeningResult && null != supplierOpeningResult.getEvaluationPrice()){
						evalPriceList.add(supplierOpeningResult.getEvaluationPrice());
					}
				}
			}
			PriceScoreCalculator priceScoreCalculator = null; 
			if(evalPriceList.size() > 0){
				priceScoreCalculator = priceScoreCalculatorMap.get(evaluationFactor.getId()); 
				// 为每个分项报价设置一个计算器,并初始化
				if(null == priceScoreCalculator){
					priceScoreCalculator = new PriceScoreCalculator();
					priceScoreCalculatorMap.put(evaluationFactor.getId(), priceScoreCalculator);
					priceScoreCalculator.init(tenderProjectEntity, tenderProjectRuleEntity, null, evaluationFactor, evalPriceList);
				}
				if(null != basePrice){
					priceScoreCalculator.setBasePrice(basePrice);
				}else {
					priceScoreCalculator.init(tenderProjectEntity, tenderProjectRuleEntity, null, evaluationFactor, evalPriceList);
				}
				hasCalculator = true;
				if(null != factorBidPrice){
					for(Supplier supplier : supplierList){
						BidPriceResult bidPriceResult = supplierBidPriceResultMap.get(supplier.getId()+"_"+factorBidPrice.getId());
						EvaluationFactorResult evaluationFactorResult = supplierEvaluationFactorResultMap.get(supplier.getId()).get(evaluationFactor.getId());
						if(null != evaluationFactorResult && null != bidPriceResult && null != bidPriceResult.getEvaluationPrice()){
							CalculationResult calculationResult = priceScoreCalculator.calculation(bidPriceResult.getEvaluationPrice());
							if(useCalculator){
								evaluationFactorResult.setBasePrice(priceScoreCalculator.getBasePrice());
								evaluationFactorResult.setDeviationRate(calculationResult.getDeviationRate());
								evaluationFactorResult.setEvaluationOpinion(calculationResult.getFormual());
								evaluationFactorResult.setEvaluationScore(calculationResult.getPriceScore());
								evaluationFactorResult.setEvaluationFinalScore(calculationResult.getPriceFinalScore());
							}else {
								priceScoreTips.setText(MessageFormat.format(Messages.Tips_notSameWidthFormulaScore, Messages.Button_recalculatePriceScore));
							}
						}
					}
				}else if(null != evaluationFactor.getBidPriceCode() && evaluationFactor.getBidPriceCode().equals(BidPrice.BID_PRICE_TOTAL_CODE)){
					for(Supplier supplier : supplierList){
						SupplierOpeningResult supplierOpeningResult = supplier.getSupplierOpeningResult();
						EvaluationFactorResult evaluationFactorResult = supplierEvaluationFactorResultMap.get(supplier.getId()).get(evaluationFactor.getId());
						if(null != evaluationFactorResult && null != supplierOpeningResult && null != supplierOpeningResult.getEvaluationPrice()){
							CalculationResult calculationResult = priceScoreCalculator.calculation(supplierOpeningResult.getEvaluationPrice());
							if(useCalculator){
								evaluationFactorResult.setBasePrice(priceScoreCalculator.getBasePrice());
								evaluationFactorResult.setDeviationRate(calculationResult.getDeviationRate());
								evaluationFactorResult.setEvaluationOpinion(calculationResult.getFormual());
								evaluationFactorResult.setEvaluationScore(calculationResult.getPriceScore());
								evaluationFactorResult.setEvaluationFinalScore(calculationResult.getPriceFinalScore());
							}else {
								priceScoreTips.setText(MessageFormat.format(Messages.Tips_notSameWidthFormulaScore, Messages.Button_recalculatePriceScore));
							}
						}
					}
				}
			}
			
		}
	}
	
	/**
	 * @Description: 添加监听
	 * @author wangxiang
	 * @param listener
	 */
	public void addPriceReviewEvaluationListener(PriceReviewEvaluationListener listener){
		this.listener= listener;
	}
	
	/**
	 * @Description: 得到最终得分
	 * @author guoyr
	 * @param evaluationFactor
	 * @param evaluationScore
	 * @return 
	 */
	private BigDecimal getEvaluationFinalScore(EvaluationFactor evaluationFactor, BigDecimal evaluationScore){
		BigDecimal evaluationFinalScore = evaluationScore;
		if(null != evaluationScore && null != evaluationFactor.getFactorFinalWeight()){
			evaluationFinalScore = BigDecimalUtils.div(BigDecimalUtils.mul(evaluationFactor.getFactorFinalWeight(), evaluationScore), new BigDecimal(100));
		}
		return BigDecimalUtils.round(evaluationFinalScore, scoreRound);
	}
	
	/**
	 * @Description: 保存评审结果
	 * @author guoyr
	 * @return 
	 */
	public boolean savePriceEvaluationResult(){
		expertEvaluationStepService.updateExpertEvaluationStatus(CommonEnum.IN_PROGRESS, tenderProjectEntity.getId(), evaluationStep,CURRENT_EXPERT.getUserId());
		boolean saveSuccess = true;
		// 如果修改了结果,才保存结果
		if(resultChanged){
			saveSuccess = expertEvaluationStepService.saveEvaluationResult(tenderProjectEntity.getId(), CURRENT_EXPERT.getUserId(), evaluationStep, expertEvaluationResultMap, supplierEvaluationFactorResultMap);
			if(saveSuccess){
				resultChanged = false;
			}else {
				resultChanged = true;
			}
		}
		return saveSuccess;
	}
	
	/** 
	 * @Description: 提交评审结果
	 * @author guoyr
	 * @return 
	 */
	public boolean submitPriceEvaluationResult() {
		String errorMessage = null;
		for(Supplier supplier : supplierList){
			Map<String, EvaluationFactorResult> supplierFactorResultMap = supplierEvaluationFactorResultMap.get(supplier.getId());
			for(Entry<String, EvaluationFactorResult> factorResultEntry : supplierFactorResultMap.entrySet()){
				EvaluationFactorResult evaluationFactorResult = factorResultEntry.getValue();
				if(null == evaluationFactorResult.getEvaluationFinalScore()){
					errorMessage = MessageFormat.format(Messages.Tips_existNoScoreFactor, supplier.getSupplierName());
					break;
				}
			}
		}
		if(null != errorMessage){
			MessageDialog.openWarning(getShell(), errorMessage);
			return false;
		}
		String message = MessageFormat.format(Messages.Tips_submitEvaluationResult, evaluationStep.getStepName());
		if(!MessageDialog.openConfirm(getShell(), Messages.Button_submitEvaluationResult, message, new String[]{Messages.Button_confirmComplate, Messages.Button_continueEvaluation})){
			return false;
		}
		return expertEvaluationStepService.submitEvaluationResult(tenderProjectEntity.getId(),tenderProjectRuleEntity, CURRENT_EXPERT.getUserId(), evaluationStep, supplierList);
	}

	/** 
	 * @Description: 释放资源
	 * @author guoyr 
	 */
	public void dispose() {
		imageResolver.disposite();
		evaluationFactorList.clear();
		evaluationFactorList = null;
		super.dispose();
	}
	@Override
	protected void checkSubclass() {
		// Disable the check that prevents subclassing of SWT components
	}
	
	public boolean parserStructProject() {
		// 获得招标文件的指标Document
		Document factorDoc = XmlUtils.getXmlDocument(FileConstants.getBiddingFilePath(tenderProjectEntity.getId()) + FileConstants.PST_XML);
		// 未找到招标文件的指标,则获得投标文件的指标。
		if(null == factorDoc){
			// 获得投标人集合
			List<Supplier> supplierList = supplierService.getSupplierOpenBidList(tenderProjectEntity.getId());
			if(null != supplierList && supplierList.size() > 0){
				// 遍历投标人信息
				for(Supplier supplier : supplierList){
					if(null != factorDoc){
						break;
					}
					// 获得投标人投标文件下的指标路径
					String supplierFactorXmlPath = FileConstants.getBidFilePath(tenderProjectEntity.getId(), supplier.getId()) + FileConstants.PST_XML;
					// 获得投标文件的指标Document
					factorDoc = XmlUtils.getXmlDocument(supplierFactorXmlPath);
				}
			}
		}
		 return factorDoc == null ? false:ParsingXmlUtils.parsingDocStructXML(factorDoc);	 
	}
}