package cn.timer.api.controller.jxgl;

import java.util.List;
import java.util.stream.Collectors;

import javax.validation.constraints.NotNull;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.timer.api.aspect.lang.annotation.Role;
import cn.timer.api.bean.jxgl.JxglAppraisal;
import cn.timer.api.bean.jxgl.JxglAppraisalAssessment;
import cn.timer.api.bean.jxgl.JxglAppraisalIndicators;
import cn.timer.api.bean.jxgl.JxglAppraisalIndicatorsAssessment;
import cn.timer.api.bean.jxgl.JxglAppraisalIndicatorsT;
import cn.timer.api.bean.jxgl.JxglAppraisalItem;
import cn.timer.api.bean.jxgl.JxglAppraisalItemT;
import cn.timer.api.bean.jxgl.JxglAppraisalLog;
import cn.timer.api.bean.jxgl.JxglAppraisalT;
import cn.timer.api.bean.jxgl.JxglBasicSetting;
import cn.timer.api.bean.jxgl.JxglPerformanceAppraisal;
import cn.timer.api.bean.jxgl.JxglPerformanceRating;
import cn.timer.api.bean.jxgl.JxglProcessNode;
import cn.timer.api.bean.spmk.SpmkApproveSummary;
import cn.timer.api.bean.yggl.YgglMainEmp;
import cn.timer.api.bean.zzgl.ZzglBmgwM;
import cn.timer.api.config.annotation.CurrentUser;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.config.enuminterface.JxglEnumInterface.AppraisalLogType;
import cn.timer.api.config.enuminterface.JxglEnumInterface.AppraisalSts;
import cn.timer.api.config.enuminterface.JxglEnumInterface.AssessmentType;
import cn.timer.api.config.enuminterface.JxglEnumInterface.BeingAppraisalSts;
import cn.timer.api.config.enuminterface.JxglEnumInterface.BeingAppraisalType;
import cn.timer.api.config.enuminterface.JxglEnumInterface.ExecuteType;
import cn.timer.api.config.enuminterface.JxglEnumInterface.IndicatorsType;
import cn.timer.api.config.enuminterface.JxglEnumInterface.PerformanceAppraisalSts;
import cn.timer.api.config.enuminterface.JxglEnumInterface.ProcessNodeSts;
import cn.timer.api.config.enuminterface.JxglEnumInterface.ProcessType;
import cn.timer.api.config.exception.CustomException;
import cn.timer.api.config.validation.ValidList;
import cn.timer.api.controller.yggl.service.YgglService;
import cn.timer.api.controller.zzgl.service.ZzglBmgwMService;
import cn.timer.api.dao.jxgl.JxglAppraisalAssessmentMapper;
import cn.timer.api.dao.jxgl.JxglAppraisalIndicatorsAssessmentMapper;
import cn.timer.api.dao.jxgl.JxglAppraisalIndicatorsMapper;
import cn.timer.api.dao.jxgl.JxglAppraisalIndicatorsTMapper;
import cn.timer.api.dao.jxgl.JxglAppraisalItemMapper;
import cn.timer.api.dao.jxgl.JxglAppraisalItemTMapper;
import cn.timer.api.dao.jxgl.JxglAppraisalLogMapper;
import cn.timer.api.dao.jxgl.JxglAppraisalMapper;
import cn.timer.api.dao.jxgl.JxglAppraisalTMapper;
import cn.timer.api.dao.jxgl.JxglBasicSettingMapper;
import cn.timer.api.dao.jxgl.JxglPerformanceAppraisalMapper;
import cn.timer.api.dao.jxgl.JxglPerformanceRatingMapper;
import cn.timer.api.dao.jxgl.JxglProcessNodeMapper;
import cn.timer.api.dao.qyzx.QyzxEmpEntAssoMapper;
import cn.timer.api.dao.yggl.YgglMainEmpMapper;
import cn.timer.api.dao.zzgl.ZzglBmgwMMapper;
import cn.timer.api.dto.jxgl.AppraisalAssessment;
import cn.timer.api.dto.jxgl.AppraisalDetail;
import cn.timer.api.dto.jxgl.AppraisalQuery;
import cn.timer.api.dto.jxgl.AppraisalReject;
import cn.timer.api.dto.jxgl.AppraisalUpdate;
import cn.timer.api.dto.jxgl.AppraisalUpdateSts;
import cn.timer.api.dto.jxgl.BeingAppraisalPerson;
import cn.timer.api.dto.jxgl.EmpAppraisalQuery;
import cn.timer.api.dto.jxgl.EmpPerformanceQuery;
import cn.timer.api.dto.jxgl.MyPerformance;
import cn.timer.api.dto.jxgl.PerformanceAppraisal;
import cn.timer.api.dto.jxgl.PerformanceAppraisalQuery;
import cn.timer.api.dto.jxgl.ProcessNode;
import cn.timer.api.dto.jxgl.ProcessNodeUpdate;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import cn.timer.api.utils.StreamUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@Api(tags = "3.1绩效管理")
@RestController
@Transactional(rollbackFor = Exception.class)
@RequestMapping(value = "/jxgl",  
produces = { "application/json","multipart/form-data" })
public class JxglController {

	@Autowired
	private QyzxEmpEntAssoMapper qyzxEmpEntAssoMapper;
	
	@Autowired
	private ZzglBmgwMMapper zzglBmgwMMapper;
	
	@Autowired
	private JxglBasicSettingMapper jxglBasicSettingMapper;
	
	@Autowired
	private JxglPerformanceRatingMapper jxglPerformanceRatingMapper;
	
	@Autowired
	private JxglAppraisalTMapper jxglAppraisalTMapper;
	
	@Autowired
	private JxglAppraisalIndicatorsTMapper jxglAppraisalIndicatorsTMapper;
	
	@Autowired
	private JxglAppraisalItemTMapper jsxglAppraisalItemTMapper;
	
	@Autowired
	private JxglAppraisalAssessmentMapper jxglAppraisalAssessmentMapper;
	
	@Autowired
	private JxglAppraisalIndicatorsAssessmentMapper jxglAppraisalIndicatorsAssessmentMapper;
	
	//TODO 基础设置
	/**
	 * 新增或编辑-基础设置
	 */
	@PostMapping(value = "/save_basic_setting")
	@ApiOperation(value = "1.新增或编辑-基础设置", httpMethod = "POST", notes = "新增或编辑-审批模板组")
	@ApiOperationSupport(order = 1)
	@Role
	public Result<Object> saveAtg(@CurrentUser UserBean userBean ,@Validated @RequestBody JxglBasicSetting basicSetting) throws Exception{
		Integer orgCode = userBean.getOrgCode();
		
		List<JxglPerformanceRating> listPr = basicSetting.getPerformanceRatings();
		if (listPr != null) {
			for (JxglPerformanceRating pr : listPr) {
				if (pr.getSectionMaxScore() > basicSetting.getMaxScore()) {
					return ResultUtil.error("区间值不能超过 最高分");
				}else if (pr.getSectionMinScore() >= pr.getSectionMaxScore()) {
					return ResultUtil.error("区间值 设置不正确");
				}
			}
		}
		JxglBasicSetting bS = jxglBasicSettingMapper.selectOne(new QueryWrapper<JxglBasicSetting>().lambda()
				.select(JxglBasicSetting::getId)
				.eq(JxglBasicSetting::getOrgCode, orgCode));
		if (bS != null) {
			// 删除 绩效等级
			jxglPerformanceRatingMapper.delete(new QueryWrapper<JxglPerformanceRating>().lambda()
					.eq(JxglPerformanceRating::getBasicSettingId, bS.getId()));
			// 删除 基础设置
			jxglBasicSettingMapper.delete(new QueryWrapper<JxglBasicSetting>().lambda()
					.eq(JxglBasicSetting::getOrgCode, orgCode));
		}
		
		basicSetting.setOrgCode(orgCode);
		basicSetting.insert();
		if (listPr != null && listPr.size() > 0) {
			listPr.stream().forEach(pr -> pr.setBasicSettingId(basicSetting.getId()));
			int i = jxglPerformanceRatingMapper.insertList(listPr);
		}

		return ResultUtil.success();

	}
	
	/**
	 * 查询-基础设置
	 */
	@GetMapping(value = "/select_basic_setting")
	@ApiOperation(value = "2.查询-基础设置", httpMethod = "GET", notes = "查询-基础设置")
	@ApiOperationSupport(order = 2)
	@Role
	public Result<Object> selectAT(@CurrentUser UserBean userBean){
		
		JxglBasicSetting bS = jxglBasicSettingMapper.selectAll(userBean.getOrgCode());

		return ResultUtil.data(bS);
		
	}
	
	
	
	//TODO 考核模板
	/**
	 * 新增或编辑-考核模板
	 */
	@PostMapping(value = "/save_appraisal_t")
	@ApiOperation(value = "3.新增或编辑-考核模板", httpMethod = "POST", notes = "新增或编辑-考核模板")
	@ApiOperationSupport(order = 3)
	@Role
	public Result<Object> saveAtg(@CurrentUser UserBean userBean ,@Validated @RequestBody JxglAppraisalT jxglAppraisalT) throws Exception{
		
		if (jxglAppraisalT.getId() != null && jxglAppraisalT.selectCount(new QueryWrapper<JxglAppraisalT>().lambda()
				.eq(JxglAppraisalT::getId, jxglAppraisalT.getId())) > 0) {
			jxglAppraisalT.updateById();
		}else {
			jxglAppraisalT.setOrgCode(userBean.getOrgCode());
			jxglAppraisalT.insert();
		}
		LambdaQueryWrapper<JxglAppraisalIndicatorsT> q = new QueryWrapper<JxglAppraisalIndicatorsT>().lambda()
		.eq(JxglAppraisalIndicatorsT::getAppraisalTId, jxglAppraisalT.getId());
		
		List<JxglAppraisalIndicatorsT> listAIT = jxglAppraisalIndicatorsTMapper.selectList(q.select(JxglAppraisalIndicatorsT::getId));
		
		List<Integer> listAITId = listAIT != null && listAIT.size() > 0 ? listAIT.stream().map(JxglAppraisalIndicatorsT::getId).collect(Collectors.toList()) : null;
		
		// 删除 原 考核指标模板
		jxglAppraisalIndicatorsTMapper.delete(q);
		// 删除 原 考核项模板
		if (listAITId != null) {
			jsxglAppraisalItemTMapper.delete(new QueryWrapper<JxglAppraisalItemT>().lambda()
					.in(JxglAppraisalItemT::getAppraisalIndicatorsTId, listAITId));
		}
		
		List<JxglAppraisalIndicatorsT> aITs = jxglAppraisalT.getAppraisalIndicatorsTs();
		for (JxglAppraisalIndicatorsT aIT : aITs) {
			aIT.setAppraisalTId(jxglAppraisalT.getId());
			// 新增 考核指标模板
			if (aIT.insert()) {
				List<JxglAppraisalItemT> aItemTs = aIT.getAppraisalItemTs();
				if (aItemTs != null && aItemTs.size() > 0) {
					// 批量新增 考核项模板
					aItemTs.stream().forEach(aItemT -> aItemT.setAppraisalIndicatorsTId(aIT.getId()));
					int c = jsxglAppraisalItemTMapper.insertList(aItemTs);
				}
			}else {
				throw new Exception();
			}
			
		}

		return ResultUtil.success();
	}
	
	
	/**
	 * 查询-考核模板-列表
	 */
	@PostMapping(value = "/selects_appraisal_t")
	@ApiOperation(value = "4.查询-考核模板-列表", httpMethod = "POST", notes = "查询-考核模板-列表")
	@ApiOperationSupport(order = 4)
	@Role
	public Result<Object> selectListAT(@CurrentUser UserBean userBean,@RequestBody cn.timer.api.utils.Page page){
		
		IPage<JxglAppraisalT> p = new Page<JxglAppraisalT>(page.getCurrentPage(),page.getTotalPage());
		
		IPage<JxglAppraisalT> pageAT = jxglAppraisalTMapper.selectPage(p, new QueryWrapper<JxglAppraisalT>().lambda()
				.eq(JxglAppraisalT::getOrgCode, userBean.getOrgCode()));
		
		List<JxglAppraisalT> listAT = pageAT.getRecords();
		
		return ResultUtil.data(pageAT, listAT);
		
	}
	
	/**
	 * 查询-考核模板-详情
	 */
	@GetMapping(value = "/selects_appraisal_t/{id}")
	@ApiOperation(value = "5.查询-考核模板-详情", httpMethod = "GET", notes = "查询-考核模板-详情")
	@ApiOperationSupport(order = 5)
	@Role
	public Result<Object> selectAT(@CurrentUser UserBean userBean,@PathVariable Integer id){
		
		JxglAppraisalT aT = jxglAppraisalTMapper.selectDetailById(id);

		return ResultUtil.data(aT);
		
	}
	
	/**
	 * 删除-考核模板
	 */
	@DeleteMapping(value = "/del_appraisal_t/{id}")
	@ApiOperation(value = "6.删除-考核模板", httpMethod = "DELETE", notes = "删除-考核模板")
	@ApiOperationSupport(order = 6)
	@Role
	public Result<Object> delAT(@CurrentUser UserBean userBean,@PathVariable Integer id) throws Exception{
		
		jxglAppraisalTMapper.delete(new QueryWrapper<JxglAppraisalT>().lambda()
				.eq(JxglAppraisalT::getId, id)
				.eq(JxglAppraisalT::getOrgCode, userBean.getOrgCode()));

		return ResultUtil.success();
		
	}
	
	@Autowired
	private ZzglBmgwMService zzglBmgwMService;
	
	@Autowired
	private YgglService ygglService;
	
	@Autowired
	private JxglPerformanceAppraisalMapper jxglPerformanceAppraisalMapper;
	
	@Autowired
	private JxglAppraisalMapper jxglAppraisalMapper;
	
	@Autowired
	private JxglAppraisalIndicatorsMapper jxglAppraisalIndicatorsMapper;
	
	@Autowired
	private JxglAppraisalItemMapper jsxglAppraisalItemMapper;
	
	@Autowired
	private JxglAppraisalLogMapper jxglAppraisalLogMapper;
	
	@Autowired
	private YgglMainEmpMapper ygglMainEmpMapper;
	
	/**
	 * 新增-绩效考核
	 */
	@PostMapping(value = "/save_performance_appraisal")
	@ApiOperation(value = "7.新增-绩效考核", httpMethod = "POST", notes = "新增-绩效考核")
	@ApiOperationSupport(order = 7)
	public Result<Object> savePA(@CurrentUser UserBean userBean,@Validated @RequestBody PerformanceAppraisal performanceAppraisal) throws Exception{
		Integer orgCode = userBean.getOrgCode();
		JxglPerformanceAppraisal pA = JxglPerformanceAppraisal.builder().build();
		BeanUtil.copyProperties(performanceAppraisal, pA, "processNode","beingAppraisalPerson","appraisalTId");
		
		List<ProcessNode> listPN = performanceAppraisal.getProcessNode();
		List<BeingAppraisalPerson> listBAP = performanceAppraisal.getBeingAppraisalPerson();
		pA.setOrgCode(orgCode);
		pA.setProcessNode(ObjectUtil.serialize(listPN));
		pA.setBeingAppraisalPerson(ObjectUtil.serialize(listBAP));
		
		// 被考核人员
		List<Integer> listEmpId = listBAP.stream()
			.filter(bAP -> 
				BeingAppraisalType.EMPLOYEE.getType().equals(bAP.getType()) && 
				BeingAppraisalSts.NEED.getType().equals(bAP.getSts()))
			.map(BeingAppraisalPerson::getId)
			.collect(Collectors.toList());

		// 被考核部门id
		List<Integer> listDeptId = listBAP.stream()
				.filter(bAP -> 
					BeingAppraisalType.DEPARTMENT.getType().equals(bAP.getType()))
				.map(BeingAppraisalPerson::getId)
				.collect(Collectors.toList());
		List<YgglMainEmp> listEmp2 = ListUtil.toList();
		for (Integer deptId : listDeptId) {
			CollUtil.addAll(listEmp2, zzglBmgwMService.selectOtherlistent(userBean.getOrgCode(), deptId));
		}
		if (!CollUtil.isEmpty(listEmp2)) {
			// 员工信息数据 去重
			List<Integer> listEmp2Id = listEmp2.stream()
					.filter(StreamUtils.distinctByKey(e -> e.getEmpNum()))
					.map(YgglMainEmp::getEmpNum)
					.collect(Collectors.toList());
			// 合并 集合
			CollUtil.addAll(listEmpId, listEmp2Id);
		}
		
		// 无需被考核人id
		List<Integer> listNotEmpId = listBAP.stream()
				.filter(bAP -> 
					BeingAppraisalType.EMPLOYEE.getType().equals(bAP.getType()) && 
					BeingAppraisalSts.NOT_NEED.getType().equals(bAP.getSts()))
				.map(BeingAppraisalPerson::getId)
				.collect(Collectors.toList());
		
		// 去重+过滤掉 无需被考核人id
		listEmpId = listEmpId.stream().filter(e -> !listNotEmpId.contains(e)).distinct().collect(Collectors.toList());
		pA.setAppraisalPersonNum(listEmpId.size());
		// 新增 绩效考核 
		pA.insert();
		// 考核模板
		JxglAppraisalT aT = jxglAppraisalTMapper.selectById(performanceAppraisal.getAppraisalTId());
		if (aT == null) {
			throw new CustomException("考核模板不存在");
		}
		
		JxglProcessNode processNode = JxglProcessNode.builder().build();
		JxglAppraisal appraisal = JxglAppraisal.builder().build();
		JxglAppraisalIndicators appraisalIndicators = JxglAppraisalIndicators.builder().build();
		JxglAppraisalItem appraisalItem = JxglAppraisalItem.builder().build();
		JxglAppraisalLog appraisalLog = JxglAppraisalLog.builder().build();
		
		System.out.println("listEmpId----"+listEmpId);
		for (Integer bAP : listEmpId) {
			// 考核
			appraisal.setPerformanceAppraisalId(pA.getId());
			appraisal.setEmpNum(bAP);
			appraisal.setName(aT.getName());
			appraisal.setAppraisalExplain(aT.getAppraisalExplain());
			appraisal.setSts(AppraisalSts.TARGET_FILL_IN.getType());
			// 新增 考核
			appraisal.insert();
			System.out.println("新增 考核:" + appraisal);
			
//			List<Integer> weights = listPN.stream()
//			.filter(p -> ProcessType.SELF_ASSESSMENT.getType().equals(p.getProcessType()) || 
//						 ProcessType.SUPERIOR_SCORE.getType().equals(p.getProcessType()))
//			.map(ProcessNode::getWeight)
//			.collect(Collectors.toList());
//			Integer weightSum = 0;
//			if (weights != null && weights.size() > 0) {
//				for (Integer i : weights) {
//					weightSum += i;
//				}
//				if (!weightSum.equals(100))
//					throw new CustomException("权重总和要等于 100%");
//			}
			
			listPN.stream().forEach(pN -> {
				Integer executeType = pN.getExecuteType();
				// 流程节点
				processNode.setAppraisalId(appraisal.getId());
				processNode.setExecuteType(executeType);
				processNode.setLeaderTier(pN.getLeaderTier());
				processNode.setName(ExecuteType.getName(executeType));
				Integer processType = pN.getProcessType();
				processNode.setProcessType(processType);
				if (ProcessType.TARGET_FILL_IN.getType().equals(processType)) {
					processNode.setSts(ProcessNodeSts.IN_EXECUTION.getType());
				}else {
					processNode.setSts(ProcessNodeSts.NON_EXECUTION.getType());
				}
				processNode.setWeight(pN.getWeight());
				
				if (ExecuteType.BEING_APPRAISAL_PERSON.getType().equals(executeType)) {
					processNode.setExecutorId(bAP);
				}else if (ExecuteType.LEADER.getType().equals(executeType)) {
					processNode.setExecutorId(ygglService.selectLeaderEmpNumById(userBean.getOrgCode(), bAP, pN.getLeaderTier()));
				}else if (ExecuteType.SPECIFIED_MEMBER.getType().equals(executeType)) {
					processNode.setExecutorId(pN.getExecutorId());
				}
				// 新增 流程节点
				processNode.insert();
				System.out.println("新增 流程节点:" + processNode);
				
			});
			
			List<JxglAppraisalIndicatorsT> listAIT = jxglAppraisalIndicatorsTMapper.selectList(new QueryWrapper<JxglAppraisalIndicatorsT>().lambda()
					.eq(JxglAppraisalIndicatorsT::getAppraisalTId, aT.getId())
					.ne(aT.getIsUseFixd() == 1 ,JxglAppraisalIndicatorsT::getType, IndicatorsType.FIXATION.getType())
					.ne(aT.getIsUseNotFixd() == 1 ,JxglAppraisalIndicatorsT::getType, IndicatorsType.NOT_FIXATION.getType()));
		
			if (listAIT == null || listAIT.size() <= 0) {
				throw new CustomException("考核指标不存在");
			}
			
			listAIT.stream().forEach(aIT -> {
					// 考核指标
					BeanUtil.copyProperties(aIT, appraisalIndicators, "appraisalId", "createTime", "updateTime");
					appraisalIndicators.setAppraisalId(appraisal.getId());
					// 新增 考核指标
					appraisalIndicators.insert();
//					System.out.println("新增 考核指标:" + appraisalIndicators);
					
					List<JxglAppraisalItemT> listAItemT = jsxglAppraisalItemTMapper.selectList(new QueryWrapper<JxglAppraisalItemT>().lambda()
							.eq(JxglAppraisalItemT::getAppraisalIndicatorsTId, aIT.getId()));
					
					if (listAItemT != null && listAItemT.size() > 0) {
						listAItemT.stream().forEach(aItemT -> {
							BeanUtil.copyProperties(aItemT, appraisalItem, "appraisalIndicatorsTId");
							appraisalItem.setAppraisalIndicatorsId(appraisalIndicators.getId());
							
							// 新增 考核项
							appraisalItem.insert();
//							System.out.println("新增 考核项:" + appraisalItem);
						});
					}
					
			});
			
			YgglMainEmp yME = ygglMainEmpMapper.selectOne(new QueryWrapper<YgglMainEmp>().lambda()
					.select(YgglMainEmp::getName)
					.eq(YgglMainEmp::getOrgCode, orgCode)
					.eq(YgglMainEmp::getEmpNum, bAP));
			
			appraisalLog.setAppraisalId(appraisal.getId());
			appraisalLog.setExecutorId(bAP);
			appraisalLog.setExecutorName(yME.getName());
			appraisalLog.setType(AppraisalLogType.START.getType());
			appraisalLog.insert();
		}
		
		return ResultUtil.success();
	}
	
	/**
	 * 删除-绩效考核
	 */
	@DeleteMapping(value = "/delete_performance_appraisal/{id}")
	@ApiOperation(value = "8.删除-绩效考核", httpMethod = "DELETE", notes = "删除-绩效考核")
	@ApiOperationSupport(order = 8)
	@Role
	public Result<Object> deletePA(@CurrentUser UserBean userBean,@PathVariable Integer id){
		
		JxglPerformanceAppraisal pA = jxglPerformanceAppraisalMapper.selectOne(new QueryWrapper<JxglPerformanceAppraisal>().lambda()
				.eq(JxglPerformanceAppraisal::getId, id)
				.eq(JxglPerformanceAppraisal::getOrgCode, userBean.getOrgCode()));
		
		if (pA == null) {
			return ResultUtil.error("绩效考核不存在");
		}
		
		List<Integer> aIds = CollUtil.toList();
		List<Integer> aIIds = CollUtil.toList();
		
		List<JxglAppraisal> listA = jxglAppraisalMapper.selectList(new QueryWrapper<JxglAppraisal>().lambda()
				.select(JxglAppraisal::getId)
				.eq(JxglAppraisal::getPerformanceAppraisalId, pA.getId()));
		
		aIds = listA != null && listA.size() > 0 ? listA.stream().map(JxglAppraisal::getId).collect(Collectors.toList()) : aIds;
		
		// 删除 绩效考核
		jxglPerformanceAppraisalMapper.deleteById(id);
		
		if (aIds.size() > 0) {
			
			// 批量删除 考核
			jxglAppraisalMapper.deleteBatchIds(aIds);
			
			// 批量删除 流程节点
			jxglProcessNodeMapper.delete(new QueryWrapper<JxglProcessNode>().lambda()
					.eq(aIds.size() == 1, JxglProcessNode::getAppraisalId, aIds)
					.in(aIds.size() > 1, JxglProcessNode::getAppraisalId, aIds));
			// 批量删除 考核评定
			jxglAppraisalAssessmentMapper.delete(new QueryWrapper<JxglAppraisalAssessment>().lambda()
					.eq(aIds.size() == 1, JxglAppraisalAssessment::getAppraisalId, aIds)
					.in(aIds.size() > 1, JxglAppraisalAssessment::getAppraisalId, aIds));
			// 批量删除 考核记录
			jxglAppraisalLogMapper.delete(new QueryWrapper<JxglAppraisalLog>().lambda()
					.eq(aIds.size() == 1, JxglAppraisalLog::getAppraisalId, aIds)
					.in(aIds.size() > 1, JxglAppraisalLog::getAppraisalId, aIds));
			
			List<JxglAppraisalIndicators> listAI = jxglAppraisalIndicatorsMapper.selectList(new QueryWrapper<JxglAppraisalIndicators>().lambda()
					.select(JxglAppraisalIndicators::getId)
					.eq(aIds.size() == 1, JxglAppraisalIndicators::getAppraisalId, aIds)
					.in(aIds.size() > 1, JxglAppraisalIndicators::getAppraisalId, aIds));
			
			aIIds = listAI != null && listAI.size() > 0 ? listAI.stream().map(JxglAppraisalIndicators::getId).collect(Collectors.toList()) : aIIds;
		
			if (aIIds.size() > 0) {
				
				jxglAppraisalIndicatorsMapper.deleteBatchIds(aIIds);
				
				// 批量删除 考核指标评定
				jxglAppraisalIndicatorsAssessmentMapper.delete(new QueryWrapper<JxglAppraisalIndicatorsAssessment>().lambda()
						.eq(aIds.size() == 1, JxglAppraisalIndicatorsAssessment::getAppraisalIndicatorsId, aIIds)
						.in(aIds.size() > 1, JxglAppraisalIndicatorsAssessment::getAppraisalIndicatorsId, aIIds));
				
				// 批量删除 考核项
				jxglAppraisalItemMapper.delete(new QueryWrapper<JxglAppraisalItem>().lambda()
						.eq(aIds.size() == 1, JxglAppraisalItem::getAppraisalIndicatorsId, aIIds)
						.in(aIds.size() > 1, JxglAppraisalItem::getAppraisalIndicatorsId, aIIds));
				
			}
		}
		
		return ResultUtil.success();
	}
	
	/**
	 * 修改-绩效管理状态
	 */
	@PostMapping(value = "/update_performance_appraisal_sts")
	@ApiOperation(value = "8.修改-绩效管理状态", httpMethod = "POST", notes = "修改-绩效管理状态")
	@ApiOperationSupport(order = 8)
	public Result<Object> updatePAS(@CurrentUser UserBean userBean,@RequestBody AppraisalUpdateSts appraisalUpdateSts){
		
		JxglPerformanceAppraisal performanceAppraisal = jxglPerformanceAppraisalMapper.selectOne(new QueryWrapper<JxglPerformanceAppraisal>().lambda()
				.eq(JxglPerformanceAppraisal::getId, appraisalUpdateSts.getId())
				.eq(JxglPerformanceAppraisal::getSts, appraisalUpdateSts.getSts())
				);
		
		if (performanceAppraisal == null) {
			return ResultUtil.error("绩效考核不存在");
		}
		if (performanceAppraisal.getSts() == PerformanceAppraisalSts.TERMINATION_ASSESSMENT.getType()) {
			return ResultUtil.error("考核已终止");
		}
		
		Integer sts = null;
		Integer id = performanceAppraisal.getId();
		
		List<JxglAppraisal> listA = CollUtil.toList();
		List<Integer> aIds =  CollUtil.toList();
		List<JxglProcessNode> listPN = CollUtil.toList();
		List<Integer> pNIds = CollUtil.toList();
		
		
		switch (performanceAppraisal.getSts()) {
		case 0:
			sts = PerformanceAppraisalSts.PERFORMANCE_SCORE.getType();
			
			listA = jxglAppraisalMapper.selectList(new QueryWrapper<JxglAppraisal>().lambda()
					.select(JxglAppraisal::getId)
					.eq(JxglAppraisal::getPerformanceAppraisalId, id));
			
			if (listA != null && listA.size() > 0) {
				aIds = listA.stream().map(JxglAppraisal::getId).collect(Collectors.toList());
				
				listPN = jxglProcessNodeMapper.selectList(new QueryWrapper<JxglProcessNode>().lambda()
						.in(JxglProcessNode::getAppraisalId, aIds)
						.eq(JxglProcessNode::getProcessType, ProcessType.TARGET_CONFIRMED.getType())
						.eq(JxglProcessNode::getSts,  ProcessNodeSts.EXECUTED.getType()));
				
				if (listPN != null && listPN.size() > 0) {
					aIds = listPN.stream().map(JxglProcessNode::getAppraisalId).collect(Collectors.toList());
					System.out.println("1------"+ aIds);
					listPN = jxglProcessNodeMapper.selectList(new QueryWrapper<JxglProcessNode>().lambda()
							.in(JxglProcessNode::getAppraisalId, aIds)
							.eq(JxglProcessNode::getProcessType, ProcessType.SELF_ASSESSMENT.getType())
							.eq(JxglProcessNode::getSts, ProcessNodeSts.NON_EXECUTION.getType()));
					if (listPN != null && listPN.size() > 0) {
						pNIds = listPN.stream().map(JxglProcessNode::getId).collect(Collectors.toList());
						aIds = listPN.stream().map(JxglProcessNode::getAppraisalId).collect(Collectors.toList());
						System.out.println("2------"+ pNIds);
						System.out.println("3------"+ aIds);
						JxglProcessNode.builder().sts(ProcessNodeSts.IN_EXECUTION.getType()).build().update(new UpdateWrapper<JxglProcessNode>().lambda()
								.in(JxglProcessNode::getId, pNIds));
						
						JxglAppraisal.builder().sts(AppraisalSts.SELF_ASSESSMENT.getType()).build().update(new UpdateWrapper<JxglAppraisal>().lambda()
								.in(JxglAppraisal::getId, aIds));
						
					}
					
				}
				
			}
			
			break;
		case 1:
			sts = PerformanceAppraisalSts.RESULT_VERIFICATION.getType();
			
			listA = jxglAppraisalMapper.selectList(new QueryWrapper<JxglAppraisal>().lambda()
					.select(JxglAppraisal::getId)
					.eq(JxglAppraisal::getPerformanceAppraisalId, id));
			
			if (listA != null && listA.size() > 0) {
				aIds = listA.stream().map(JxglAppraisal::getId).collect(Collectors.toList());
				
				listPN = jxglProcessNodeMapper.selectList(new QueryWrapper<JxglProcessNode>().lambda()
						.in(JxglProcessNode::getAppraisalId, aIds)
						.eq(JxglProcessNode::getProcessType, ProcessType.SUPERIOR_SCORE.getType())
						.eq(JxglProcessNode::getSts,  ProcessNodeSts.EXECUTED.getType()));
				
				if (listPN != null && listPN.size() > 0) {
					aIds = listPN.stream().map(JxglProcessNode::getAppraisalId).collect(Collectors.toList());
					
					listPN = jxglProcessNodeMapper.selectList(new QueryWrapper<JxglProcessNode>().lambda()
							.in(JxglProcessNode::getAppraisalId, aIds)
							.eq(JxglProcessNode::getProcessType, ProcessType.RESULT_VERIFICATION.getType())
							.eq(JxglProcessNode::getSts, ProcessNodeSts.NON_EXECUTION.getType()));
					if (listPN != null && listPN.size() > 0) {
						pNIds = listPN.stream().map(JxglProcessNode::getId).collect(Collectors.toList());
						aIds = listPN.stream().map(JxglProcessNode::getAppraisalId).collect(Collectors.toList());
						
						JxglProcessNode.builder().sts(ProcessNodeSts.IN_EXECUTION.getType()).build().update(new UpdateWrapper<JxglProcessNode>().lambda()
								.in(JxglProcessNode::getId, pNIds));
						
						JxglAppraisal.builder().sts(AppraisalSts.RESULT_VERIFICATION.getType()).build().update(new UpdateWrapper<JxglAppraisal>().lambda()
								.in(JxglAppraisal::getId, aIds));
						
					}
					
				}
				
			}
			break;
		case 2:
			sts = PerformanceAppraisalSts.PERFORMANCE_ARCHIVE.getType();
			
			listA = jxglAppraisalMapper.selectList(new QueryWrapper<JxglAppraisal>().lambda()
					.select(JxglAppraisal::getId)
					.eq(JxglAppraisal::getPerformanceAppraisalId, id));
			
			if (listA != null && listA.size() > 0) {
				aIds = listA.stream().map(JxglAppraisal::getId).collect(Collectors.toList());
				
				listPN = jxglProcessNodeMapper.selectList(new QueryWrapper<JxglProcessNode>().lambda()
						.in(JxglProcessNode::getAppraisalId, aIds)
						.eq(JxglProcessNode::getProcessType, ProcessType.RESULT_VERIFICATION.getType())
						.eq(JxglProcessNode::getSts,  ProcessNodeSts.EXECUTED.getType()));
				
				if (listPN != null && listPN.size() > 0) {
					aIds = listPN.stream().map(JxglProcessNode::getAppraisalId).collect(Collectors.toList());
					
					listPN = jxglProcessNodeMapper.selectList(new QueryWrapper<JxglProcessNode>().lambda()
							.in(JxglProcessNode::getAppraisalId, aIds)
							.eq(JxglProcessNode::getProcessType, ProcessType.TARGET_CONFIRMED.getType())
							.eq(JxglProcessNode::getSts, ProcessNodeSts.NON_EXECUTION.getType()));
					if (listPN != null && listPN.size() > 0) {
						pNIds = listPN.stream().map(JxglProcessNode::getId).collect(Collectors.toList());
						aIds = listPN.stream().map(JxglProcessNode::getAppraisalId).collect(Collectors.toList());
						
						JxglProcessNode.builder().sts(ProcessNodeSts.IN_EXECUTION.getType()).build().update(new UpdateWrapper<JxglProcessNode>().lambda()
								.in(JxglProcessNode::getId, pNIds));
						
						JxglAppraisal.builder().sts(AppraisalSts.SELF_ASSESSMENT.getType()).build().update(new UpdateWrapper<JxglAppraisal>().lambda()
								.in(JxglAppraisal::getId, aIds));
						
					}
					
				}
				
			}
			break;
		default:
			break;
		}
		
		// 修改 绩效考核状态
		jxglPerformanceAppraisalMapper.updateById(JxglPerformanceAppraisal.builder()
				.id(appraisalUpdateSts.getId())
				.sts(sts)
				.build());
		
		// 修改 考核状态
		jxglAppraisalMapper.update(JxglAppraisal.builder()
				.performanceAppraisalId(appraisalUpdateSts.getId())
				.sts(sts)
				.build(), new UpdateWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getPerformanceAppraisalId, appraisalUpdateSts.getId())
				.eq(JxglAppraisal::getSts, AppraisalSts.TARGET_CONFIRMED.getType())
				);
		
		return ResultUtil.success();
	}
	
	/**
	 * 删除-所有-绩效考核
	 */
	@DeleteMapping(value = "/delete_all_pa")
	@ApiOperation(value = "99.删除-所有-绩效考核", httpMethod = "DELETE", notes = "删除-所有-绩效考核")
	@ApiOperationSupport(order = 99)
	@Role
	public Result<Object> deleteAllPA(@CurrentUser UserBean userBean){
		
			jxglPerformanceAppraisalMapper.delete(null);
			jxglAppraisalMapper.delete(null);
			jxglProcessNodeMapper.delete(null);
			jxglAppraisalAssessmentMapper.delete(null);
			jxglAppraisalLogMapper.delete(null);
			jxglAppraisalIndicatorsMapper.delete(null);
			jxglAppraisalIndicatorsAssessmentMapper.delete(null);
			jxglAppraisalItemMapper.delete(null);
		
		return ResultUtil.success("删除-所有-绩效考核");
	}
	
	/**
	 * 查询-绩效考核-列表-归档
	 */
	@PostMapping(value = "/selects_performance_appraisal_archive")
	@ApiOperation(value = "8.查询-绩效考核-列表-归档", httpMethod = "POST", notes = "查询-绩效考核-列表-归档")
	@ApiOperationSupport(order = 8)
	@Role
	public Result<Object> selectsPAArchive(@CurrentUser UserBean userBean,@RequestBody PerformanceAppraisalQuery query){
		
		IPage<SpmkApproveSummary> page = new Page<SpmkApproveSummary>(query.getCurrentPage(),query.getTotalPage());
		
		query.setOrgCode(userBean.getOrgCode());
		
		IPage<JxglPerformanceAppraisal> pagePA = jxglPerformanceAppraisalMapper.selectArchiveListByQuery(page, query);
		
		List<JxglPerformanceAppraisal> listPA = pagePA.getRecords();

		return ResultUtil.data(pagePA,listPA);
		
	}
	
	/**
	 * 查询-绩效考核-列表-非归档
	 */
	@PostMapping(value = "/selects_performance_appraisal")
	@ApiOperation(value = "9.查询-绩效考核-列表-非归档", httpMethod = "POST", notes = "查询-绩效考核-列表-非归档")
	@ApiOperationSupport(order = 9)
	@Role
	public Result<Object> selectsPA(@CurrentUser UserBean userBean,@RequestBody PerformanceAppraisalQuery query){
		
		IPage<SpmkApproveSummary> page = new Page<SpmkApproveSummary>(query.getCurrentPage(),query.getTotalPage());
		
		query.setOrgCode(userBean.getOrgCode());
		
		IPage<JxglPerformanceAppraisal> pagePA = jxglPerformanceAppraisalMapper.selectListByQuery(page, query);
		
		List<JxglPerformanceAppraisal> listPA = pagePA.getRecords();

		return ResultUtil.data(pagePA,listPA);
		
	}
	
	/**
	 * 查询-考核-列表
	 */
	@PostMapping(value = "/selects_appraisal")
	@ApiOperation(value = "10.查询-考核-列表", httpMethod = "POST", notes = "查询-考核-列表")
	@ApiOperationSupport(order = 10)
	@Role
	public Result<Object> selectsA(@CurrentUser UserBean userBean,@RequestBody AppraisalQuery query){
		
		IPage<JxglAppraisal> page = new Page<JxglAppraisal>(query.getCurrentPage(),query.getTotalPage());
		query.setOrgCode(userBean.getOrgCode());
		
		IPage<JxglAppraisal> pageA = jxglAppraisalMapper.selectListByQuery(page, query);
		
		List<JxglAppraisal> listPA = pageA.getRecords();

		return ResultUtil.data(pageA,listPA);
		
	}
	
	/**
	 * 查询-考核-详情
	 */
	@GetMapping(value = "/select_appraisal/{id}")
	@ApiOperation(value = "11.查询-考核-详情", httpMethod = "GET", notes = "查询-考核-详情")
	@ApiOperationSupport(order = 11)
	@Role
	public Result<Object> selectA(@CurrentUser UserBean userBean,@PathVariable Integer id){
		
		AppraisalDetail aD = jxglAppraisalMapper.selectDetailById(userBean.getOrgCode(), id);
		
		if (aD != null) {
			JxglPerformanceAppraisal pA = jxglPerformanceAppraisalMapper.selectOne(new QueryWrapper<JxglPerformanceAppraisal>().lambda()
					.eq(JxglPerformanceAppraisal::getId, aD.getPerformanceAppraisalId()));
			
			if (pA != null && pA.getIsVisible() == 0) {
				return ResultUtil.data(aD);
			}else {
				List<JxglAppraisalAssessment> listAA = aD.getAppraisalAssessments();
				if (listAA != null) {
					listAA = listAA.stream().filter(a -> !userBean.getEmpNum().equals(a.getAssessorId())).collect(Collectors.toList());
					aD.setAppraisalAssessments(listAA);
				}
			}
		}
		
		return ResultUtil.data(aD);
		
	}
	
	/**
	 * 修改-流程执行人-转派
	 */
	@PutMapping(value = "/update_process_node")
	@ApiOperation(value = "12.修改-流程执行人-转派", httpMethod = "PUT", notes = "修改-流程执行人-转派")
	@ApiOperationSupport(order = 12)
	@Role
	public Result<Object> updatePN(@CurrentUser UserBean userBean,@Validated @RequestBody ProcessNodeUpdate processNodeUpdate){
		
		JxglAppraisal appraisal = jxglAppraisalMapper.selectOne(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, processNodeUpdate.getAppraisalId())
				.select(JxglAppraisal::getId));
		
		if (appraisal == null) {
			return ResultUtil.error("考核 不存在");
		}
		
		Integer count = jxglAppraisalMapper.selectCount(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, processNodeUpdate.getAppraisalId())
				.in(JxglAppraisal::getSts, AppraisalSts.ASSESSMENT_COMPLETE.getType(),
						AppraisalSts.TERMINATION_ASSESSMENT.getType(),
						AppraisalSts.PERFORMANCE_ARCHIVE.getType()));
		
		if (count > 0) {
			return ResultUtil.error("考核已结束");
		}
		
		count = jxglProcessNodeMapper.selectCount(new QueryWrapper<JxglProcessNode>().lambda()
				.eq(JxglProcessNode::getAppraisalId, processNodeUpdate.getAppraisalId())
				.ne(JxglProcessNode::getSts, ProcessNodeSts.EXECUTED.getType()));
		
		if (count <= 0) {
			return ResultUtil.error("流程已执行,无法更改");
		}
		
		JxglProcessNode pN = JxglProcessNode.builder().build();
		BeanUtil.copyProperties(processNodeUpdate, pN);
		
		pN.updateById();
		
		return ResultUtil.data(pN);
	}
	
	/**
	 * 终止-考核
	 */
	@PutMapping(value = "/termination_assessment")
	@ApiOperation(value = "13.终止-考核", httpMethod = "PUT", notes = "终止-考核")
	@ApiOperationSupport(order = 13)
	@Role
	public Result<Object> terminationAssessment(@CurrentUser UserBean userBean,@NotNull @RequestParam Integer id){
		
		JxglAppraisal appraisal = jxglAppraisalMapper.selectById(id);
		
		if (appraisal == null) {
			return ResultUtil.error("考核 不存在");
		}else if (appraisal.getSts() <= AppraisalSts.RESULT_VERIFICATION.getType() ) {
			JxglAppraisal.builder().id(id).sts(AppraisalSts.TERMINATION_ASSESSMENT.getType()).build().updateById();
		}else if (appraisal.getSts() == AppraisalSts.ASSESSMENT_COMPLETE.getType()) {
			return ResultUtil.error("考核已完成,无法终止");
		}else if (appraisal.getSts() == AppraisalSts.TERMINATION_ASSESSMENT.getType()) {
			return ResultUtil.error("考核已终止,无法重复终止");
		}else if (appraisal.getSts() == AppraisalSts.PERFORMANCE_ARCHIVE.getType()) {
			return ResultUtil.error("考核已归档,无法终止");
		}
		return ResultUtil.success();
	}
	
	@Autowired
	private JxglAppraisalAssessmentMapper appraisalAssessmentMapper;
	
	@Autowired
	private JxglProcessNodeMapper processNodeMapper;
	
	/**
	 * 新增-考核评定
	 */
	@PutMapping(value = "/save_appraisal_assessment")
	@ApiOperation(value = "13.新增-考核评定", httpMethod = "PUT", notes = "新增-考核评定")
	@ApiOperationSupport(order = 13)
	public Result<Object> saveAA(@CurrentUser UserBean userBean,@RequestBody JxglAppraisalAssessment appraisalAssessment){
		
		Integer count2 = jxglAppraisalMapper.selectCount(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, appraisalAssessment.getAppraisalId())
				.in(JxglAppraisal::getSts, AppraisalSts.ASSESSMENT_COMPLETE.getType(),
						AppraisalSts.TERMINATION_ASSESSMENT.getType(),
						AppraisalSts.PERFORMANCE_ARCHIVE.getType()));
		
		if (count2 > 0) {
			return ResultUtil.error("考核已结束");
		}
		Integer empNum =  userBean.getEmpNum();
		
		JxglProcessNode pN = processNodeMapper.selectOne(new QueryWrapper<JxglProcessNode>().lambda()
				.in(JxglProcessNode::getProcessType, ProcessType.SELF_ASSESSMENT,ProcessType.SUPERIOR_SCORE));
		
		if (pN == null) {
			return ResultUtil.error("在该流程状态 无法评价");
		}else if (!empNum.equals(pN.getExecutorId())) {
			return ResultUtil.error("无权限 评价");
		}
		
		appraisalAssessment.setAssessorName(userBean.getUserInfo().getName());
		appraisalAssessment.setAssessorId(userBean.getEmpNum());
		appraisalAssessment.insert();
		
		return ResultUtil.data(appraisalAssessment);
	}
	
	/**
	 * 查询-所有员工绩效-汇总
	 */
	@PostMapping(value = "/selects_emp_performance")
	@ApiOperation(value = "14.查询-所有员工绩效-汇总", httpMethod = "POST", notes = "查询-所有员工绩效-汇总")
	@ApiOperationSupport(order = 14)
	@Role
	public Result<Object> selectsEP(@CurrentUser UserBean userBean,@RequestBody EmpPerformanceQuery query){
		
		IPage<JxglAppraisal> page = new Page<JxglAppraisal>(query.getCurrentPage(),query.getTotalPage());
		query.setOrgCode(userBean.getOrgCode());
		
		IPage<JxglAppraisal> pageA = jxglAppraisalMapper.selectListEmpByQuery(page, query);
		
		List<JxglAppraisal> listA = pageA.getRecords();

		return ResultUtil.data(pageA,listA);
		
	}
	
	/**
	 * 查询-某员工考核-列表
	 */
	@PostMapping(value = "/selects_emp_appraisal")
	@ApiOperation(value = "15.查询-某员工考核-列表", httpMethod = "POST", notes = "查询-某员工考核-列表")
	@ApiOperationSupport(order = 15)
	@Role
	public Result<Object> selectsEA(@CurrentUser UserBean userBean,@RequestBody EmpAppraisalQuery query){
		
		IPage<JxglPerformanceAppraisal> page = new Page<JxglPerformanceAppraisal>(query.getCurrentPage(),query.getTotalPage());
		query.setOrgCode(userBean.getOrgCode());
		
		IPage<JxglPerformanceAppraisal> pagePA = jxglPerformanceAppraisalMapper.selectListEmpByQuery(page, query);
		
		List<JxglPerformanceAppraisal> listPA = pagePA.getRecords();

		return ResultUtil.data(pagePA,listPA);
		
	}
	
	/**
	 * 查询-绩效考核-方案
	 */
	@GetMapping(value = "/selects_performance_appraisal/{id}")
	@ApiOperation(value = "16.查询-绩效考核-方案", httpMethod = "GET", notes = "查询-绩效考核-方案")
	@ApiOperationSupport(order = 16)
	@Role
	public Result<Object> selectPA(@CurrentUser UserBean userBean,@PathVariable Integer id){
		
		JxglPerformanceAppraisal pA = jxglPerformanceAppraisalMapper.selectById(id);
		if (pA == null) {
			return ResultUtil.error("方案不存在");
		}
		PerformanceAppraisal paDto = PerformanceAppraisal.builder()
				.name(pA.getName())
				.period(pA.getPeriod())
				.appraisalStartTime(pA.getAppraisalStartTime())
				.appraisalEndTime(pA.getAppraisalEndTime())
				.isVisible(pA.getIsVisible())
				.scope(pA.getScope())
				.appraisalTName(pA.getAppraisalTName())
				.processNode(ObjectUtil.deserialize(pA.getProcessNode()))
				.beingAppraisalPerson(ObjectUtil.deserialize(pA.getBeingAppraisalPerson()))
				.build();
		
		return ResultUtil.data(paDto);
		
	}
	
	/**
	 * 查询-我的绩效-列表
	 */
	@PostMapping(value = "/selects_my_performance")
	@ApiOperation(value = "17.查询-我的绩效-列表", httpMethod = "POST", notes = "查询-我的绩效-列表")
	@ApiOperationSupport(order = 17)
	public Result<Object> selects(@CurrentUser UserBean userBean,@RequestBody MyPerformance query){
		
		IPage<JxglPerformanceAppraisal> page = new Page<JxglPerformanceAppraisal>(query.getCurrentPage(),query.getTotalPage());
		query.setOrgCode(userBean.getOrgCode());
		query.setId(userBean.getEmpNum());
		IPage<JxglPerformanceAppraisal> pagePA = jxglPerformanceAppraisalMapper.selectMyByQuery(page, query);
		
		List<JxglPerformanceAppraisal> listPA = pagePA.getRecords();

		return ResultUtil.data(pagePA,listPA);
		
	}
	
	@Autowired
	private JxglProcessNodeMapper jxglProcessNodeMapper;
	@Autowired
	private JxglAppraisalItemMapper jxglAppraisalItemMapper;
	
	/**
	 * 目标填写-保存
	 */
	@PostMapping(value = "/save_target_fill")
	@ApiOperation(value = "17.目标填写-保存", httpMethod = "POST", notes = "目标填写-保存")
	@ApiOperationSupport(order = 17)
	public Result<Object> saveTF(@CurrentUser UserBean userBean,@RequestBody AppraisalUpdate appraisalUpdate) throws Exception{
		
		
		
		Integer id = appraisalUpdate.getId();
		
		Integer count2 = jxglAppraisalMapper.selectCount(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, id)
				.in(JxglAppraisal::getSts, AppraisalSts.ASSESSMENT_COMPLETE.getType(),
						AppraisalSts.TERMINATION_ASSESSMENT.getType(),
						AppraisalSts.PERFORMANCE_ARCHIVE.getType()));
		
		if (count2 > 0) {
			return ResultUtil.error("考核已结束");
		}
		
		JxglAppraisal appraisal = jxglAppraisalMapper.selectOne(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, id)
				.select(JxglAppraisal::getId));
		
		if (appraisal == null) {
			return ResultUtil.error("考核不存在");
		}
		
		List<JxglAppraisalIndicators> listAI2 = appraisalUpdate.getAppraisalIndicators();
		
		if (listAI2 == null) {
			return ResultUtil.error("考核指标不能为空");
		}
		
		JxglProcessNode processNode = jxglProcessNodeMapper.selectOne(new QueryWrapper<JxglProcessNode>().lambda()
				.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
				.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
		if (processNode == null) {
			return ResultUtil.error("流程不存在");
		}
		
		if (ProcessType.TARGET_FILL_IN.getType() == processNode.getProcessType()) {
			
			if (!userBean.getEmpNum().equals(processNode.getExecutorId())) {
				return ResultUtil.error("无权限 操作该流程");
			}
			
		}else {
			return ResultUtil.error("流程状态异常");
		}
		
		// 查找 非固定 考核指标
		List<JxglAppraisalIndicators>  listAI = jxglAppraisalIndicatorsMapper.selectList(new QueryWrapper<JxglAppraisalIndicators>().lambda()
				.select(JxglAppraisalIndicators::getId)
				.eq(JxglAppraisalIndicators::getType, IndicatorsType.NOT_FIXATION.getType())
				.eq(JxglAppraisalIndicators::getAppraisalId, id));
		
		List<Integer> appraisalIndicatorIds = listAI != null ? listAI.stream().map(JxglAppraisalIndicators::getId).collect(Collectors.toList()) : null;
		
		if (appraisalIndicatorIds != null) {
			
			// 删除 考核项
			jxglAppraisalItemMapper.delete(new QueryWrapper<JxglAppraisalItem>().lambda()
					.in(JxglAppraisalItem::getAppraisalIndicatorsId, appraisalIndicatorIds));
		}
		
		// 删除 考核指标
		jxglAppraisalIndicatorsMapper.delete(new QueryWrapper<JxglAppraisalIndicators>().lambda()
				.eq(JxglAppraisalIndicators::getType, IndicatorsType.NOT_FIXATION.getType())
				.eq(JxglAppraisalIndicators::getAppraisalId, id));
		
		listAI2.forEach(aI -> {
			aI.setAppraisalId(id);
			aI.setType(IndicatorsType.NOT_FIXATION.getType());
			if (aI.insert()) {
				List<JxglAppraisalItem> listAItem = aI.getAppraisalItems();
				if (listAItem != null && listAItem.size() > 0) {
					for (JxglAppraisalItem aItem : listAItem) {
						aItem.setAppraisalIndicatorsId(aI.getId());
						aItem.insert();
					}
				}
			}else {
				throw new CustomException("保存异常");
			}
			
		});
		
		listAI = jxglAppraisalIndicatorsMapper.selectList(new QueryWrapper<JxglAppraisalIndicators>().lambda()
				.select(JxglAppraisalIndicators::getWeight)
				.eq(JxglAppraisalIndicators::getAppraisalId, id));
		
		List<Integer> listWeight = listAI.stream().map(JxglAppraisalIndicators::getWeight).collect(Collectors.toList());
		Integer weightSum = 0;
		if (listWeight != null && listWeight.size() > 0) {
			for (Integer i : listWeight) {
				weightSum += i;
				System.out.println("权重:"+ i);
			}
			if (!weightSum.equals(100))
				return ResultUtil.error("权重总和要等于 100%");
		}
		
		return ResultUtil.success();
	}
	
	/**
	 * 目标填写-提交
	 */
	@PostMapping(value = "/submit_target_fill")
	@ApiOperation(value = "17.目标填写-提交", httpMethod = "POST", notes = "目标填写-提交")
	@ApiOperationSupport(order = 17)
	public Result<Object> submitTF(@CurrentUser UserBean userBean,@RequestParam Integer id){
		
		Integer count2 = jxglAppraisalMapper.selectCount(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, id)
				.in(JxglAppraisal::getSts, AppraisalSts.ASSESSMENT_COMPLETE.getType(),
						AppraisalSts.TERMINATION_ASSESSMENT.getType(),
						AppraisalSts.PERFORMANCE_ARCHIVE.getType()));
		
		if (count2 > 0) {
			return ResultUtil.error("考核已结束");
		}
		
		JxglAppraisal appraisal = jxglAppraisalMapper.selectOne(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, id)
				.select(JxglAppraisal::getId));
		
		if (appraisal == null) {
			return ResultUtil.error("考核不存在");
		}
			
		JxglProcessNode processNode = jxglProcessNodeMapper.selectOne(new QueryWrapper<JxglProcessNode>().lambda()
				.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
				.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
		if (processNode == null) {
			return ResultUtil.error("流程不存在");
		}
		
		if (ProcessType.TARGET_FILL_IN.getType() == processNode.getProcessType()) {
			
			if (!userBean.getEmpNum().equals(processNode.getExecutorId())) {
				return ResultUtil.error("无权限 操作该流程");
			}
			
			List<JxglAppraisalIndicators> listAI = jxglAppraisalIndicatorsMapper.selectList(new QueryWrapper<JxglAppraisalIndicators>().lambda()
					.eq(JxglAppraisalIndicators::getAppraisalId, appraisal.getId()));
			
			if (listAI == null) {
				return ResultUtil.error("考核指标不能为空");
			}
			List<Integer> listWeight = listAI.stream().map(JxglAppraisalIndicators::getWeight).collect(Collectors.toList());
			Integer weightSum = 0;
			if (listWeight != null && listWeight.size() > 0) {
				for (Integer i : listWeight) {
					weightSum += i;
				}
				if (!weightSum.equals(100))
					return ResultUtil.error("权重总和要等于 100%");
			}
			// 修改 目标填写 状态
			JxglProcessNode
				.builder()
				.sts(ProcessNodeSts.EXECUTED.getType())
				.build()
				.update(new UpdateWrapper<JxglProcessNode>().lambda()
						.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
						.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
			
			// 修改 下一个节点状态
			JxglProcessNode
			.builder()
			.sts(ProcessNodeSts.IN_EXECUTION.getType())
			.build()
			.update(new UpdateWrapper<JxglProcessNode>().lambda()
					.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
					.eq(JxglProcessNode::getProcessType, ProcessType.TARGET_CONFIRMED.getType()));
			
			jxglAppraisalMapper.updateById(JxglAppraisal.builder().id(id).sts(AppraisalSts.TARGET_CONFIRMED.getType()).build());
			
			JxglAppraisalLog appraisalLog = JxglAppraisalLog.builder().build();
			appraisalLog.setAppraisalId(appraisal.getId());
			appraisalLog.setExecutorId(userBean.getEmpNum());
			appraisalLog.setExecutorName(userBean.getUserInfo().getName());
			appraisalLog.setType(AppraisalLogType.TARGET_FILL_IN.getType());
			appraisalLog.insert();
			
		}else {
			return ResultUtil.error("流程状态异常");
		}

		return ResultUtil.success();
		
	}
	
	/**
	 * 目标确认-同意
	 */
	@PostMapping(value = "/update_target_confirmed")
	@ApiOperation(value = "18.目标确认-同意", httpMethod = "POST", notes = "目标确认-同意")
	@ApiOperationSupport(order = 18)
	public Result<Object> updateTC(@CurrentUser UserBean userBean,@RequestParam Integer id){
		
		Integer count2 = jxglAppraisalMapper.selectCount(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, id)
				.in(JxglAppraisal::getSts, AppraisalSts.ASSESSMENT_COMPLETE.getType(),
						AppraisalSts.TERMINATION_ASSESSMENT.getType(),
						AppraisalSts.PERFORMANCE_ARCHIVE.getType()));
		
		if (count2 > 0) {
			return ResultUtil.error("考核已结束");
		}
		
		JxglAppraisal appraisal = jxglAppraisalMapper.selectOne(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, id)
				.select(JxglAppraisal::getId));
		
		if (appraisal == null) {
			return ResultUtil.error("考核不存在");
		}
			
		JxglProcessNode processNode = jxglProcessNodeMapper.selectOne(new QueryWrapper<JxglProcessNode>().lambda()
				.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
				.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
		if (processNode == null) {
			return ResultUtil.error("流程不存在");
		}
		
		if (ProcessType.TARGET_CONFIRMED.getType() == processNode.getProcessType()) {
			
			if (!userBean.getEmpNum().equals(processNode.getExecutorId())) {
				return ResultUtil.error("无权限 操作该流程");
			}


			// 修改 目标确认  状态
			JxglProcessNode
				.builder()
				.sts(ProcessNodeSts.EXECUTED.getType())
				.build()
				.update(new UpdateWrapper<JxglProcessNode>().lambda()
						.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
						.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
			JxglPerformanceAppraisal pA = jxglPerformanceAppraisalMapper.selectById(appraisal.getPerformanceAppraisalId());
			if (pA != null && pA.getSts() > PerformanceAppraisalSts.TARGET_SETING.getType()) {
				// 修改 下一个节点状态
				JxglProcessNode
				.builder()
				.sts(ProcessNodeSts.IN_EXECUTION.getType())
				.build()
				.update(new UpdateWrapper<JxglProcessNode>().lambda()
						.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
						.eq(JxglProcessNode::getProcessType, ProcessType.SELF_ASSESSMENT.getType()));
				
				jxglAppraisalMapper.updateById(JxglAppraisal.builder().id(appraisal.getId()).sts(AppraisalSts.SELF_ASSESSMENT.getType()).build());
			}
			
			
			
			JxglAppraisalLog appraisalLog = JxglAppraisalLog.builder().build();
			appraisalLog.setAppraisalId(appraisal.getId());
			appraisalLog.setExecutorId(userBean.getEmpNum());
			appraisalLog.setExecutorName(userBean.getUserInfo().getName());
			appraisalLog.setType(AppraisalLogType.TARGET_CONFIRMED.getType());
			appraisalLog.insert();
		}else {
			return ResultUtil.error("流程状态异常");
		}

		return ResultUtil.success();
		
	}
	
	/**
	 * 目标确认-驳回目标
	 */
	@PostMapping(value = "/update_target_confirmed_reject")
	@ApiOperation(value = "18.目标确认-驳回目标", httpMethod = "POST", notes = "目标确认-驳回目标")
	@ApiOperationSupport(order = 18)
	public Result<Object> updateTCR(@CurrentUser UserBean userBean, @RequestBody AppraisalReject appraisalReject){
		
		Integer count2 = jxglAppraisalMapper.selectCount(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, appraisalReject.getId())
				.in(JxglAppraisal::getSts, AppraisalSts.ASSESSMENT_COMPLETE.getType(),
						AppraisalSts.TERMINATION_ASSESSMENT.getType(),
						AppraisalSts.PERFORMANCE_ARCHIVE.getType()));
		
		if (count2 > 0) {
			return ResultUtil.error("考核已结束");
		}
		
		JxglAppraisal appraisal = jxglAppraisalMapper.selectOne(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, appraisalReject.getId())
				.select(JxglAppraisal::getId));
		
		if (appraisal == null) {
			return ResultUtil.error("考核 不存在");
		}
			
		JxglProcessNode processNode = jxglProcessNodeMapper.selectOne(new QueryWrapper<JxglProcessNode>().lambda()
				.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
				.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
		
		if (processNode == null) {
			return ResultUtil.error("流程不存在");
		}
		
		if (ProcessType.TARGET_CONFIRMED.getType() == processNode.getProcessType()) {
			
			if (!userBean.getEmpNum().equals(processNode.getExecutorId())) {
				return ResultUtil.error("无权限 操作该流程");
			}


			// 修改 目标确认  状态
			JxglProcessNode
				.builder()
				.sts(ProcessNodeSts.NON_EXECUTION.getType())
				.build()
				.update(new UpdateWrapper<JxglProcessNode>().lambda()
						.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
						.in(JxglProcessNode::getProcessType, ProcessType.TARGET_CONFIRMED.getType())
						);
			
			JxglProcessNode
			.builder()
			.sts(ProcessNodeSts.IN_EXECUTION.getType())
			.build()
			.update(new UpdateWrapper<JxglProcessNode>().lambda()
					.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
					.eq(JxglProcessNode::getProcessType, ProcessType.TARGET_FILL_IN.getType()));
			
			jxglAppraisalMapper.updateById(JxglAppraisal.builder().id(appraisal.getId()).sts(AppraisalSts.TARGET_FILL_IN.getType()).build());
			
			JxglAppraisalLog appraisalLog = JxglAppraisalLog.builder().build();
			appraisalLog.setRemarks(appraisalReject.getRejectReason());
			appraisalLog.setAppraisalId(appraisal.getId());
			appraisalLog.setExecutorId(userBean.getEmpNum());
			appraisalLog.setExecutorName(userBean.getUserInfo().getName());
			appraisalLog.setType(AppraisalLogType.TARGET_DISMISS.getType());
			appraisalLog.insert();
			
		}else {
			return ResultUtil.error("流程状态异常");
		}

		return ResultUtil.success();
		
	}
	
	/**
	 * 上级评价 -驳回目标
	 */
	@PostMapping(value = "/update_superior_score_reject")
	@ApiOperation(value = "19.上级评价 -驳回目标", httpMethod = "POST", notes = "上级评价 -驳回目标")
	@ApiOperationSupport(order = 19)
	public Result<Object> updateSSR(@CurrentUser UserBean userBean, @RequestBody AppraisalReject appraisalReject){
		
		Integer count2 = jxglAppraisalMapper.selectCount(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, appraisalReject.getId())
				.in(JxglAppraisal::getSts, AppraisalSts.ASSESSMENT_COMPLETE.getType(),
						AppraisalSts.TERMINATION_ASSESSMENT.getType(),
						AppraisalSts.PERFORMANCE_ARCHIVE.getType()));
		
		if (count2 > 0) {
			return ResultUtil.error("考核已结束");
		}
		
		JxglAppraisal appraisal = jxglAppraisalMapper.selectOne(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, appraisalReject.getId())
				.select(JxglAppraisal::getId));
		
		if (appraisal == null) {
			return ResultUtil.error("考核 不存在");
		}
			
		JxglProcessNode processNode = jxglProcessNodeMapper.selectOne(new QueryWrapper<JxglProcessNode>().lambda()
				.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
				.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
		if (processNode == null) {
			return ResultUtil.error("流程不存在");
		}
		
		if (ProcessType.SUPERIOR_SCORE.getType() == processNode.getProcessType()) {
			
			if (!userBean.getEmpNum().equals(processNode.getExecutorId())) {
				return ResultUtil.error("无权限 操作该流程");
			}


			// 修改 目标确认  状态
			JxglProcessNode
				.builder()
				.sts(ProcessNodeSts.NON_EXECUTION.getType())
				.build()
				.update(new UpdateWrapper<JxglProcessNode>().lambda()
						.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
						.in(JxglProcessNode::getProcessType, ProcessType.TARGET_CONFIRMED.getType(),
								ProcessType.SELF_ASSESSMENT.getType())
						);
			
			JxglProcessNode
			.builder()
			.sts(ProcessNodeSts.IN_EXECUTION.getType())
			.build()
			.update(new UpdateWrapper<JxglProcessNode>().lambda()
					.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
					.eq(JxglProcessNode::getProcessType, ProcessType.TARGET_FILL_IN.getType()));
			
			// 删除 考核评定-自评
			jxglAppraisalAssessmentMapper.delete(new QueryWrapper<JxglAppraisalAssessment>().lambda()
					.eq(JxglAppraisalAssessment::getAppraisalId, appraisal.getId())
					.eq(JxglAppraisalAssessment::getType, AssessmentType.SELF_ASSESSMENT.getType()));
			
			List<JxglAppraisalIndicators> listAI = jxglAppraisalIndicatorsMapper.selectList(new QueryWrapper<JxglAppraisalIndicators>().lambda()
					.select(JxglAppraisalIndicators::getId)
					.eq(JxglAppraisalIndicators::getAppraisalId, appraisal.getId()));
			List<Integer> listAIId = listAI != null && listAI.size() > 0 ? listAI.stream().map(JxglAppraisalIndicators::getId).collect(Collectors.toList()) : null;
			// 删除 考核指标评定-自评
			jxglAppraisalIndicatorsAssessmentMapper.delete(new QueryWrapper<JxglAppraisalIndicatorsAssessment>().lambda()
					.in(JxglAppraisalIndicatorsAssessment::getAppraisalIndicatorsId, listAIId)
					.eq(JxglAppraisalIndicatorsAssessment::getType, AssessmentType.SELF_ASSESSMENT.getType()));
			
			jxglAppraisalMapper.updateById(JxglAppraisal.builder().id(appraisal.getId()).sts(AppraisalSts.TARGET_FILL_IN.getType()).build());
			
			JxglAppraisalLog appraisalLog = JxglAppraisalLog.builder().build();
			appraisalLog.setRemarks(appraisalReject.getRejectReason());
			appraisalLog.setAppraisalId(appraisal.getId());
			appraisalLog.setExecutorId(userBean.getEmpNum());
			appraisalLog.setExecutorName(userBean.getUserInfo().getName());
			appraisalLog.setType(AppraisalLogType.TARGET_DISMISS.getType());
			appraisalLog.insert();
			
		}else {
			return ResultUtil.error("流程状态异常");
		}

		return ResultUtil.success();
		
	}
	
	/**
	 * 上级评价 -驳回评分
	 */
	@PostMapping(value = "/update_superior_reject_score")
	@ApiOperation(value = "20.上级评价 -驳回评分", httpMethod = "POST", notes = "上级评价 -驳回评分")
	@ApiOperationSupport(order = 20)
	public Result<Object> updateSRS(@CurrentUser UserBean userBean, @RequestBody AppraisalReject appraisalReject){
		
		Integer count2 = jxglAppraisalMapper.selectCount(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, appraisalReject.getId())
				.in(JxglAppraisal::getSts, AppraisalSts.ASSESSMENT_COMPLETE.getType(),
						AppraisalSts.TERMINATION_ASSESSMENT.getType(),
						AppraisalSts.PERFORMANCE_ARCHIVE.getType()));
		
		if (count2 > 0) {
			return ResultUtil.error("考核已结束");
		}
		
		JxglAppraisal appraisal = jxglAppraisalMapper.selectOne(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, appraisalReject.getId())
				.select(JxglAppraisal::getId));
		
		if (appraisal == null) {
			return ResultUtil.error("考核不存在");
		}
			
		JxglProcessNode processNode = jxglProcessNodeMapper.selectOne(new QueryWrapper<JxglProcessNode>().lambda()
				.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
				.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
		if (processNode == null) {
			return ResultUtil.error("流程不存在");
		}
		
		if (ProcessType.SUPERIOR_SCORE.getType() == processNode.getProcessType()) {
			
			if (!userBean.getEmpNum().equals(processNode.getExecutorId())) {
				return ResultUtil.error("无权限操作该流程");
			}

			// 修改  状态
			JxglProcessNode
				.builder()
				.sts(ProcessNodeSts.NON_EXECUTION.getType())
				.build()
				.update(new UpdateWrapper<JxglProcessNode>().lambda()
						.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
						.eq(JxglProcessNode::getProcessType, ProcessType.SUPERIOR_SCORE.getType())
						);
			
			// 修改 上一个节点状态
			JxglProcessNode
			.builder()
			.sts(ProcessNodeSts.IN_EXECUTION.getType())
			.build()
			.update(new UpdateWrapper<JxglProcessNode>().lambda()
					.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
					.eq(JxglProcessNode::getProcessType, ProcessType.SELF_ASSESSMENT.getType()));
			
			// 删除 考核评定-自评
			jxglAppraisalAssessmentMapper.delete(new QueryWrapper<JxglAppraisalAssessment>().lambda()
					.eq(JxglAppraisalAssessment::getAppraisalId, appraisal.getId())
					.eq(JxglAppraisalAssessment::getType, AssessmentType.SELF_ASSESSMENT.getType()));
			
			List<JxglAppraisalIndicators> listAI = jxglAppraisalIndicatorsMapper.selectList(new QueryWrapper<JxglAppraisalIndicators>().lambda()
					.select(JxglAppraisalIndicators::getId)
					.eq(JxglAppraisalIndicators::getAppraisalId, appraisal.getId()));
			List<Integer> listAIId = listAI != null && listAI.size() > 0 ? listAI.stream().map(JxglAppraisalIndicators::getId).collect(Collectors.toList()) : null;
			// 删除 考核指标评定-自评
			jxglAppraisalIndicatorsAssessmentMapper.delete(new QueryWrapper<JxglAppraisalIndicatorsAssessment>().lambda()
					.in(JxglAppraisalIndicatorsAssessment::getAppraisalIndicatorsId, listAIId)
					.eq(JxglAppraisalIndicatorsAssessment::getType, AssessmentType.SELF_ASSESSMENT.getType()));
			
			jxglAppraisalMapper.updateById(JxglAppraisal.builder().id(appraisal.getId()).sts(AppraisalSts.SELF_ASSESSMENT.getType()).build());
			
			JxglAppraisalLog appraisalLog = JxglAppraisalLog.builder().build();
			appraisalLog.setRemarks(appraisalReject.getRejectReason());
			appraisalLog.setAppraisalId(appraisal.getId());
			appraisalLog.setExecutorId(userBean.getEmpNum());
			appraisalLog.setExecutorName(userBean.getUserInfo().getName());
			appraisalLog.setType(AppraisalLogType.SCORE_DISMISS.getType());
			appraisalLog.insert();
			
		}else {
			return ResultUtil.error("流程状态异常");
		}

		return ResultUtil.success();
		
	}
	
	/**
	 * 评分提交-(缺-评分最大分数限制)
	 */
	@PostMapping(value = "/save_score")
	@ApiOperation(value = "22.评分提交", httpMethod = "POST", notes = "评分提交")
	@ApiOperationSupport(order = 22)
	public Result<Object> saveScore(@CurrentUser UserBean userBean,@Validated @RequestBody ValidList<AppraisalAssessment> appraisalAssessments){
		
		Integer appraisalId = appraisalAssessments.get(0).getAppraisalId();
		
		Integer count2 = jxglAppraisalMapper.selectCount(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, appraisalId)
				.in(JxglAppraisal::getSts, AppraisalSts.ASSESSMENT_COMPLETE.getType(),
						AppraisalSts.TERMINATION_ASSESSMENT.getType(),
						AppraisalSts.PERFORMANCE_ARCHIVE.getType()));
		
		if (count2 > 0) {
			return ResultUtil.error("考核已结束");
		}
		
		JxglAppraisal appraisal = jxglAppraisalMapper.selectOne(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, appraisalId)
				.select(JxglAppraisal::getId));
		
		if (appraisal == null) {
			return ResultUtil.error("考核不存在");
		}
			
		JxglProcessNode processNode = jxglProcessNodeMapper.selectOne(new QueryWrapper<JxglProcessNode>().lambda()
				.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
				.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
		if (processNode == null) {
			return ResultUtil.error("流程不存在");
		}
		
		if (ProcessType.SELF_ASSESSMENT.getType() == processNode.getProcessType() || 
				ProcessType.SUPERIOR_SCORE.getType() == processNode.getProcessType()) {
			
			if (!userBean.getEmpNum().equals(processNode.getExecutorId())) {
				return ResultUtil.error("无权限 操作该流程");
			}

			appraisalAssessments.stream().forEach(a -> {
				Integer type = ProcessType.SELF_ASSESSMENT.getType() == processNode.getProcessType() ? AssessmentType.SELF_ASSESSMENT.getType() : AssessmentType.SUPERIOR_SCORE.getType();
				
				if (a.getAppraisalIndicatorsId() != null) {
					JxglAppraisalIndicatorsAssessment.builder()
					.appraisalIndicatorsId(a.getAppraisalIndicatorsId())
					.assessorId(userBean.getEmpNum())
					.assessorName(userBean.getUserInfo().getName())
					.score(a.getScore())
					.remarks(a.getRemarks())
					.type(type)
					.build()
					.insert();
					
					jxglAppraisalMapper.updateById(JxglAppraisal.builder().id(appraisal.getId()).sts(AppraisalSts.SUPERIOR_SCORE.getType()).build());
					
				}else {
					JxglAppraisalAssessment.builder()
					.appraisalId(a.getAppraisalId())
					.assessorId(userBean.getEmpNum())
					.assessorName(userBean.getUserInfo().getName())
					.comprehensiveScore(a.getScore())
					.remarks(a.getRemarks())
					.type(type)
					.level(a.getLevel())
					.build()
					.insert();
					
//					jxglAppraisalMapper.updateById(JxglAppraisal.builder().id(appraisal.getId()).sts(AppraisalSts.RESULT_VERIFICATION.getType()).build());
				}
				
				
			});

			// 修改  状态
			JxglProcessNode
				.builder()
				.sts(ProcessNodeSts.EXECUTED.getType())
				.build()
				.update(new UpdateWrapper<JxglProcessNode>().lambda()
						.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
						.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
			
			JxglProcessNode
			.builder()
			.sts(ProcessNodeSts.IN_EXECUTION.getType())
			.build()
			.update(new UpdateWrapper<JxglProcessNode>().lambda()
					.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
					.eq(ProcessType.SUPERIOR_SCORE.getType() == processNode.getProcessType(), JxglProcessNode::getProcessType, ProcessType.RESULT_VERIFICATION.getType())
					.eq(ProcessType.SELF_ASSESSMENT.getType() == processNode.getProcessType(), JxglProcessNode::getProcessType, ProcessType.SUPERIOR_SCORE.getType()));
			
			JxglPerformanceAppraisal pA = jxglPerformanceAppraisalMapper.selectById(appraisal.getPerformanceAppraisalId());
			
			if (pA != null && pA.getSts() > PerformanceAppraisalSts.PERFORMANCE_SCORE.getType()) {
				
				if (ProcessType.SUPERIOR_SCORE.getType() == processNode.getProcessType()) {
					jxglAppraisalMapper.updateById(JxglAppraisal.builder()
							.id(appraisal.getId())
							.sts(AppraisalSts.RESULT_VERIFICATION.getType()).build());
				}
				
			}
			
			JxglAppraisalLog appraisalLog = JxglAppraisalLog.builder().build();
			appraisalLog.setAppraisalId(appraisal.getId());
			appraisalLog.setExecutorId(userBean.getEmpNum());
			appraisalLog.setExecutorName(userBean.getUserInfo().getName());
			appraisalLog.setType(ProcessType.SELF_ASSESSMENT.getType() == processNode.getProcessType() ? AppraisalLogType.SELF_ASSESSMENT.getType() : AppraisalLogType.SUPERIOR_SCORE.getType());
			appraisalLog.insert();
			
		}else {
			return ResultUtil.error("流程状态异常");
		}

		return ResultUtil.success();
	}
	
	/**
	 * 结果确认-确认
	 */
	@PostMapping(value = "/result_verification")
	@ApiOperation(value = "23.结果确认-确认", httpMethod = "POST", notes = "结果确认-确认")
	@ApiOperationSupport(order = 23)
	public Result<Object> resultVerification(@CurrentUser UserBean userBean,@RequestParam Integer id){
		
		Integer count2 = jxglAppraisalMapper.selectCount(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, id)
				.in(JxglAppraisal::getSts, AppraisalSts.ASSESSMENT_COMPLETE.getType(),
						AppraisalSts.TERMINATION_ASSESSMENT.getType(),
						AppraisalSts.PERFORMANCE_ARCHIVE.getType()));
		
		if (count2 > 0) {
			return ResultUtil.error("考核已结束");
		}
		
		JxglAppraisal appraisal = jxglAppraisalMapper.selectOne(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, id)
				.select(JxglAppraisal::getId));
		
		if (appraisal == null) {
			return ResultUtil.error("考核 不存在");
		}
			
		JxglProcessNode processNode = jxglProcessNodeMapper.selectOne(new QueryWrapper<JxglProcessNode>().lambda()
				.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
				.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
		if (processNode == null) {
			return ResultUtil.error("流程不存在");
		}
		
		if (ProcessType.RESULT_VERIFICATION.getType() == processNode.getProcessType()) {
			
			if (!userBean.getEmpNum().equals(processNode.getExecutorId())) {
				return ResultUtil.error("无权限 操作该流程");
			}
				
			// 修改  状态
			JxglProcessNode
				.builder()
				.sts(ProcessNodeSts.EXECUTED.getType())
				.build()
				.update(new UpdateWrapper<JxglProcessNode>().lambda()
						.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
						.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
			
			jxglAppraisalMapper.updateById(JxglAppraisal.builder()
					.id(id)
					.sts(AppraisalSts.ASSESSMENT_COMPLETE.getType()).build());
			
			JxglAppraisalLog appraisalLog = JxglAppraisalLog.builder().build();
			appraisalLog.setAppraisalId(appraisal.getId());
			appraisalLog.setExecutorId(userBean.getEmpNum());
			appraisalLog.setExecutorName(userBean.getUserInfo().getName());
			appraisalLog.setType(AppraisalLogType.RESULT_VERIFICATION.getType());
			appraisalLog.insert();
			
		}else {
			return ResultUtil.error("流程状态异常");
		}

		return ResultUtil.success();
	}
	
	/**
	 * 结果确认-改分
	 */
	@PostMapping(value = "/change_score")
	@ApiOperation(value = "24.结果确认-改分", httpMethod = "POST", notes = "结果确认-改分")
	@ApiOperationSupport(order = 24)
	public Result<Object> changeScore(@CurrentUser UserBean userBean,@Validated @RequestBody AppraisalAssessment appraisalAssessment){
		
		Integer count2 = jxglAppraisalMapper.selectCount(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, appraisalAssessment.getAppraisalId())
				.in(JxglAppraisal::getSts, AppraisalSts.ASSESSMENT_COMPLETE.getType(),
						AppraisalSts.TERMINATION_ASSESSMENT.getType(),
						AppraisalSts.PERFORMANCE_ARCHIVE.getType()));
		
		if (count2 > 0) {
			return ResultUtil.error("考核已结束");
		}
		
		JxglAppraisal appraisal = jxglAppraisalMapper.selectOne(new QueryWrapper<JxglAppraisal>().lambda()
				.eq(JxglAppraisal::getId, appraisalAssessment.getAppraisalId())
				.select(JxglAppraisal::getId));
		
		if (appraisal == null) {
			return ResultUtil.error("考核 不存在");
		}
			
		JxglProcessNode processNode = jxglProcessNodeMapper.selectOne(new QueryWrapper<JxglProcessNode>().lambda()
				.eq(JxglProcessNode::getAppraisalId, appraisal.getId())
				.eq(JxglProcessNode::getSts, ProcessNodeSts.IN_EXECUTION.getType()));
		if (processNode == null) {
			return ResultUtil.error("流程不存在");
		}
		
		if (ProcessType.RESULT_VERIFICATION.getType() == processNode.getProcessType()) {
			
			if (!userBean.getEmpNum().equals(processNode.getExecutorId())) {
				return ResultUtil.error("无权限 操作该流程");
			}
			
			JxglAppraisalAssessment.builder()
			.id(appraisalAssessment.getAppraisalAssessmentId())
			.comprehensiveScore(appraisalAssessment.getScore())
			.level(appraisalAssessment.getLevel())
			.build()
			.updateById();
			
			JxglAppraisalLog appraisalLog = JxglAppraisalLog.builder().build();
			appraisalLog.setRemarks(appraisalAssessment.getRemarks());
			appraisalLog.setAppraisalId(appraisal.getId());
			appraisalLog.setExecutorId(userBean.getEmpNum());
			appraisalLog.setExecutorName(userBean.getUserInfo().getName());
			appraisalLog.setType(AppraisalLogType.UPDATE_SCORE.getType());
			appraisalLog.insert();
			
		}else {
			return ResultUtil.error("流程状态异常");
		}

		return ResultUtil.success();
	}
	
	/**
	 * 查询-我的绩效-员工绩效
	 */
	@PostMapping(value = "/selects_my_emp_performance")
	@ApiOperation(value = "25.查询-我的绩效-员工绩效", httpMethod = "POST", notes = "查询-我的绩效-员工绩效")
	@ApiOperationSupport(order = 25)
	@Role
	public Result<Object> selectsMEP(@CurrentUser UserBean userBean,@RequestBody EmpPerformanceQuery query){
		Integer orgCode = userBean.getOrgCode();
		Integer empNum = userBean.getEmpNum();
		IPage<JxglAppraisal> page = new Page<JxglAppraisal>(query.getCurrentPage(),query.getTotalPage());
		query.setOrgCode(orgCode);
		
		List<ZzglBmgwM> listBM = zzglBmgwMMapper.selectList(new QueryWrapper<ZzglBmgwM>().lambda()
				.select(ZzglBmgwM::getId)
				.eq(ZzglBmgwM::getOrgCode, userBean.getOrgCode())
				.eq(ZzglBmgwM::getLeader, empNum));
		ZzglBmgwM ZzglBmgwM = CollUtil.getFirst(listBM);
		if (ZzglBmgwM == null) {
			return ResultUtil.success();
		}
		
		List<YgglMainEmp> users = zzglBmgwMService.selectOtherlistent(orgCode, ZzglBmgwM.getId());
		List<Integer> empNums = null;
		if (users != null ) {
			empNums = users.stream().map(YgglMainEmp::getEmpNum).collect(Collectors.toList());
		}
		query.setEmpNums(empNums);
		IPage<JxglAppraisal> pageA = jxglAppraisalMapper.selectMyEmpByQuery(page, query);
		
		List<JxglAppraisal> listA = pageA.getRecords();

		return ResultUtil.data(pageA,listA);
		
	}
	
	
	
	
}