|
|
@@ -274,9 +274,18 @@ public class FactorMatch {
|
|
|
|
|
|
|
|
|
private static boolean checkBoxEqual(PtlAgreementCostRule ptlAgreementCostRule, String value) {
|
|
|
+ if (ptlAgreementCostRule.getMin() == null || value == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
String[] split = ptlAgreementCostRule.getMin().split(",");
|
|
|
for (String sp : split) {
|
|
|
- if (sp.equals(value)) {
|
|
|
+ if (sp.trim().equals(value.trim())) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ // 顺带支持是/否归一化
|
|
|
+ String n1 = normalizeYesNo(sp.trim());
|
|
|
+ String n2 = normalizeYesNo(value.trim());
|
|
|
+ if (!n1.equals(sp.trim()) && !n2.equals(value.trim()) && n1.equals(n2)) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
@@ -347,8 +356,21 @@ public class FactorMatch {
|
|
|
}
|
|
|
|
|
|
private static boolean selectEqual(PtlAgreementCostRule ptlAgreementCostRule, String value) {
|
|
|
- if (ptlAgreementCostRule.getMin() != null && ptlAgreementCostRule.getMin().contains(value)) {
|
|
|
- return true;
|
|
|
+ if (ptlAgreementCostRule.getMin() == null || value == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // 修复:select 支持多选逗号分隔,所以正确做法是 split 后逐个 equals
|
|
|
+ String[] options = ptlAgreementCostRule.getMin().split(",");
|
|
|
+ for (String opt : options) {
|
|
|
+ if (opt.trim().equals(value.trim())) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ // 顺带支持是/否归一化
|
|
|
+ String n1 = normalizeYesNo(opt.trim());
|
|
|
+ String n2 = normalizeYesNo(value.trim());
|
|
|
+ if (!n1.equals(opt.trim()) && !n2.equals(value.trim()) && n1.equals(n2)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
@@ -358,15 +380,70 @@ public class FactorMatch {
|
|
|
if ("NewEnergy".equals(ptlAgreementCostRule.getAttrCode())) {
|
|
|
// 是否是新能源车
|
|
|
boolean newEnergy = EnergyTypeCode.isNewEnergy(value);
|
|
|
- if (newEnergy && ptlAgreementCostRule.getMin().equals("1")) {
|
|
|
+ if (newEnergy && "1".equals(normalizeYesNo(ptlAgreementCostRule.getMin()))) {
|
|
|
return true;
|
|
|
- } else if (!newEnergy && ptlAgreementCostRule.getMin().equals("0")) {
|
|
|
+ } else if (!newEnergy && "0".equals(normalizeYesNo(ptlAgreementCostRule.getMin()))) {
|
|
|
return true;
|
|
|
}
|
|
|
- } else if (ptlAgreementCostRule.getMin().contains(value)) {
|
|
|
- return true;
|
|
|
+ return false;
|
|
|
}
|
|
|
- return false;
|
|
|
+
|
|
|
+ // ========== 修复:归一化 是/否 类的 value ==========
|
|
|
+ String ruleValue = (ptlAgreementCostRule.getMin() != null) ? ptlAgreementCostRule.getMin() : ptlAgreementCostRule.getMax();
|
|
|
+ String normalizedRule = normalizeYesNo(ruleValue);
|
|
|
+ String normalizedValue = normalizeYesNo(value);
|
|
|
+
|
|
|
+ String operator = ptlAgreementCostRule.getOperator();
|
|
|
+ if (operator == null) operator = "1"; // 默认 等于
|
|
|
+
|
|
|
+ switch (operator) {
|
|
|
+ case "1": // 等于(默认)
|
|
|
+ // 修复1:先归一化后比较(解决 N/0、Y/1 不一致的问题)
|
|
|
+ if (normalizedRule != null && normalizedValue != null
|
|
|
+ && !normalizedRule.equals(ruleValue) && !normalizedValue.equals(value)) {
|
|
|
+ // 两个都经过归一化翻译了,直接比归一化后的值
|
|
|
+ return normalizedRule.equals(normalizedValue);
|
|
|
+ }
|
|
|
+ // 修复2:用 equals 代替 contains(避免 "10".contains("0") 的误判)
|
|
|
+ return (ruleValue != null && ruleValue.equals(value))
|
|
|
+ || (normalizedRule != null && normalizedRule.equals(normalizedValue));
|
|
|
+
|
|
|
+ case "2": // 不等于
|
|
|
+ if (normalizedRule != null && normalizedValue != null
|
|
|
+ && !normalizedRule.equals(ruleValue) && !normalizedValue.equals(value)) {
|
|
|
+ return !normalizedRule.equals(normalizedValue);
|
|
|
+ }
|
|
|
+ return ruleValue == null || !ruleValue.equals(value);
|
|
|
+
|
|
|
+ case "3": case "4": case "5": // 其他运算符(radio 一般用不上,兜底)
|
|
|
+ return inputNumberEqual(ptlAgreementCostRule, value);
|
|
|
+
|
|
|
+ default:
|
|
|
+ return (ruleValue != null && ruleValue.equals(value));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 归一化"是/否"类的值,把各种表达方式统一成 1/0
|
|
|
+ * 是: "1", "Y", "y", "是", "true", "TRUE", "True" -> "1"
|
|
|
+ * 否: "0", "N", "n", "否", "false", "FALSE", "False" -> "0"
|
|
|
+ * 其他值原样返回
|
|
|
+ */
|
|
|
+ private static String normalizeYesNo(String value) {
|
|
|
+ if (value == null) return null;
|
|
|
+ String v = value.trim();
|
|
|
+ if (v.isEmpty()) return v;
|
|
|
+ // 是否的"是"
|
|
|
+ if ("1".equals(v) || "Y".equalsIgnoreCase(v) || "true".equalsIgnoreCase(v)
|
|
|
+ || "是".equals(v) || "T".equalsIgnoreCase(v) || "YES".equalsIgnoreCase(v)) {
|
|
|
+ return "1";
|
|
|
+ }
|
|
|
+ // 是否的"否"
|
|
|
+ if ("0".equals(v) || "N".equalsIgnoreCase(v) || "false".equalsIgnoreCase(v)
|
|
|
+ || "否".equals(v) || "F".equalsIgnoreCase(v) || "NO".equalsIgnoreCase(v)) {
|
|
|
+ return "0";
|
|
|
+ }
|
|
|
+ return v;
|
|
|
}
|
|
|
|
|
|
public static boolean dateTimeEqual(PtlAgreementCostRule ptlAgreementCostRule, String value){
|