package nccloud.web.hryf.transapply.action;

import java.util.HashMap;
import java.util.Map;

import nccloud.commons.lang.StringUtils;

import nc.bs.framework.common.NCLocator;
import nc.bs.uif2.validation.ValidationFailure;
import nc.hr.utils.ResHelper;
import nc.itf.hi.seqcontrol.ISeqcontrolManageService;
import nc.itf.hr.frame.IPersistenceRetrieve;
import nc.itf.trn.IItemSetAdapter;
import nc.vo.hi.psndoc.CtrtVO;
import nc.vo.hi.seqcontrol.SeqcontrolSetVO;
import nc.vo.hi.trnstype.TrnstypeFlowVO;
import nc.vo.pub.AggregatedValueObject;
import nc.vo.pub.BusinessException;
import nc.vo.pub.SuperVO;
import nc.vo.pub.billtype.BilltypeVO;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.pub.pf.IPfRetCheckInfo;
import nc.vo.trn.partmng.PartApplyVO;
import nc.vo.trn.pub.TRNConst;
import nc.vo.trn.transmng.StapplyVO;
import nc.vo.uif2.LoginContext;
import nccloud.dto.hryf.tools.HRYFConst;
import nccloud.framework.service.ServiceLocator;
import nccloud.framework.web.container.IRequest;
import nccloud.framework.web.ui.meta.FormItemMeta;
import nccloud.framework.web.ui.meta.FormMeta;
import nccloud.framework.web.ui.meta.PageMeta;
import nccloud.web.hr.pub.HRNccPubEnv;
import nccloud.web.hr.pub.HRNccTemplateUtils;
import nccloud.web.hr.pub.HRNccUtils;
import nccloud.web.uapbd.commons.web.ParamUtils;

/**
 * 调配办理-新增按钮
 * @author lbt 20190330
 *
 */
public class TransAddAction extends TransBaseAction {

	@Override
	public <T> Object execute(IRequest request, T para) throws Exception {
		ParamUtils param = new ParamUtils(request);
		LoginContext context = HRNccUtils.getLoginContext(param);
		// 1：校验数据并返回所有项目设置数据
		IItemSetAdapter[] items = super.transtypeNotNullValidate(param, context);
		AggregatedValueObject  aggvo = super.getDefaultValue(context, param,false);
		//调配方式
		Integer transMode = param.getInt("transMode", null);
		if(transMode==null){
			return new ValidationFailure(ResHelper.getString("6009tran", "06009tran0129")/* @res "当前选择的调配方式为空，不能进行后续操作！" */);
		}
		((StapplyVO)aggvo.getParentVO()).setStapply_mode(transMode);
		((StapplyVO) aggvo.getParentVO()).setWorkflow_state(IPfRetCheckInfo.NOSTATE);
		String transType = param.getString("transType", null);//调配业务类型
		((StapplyVO)aggvo.getParentVO()).setPk_trnstype(transType);
		TrnstypeFlowVO[] flow =  (TrnstypeFlowVO[]) ServiceLocator.find(IPersistenceRetrieve.class).retrieveByClause(null, TrnstypeFlowVO.class,
                        " pk_group = '" + HRNccPubEnv.getPk_group() + "' and pk_trnstype = '" + transType + "'");
		if (flow != null && flow.length > 0) {
			 ((StapplyVO) aggvo.getParentVO()).setTranstypeid(flow[0].getPk_transtype());
			 ((StapplyVO) aggvo.getParentVO()).setTranstype(null);
             if (StringUtils.isNotEmpty(flow[0].getPk_transtype())){
                 BilltypeVO billtype = (BilltypeVO) ServiceLocator.find(IPersistenceRetrieve.class) .retrieveByPk(null, BilltypeVO.class, flow[0].getPk_transtype());
                 ((StapplyVO) aggvo.getParentVO()).setTranstype(billtype.getPk_billtypecode());
             }
             ((StapplyVO) aggvo.getParentVO()).setBusiness_type(flow[0].getPk_businesstype());
        }
		
		//默认为false
		((StapplyVO) aggvo.getParentVO()).setAttributeValue("ifsynwork", UFBoolean.FALSE);
		//返回前后项目模板
		PageMeta pm = showAllSetItems(context, HRYFConst.APPCODE_TRANAPPLY, HRYFConst.PAGECODE_TRANAPPLY, true, items, false);
        ((FormMeta) pm.getAreaMeta(TRNConst.TRNS_NEWINFO_TAB)).getItemByCode(StapplyVO.NEWPK_POSTSERIES).setDisabled(false);
        ((FormMeta) pm.getAreaMeta(TRNConst.TRNS_NEWINFO_TAB)).getItemByCode(StapplyVO.NEWPK_JOBGRADE).setDisabled(true);// 调配申请新增时职级不可编辑
		// 人员信息
		FormMeta fm_psninfo = (FormMeta) pm.getAreaMeta(TRNConst.TRNS_PSNINFO_TAB);
		fm_psninfo.getItemByCode(StapplyVO.PK_PSNJOB).setDisabled(false);
		fm_psninfo.getItemByCode(StapplyVO.PK_PSNJOB).setRequired(true);
		fm_psninfo.getItemByCode(StapplyVO.STAPPLY_MODE).setDisabled(true);		
		fm_psninfo.getItemByCode(StapplyVO.STAPPLY_MODE).setRequired(false);	
		fm_psninfo.getItemByCode(StapplyVO.PK_TRNSTYPE).setDisabled(true);		
		fm_psninfo.getItemByCode(StapplyVO.PK_TRNSTYPE).setRequired(false);
		fm_psninfo.getItemByCode(StapplyVO.SREASON).setDisabled(false);
		fm_psninfo.getItemByCode(StapplyVO.SREASON).setRequired(true);
		fm_psninfo.getItemByCode(StapplyVO.EFFECTDATE).setDisabled(false);
		fm_psninfo.getItemByCode(StapplyVO.EFFECTDATE).setRequired(true);
		// 跟试用相关
		fm_psninfo.getItemByCode(StapplyVO.TRIALDAYS).setDisabled(true);		
		fm_psninfo.getItemByCode(StapplyVO.TRIALDAYS).setRequired(false);		
		fm_psninfo.getItemByCode(StapplyVO.TRIAL_UNIT).setDisabled(true);		
		fm_psninfo.getItemByCode(StapplyVO.TRIAL_UNIT).setRequired(false);		
		fm_psninfo.getItemByCode(StapplyVO.TRIALBEGINDATE).setDisabled(true);		
		fm_psninfo.getItemByCode(StapplyVO.TRIALBEGINDATE).setRequired(false);		
		fm_psninfo.getItemByCode(StapplyVO.TRIALENDDATE).setDisabled(true);		
		fm_psninfo.getItemByCode(StapplyVO.TRIALENDDATE).setRequired(false);
		// 合同信息
		CtrtVO ctrt = getCtrt((StapplyVO) aggvo.getParentVO());
		if (ctrt == null) {
			// 最新的合同记录不是签订/变更/续签三个状态（未签订合同或者合同已经解除/终止），不需要勾选和编辑
			((StapplyVO) aggvo.getParentVO()).setIsrelease(UFBoolean.FALSE);
			((StapplyVO) aggvo.getParentVO()).setIsend(UFBoolean.FALSE);
			((FormMeta) pm.getAreaMeta("contract_mng_org")).getItemByCode(StapplyVO.ISRELEASE).setDisabled(true);
			((FormMeta) pm.getAreaMeta("contract_mng_org")).getItemByCode(StapplyVO.ISEND).setDisabled(true);
		}
        if (TRNConst.TRANSMODE_CROSS_OUT == transMode ) {
            // 调出,或变更离职后HR组织
            ((FormMeta) pm.getAreaMeta("stapply_mng_org")).getItemByCode(StapplyVO.PK_HI_ORG).setDisabled(false);
            ((StapplyVO)aggvo.getParentVO()).setPk_hi_org(null);
        } else {
            // 组织内、调入、不变更离职后组织都是当前HR组织
    		((FormMeta) pm.getAreaMeta("contract_mng_org")).getItemByCode(StapplyVO.PK_HRCM_ORG).setDisabled(true);		
    		((FormMeta) pm.getAreaMeta("stapply_mng_org")).getItemByCode(StapplyVO.PK_HI_ORG).setDisabled(true);
    		((FormMeta) pm.getAreaMeta("contract_mng_org")).getItemByCode(StapplyVO.ISRELEASE).setDisabled(true);	
    		((FormMeta) pm.getAreaMeta("contract_mng_org")).getItemByCode(StapplyVO.ISEND).setDisabled(true);	
        }
		// 是否是审批节点
     	boolean isapprove = param.getBoolean("isapprove", false);
		if (isapprove) {
             // 审批节点不能修改流程类型与业务类型
             ((FormMeta) pm.getAreaMeta("card")).getItemByCode(StapplyVO.TRANSTYPEID).setDisabled(true);
             ((FormMeta) pm.getAreaMeta("card")).getItemByCode(StapplyVO.BUSINESS_TYPE).setDisabled(true);
        } else {
             ((FormMeta) pm.getAreaMeta("card")).getItemByCode(StapplyVO.BILL_CODE).setDisabled(true);
        }
		if (isapprove)  {
		    ((FormMeta) pm.getAreaMeta("card")).getItemByCode(StapplyVO.BILL_CODE).setDisabled(true);
			((FormMeta) pm.getAreaMeta("card")).getItemByCode(StapplyVO.BUSINESS_TYPE).setDisabled(true);
			((FormMeta) pm.getAreaMeta("card")).getItemByCode(StapplyVO.TRANSTYPEID).setDisabled(true);
			((FormMeta) pm.getAreaMeta("card")).getItemByCode(StapplyVO.APPLY_DATE).setDisabled(true);
			// 审批节点不能修改解除和终止
			((FormMeta) pm.getAreaMeta("contract_mng_org")).getItemByCode(StapplyVO.ISRELEASE).setDisabled(true);
			((FormMeta) pm.getAreaMeta("contract_mng_org")).getItemByCode(StapplyVO.ISEND).setDisabled(true);
        }
		//返回页面默认数据
		Map result = new HashMap<>();
		result.put("formData",HRNccTemplateUtils.getFormWithArea(HRYFConst.PAGECODE_TRANAPPLY, "card", (SuperVO) aggvo.getParentVO()));
		result.put("isBillCodeEditable",  super.isBillCodeEditable(context));
		result.put(TRNConst.TRNS_OLDINFO_TAB, pm.getAreaMeta(TRNConst.TRNS_OLDINFO_TAB));
		result.put(TRNConst.TRNS_NEWINFO_TAB, pm.getAreaMeta(TRNConst.TRNS_NEWINFO_TAB));
		result.put(TRNConst.TRNS_PSNINFO_TAB, pm.getAreaMeta(TRNConst.TRNS_PSNINFO_TAB));
		result.put("contract_mng_org", pm.getAreaMeta("contract_mng_org"));
		result.put("stapply_mng_org", pm.getAreaMeta("stapply_mng_org"));
		result.put("card", pm.getAreaMeta("card"));
		FormItemMeta psnItemMeta = ((FormMeta)pm.getAreaMeta(TRNConst.TRNS_PSNINFO_TAB)).getItemByCode(StapplyVO.PK_PSNJOB);
		// 查询当前逐级管控模式,如果有管控
		if(getQuerySeq()){
			psnItemMeta.setRefcode("hrhi/refer/hiref/PsnjobRefTreeGridRef/index");
		}
		return result;
	}
	

}
