//package com.engine.salary.entity.salaryacct.bo;
//
//import com.google.common.collect.Lists;
//import com.weaver.common.distribution.genid.IdGenerator;
//import com.weaver.hrm.salary.entity.salaryacct.param.SalaryAcctCheckParam;
//import com.weaver.hrm.salary.entity.salaryacct.po.SalaryCheckResultDetailTempPO;
//import com.weaver.hrm.salary.entity.salaryacct.po.SalaryCheckResultPO;
//import com.weaver.hrm.salary.entity.salaryacct.po.SalaryCheckResultRecordPO;
//import com.weaver.hrm.salary.util.SalaryEntityUtil;
//import lombok.Data;
//import org.apache.commons.collections4.CollectionUtils;
//
//import java.time.LocalDateTime;
//import java.util.Collection;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
///**
// * @description: 薪资核算校验
// * @author: xiajun
// * @modified By: xiajun
// * @date: Created in 12/17/21 4:31 PM
// * @version:v1.0
// */
//public class SalaryCheckBO {
//
//    /**
//     * 原来的校验异常
//     */
//    private Collection<SalaryCheckResultPO> oldCheckResults;
//
//    /**
//     * 原来的校验异常明细
//     */
//    private Collection<SalaryCheckResultRecordPO> oldCheckResultRecords;
//
//    /**
//     * 新的校验异常明细的临时存储数据
//     */
//    private Collection<SalaryCheckResultDetailTempPO> salaryCheckResultDetailTemps;
//
//    public SalaryCheckBO(Collection<SalaryCheckResultPO> oldCheckResults,
//                         Collection<SalaryCheckResultRecordPO> oldCheckResultRecords,
//                         Collection<SalaryCheckResultDetailTempPO> salaryCheckResultDetailTemps) {
//        this.oldCheckResults = oldCheckResults;
//        this.oldCheckResultRecords = oldCheckResultRecords;
//        this.salaryCheckResultDetailTemps = salaryCheckResultDetailTemps;
//    }
//
//    /**
//     * 处理校验异常明细的临时存储数据
//     *
//     * @param checkParam
//     * @param employeeId
//     * @param tenantKey
//     * @return
//     */
//    public Result handleSalaryCheckResultDetailTemp(SalaryAcctCheckParam checkParam, Long employeeId, String tenantKey) {
//        Result result = new Result();
//        Map<Long, SalaryCheckResultPO> oldCheckResultMap = SalaryEntityUtil.convert2Map(oldCheckResults, SalaryCheckResultPO::getSalaryCheckRuleId);
//        Map<Long, List<SalaryCheckResultDetailTempPO>> checkRuleIdKeyTempMap = SalaryEntityUtil
//                .group2Map(salaryCheckResultDetailTemps, SalaryCheckResultDetailTempPO::getSalaryCheckRuleId);
//        if (CollectionUtils.isEmpty(checkParam.getIds())) {
//            // 如果校验全部人员
//            handleAllCheck(checkParam, checkRuleIdKeyTempMap, result, employeeId, tenantKey);
//        } else {
//            // 如果校验部分人员
//            handlePartCheck(checkParam, oldCheckResultMap, checkRuleIdKeyTempMap, result, employeeId, tenantKey);
//        }
//        return result;
//    }
//
//    /**
//     * 校验全部人员
//     *
//     * @param checkParam
//     * @param checkRuleIdKeyTempMap
//     * @param result
//     * @param employeeId
//     * @param tenantKey
//     */
//    private void handleAllCheck(SalaryAcctCheckParam checkParam,
//                                Map<Long, List<SalaryCheckResultDetailTempPO>> checkRuleIdKeyTempMap,
//                                Result result, Long employeeId, String tenantKey) {
//        LocalDateTime now = LocalDateTime.now();
//        checkRuleIdKeyTempMap.forEach((checkRuleId, salaryCheckResultDetailTempPOS) -> {
//            // 校验异常
//            SalaryCheckResultPO salaryCheckResultPO = SalaryCheckResultPO.builder()
//                    .salaryAcctRecordId(checkParam.getSalaryAcctRecordId())
//                    .salaryCheckRuleId(checkRuleId)
//                    .formulaId(salaryCheckResultDetailTempPOS.get(0).getFormulaId())
//                    .ignoreType(0)
//                    .creator(employeeId)
//                    .createTime(now)
//                    .updateTime(now)
//                    .tenantKey(tenantKey)
//                    .deleteType(0)
//                    .build();
//            result.getNeedInsertCheckResults().add(salaryCheckResultPO);
//            // 校验异常明细
//            for (SalaryCheckResultDetailTempPO salaryCheckResultDetailTempPO : salaryCheckResultDetailTempPOS) {
//                SalaryCheckResultRecordPO salaryCheckResultRecordPO = convert2CheckResultRecordPO(salaryCheckResultPO.getId(),
//                        salaryCheckResultDetailTempPO, now, employeeId, tenantKey);
//                result.getNeedInsertCheckResultRecords().add(salaryCheckResultRecordPO);
//            }
//        });
//    }
//
//    /**
//     * 校验部分人员
//     *
//     * @param checkParam
//     * @param oldCheckResultMap
//     * @param checkRuleIdKeyTempMap
//     * @param result
//     * @param employeeId
//     * @param tenantKey
//     */
//    private void handlePartCheck(SalaryAcctCheckParam checkParam,
//                                 Map<Long, SalaryCheckResultPO> oldCheckResultMap,
//                                 Map<Long, List<SalaryCheckResultDetailTempPO>> checkRuleIdKeyTempMap,
//                                 Result result, Long employeeId, String tenantKey) {
//        LocalDateTime now = LocalDateTime.now();
//        checkRuleIdKeyTempMap.forEach((checkRuleId, salaryCheckResultDetailTempPOS) -> {
//            // 校验异常
//            SalaryCheckResultPO salaryCheckResultPO = oldCheckResultMap.computeIfAbsent(checkRuleId,
//                    k -> SalaryCheckResultPO.builder()
//                            .salaryAcctRecordId(checkParam.getSalaryAcctRecordId())
//                            .salaryCheckRuleId(k)
//                            .formulaId(salaryCheckResultDetailTempPOS.get(0).getFormulaId())
//                            .ignoreType(0)
//                            .creator(employeeId)
//                            .createTime(now)
//                            .updateTime(now)
//                            .tenantKey(tenantKey)
//                            .deleteType(0)
//                            .build());
//            // 校验异常明细
//            for (SalaryCheckResultDetailTempPO salaryCheckResultDetailTempPO : salaryCheckResultDetailTempPOS) {
//                SalaryCheckResultRecordPO salaryCheckResultRecordPO = convert2CheckResultRecordPO(salaryCheckResultPO.getId(),
//                        salaryCheckResultDetailTempPO, now, employeeId, tenantKey);
//                result.getNeedInsertCheckResultRecords().add(salaryCheckResultRecordPO);
//            }
//        });
//        // 需要删除的校验异常明细（属于本次校验人员的校验异常明细需要删除）
//        List<Long> needDeleteCheckResultRecordIds = oldCheckResultRecords.stream()
//                .filter(e -> checkParam.getIds().contains(e.getSalaryAcctEmpId()))
//                .map(SalaryCheckResultRecordPO::getId)
//                .collect(Collectors.toList());
//        result.getNeedDeleteCheckResultRecordIds().addAll(needDeleteCheckResultRecordIds);
//        // 需要删除的异常异常（校验异常下已经没有校验异常明细时需要删除）
//        Map<Long, List<SalaryCheckResultRecordPO>> oldCheckResultRecordMap = SalaryEntityUtil
//                .group2Map(oldCheckResultRecords, SalaryCheckResultRecordPO::getCheckResultId);
//        oldCheckResultRecordMap.forEach((checkResultId, salaryCheckResultRecordPOS) -> {
//            // 本次校验是否生成了校验异常明细
//            SalaryCheckResultPO checkResultPO = oldCheckResultMap.get(checkResultId);
//            boolean hasSalaryCheckResultRecord = checkRuleIdKeyTempMap.containsKey(checkResultPO.getSalaryCheckRuleId());
//            // 原来的校验异常明细中是否包含其他人员的（非本次校验的人员）
//            boolean hasOtherSalaryAcctEmployee = salaryCheckResultRecordPOS.stream().anyMatch(e -> !checkParam.getIds().contains(e.getSalaryAcctEmpId()));
//            // 原来校验异常明细不包含其他人员，本次校验也没有生成新的校验异常明细，那么就需要删除校验异常
//            if (!hasOtherSalaryAcctEmployee && !hasSalaryCheckResultRecord) {
//                result.getNeedDeleteCheckResultIds().add(checkResultId);
//            }
//        });
//    }
//
//    /**
//     * 转换成校验异常明细po
//     *
//     * @param checkResultId
//     * @param salaryCheckResultDetailTempPO
//     * @param now
//     * @param employeeId
//     * @param tenantKey
//     * @return
//     */
//    private SalaryCheckResultRecordPO convert2CheckResultRecordPO(Long checkResultId,
//                                                                  SalaryCheckResultDetailTempPO salaryCheckResultDetailTempPO,
//                                                                  LocalDateTime now,
//                                                                  Long employeeId,
//                                                                  String tenantKey) {
//        return SalaryCheckResultRecordPO.builder()
//                .checkResultId(checkResultId)
//                .salaryAcctRecordId(salaryCheckResultDetailTempPO.getSalaryAcctRecordId())
//                .salaryCheckRuleId(salaryCheckResultDetailTempPO.getSalaryCheckRuleId())
//                .formulaId(salaryCheckResultDetailTempPO.getFormulaId())
//                .salaryAcctEmpId(salaryCheckResultDetailTempPO.getSalaryAcctEmpId())
//                .employeeId(salaryCheckResultDetailTempPO.getEmployeeId())
//                .creator(employeeId)
//                .createTime(now)
//                .updateTime(now)
//                .tenantKey(tenantKey)
//                .deleteType(0)
//                .build();
//    }
//
//    @Data
//    public static class Result {
//
//        /**
//         * 需要删除的校验异常
//         */
//        private Collection<Long> needDeleteCheckResultIds;
//
//        /**
//         * 需要重新保存的校验异常
//         */
//        private Collection<SalaryCheckResultPO> needInsertCheckResults;
//
//        /**
//         * 需要删除的校验异常明细
//         */
//        private Collection<Long> needDeleteCheckResultRecordIds;
//
//        /**
//         * 需要重新保存的校验异常明细
//         */
//        private Collection<SalaryCheckResultRecordPO> needInsertCheckResultRecords;
//
//        private Result() {
//            this.needDeleteCheckResultIds = Lists.newArrayList();
//            this.needInsertCheckResults = Lists.newArrayList();
//            this.needDeleteCheckResultRecordIds = Lists.newArrayList();
//            this.needInsertCheckResultRecords = Lists.newArrayList();
//        }
//    }
//}
