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 + " 数值未成立,请检查!");
}
}
}
}
封装。提取。
于 2024-12-25 16:26:26 首次发布