封装。提取。

package com.guodi.bpm.gdbh.from.service.event;

import com.alibaba.fastjson.JSONObject;
import com.guodi.bpm.common.exception.BusinessException;
import com.guodi.bpm.form.core.event.BpmFormEvent;
import com.guodi.bpm.model.vo.request.FormDataRequest;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author 梁伟浩
 * @description 监听表单事件
 * @date 2024/12/20 15:15
 * @study 星期五
 */

@Component
public class saveFormDataEvent {

    /**
     *
     * 处理农用设施保存表单耕地面积逻辑
     * 带条件监听事件(只监听[指定表单]的[保存]事件)
     * @author 梁伟浩
     * @param event
     */
    @EventListener(condition = "#event.inKey({'F000002'}) and #event.data.eventType=='Save'")
    public void declarationFromSave(BpmFormEvent event) {
        // 获取数据
        FormDataRequest request = (FormDataRequest) event.getData().getVariables().get("data");
        List<JSONObject> formDataList = request.getFormDataList();
        // 初始化变量
        BigDecimal zgdmj = BigDecimal.ZERO;
        BigDecimal zynydzmj = BigDecimal.ZERO;
        BigDecimal zyynmj = BigDecimal.ZERO;
        BigDecimal phgzcmj = BigDecimal.ZERO;
        BigDecimal phgzczgdmj = BigDecimal.ZERO;
        BigDecimal phgzczynmj = BigDecimal.ZERO;
        BigDecimal bhyjjbntmj = BigDecimal.ZERO;
        // 提取表单数据
        for (JSONObject formData : formDataList) {
            try {
                String key = formData.getString("key");
                Object value = formData.get("value");

                switch (key) {
                    case "zgdmj":
                        zgdmj = toBigDecimal(value);
                        break;
                    case "zynydzmj":
                        zynydzmj = toBigDecimal(value);
                        break;
                    case "zyynmj":
                        zyynmj = toBigDecimal(value);
                        break;
                    case "phgzczgdmj":
                        phgzczgdmj = toBigDecimal(value);
                        break;
                    case "phgzczynmj":
                        phgzczynmj = toBigDecimal(value);
                        break;
                    case "bhyjjbntmj":
                        bhyjjbntmj = toBigDecimal(value);
                        break;
                    default:
                        break; // 其他字段不处理
                }
            } catch (Exception e) {
                throw new BusinessException("处理农用设施保存表单耕地面积逻辑报错: " + e.getMessage());
            }
        }

        // 比较条件
        checkValues(zgdmj, zynydzmj, zyynmj, "占压耕地面积", "占用农用地总面积", "占用永久基本农田面积");
        checkValues(zgdmj, phgzcmj, "占压耕地面积", "破坏耕作层面积");
        checkValues(phgzczgdmj, phgzczynmj, "破坏耕作层占压耕地面积", "破坏耕作层占压永久基本农田面积");
        // 比较占用永久基本农田面积与补划永久基本农田面积
        compareBigDecimalValues(zyynmj, bhyjjbntmj, "占用永久基本农田面积", "补划永久基本农田面积");
    }

    /**
     * 将 Object 转换为 BigDecimal 类型,处理可能的异常。
     */
    private static BigDecimal toBigDecimal(Object obj) {
        if (obj == null) {
            return BigDecimal.ZERO;  // 如果为 null,则返回 BigDecimal.ZERO
        }
        if (obj instanceof Number) {
            return new BigDecimal(((Number) obj).toString());  // 将数字类型转换为 BigDecimal
        } else if (obj instanceof String) {
            try {
                return new BigDecimal((String) obj);  // 如果是字符串类型,尝试解析为 BigDecimal
            } catch (NumberFormatException e) {
                return BigDecimal.ZERO;  // 转换失败时返回 BigDecimal.ZERO
            }
        } else {
            return BigDecimal.ZERO;  // 其他类型返回 BigDecimal.ZERO
        }
    }

    /**
     * 校验数值大小关系,使用 BigDecimal 来进行比较。
     */
    private void checkValues(BigDecimal value1, BigDecimal value2, String label1, String label2) {
        if (value1.compareTo(BigDecimal.ZERO) != 0 && value2.compareTo(BigDecimal.ZERO) != 0) {
            if (value1.compareTo(value2) < 0) {
                throw new BusinessException(label1 + " 数值必须≥ " + label2 + " 数值条件未成立,请检查!");
            }
        }
    }

    /**
     * 重载的校验方法,支持多个数值的比较。
     */
    private void checkValues(BigDecimal value1, BigDecimal value2, BigDecimal value3, String label1, String label2, String label3) {
        if (value1.compareTo(BigDecimal.ZERO) != 0 && value2.compareTo(BigDecimal.ZERO) != 0 && value3.compareTo(BigDecimal.ZERO) != 0) {
            if (value1.compareTo(value2) < 0 || value2.compareTo(value3) < 0) {
                throw new BusinessException(label1 + " 数值必须≥ " + label2 + " 数值≥ " + label3 + " 数值条件未成立,请检查!");
            }
        }
    }

    /**
     * 比较两个 BigDecimal 的值,如果不相等则抛出异常。
     */
    private void compareBigDecimalValues(BigDecimal value1, BigDecimal value2, String label1, String label2) {
        if (value1.compareTo(BigDecimal.ZERO) != 0 && value2.compareTo(BigDecimal.ZERO) != 0) {
            if (value1.compareTo(value2) != 0) {
                throw new BusinessException(label1 + " 数值必须= " + label2 + " 数值未成立,请检查!");
            }
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java中的战斗机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值