package com.yem.wm.im.debcrednotenew.op;

import com.yem.wm.im.debcrednotenew.validator.DebCredNewAuditValidatorOp;
import com.yem.wm.utils.DynamicObjectUtil;
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.plugin.PreparePropertysEventArgs;
import kd.bos.entity.plugin.args.BeforeOperationArgs;
import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;

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

/**
 * @author zhouc
 * @date 2024/3/30 20:12
 * @className DebCredNewSubmitOp
 * @description 贷记单提交服务插件
 */
public class DebCredNewSubmitOp extends AbstractOperationServicePlugIn {
    @Override
    public void onPreparePropertys(PreparePropertysEventArgs e) {
        super.onPreparePropertys(e);
        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
    }

    @Override
    public void onAddValidators(AddValidatorsEventArgs e) {
        super.onAddValidators(e);
        e.addValidator(new DebCredNewAuditValidatorOp());
    }

    @Override
    public void endOperationTransaction(EndOperationTransactionArgs e) {
        DynamicObject[] dataEnties = e.getDataEntities();
        for (DynamicObject temp : dataEnties) {
            //2024-10-08 zhouc 修改至提交前计算
//            getlast(temp);
        }
    }

    @Override
    public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
        super.beforeExecuteOperationTransaction(e);
        for (ExtendedDataEntity dataEntity : e.getSelectedRows()) {
            DynamicObject dynamicObject = dataEntity.getDataEntity();
            DynamicObject billObj = BusinessDataServiceHelper.loadSingle(dynamicObject.getPkValue(), dynamicObject.getDynamicObjectType().getName());
            DynamicObject yemCurrency = billObj.getDynamicObject("yem_currency");
            if (yemCurrency!=null){
                /*
                  （1）如果结算币别=美元：
                  ①　扣减后金额（美元）=上次美元金额（实际）+ 配件资金池增加金额-配件资金池扣减金额；
                  ②　扣减后金额（人民币）= 上次人民币金额（实际）；
                  （2）如果结算币别=人民币：
                   ①　扣减后金额（美元）=上次美元金额（实际）；
                   ②　扣减后金额（人民币）= 上次人民币金额（实际）+ 配件资金池增加金额-配件资金池扣减金额；
                 */
                String number = yemCurrency.getString("number");
                BigDecimal yemCreditusdamt = billObj.getBigDecimal("yem_creditusdamt");//上次美元金额（实际）
                BigDecimal yemCreditrmbamt = billObj.getBigDecimal("yem_creditrmbamt");//上次人民币金额（实际）
                BigDecimal yemAmount = billObj.getBigDecimal("yem_amount");//配件资金池增加金额
                BigDecimal yemAmountSub = billObj.getBigDecimal("yem_amount_sub");//配件资金池扣减金额
                if ("CNY".equals(number)){
                    dynamicObject.set("yem_koujianusd",yemCreditusdamt);
                    dynamicObject.set("yem_koujiancny",yemCreditrmbamt.add(yemAmount.subtract(yemAmountSub)));
                }else if ("USD".equals(number)){
                    dynamicObject.set("yem_koujianusd",yemCreditusdamt.add(yemAmount.subtract(yemAmountSub)));
                    dynamicObject.set("yem_koujiancny",yemCreditrmbamt);
                }
            }
            getlast(dynamicObject);
        }
    }
    /**
     *  计算上次美元金额（实际） 上次人民币金额（实际）
     * @param temp
     */
    public void getlast(DynamicObject temp){
        temp = BusinessDataServiceHelper.loadSingle(temp.getPkValue(), temp.getDynamicObjectType().getName());
        //借贷业务类型
        DynamicObject yem_credittype = temp.getDynamicObject("yem_credittype");
        //集团客户
        DynamicObject yem_customer = temp.getDynamicObject("yem_groupcusfields");
        //产品类型
        DynamicObject yem_bd_products = temp.getDynamicObject("yem_bd_products");
        QFilter qFilter1 = new QFilter("billstatus", QCP.equals, "C");
        qFilter1.and(new QFilter("yem_credittype.id", QCP.equals, yem_credittype.getLong("id")));
        qFilter1.and(new QFilter("yem_groupcusfields.id", QCP.equals, yem_customer.getLong("id")));
        //借/贷类型
        qFilter1.and(new QFilter("yem_debcredtype", QCP.equals, temp.getString("yem_debcredtype")));
        qFilter1.and(new QFilter("yem_bd_products.id", QCP.equals, yem_bd_products.getLong("id")));
        qFilter1.and(new QFilter("id", QCP.not_equals, temp.getPkValue()));
        String selectfielddebcrednote = DynamicObjectUtil.getSelectfields("yem_debcrednote", false);
        DynamicObjectCollection debcrednote = QueryServiceHelper.query("yem_debcrednote",
                selectfielddebcrednote, new QFilter[]{qFilter1}, "billno desc");
        if (debcrednote.size() > 0) {
            String billno = debcrednote.get(0).getString("billno");
            temp.set("yem_lastbillno", billno);
        }
        //组织
        DynamicObject org = temp.getDynamicObject("org");
        String products = "";
        if (yem_bd_products != null) {
            String number = yem_bd_products.getString("number");
            if (number.contains("ZZJ")) {
                products = "ZZJ";
            } else if (number.contains("CC")) {
                products = "CC";
            } else if (number.contains("TLJ")) {
                products = "TLJ";
            }
        }
        if (org != null && yem_customer != null && yem_credittype != null && products != null) {
            QFilter qFilter = new QFilter("billstatus", QCP.equals, "C");//
            qFilter.and(new QFilter("org.id", QCP.equals, org.getLong("id")));
            qFilter.and(new QFilter("yem_customer.id", QCP.equals, yem_customer.getLong("id")));
            qFilter.and(new QFilter("yem_bd_products.number", QCP.equals, products));
            qFilter.and(new QFilter("yem_spcapitalpool_a.yem_creditype.id", QCP.equals, yem_credittype.getLong("id")));
            qFilter.and(new QFilter("yem_spcapitalpool_a.yem_debcredtype", QCP.equals, temp.getString("yem_debcredtype")));
            String selectfield = DynamicObjectUtil.getSelectfields("yem_spcapitalpool", false);
            String selectfields = DynamicObjectUtil.getEntrySelectfields(selectfield, "yem_spcapitalpool", "yem_spcapitalpool_a", false);
            DynamicObjectCollection data = QueryServiceHelper.query("yem_spcapitalpool", selectfields, new QFilter[]{qFilter}, "billno");
            Map<Long, BigDecimal> map = new HashMap<>();
            Map<Long, BigDecimal> map1 = new HashMap<>();
            if (data.size() > 0) {
                for (int i = 0; i < data.size(); i++) {
                    DynamicObject dynamicObject = data.get(i);
                    long yem_curr = dynamicObject.getLong("yem_spcapitalpool_a.yem_curr");
                    BigDecimal yem_noamo = dynamicObject.getBigDecimal("yem_spcapitalpool_a.yem_actremaamount");//实际剩余金额
                    BigDecimal yem_estamount = dynamicObject.getBigDecimal("yem_spcapitalpool_a.yem_estamount");//预计剩余金额
                    if (map.containsKey(yem_curr)) {
                        BigDecimal bigDecimal = map.get(yem_curr);
                        map.put(yem_curr, bigDecimal.add(yem_noamo));
                        BigDecimal bigDecimal1 = map1.get(yem_curr);
                        map1.put(yem_curr, bigDecimal1.add(yem_estamount));
                    } else {
                        map.put(yem_curr, yem_noamo);
                        map1.put(yem_curr, yem_estamount);
                    }
                }
            }
            if (map.size() > 0) {
                for (Long mapkey : map.keySet()) {
                    BigDecimal bigDecimal = map.get(mapkey);
                    DynamicObject yem_em_replace = BusinessDataServiceHelper.loadSingle(mapkey, "bd_currency");
                    if (yem_em_replace != null) {
                        String number = yem_em_replace.getString("number");
                        if (number.equals("CNY")) {
                            temp.set("yem_creditrmbamt", bigDecimal);
                        }
                        if (number.equals("USD")) {
                            temp.set("yem_creditusdamt", bigDecimal);
                        }
                    }
                }
            }
            if (map1.size() > 0) {
                for (Long mapkey : map1.keySet()) {
                    BigDecimal bigDecimal = map1.get(mapkey);
                    DynamicObject yem_em_replace = BusinessDataServiceHelper.loadSingle(mapkey, "bd_currency");
                    if (yem_em_replace != null) {
                        String number = yem_em_replace.getString("number");
                        if (number.equals("CNY")) {
                            temp.set("yem_lastrmbamt", bigDecimal);
                        }
                        if (number.equals("USD")) {
                            temp.set("yem_lastusdamt", bigDecimal);
                        }
                    }
                }
            }
        }

        SaveServiceHelper.update(temp);
    }
}
