first commit
This commit is contained in:
commit
db5762abd4
687 files changed
+171307
No files matched your search
@@ -0,0 +1,261 @@
|
||||
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 };
|
||||
Reference in new issue
Block a user