package shkd.repc.rebm.opplugin;

import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.AddValidatorsEventArgs;
import kd.bos.entity.validate.AbstractValidator;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.util.StringUtils;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * 采购立项提交
 * qeug_rebm_project_ext
 */
public class PurProjectSubmitOPPlugin extends AbstractOperationServicePlugIn {

    @Override
    public void onAddValidators(AddValidatorsEventArgs e) {
        super.onAddValidators(e);
        /*
          校验金额逻辑
              1)引用合约规划:遍历子单据体,取计划,需求均为空并且合约规划名称不为空的行,累加规划金额
              2)引用采购计划:遍历子单据体,取计划不为空的行,穿透到计划中累加对应明细的控制金额
              3)引用采购需求:合并相同的采购需求单,累加需求金额
         */

        e.addValidator(new AbstractValidator() {
            @Override
            public void validate() {
                String operateKey = this.getOperateKey();
                ExtendedDataEntity[] dataEntities1 = this.getDataEntities();
                if ("submit".equals(operateKey)) {
                    for (ExtendedDataEntity extendedDataEntity : dataEntities1) {
                        // 控制金额校验
                        DynamicObject dataEntity = extendedDataEntity.getDataEntity();
                        Map<Long, BigDecimal> XqMap = new HashMap<>();
                        DynamicObjectCollection bidSections = dataEntity.getDynamicObjectCollection("bidsection"); // 标段
                        BigDecimal totalAmount = BigDecimal.ZERO; // 遍历明细, 需求单去重后累加申请金额, 非需求单累加规划金额

                        if (bidSections != null) {
                            for (DynamicObject bidSection : bidSections) {
                                DynamicObjectCollection projectEntries = bidSection.getDynamicObjectCollection("projectentry"); // 采购明细

                                if (projectEntries != null) {
                                    for (DynamicObject projectEntry : projectEntries) {
                                        long id = projectEntry.getLong("qeug_purentry_id");

                                        // 需求_对应金额, 若id相同, 覆盖
                                        if (id != 0) {
                                            DynamicObject qeugCgxq = projectEntry.getDynamicObject("qeug_cgxq");
                                            if (qeugCgxq != null) {
                                                qeugCgxq = BusinessDataServiceHelper.loadSingle(qeugCgxq.getPkValue(), "recon_settleplanbill");
                                                if (qeugCgxq != null) {
                                                    XqMap.put(qeugCgxq.getLong("id"), qeugCgxq.getBigDecimal("qeug_applyamount"));
                                                }
                                            }
                                        }
                                        // 非采购需求
                                        else {
                                            String purplanname = projectEntry.getString("purplanname"); // 采购计划名称
                                            DynamicObject programcontract = projectEntry.getDynamicObject("programcontract"); // 合约规划
                                            DynamicObject cqprogcon = projectEntry.getDynamicObject("cqprogcon"); // 合约规划树形

                                            // 合约规划
                                            if (StringUtils.isEmpty(purplanname) && projectEntry.getDynamicObject("qeug_cgxq") == null) {
                                                if (programcontract != null || cqprogcon != null) {
                                                    totalAmount = totalAmount.add(projectEntry.getBigDecimal("planamount"));
                                                }
                                            }

                                            // 采购计划
                                            if (!StringUtils.isEmpty(purplanname)) {
                                                DynamicObject purplanentry = projectEntry.getDynamicObject("purplanentry"); // 采购计划分录
                                                if (purplanentry != null) {
                                                    purplanentry = BusinessDataServiceHelper.loadSingle(purplanentry.getPkValue(), "rebm_purplanentry_f7");
                                                    DynamicObject purplan = purplanentry.getDynamicObject("purplan");
                                                    if (purplan != null) {
                                                        DynamicObject rebm_purplan = BusinessDataServiceHelper.loadSingle(purplan.getPkValue(), "rebm_purplan");
                                                        DynamicObjectCollection collection = rebm_purplan.getDynamicObjectCollection("entryentity");

                                                        for (DynamicObject dynamicObject : collection) {
                                                            long id1 = purplanentry.getLong("id"); // 计划分录id
                                                            long id2 = dynamicObject.getLong("id");
                                                            if (id1 == id2) {
                                                                totalAmount = totalAmount.add(dynamicObject.getBigDecimal("prucontrolamount"));
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }

                            // 累加需求对应金额
                            for (BigDecimal value : XqMap.values()) {
                                totalAmount = totalAmount.add(value);
                            }
                        }

                        // 采购立项_采购控制总金额(单头)
                        BigDecimal totalcontrol = dataEntity.getBigDecimal("totalcontrol");
                        if (totalcontrol.compareTo(totalAmount) > 0) {
                            this.addErrorMessage(extendedDataEntity, "采购控制总金额不能大于采购申请总金额与规划金额之和");
                        }
                    }
                }
            }
        });
    }
}