package nccloud.web.hrwa.wagrade.action;

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

import com.alibaba.fastjson.JSONObject;

import nc.itf.hr.wa.IWaGradeQueryService;
import nc.itf.hr.wa.IWaGradeService;
import nc.vo.pub.BusinessException;
import nc.vo.pub.VOStatus;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.wa.grade.AggWaGradeVO;
import nc.vo.wa.grade.IWaGradeCommonDef;
import nc.vo.wa.grade.WaGradeVO;
import nc.vo.wa.grade.WaPrmlvVO;
import nc.vo.wa.grade.WaPsnhiVO;
import nc.vo.wa.grade.WaSeclvVO;
import nc.vo.wa.item.WaItemVO;
import nccloud.commons.lang.StringUtils;
import nccloud.framework.service.ServiceLocator;
import nccloud.framework.web.container.IRequest;
import nccloud.web.hr.pub.HRCommonAction;
import nccloud.web.hrwa.wagrade.action.util.WaGradeCommon;
import nccloud.web.hrwa.wagrade.save.CopyHelper;
import nccloud.web.hrwa.wagrade.save.GetSaveParamHelper;
import nccloud.web.hrwa.wagrade.save.UpdateHelper;
import nccloud.web.hrwa.wagrade.validation.WaGradeValidate;
import nccloud.web.hrwa.wagrade.vo.WaGradeSaveCommonProp;
import nccloud.web.uapbd.commons.web.ParamUtils;
/**
 * 
 * 2019年7月13日下午3:05:41
 * msw：
 * 薪资标准设置保存
 */
public class WaGradeSaveAction extends HRCommonAction {
	
	private CopyHelper copyHelper = null;
	private GetSaveParamHelper getSaveParamHelper = null;
	private UpdateHelper updateHelper = null;

	private void initParam(WaGradeSaveCommonProp commonPorp) {
		copyHelper = new CopyHelper(commonPorp);
		getSaveParamHelper = new GetSaveParamHelper(commonPorp);
		updateHelper = new UpdateHelper(commonPorp);
	}
	@SuppressWarnings("unchecked")
	@Override
	public <T> Object execute(IRequest request, T para) throws Exception {
		WaGradeSaveCommonProp commonPorp=new WaGradeSaveCommonProp();
		initParam(commonPorp);
		
		ParamUtils param = new ParamUtils(request);
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap = param.getMap("base_param", paramMap);
		String opType = paramMap.get("op_type");// 前端必须传入操作运算符，例如add,copy,edit
		Map<String, Object> formDataMap = new HashMap<String, Object>();
		formDataMap = getSaveParamHelper.getWebAggWaGradeVO(request);
		AggWaGradeVO aggVO = (AggWaGradeVO) formDataMap.get("aggvo");

		WaGradeValidate validate = new WaGradeValidate();
		validate.validatePrvSecIsNull(aggVO);

		WaGradeVO parentOldVO = null;
		String pkWaGrdOld = "";// 获取复制前主键，用户复制后续操作
		WaGradeVO parentNewVO = aggVO.getParentVO();
		if ("edit".equals(opType) || "copy".equals(opType)) {
			AggWaGradeVO gradeVo = (AggWaGradeVO) ServiceLocator.find(IWaGradeQueryService.class)
					.queryAggWagradeByGrdPK(aggVO.getParentVO().getPk_wa_grd());
			// 原薪资标准主VO
			parentOldVO = gradeVo.getParentVO();
			// 原薪资标准主键
			pkWaGrdOld = parentOldVO.getPk_wa_grd();
			// 获取复制前薪资标准级别数组，用户复制后续操作
			commonPorp.setWaPrmlvVOArrOld((WaPrmlvVO[]) gradeVo.getTableVO(IWaGradeCommonDef.WA_PRMLV));
			// 获取复制前薪资标准档别数组，用户复制后续操作
			commonPorp.setWaSeclvVOArrOld((WaSeclvVO[]) gradeVo.getTableVO(IWaGradeCommonDef.WA_SECLV));
			// 获取复制前薪资标准人员属性数组，用户复制后续操作
			commonPorp.setWaPsnhiVOArrOld((WaPsnhiVO[]) gradeVo.getTableVO(IWaGradeCommonDef.WA_PSNHI));	
		}
		// 原多档标识
		commonPorp.setMultOld((parentOldVO == null) ? false : parentOldVO.getIsmultsec().booleanValue());
		// 原宽带标识
		commonPorp.setRangeOld((parentOldVO == null) ? false : parentOldVO.getIsrange().booleanValue());
		// 现多档标识
		commonPorp.setMultNew(parentNewVO.getIsmultsec().booleanValue());
		// 现宽带标识
		commonPorp.setRangeNew(parentNewVO.getIsrange().booleanValue());
		
		WaPrmlvVO[] waPrmlvVOArr = (WaPrmlvVO[]) aggVO.getTableVO(IWaGradeCommonDef.WA_PRMLV);
		WaSeclvVO[] waSeclvVOArr = (WaSeclvVO[]) aggVO.getTableVO(IWaGradeCommonDef.WA_SECLV);
		// 处理档别数据，如果不是多档而且是在修改状态下，之前的档别数据删除
		if ("edit".equals(opType) && !commonPorp.isMultNew()) {
			if (waSeclvVOArr != null && waSeclvVOArr.length > 0) {
				for (int i = 0; i < waSeclvVOArr.length; i++) {
					waSeclvVOArr[i].setStatus(VOStatus.DELETED);
				}
			}
		}
		
		//add by@chenzf判断是否集团分配下来的数据，保存验证下级薪别数据的上级是否为空 2021-4-7 16:23:52 begin
		if(parentNewVO.getIsgroup() != null && parentNewVO.getIsgroup().booleanValue() && parentNewVO.getIsscope() != null && parentNewVO.getIsscope().booleanValue()) {
			String msg = "";
			for(WaPrmlvVO vo : waPrmlvVOArr) {
				String levelname = vo.getLevelname();
				if(vo.getIsgroup() != null && vo.getIsgroup().booleanValue()) {
					continue;
				} else {
					if(StringUtils.isBlank(vo.getPk_wa_fatheprmlv())) {
						msg = msg + levelname + ",";
					}
				}
			}
			if(msg.length() > 0) {
				throw new BusinessException("以下薪别的上级级别不能为空:["+msg.substring(0, msg.length() - 1)+"]");
			}
		}
		//判断上级标准下级只能存在一个年终奖和一个月薪的数据
		if(StringUtils.isNotBlank(parentNewVO.getPk_wagrade_top())) {
			//1为年薪  2为月薪，3为年终奖
			String standard_type = parentNewVO.getStandard_type();
			String pk_wagrade_top = parentNewVO.getPk_wagrade_top();
			String pk_wa_grade = parentNewVO.getPk_wa_grd();
			UFBoolean check = ServiceLocator.find(IWaGradeQueryService.class).checkWaGrade(pk_wagrade_top, standard_type, pk_wa_grade);
			if(check.booleanValue()) {
				throw new BusinessException("同一个上级标准类别，不能存在2个相同的月工资或者年终奖类别！");
			}
		}
		//判断是否允许下级增加级别，如果是的话，则判断是否为多档
		if(parentNewVO.getIsscope() != null && parentNewVO.getIsscope().booleanValue()) {
			UFBoolean ismultsec = parentNewVO.getIsmultsec();
			if(ismultsec == null || !ismultsec.booleanValue()) {
				throw new BusinessException("可确定级别金额范围并允许公司增加子级别为是，多档不能为否");
			}
		}
		//add by@chenzf判断是否集团分配下来的数据，保存验证下级薪别数据的上级是否为空 2021-4-7 16:23:52 end
		
		// 判断级别和档别数据是否增加或者删除
		Map<String, Boolean> isAddOrDelMap = getSaveParamHelper.prvAndSevIsAddOrDel(aggVO);
		Boolean isPrmlvAddOrDel = isAddOrDelMap.get(IWaGradeCommonDef.WA_PRMLV);
		Boolean isSeclvAddOrDel = isAddOrDelMap.get(IWaGradeCommonDef.WA_SECLV);
		// 取得选择相关人员属性内容
		WaPsnhiVO[] psnhiVOs = getSaveParamHelper.getPsnHiVO(aggVO, formDataMap);
		// 查看级别人员属性和档别人员属性是否发生变化
		Map<String, Boolean> isChangeMap = getSaveParamHelper.prvAndSevIsChange(commonPorp.getWaPsnhiVOArrOld(), psnhiVOs);
		Boolean isWaPsnhiChange = isChangeMap.get(IWaGradeCommonDef.WA_PRMLV);
		Boolean isWaPsnhiSevChange = isChangeMap.get(IWaGradeCommonDef.WA_SECLV);

		aggVO.setTableVO(IWaGradeCommonDef.WA_PRMLV, waPrmlvVOArr);
		aggVO.setTableVO(IWaGradeCommonDef.WA_SECLV, waSeclvVOArr);
		validate.validateDataDuplication(aggVO);
		
		commonPorp.setWaPsnhiChange(isWaPsnhiChange); // 级别人员属性是否发生变化
		commonPorp.setWaPsnhiSevChange(isWaPsnhiSevChange);// 档别人员属性是否发生变化
		commonPorp.setPrmlvAddOrDel(isPrmlvAddOrDel); // 级别数据是否增加或者删除
		commonPorp.setSeclvAddOrDel(isSeclvAddOrDel);// 档别数据是否增加或者删除
		commonPorp.setPsnhiVOs(psnhiVOs);
		commonPorp.setAggVO(aggVO);
		
		// 处理具体业务
		return process(opType, pkWaGrdOld, commonPorp);
	}

	/**
	 * 
	 * 2019年6月27日下午4:30:23 msw
	 * 
	 * @param opType
	 * @param pkWaGrdOld
	 * @param psnhiVOs
	 * @param aggVO
	 * @return
	 * @throws BusinessException：
	 *
	 */
	private JSONObject process(String opType, String pkWaGrdOld,WaGradeSaveCommonProp commonPorp)
			throws BusinessException {
		StringBuffer warinMsgBf = new StringBuffer();// 返回信息
		AggWaGradeVO aggVO=commonPorp.getAggVO();
		if ("add".equals(opType) || "copy".equals(opType)) {
			// 非多档清除档别数据
			if (!commonPorp.isMultNew()) {
				aggVO.setTableVO(IWaGradeCommonDef.WA_SECLV, null);
			}
			// 处理复制的时候子集的状态，级别和档别都为新增状态
			if ("copy".equals(opType)) {
				copyHelper.ensureCopyData(aggVO);
			}
			aggVO.setTableVO(IWaGradeCommonDef.WA_PSNHI, commonPorp.getPsnhiVOs());
			WaItemVO itemvo = WaGradeCommon.getWaItem(aggVO.getParentVO().getPk_wa_item());
			
			//add by@chenzf添加校验，上级级别不为空时，一个组织只能存在月薪和年终奖数据 2021-4-6 15:20:26 begin
			WaGradeVO waGradeVO = aggVO.getParentVO();
			if(StringUtils.isNotEmpty(waGradeVO.getPk_wagrade_top())) {
				String sql = "pk_wagrade_top = '"+waGradeVO.getPk_wagrade_top()+"' and standard_type = '"+waGradeVO.getStandard_type()+"' and nvl(dr,0) = 0";
				String rst = ServiceLocator.find(IWaGradeQueryService.class).queryWaGradePK(sql);
				if(StringUtils.isNotEmpty(rst)) {
					throw new BusinessException("该薪资标准类别已经存在一条数据!");
				}
			}
			//add by@chenzf添加校验，上级级别不为空时，一个组织只能存在月薪和年终奖数据 2021-4-6 15:20:26 end
			
			// 保存
			AggWaGradeVO resultVO = ServiceLocator.find(IWaGradeService.class).insertWaGradeVO(aggVO);
			resultVO.getParentVO().setIflddecimal(itemvo.getIflddecimal());
			/*
			 * 复制后，做后续保存操作 添加人员属性设置信息，生效的薪资标准版本信息 1 人员属性发生变化，对应的人员属性设置数据不复制
			 * 2多档，宽带薪酬，级别增加删除，档别增加删除时，薪资标准版本信息不复制
			 */
			if ("copy".equals(opType)) {
				copyHelper.copyHandle(resultVO, pkWaGrdOld, warinMsgBf);
			}
		} else if ("edit".equals(opType)) {
			updateHelper.updateHandle(commonPorp.getPsnhiVOs(), aggVO, warinMsgBf);
		}
		boolean val = "".equals(warinMsgBf.toString()) ? true : false;
		JSONObject json = new JSONObject();
		json.put("message", warinMsgBf.toString());
		json.put("success", val);
		json.put("pk", aggVO.getParentVO().getPrimaryKey());
		return json;
	}
}
