Files
console-dev/app/lib/common-advanced-rules.js
T
2026-11-06 00:04:38 +08:00

262 lines
7.4 KiB
JavaScript

var e = (e) => (e && typeof e == `object` && !Array.isArray(e) ? e : {}),
t = (t) => (Array.isArray(t) ? t.map(e) : []),
n = (e) => JSON.parse(JSON.stringify(e)),
r = (e) => [`quantity`, `quantity_range`].includes(String(e.option_type)),
i = (e) => String(e.id ?? e.configoption_id ?? ``),
a = (e) =>
(Array.isArray(e) ? e : [e])
.filter((e) => e != null && e !== ``)
.map(Number),
o = (e = `商品高级规则数据不完整`) => {
throw Error(e);
};
function s(n) {
return n == null
? []
: Array.isArray(n)
? n.flatMap((n) => {
let r = e(n);
if (![!0, 1, `1`].includes(r.enabled)) return [];
[`all`, `any`].includes(String(r.combine_mode)) || o();
let i = t(r.terms).map(
(e) => (
(![`condition`, `result`].includes(String(e.role)) ||
![`in`, `not_in`].includes(String(e.operator)) ||
!Number.isSafeInteger(Number(e.configoption_id)) ||
Number(e.configoption_id) <= 0 ||
!t(e.values).length) &&
o(),
{
id: String(e.configoption_id),
role: e.role,
operator: e.operator,
values: t(e.values),
}
),
);
return (
(!i.some((e) => e.role === `condition`) ||
!i.some((e) => e.role === `result`)) &&
o(),
[
{
mode: r.combine_mode,
terms: i,
},
]
);
})
: o();
}
function c(e, t, n) {
return n.values.some((n) => {
if (r(e))
return (
(n.qty_min === null ||
n.qty_min === void 0 ||
n.qty_max === null ||
n.qty_max === void 0 ||
!Number.isFinite(Number(n.qty_min)) ||
!Number.isFinite(Number(n.qty_max)) ||
Number(n.qty_max) < Number(n.qty_min)) &&
o(),
t >= Number(n.qty_min) && t <= Number(n.qty_max)
);
let i = Number(n.configoption_sub_id);
return ((!Number.isSafeInteger(i) || i <= 0) && o(), t === i);
});
}
function l(e, t, n) {
let r = a(t).map((t) => c(e, t, n));
return n.operator === `not_in`
? !r.some(Boolean)
: n.role === `condition`
? r.some(Boolean)
: !!r.length && r.every(Boolean);
}
function u(e) {
return e.option_type === `os`
? t(e.subs).flatMap((e) => t(e.version).map((e) => Number(e.id)))
: t(e.subs).map((e) => Number(e.id));
}
function d(e) {
let n = {};
for (let o of e) {
let e = i(o);
if (!e || o.option_type === `cascade`) continue;
let s = (
r(o)
? [Number(o.qty)]
: o.configoption_sub_id === void 0
? t(o.subs).some((e) => e.id !== void 0)
? t(o.subs).map((e) => Number(e.id))
: u(o)
: [Number(o.configoption_sub_id)]
).filter(Number.isFinite);
n[e] =
r(o) || o.option_type === `multi_select`
? [...a(n[e]), ...s]
: (s[0] ?? null);
}
return n;
}
function f(e, n, i) {
if (
(e.option_type === `cascade` && o(`高级规则不能将级联项作为普通配置提交`),
!r(e))
) {
let r = (t) =>
n.operator === `not_in` ? !c(e, Number(t), n) : c(e, Number(t), n);
e.subs =
e.option_type === `os`
? t(e.subs)
.map((e) => ({
...e,
version: t(e.version).filter((e) => r(e.id)),
}))
.filter((e) => e.version.length)
: t(e.subs).filter((e) => r(e.id));
return;
}
let a = Number(i.qty_min ?? 0),
s = Math.max(1, Number(i.qty_change || 1));
((!Number.isSafeInteger(a) || !Number.isSafeInteger(s)) && o(),
(e.subs = (
t(e.subs).length
? t(e.subs)
: [
{
qty_min: e.qty_min,
qty_max: e.qty_max,
},
]
).flatMap((t) => {
let r = a + Math.ceil((Number(t.qty_min) - a) / s) * s,
i = a + Math.floor((Number(t.qty_max) - a) / s) * s;
if (!Number.isSafeInteger(r) || !Number.isSafeInteger(i) || i < r)
return [];
let o = Math.floor((i - r) / s) + 1,
l = [
...new Set([
0,
o,
...n.values.flatMap(
(t) => (
c(e, r, {
...n,
values: [t],
}),
[
Math.ceil((Number(t.qty_min) - r) / s),
Math.floor((Number(t.qty_max) - r) / s) + 1,
]
),
),
]),
]
.filter((e) => e >= 0 && e <= o)
.sort((e, t) => e - t);
return l.slice(0, -1).flatMap((i, a) => {
let o = r + i * s,
u = r + (l[a + 1] - 1) * s,
d = c(e, o, n);
return u >= o && (n.operator === `not_in` ? !d : d)
? [
{
...t,
qty_min: o,
qty_max: u,
},
]
: [];
});
})));
let l = t(e.subs);
l.length &&
((e.qty_min = Math.min(...l.map((e) => Number(e.qty_min)))),
(e.qty_max = Math.max(...l.map((e) => Number(e.qty_max)))));
}
function p(e, n, s) {
let c = i(e),
l = String(e.option_name || c),
d = n[c];
if (r(e)) {
let r = t(e.subs),
i = Number(s.qty_min ?? 0),
u = Math.max(1, Number(s.qty_change || 1));
r.length || o(`${l}没有符合当前条件的配置`);
let f = Number(r[0].qty_min),
p = a(d).map((e) =>
r.some(
(t) =>
e >= Number(t.qty_min) &&
e <= Number(t.qty_max) &&
(e - i) % u === 0,
)
? e
: f,
);
n[c] = Array.isArray(d) ? (p.length ? p : [f]) : (p[0] ?? f);
} else {
let t = u(e);
if (
(t.length || o(`${l}没有符合当前条件的配置`),
e.option_type === `multi_select`)
) {
let e = a(d).filter((e) => t.includes(e));
n[c] = e.length ? e : [t[0]];
} else t.includes(Number(d)) || (n[c] = t[0]);
}
}
function m(r, a, c, u = []) {
let m = r.map((t) => n(e(t))),
h = s(c);
if (!h.length)
return {
options: r,
form: a,
};
let g = t(u),
_ = new Map([...g, ...m].map((e) => [i(e), e])),
v = d(g),
y = n(a),
b = new Set();
for (let e = 0; e <= m.length + h.length + 2; e++) {
let e = JSON.stringify(y);
(b.has(e) && o(`商品高级规则相互冲突,请重新选择配置`), b.add(e));
let t = n(m),
r = {
...v,
...y,
},
a = new Set();
for (let e of h) {
let n = e.terms
.filter((e) => e.role === `condition`)
.map((e) => {
let t = _.get(e.id);
return t ? l(t, r[e.id], e) : null;
});
if (e.mode === `any` ? n.some((e) => e === !0) : n.every((e) => e === !0))
for (let n of e.terms.filter((e) => e.role === `result`)) {
let e = t.find((e) => i(e) === n.id);
if (e) (f(e, n, _.get(n.id)), a.add(n.id));
else {
let e = _.get(n.id);
e &&
!l(e, r[n.id], n) &&
o(`所选配置与当前实例配置不兼容,请重新选择`);
}
}
}
for (let e of t) a.has(i(e)) && p(e, y, _.get(i(e)));
if (JSON.stringify(y) === e)
return {
options: t,
form: y,
};
}
return o(`商品高级规则无法确定,请重新选择配置`);
}
export { m as t };