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.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.AddValidatorsEventArgs;
import kd.bos.entity.plugin.PreparePropertysEventArgs;
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.List;
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);
        List<String> fieldKeys = e.getFieldKeys();
        fieldKeys.add("yem_groupcusfields");
    }

    @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) {
            temp = BusinessDataServiceHelper.loadSingle(temp.getPkValue(), temp.getDynamicObjectType().getName());
            //借贷业务类型
            DynamicObject yem_credittype = temp.getDynamicObject("yem_credittype");
            //客户
            DynamicObject yem_customer = temp.getDynamicObject("yem_customer");
            //产品类型
            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_customer.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");
            //集团客户
            DynamicObject yem_groupcustomers = temp.getDynamicObject("yem_groupcusfields");
            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_groupcustomers != 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_groupcustomers.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);
        }
    }
}
