@pisell/pisellos 2.2.253 → 2.2.255

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/model/strategy/adapter/promotion/index.js +0 -9
  2. package/dist/modules/Order/index.d.ts +10 -1
  3. package/dist/modules/Order/index.js +448 -369
  4. package/dist/modules/Order/types.d.ts +2 -0
  5. package/dist/modules/Quotation/index.d.ts +16 -2
  6. package/dist/modules/Quotation/index.js +71 -38
  7. package/dist/modules/Quotation/types.d.ts +14 -0
  8. package/dist/modules/SalesSummary/index.d.ts +1 -0
  9. package/dist/modules/SalesSummary/index.js +7 -4
  10. package/dist/modules/Schedule/index.d.ts +4 -0
  11. package/dist/modules/Schedule/index.js +31 -1
  12. package/dist/modules/Schedule/types.d.ts +2 -0
  13. package/dist/server/index.js +13 -12
  14. package/dist/server/modules/products/index.d.ts +4 -0
  15. package/dist/server/modules/products/index.js +76 -45
  16. package/dist/server/modules/quotation/index.d.ts +39 -0
  17. package/dist/server/modules/quotation/index.js +278 -66
  18. package/dist/server/modules/schedule/index.d.ts +2 -0
  19. package/dist/server/modules/schedule/index.js +10 -2
  20. package/dist/solution/BaseSales/index.d.ts +10 -1
  21. package/dist/solution/BaseSales/index.js +825 -528
  22. package/dist/solution/BaseSales/types.d.ts +7 -0
  23. package/dist/solution/BaseSales/utils/quotationPrice.d.ts +12 -1
  24. package/dist/solution/BaseSales/utils/quotationPrice.js +16 -3
  25. package/dist/solution/BookingByStep/index.d.ts +1 -1
  26. package/lib/model/strategy/adapter/promotion/index.js +49 -0
  27. package/lib/modules/Order/index.d.ts +10 -1
  28. package/lib/modules/Order/index.js +48 -7
  29. package/lib/modules/Order/types.d.ts +2 -0
  30. package/lib/modules/Quotation/index.d.ts +16 -2
  31. package/lib/modules/Quotation/index.js +49 -13
  32. package/lib/modules/Quotation/types.d.ts +14 -0
  33. package/lib/modules/SalesSummary/index.d.ts +1 -0
  34. package/lib/modules/SalesSummary/index.js +4 -3
  35. package/lib/modules/Schedule/index.d.ts +4 -0
  36. package/lib/modules/Schedule/index.js +21 -0
  37. package/lib/modules/Schedule/types.d.ts +2 -0
  38. package/lib/server/index.js +1 -1
  39. package/lib/server/modules/products/index.d.ts +4 -0
  40. package/lib/server/modules/products/index.js +43 -19
  41. package/lib/server/modules/quotation/index.d.ts +39 -0
  42. package/lib/server/modules/quotation/index.js +179 -1
  43. package/lib/server/modules/schedule/index.d.ts +2 -0
  44. package/lib/server/modules/schedule/index.js +8 -1
  45. package/lib/solution/BaseSales/index.d.ts +10 -1
  46. package/lib/solution/BaseSales/index.js +218 -19
  47. package/lib/solution/BaseSales/types.d.ts +7 -0
  48. package/lib/solution/BaseSales/utils/quotationPrice.d.ts +12 -1
  49. package/lib/solution/BaseSales/utils/quotationPrice.js +15 -3
  50. package/lib/solution/BookingByStep/index.d.ts +1 -1
  51. package/package.json +1 -1
@@ -1,4 +1,6 @@
1
1
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2
4
  function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
5
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
4
6
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
@@ -16,8 +18,14 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
16
18
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
17
19
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
18
20
  import { cloneDeep } from 'lodash-es';
21
+ import dayjs from 'dayjs';
22
+ import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
23
+ import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
19
24
  import { BaseModule } from "../../../modules/BaseModule";
20
25
  import { QuotationHooks } from "./types";
26
+ import { getDateIsInSchedule } from "../../../modules/Schedule/getDateIsInSchedule";
27
+ dayjs.extend(isSameOrBefore);
28
+ dayjs.extend(isSameOrAfter);
21
29
 
22
30
  /**
23
31
  * IndexDB 存储名称
@@ -30,8 +38,6 @@ var INDEXDB_STORE_NAME = 'quotation';
30
38
  export var QuotationModule = /*#__PURE__*/function (_BaseModule) {
31
39
  _inherits(QuotationModule, _BaseModule);
32
40
  var _super = _createSuper(QuotationModule);
33
- // IndexDBManager 实例
34
-
35
41
  function QuotationModule(name, version) {
36
42
  var _this;
37
43
  _classCallCheck(this, QuotationModule);
@@ -41,6 +47,8 @@ export var QuotationModule = /*#__PURE__*/function (_BaseModule) {
41
47
  _defineProperty(_assertThisInitialized(_this), "request", void 0);
42
48
  _defineProperty(_assertThisInitialized(_this), "store", void 0);
43
49
  _defineProperty(_assertThisInitialized(_this), "dbManager", void 0);
50
+ // IndexDBManager 实例
51
+ _defineProperty(_assertThisInitialized(_this), "scheduleResolver", void 0);
44
52
  return _this;
45
53
  }
46
54
  _createClass(QuotationModule, [{
@@ -170,82 +178,286 @@ export var QuotationModule = /*#__PURE__*/function (_BaseModule) {
170
178
  value: function getQuotationList() {
171
179
  return this.store.quotationList;
172
180
  }
181
+ }, {
182
+ key: "loadQuotations",
183
+ value: function () {
184
+ var _loadQuotations = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(params) {
185
+ var _data;
186
+ var query, res, list;
187
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
188
+ while (1) switch (_context4.prev = _context4.next) {
189
+ case 0:
190
+ if (!(Array.isArray(this.store.quotationList) && this.store.quotationList.length > 0)) {
191
+ _context4.next = 3;
192
+ break;
193
+ }
194
+ this.store.quotationList.sort(function (a, b) {
195
+ var _ref, _a$sort, _ref2, _b$sort;
196
+ return Number((_ref = (_a$sort = a.sort) !== null && _a$sort !== void 0 ? _a$sort : a.priority) !== null && _ref !== void 0 ? _ref : 0) - Number((_ref2 = (_b$sort = b.sort) !== null && _b$sort !== void 0 ? _b$sort : b.priority) !== null && _ref2 !== void 0 ? _ref2 : 0);
197
+ });
198
+ return _context4.abrupt("return");
199
+ case 3:
200
+ query = {};
201
+ if (params !== null && params !== void 0 && params.channel) query.channel = params.channel;
202
+ if ((params === null || params === void 0 ? void 0 : params.channel) === 'online_store') query.channel = 'online-store';
203
+ _context4.next = 8;
204
+ return this.request.get('/quotation/available', query, {
205
+ useCache: false,
206
+ osServer: true
207
+ });
208
+ case 8:
209
+ res = _context4.sent;
210
+ list = (res === null || res === void 0 || (_data = res.data) === null || _data === void 0 ? void 0 : _data.list) || (res === null || res === void 0 ? void 0 : res.list) || [];
211
+ list.sort(function (a, b) {
212
+ var _ref3, _a$sort2, _ref4, _b$sort2;
213
+ return Number((_ref3 = (_a$sort2 = a.sort) !== null && _a$sort2 !== void 0 ? _a$sort2 : a.priority) !== null && _ref3 !== void 0 ? _ref3 : 0) - Number((_ref4 = (_b$sort2 = b.sort) !== null && _b$sort2 !== void 0 ? _b$sort2 : b.priority) !== null && _ref4 !== void 0 ? _ref4 : 0);
214
+ });
215
+ this.store.quotationList = list;
216
+ _context4.next = 14;
217
+ return this.core.effects.emit(QuotationHooks.onQuotationLoaded, this.store.quotationList);
218
+ case 14:
219
+ case "end":
220
+ return _context4.stop();
221
+ }
222
+ }, _callee4, this);
223
+ }));
224
+ function loadQuotations(_x4) {
225
+ return _loadQuotations.apply(this, arguments);
226
+ }
227
+ return loadQuotations;
228
+ }()
229
+ }, {
230
+ key: "setScheduleResolver",
231
+ value: function setScheduleResolver(resolver) {
232
+ this.scheduleResolver = resolver;
233
+ }
234
+ }, {
235
+ key: "getPriceForProduct",
236
+ value: function getPriceForProduct(params) {
237
+ var _this$getQuotationMat, _this$getQuotationMat2;
238
+ return (_this$getQuotationMat = (_this$getQuotationMat2 = this.getQuotationMatchForProduct(params)) === null || _this$getQuotationMat2 === void 0 ? void 0 : _this$getQuotationMat2.price) !== null && _this$getQuotationMat !== void 0 ? _this$getQuotationMat : null;
239
+ }
240
+ }, {
241
+ key: "getQuotationMatchForProduct",
242
+ value: function getQuotationMatchForProduct(params) {
243
+ var productId = params.productId,
244
+ variantId = params.variantId,
245
+ datetime = params.datetime,
246
+ channel = params.channel,
247
+ customer_id = params.customer_id;
248
+ for (var _i = 0, _arr = this.store.quotationList; _i < _arr.length; _i++) {
249
+ var _ref5, _match$value;
250
+ var quotation = _arr[_i];
251
+ if (!this.isQuotationVisibleForChannel(quotation, channel)) continue;
252
+ if (!this.isQuotationVisibleForCustomer(quotation, customer_id)) continue;
253
+ if (!this.isQuotationActiveAt(quotation, datetime)) continue;
254
+ var match = this.findProductData(quotation, productId, variantId);
255
+ if (!match) continue;
256
+ var value = (_ref5 = (_match$value = match.value) !== null && _match$value !== void 0 ? _match$value : match.final_price) !== null && _ref5 !== void 0 ? _ref5 : match.discount_value;
257
+ if (Number(value) === 0) continue;
258
+ if (value === undefined || value === null || value === '') continue;
259
+ return {
260
+ price: String(value),
261
+ quotationShelfId: Number(quotation.id) || 0
262
+ };
263
+ }
264
+ return null;
265
+ }
266
+ }, {
267
+ key: "getQuotationShelfId",
268
+ value: function getQuotationShelfId(params) {
269
+ var _this$getQuotationMat3, _this$getQuotationMat4;
270
+ return (_this$getQuotationMat3 = (_this$getQuotationMat4 = this.getQuotationMatchForProduct(params)) === null || _this$getQuotationMat4 === void 0 ? void 0 : _this$getQuotationMat4.quotationShelfId) !== null && _this$getQuotationMat3 !== void 0 ? _this$getQuotationMat3 : 0;
271
+ }
272
+ }, {
273
+ key: "getQuotationCustomerScopeInfo",
274
+ value: function getQuotationCustomerScopeInfo() {
275
+ var _this2 = this;
276
+ var customerById = new Map();
277
+ var quotationScopes = this.store.quotationList.filter(function (quotation) {
278
+ return Array.isArray(quotation === null || quotation === void 0 ? void 0 : quotation.customer) && quotation.customer.length > 0;
279
+ }).map(function (quotation) {
280
+ var customerIds = [];
281
+ var customers = [];
282
+ var localSeen = new Set();
283
+ (quotation.customer || []).forEach(function (customer) {
284
+ var customerId = _this2.normalizeCustomerId(customer === null || customer === void 0 ? void 0 : customer.id);
285
+ if (!customerId || localSeen.has(customerId)) return;
286
+ localSeen.add(customerId);
287
+ customerIds.push(customerId);
288
+ customers.push(customer);
289
+ if (!customerById.has(customerId)) customerById.set(customerId, customer);
290
+ });
291
+ return {
292
+ quotationId: Number(quotation.id),
293
+ quotationName: String(quotation.name || ''),
294
+ customerIds: customerIds,
295
+ customers: customers
296
+ };
297
+ });
298
+ var result = {
299
+ quotationCount: this.store.quotationList.length,
300
+ hasCustomerScopedQuotations: quotationScopes.length > 0,
301
+ allQuotationsCustomerScoped: this.store.quotationList.length > 0 && quotationScopes.length === this.store.quotationList.length,
302
+ customerIds: Array.from(customerById.keys()),
303
+ customers: Array.from(customerById.values()),
304
+ quotationScopes: quotationScopes
305
+ };
306
+ return result;
307
+ }
173
308
  /**
174
309
  * 清空缓存
175
310
  */
176
311
  }, {
177
312
  key: "clear",
178
313
  value: (function () {
179
- var _clear = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
180
- return _regeneratorRuntime().wrap(function _callee4$(_context4) {
181
- while (1) switch (_context4.prev = _context4.next) {
314
+ var _clear = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
315
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
316
+ while (1) switch (_context5.prev = _context5.next) {
182
317
  case 0:
183
318
  this.store.quotationList = [];
184
319
 
185
320
  // 同时清空 IndexDB 中的数据
186
321
  if (!this.dbManager) {
187
- _context4.next = 11;
322
+ _context5.next = 11;
188
323
  break;
189
324
  }
190
- _context4.prev = 2;
191
- _context4.next = 5;
325
+ _context5.prev = 2;
326
+ _context5.next = 5;
192
327
  return this.dbManager.clear(INDEXDB_STORE_NAME);
193
328
  case 5:
194
329
  console.log('[Quotation] IndexDB 缓存已清空');
195
- _context4.next = 11;
330
+ _context5.next = 11;
196
331
  break;
197
332
  case 8:
198
- _context4.prev = 8;
199
- _context4.t0 = _context4["catch"](2);
200
- console.error('[Quotation] 清空 IndexDB 缓存失败:', _context4.t0);
333
+ _context5.prev = 8;
334
+ _context5.t0 = _context5["catch"](2);
335
+ console.error('[Quotation] 清空 IndexDB 缓存失败:', _context5.t0);
201
336
  case 11:
202
337
  console.log('[Quotation] 缓存已清空');
203
338
  case 12:
204
339
  case "end":
205
- return _context4.stop();
340
+ return _context5.stop();
206
341
  }
207
- }, _callee4, this, [[2, 8]]);
342
+ }, _callee5, this, [[2, 8]]);
208
343
  }));
209
344
  function clear() {
210
345
  return _clear.apply(this, arguments);
211
346
  }
212
347
  return clear;
213
- }()
348
+ }())
349
+ }, {
350
+ key: "normalizeCustomerId",
351
+ value: function normalizeCustomerId(customerId) {
352
+ if (customerId === undefined || customerId === null || customerId === '') return null;
353
+ return String(customerId);
354
+ }
355
+ }, {
356
+ key: "hasValidCustomerId",
357
+ value: function hasValidCustomerId(customerId) {
358
+ if (customerId === undefined || customerId === null || customerId === '') return false;
359
+ return Number(customerId) > 0;
360
+ }
361
+ }, {
362
+ key: "isQuotationVisibleForCustomer",
363
+ value: function isQuotationVisibleForCustomer(quotation, customerId) {
364
+ var customers = quotation.customer || [];
365
+ if (!Array.isArray(customers) || customers.length === 0) return true;
366
+ if (!this.hasValidCustomerId(customerId)) return false;
367
+ return customers.some(function (customer) {
368
+ return String(customer.id) === String(customerId);
369
+ });
370
+ }
371
+ }, {
372
+ key: "isQuotationVisibleForChannel",
373
+ value: function isQuotationVisibleForChannel(quotation, channel) {
374
+ if (!channel) return true;
375
+ var normalizedChannel = channel === 'online_store' ? 'online-store' : channel;
376
+ var channels = quotation.channel;
377
+ if (!Array.isArray(channels) || channels.length === 0) return true;
378
+ return channels.some(function (item) {
379
+ return String(item) === normalizedChannel;
380
+ });
381
+ }
382
+ }, {
383
+ key: "isQuotationActiveAt",
384
+ value: function isQuotationActiveAt(quotation, datetime) {
385
+ var _this3 = this;
386
+ var quotationSchedules = Array.isArray(quotation.schedule) ? quotation.schedule : [];
387
+ var scheduleIds = Array.isArray(quotation.schedule_ids) ? quotation.schedule_ids : [];
388
+ if (!quotationSchedules.length && !scheduleIds.length) return false;
389
+ var scheduleItems = [];
390
+ quotationSchedules.forEach(function (schedule) {
391
+ var _this3$scheduleResolv;
392
+ var full = (_this3$scheduleResolv = _this3.scheduleResolver) === null || _this3$scheduleResolv === void 0 ? void 0 : _this3$scheduleResolv.call(_this3, schedule.id);
393
+ if (full) {
394
+ scheduleItems.push(full);
395
+ return;
396
+ }
397
+ if (_this3.scheduleResolver) return;
398
+ scheduleItems.push(_objectSpread(_objectSpread({}, schedule), {}, {
399
+ repeat_type: schedule.repeat_type || 'none',
400
+ repeat_rule: schedule.repeat_rule || null,
401
+ time_slot: schedule.time_slot || []
402
+ }));
403
+ });
404
+ scheduleIds.forEach(function (id) {
405
+ var _this3$scheduleResolv2;
406
+ var full = (_this3$scheduleResolv2 = _this3.scheduleResolver) === null || _this3$scheduleResolv2 === void 0 ? void 0 : _this3$scheduleResolv2.call(_this3, id);
407
+ if (full) scheduleItems.push(full);
408
+ });
409
+ if (!scheduleItems.length) return false;
410
+ return getDateIsInSchedule(datetime, scheduleItems);
411
+ }
412
+ }, {
413
+ key: "findProductData",
414
+ value: function findProductData(quotation, productId, variantId) {
415
+ var productData = Array.isArray(quotation.product_data) ? quotation.product_data : Array.isArray(quotation.product_prices) ? quotation.product_prices : [];
416
+ if (variantId && variantId !== 0) {
417
+ var variantMatch = productData.find(function (item) {
418
+ return Number(item.product_id) === productId && Number(item.variant_id || 0) === variantId;
419
+ });
420
+ if (variantMatch) return variantMatch;
421
+ }
422
+ return productData.find(function (item) {
423
+ return Number(item.product_id) === productId && Number(item.variant_id || 0) === 0;
424
+ });
425
+ }
426
+
214
427
  /**
215
428
  * 从 IndexDB 加载报价单数据
216
429
  * @private
217
430
  */
218
- )
219
431
  }, {
220
432
  key: "loadQuotationFromIndexDB",
221
433
  value: (function () {
222
- var _loadQuotationFromIndexDB = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
434
+ var _loadQuotationFromIndexDB = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
223
435
  var quotationList;
224
- return _regeneratorRuntime().wrap(function _callee5$(_context5) {
225
- while (1) switch (_context5.prev = _context5.next) {
436
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
437
+ while (1) switch (_context6.prev = _context6.next) {
226
438
  case 0:
227
439
  if (this.dbManager) {
228
- _context5.next = 2;
440
+ _context6.next = 2;
229
441
  break;
230
442
  }
231
- return _context5.abrupt("return", []);
443
+ return _context6.abrupt("return", []);
232
444
  case 2:
233
- _context5.prev = 2;
234
- _context5.next = 5;
445
+ _context6.prev = 2;
446
+ _context6.next = 5;
235
447
  return this.dbManager.getAll(INDEXDB_STORE_NAME);
236
448
  case 5:
237
- quotationList = _context5.sent;
238
- return _context5.abrupt("return", quotationList || []);
449
+ quotationList = _context6.sent;
450
+ return _context6.abrupt("return", quotationList || []);
239
451
  case 9:
240
- _context5.prev = 9;
241
- _context5.t0 = _context5["catch"](2);
242
- console.error('[Quotation] 从 IndexDB 读取数据失败:', _context5.t0);
243
- return _context5.abrupt("return", []);
452
+ _context6.prev = 9;
453
+ _context6.t0 = _context6["catch"](2);
454
+ console.error('[Quotation] 从 IndexDB 读取数据失败:', _context6.t0);
455
+ return _context6.abrupt("return", []);
244
456
  case 13:
245
457
  case "end":
246
- return _context5.stop();
458
+ return _context6.stop();
247
459
  }
248
- }, _callee5, this, [[2, 9]]);
460
+ }, _callee6, this, [[2, 9]]);
249
461
  }));
250
462
  function loadQuotationFromIndexDB() {
251
463
  return _loadQuotationFromIndexDB.apply(this, arguments);
@@ -260,43 +472,43 @@ export var QuotationModule = /*#__PURE__*/function (_BaseModule) {
260
472
  }, {
261
473
  key: "saveQuotationToIndexDB",
262
474
  value: (function () {
263
- var _saveQuotationToIndexDB = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(quotationList) {
264
- var _this2 = this;
475
+ var _saveQuotationToIndexDB = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(quotationList) {
476
+ var _this4 = this;
265
477
  var savePromises;
266
- return _regeneratorRuntime().wrap(function _callee6$(_context6) {
267
- while (1) switch (_context6.prev = _context6.next) {
478
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
479
+ while (1) switch (_context7.prev = _context7.next) {
268
480
  case 0:
269
481
  if (this.dbManager) {
270
- _context6.next = 2;
482
+ _context7.next = 2;
271
483
  break;
272
484
  }
273
- return _context6.abrupt("return");
485
+ return _context7.abrupt("return");
274
486
  case 2:
275
- _context6.prev = 2;
276
- _context6.next = 5;
487
+ _context7.prev = 2;
488
+ _context7.next = 5;
277
489
  return this.dbManager.clear(INDEXDB_STORE_NAME);
278
490
  case 5:
279
491
  // 逐个保存报价单(每个报价单是独立的记录)
280
492
  savePromises = quotationList.map(function (quotation) {
281
- return _this2.dbManager.add(INDEXDB_STORE_NAME, quotation);
493
+ return _this4.dbManager.add(INDEXDB_STORE_NAME, quotation);
282
494
  });
283
- _context6.next = 8;
495
+ _context7.next = 8;
284
496
  return Promise.all(savePromises);
285
497
  case 8:
286
498
  console.log("[Quotation] \u5DF2\u5C06 ".concat(quotationList.length, " \u6761\u62A5\u4EF7\u5355\u6570\u636E\u4FDD\u5B58\u5230 IndexDB"));
287
- _context6.next = 14;
499
+ _context7.next = 14;
288
500
  break;
289
501
  case 11:
290
- _context6.prev = 11;
291
- _context6.t0 = _context6["catch"](2);
292
- console.error('[Quotation] 保存数据到 IndexDB 失败:', _context6.t0);
502
+ _context7.prev = 11;
503
+ _context7.t0 = _context7["catch"](2);
504
+ console.error('[Quotation] 保存数据到 IndexDB 失败:', _context7.t0);
293
505
  case 14:
294
506
  case "end":
295
- return _context6.stop();
507
+ return _context7.stop();
296
508
  }
297
- }, _callee6, this, [[2, 11]]);
509
+ }, _callee7, this, [[2, 11]]);
298
510
  }));
299
- function saveQuotationToIndexDB(_x4) {
511
+ function saveQuotationToIndexDB(_x5) {
300
512
  return _saveQuotationToIndexDB.apply(this, arguments);
301
513
  }
302
514
  return saveQuotationToIndexDB;
@@ -309,53 +521,53 @@ export var QuotationModule = /*#__PURE__*/function (_BaseModule) {
309
521
  }, {
310
522
  key: "preload",
311
523
  value: (function () {
312
- var _preload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
524
+ var _preload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
313
525
  var cachedData, quotationList;
314
- return _regeneratorRuntime().wrap(function _callee7$(_context7) {
315
- while (1) switch (_context7.prev = _context7.next) {
526
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
527
+ while (1) switch (_context8.prev = _context8.next) {
316
528
  case 0:
317
529
  console.log('[Quotation] 开始预加载数据...');
318
- _context7.prev = 1;
319
- _context7.next = 4;
530
+ _context8.prev = 1;
531
+ _context8.next = 4;
320
532
  return this.loadQuotationFromIndexDB();
321
533
  case 4:
322
- cachedData = _context7.sent;
534
+ cachedData = _context8.sent;
323
535
  if (!(cachedData && cachedData.length > 0)) {
324
- _context7.next = 10;
536
+ _context8.next = 10;
325
537
  break;
326
538
  }
327
539
  console.log("[Quotation] \u4ECE IndexDB \u52A0\u8F7D\u4E86 ".concat(cachedData.length, " \u6761\u62A5\u4EF7\u5355\u6570\u636E"));
328
540
  // 将缓存数据放入 store
329
541
  this.store.quotationList = cloneDeep(cachedData);
330
542
  this.core.effects.emit(QuotationHooks.onQuotationChanged, this.store.quotationList);
331
- return _context7.abrupt("return");
543
+ return _context8.abrupt("return");
332
544
  case 10:
333
545
  console.log('[Quotation] IndexDB 中没有缓存数据,从服务器加载...');
334
- _context7.next = 16;
546
+ _context8.next = 16;
335
547
  break;
336
548
  case 13:
337
- _context7.prev = 13;
338
- _context7.t0 = _context7["catch"](1);
339
- console.warn('[Quotation] 从 IndexDB 加载数据失败:', _context7.t0);
549
+ _context8.prev = 13;
550
+ _context8.t0 = _context8["catch"](1);
551
+ console.warn('[Quotation] 从 IndexDB 加载数据失败:', _context8.t0);
340
552
  case 16:
341
- _context7.next = 18;
553
+ _context8.next = 18;
342
554
  return this.loadQuotationList();
343
555
  case 18:
344
- quotationList = _context7.sent;
556
+ quotationList = _context8.sent;
345
557
  if (!(quotationList && quotationList.length > 0)) {
346
- _context7.next = 24;
558
+ _context8.next = 24;
347
559
  break;
348
560
  }
349
- _context7.next = 22;
561
+ _context8.next = 22;
350
562
  return this.saveQuotationToIndexDB(quotationList);
351
563
  case 22:
352
564
  this.store.quotationList = cloneDeep(quotationList);
353
565
  this.core.effects.emit(QuotationHooks.onQuotationChanged, this.store.quotationList);
354
566
  case 24:
355
567
  case "end":
356
- return _context7.stop();
568
+ return _context8.stop();
357
569
  }
358
- }, _callee7, this, [[1, 13]]);
570
+ }, _callee8, this, [[1, 13]]);
359
571
  }));
360
572
  function preload() {
361
573
  return _preload.apply(this, arguments);
@@ -12,6 +12,7 @@ export declare class ScheduleModuleEx extends BaseModule implements Module, Sche
12
12
  private store;
13
13
  private dbManager;
14
14
  private logger;
15
+ private hasLoadedScheduleList;
15
16
  constructor(name?: string, version?: string);
16
17
  /**
17
18
  * 记录信息日志
@@ -41,6 +42,7 @@ export declare class ScheduleModuleEx extends BaseModule implements Module, Sche
41
42
  * 获取所有日程列表
42
43
  */
43
44
  getScheduleList(): ScheduleItem[];
45
+ isScheduleListLoaded(): boolean;
44
46
  /**
45
47
  * 根据 schedule IDs 获取日程数据
46
48
  * 使用 Map 快速查询,时间复杂度 O(m),m 为 ids 数量
@@ -43,8 +43,6 @@ var SCHEDULE_STORE_NAME = 'schedule';
43
43
  export var ScheduleModuleEx = /*#__PURE__*/function (_BaseModule) {
44
44
  _inherits(ScheduleModuleEx, _BaseModule);
45
45
  var _super = _createSuper(ScheduleModuleEx);
46
- // LoggerManager 实例
47
-
48
46
  function ScheduleModuleEx(name, version) {
49
47
  var _this;
50
48
  _classCallCheck(this, ScheduleModuleEx);
@@ -56,6 +54,8 @@ export var ScheduleModuleEx = /*#__PURE__*/function (_BaseModule) {
56
54
  _defineProperty(_assertThisInitialized(_this), "dbManager", void 0);
57
55
  // SQLiteAdapter 实例
58
56
  _defineProperty(_assertThisInitialized(_this), "logger", void 0);
57
+ // LoggerManager 实例
58
+ _defineProperty(_assertThisInitialized(_this), "hasLoadedScheduleList", false);
59
59
  return _this;
60
60
  }
61
61
 
@@ -144,9 +144,11 @@ export var ScheduleModuleEx = /*#__PURE__*/function (_BaseModule) {
144
144
  this.store.scheduleList = options.initialState.scheduleList;
145
145
  // 同步更新 Map 缓存
146
146
  this.syncScheduleMap();
147
+ this.hasLoadedScheduleList = Array.isArray(options.initialState.scheduleList);
147
148
  } else {
148
149
  this.store.scheduleList = [];
149
150
  this.store.map = new Map();
151
+ this.hasLoadedScheduleList = false;
150
152
  }
151
153
 
152
154
  // 获取并存储 SQLite 和 logger
@@ -237,6 +239,7 @@ export var ScheduleModuleEx = /*#__PURE__*/function (_BaseModule) {
237
239
  key: "setScheduleList",
238
240
  value: function setScheduleList(list) {
239
241
  this.store.scheduleList = list;
242
+ this.hasLoadedScheduleList = true;
240
243
  // 同步更新 Map 缓存
241
244
  this.syncScheduleMap();
242
245
  }
@@ -249,6 +252,11 @@ export var ScheduleModuleEx = /*#__PURE__*/function (_BaseModule) {
249
252
  value: function getScheduleList() {
250
253
  return this.store.scheduleList;
251
254
  }
255
+ }, {
256
+ key: "isScheduleListLoaded",
257
+ value: function isScheduleListLoaded() {
258
+ return this.hasLoadedScheduleList;
259
+ }
252
260
 
253
261
  /**
254
262
  * 根据 schedule IDs 获取日程数据
@@ -1,6 +1,6 @@
1
1
  import { Module, ModuleOptions, PisellCore } from '../../types';
2
2
  import { BaseModule } from '../../modules/BaseModule';
3
- import { BaseSalesOrderProduct, BaseSalesOrderProductIdentity, BaseSalesPaymentStatus, BaseSalesUpdateOrderProductQuantityParams, BaseSalesCalculateProductBookingPriceParams, BaseSalesProductBookingPriceResult, BaseSalesScanCodeResult } from './types';
3
+ import { BaseSalesOrderProduct, BaseSalesOrderProductIdentity, BaseSalesPaymentStatus, BaseSalesUpdateOrderProductQuantityParams, BaseSalesCalculateProductBookingPriceParams, BaseSalesPriceRecalculationContextChange, BaseSalesProductBookingPriceResult, BaseSalesQuotationCustomerScopeInfo, BaseSalesScanCodeResult } from './types';
4
4
  import { OrderModule } from '../../modules/Order';
5
5
  import type { AddProductBookingInput, LoadSalesDetailParams, OrderPaymentData, OrderPaymentSource, SendCustomerPayLinkParams, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, UpdateTempOrderCustomerInput, UpdateOrderBookingParams, UpdateOrderProductParams, OrderTempOrder, OrderSummary, OrderPromotionEvaluator, OrderGiftSelectResolver, OrderUnfulfilledPromotion, OrderLastGiftActions } from '../../modules/Order/types';
6
6
  import type { SubmitPayloadEnhancer } from '../../modules/Order/utils';
@@ -44,6 +44,7 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
44
44
  protected currentSalesDetail: ISalesDetail | null;
45
45
  protected discountConfigCacheKey: string | null;
46
46
  protected hasManualDiscountSelection: boolean;
47
+ private readonly reusedSharedSubModuleNames;
47
48
  private paymentMethodsCache;
48
49
  constructor(name?: string, version?: string);
49
50
  /**
@@ -51,6 +52,8 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
51
52
  * 默认包含通用销售模块:products / order / salesSummary / schedule / payment / quotation。
52
53
  */
53
54
  protected getRegisteredModuleNames(): readonly string[];
55
+ private getReusableSharedSubModule;
56
+ private isScheduleListLoaded;
54
57
  /**
55
58
  * 记录信息日志
56
59
  */
@@ -66,10 +69,12 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
66
69
  private hydrateOrderPaymentNames;
67
70
  get payment(): PaymentModule | undefined;
68
71
  private getCurrentOrderCustomerId;
72
+ private normalizePriceContextCustomerId;
69
73
  private applyQuotationScheduleResolver;
70
74
  private loadQuotationForPriceQuery;
71
75
  private getPriceQueryProductId;
72
76
  private getPriceQuerySchedule;
77
+ private loadProductsForPriceQuery;
73
78
  private loadProductForPriceQuery;
74
79
  private getAuthoritativeBundleItems;
75
80
  private findAuthoritativeBundleItem;
@@ -268,8 +273,12 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
268
273
  }): Promise<T>;
269
274
  transformBaseProductToOrderProduct(params: TransformBaseProductToOrderProductParams): import("./utils/transformBaseProductToOrderProduct").BaseProductOrderProductInput | null;
270
275
  calculateProductBookingPrice(params: BaseSalesCalculateProductBookingPriceParams): Promise<BaseSalesProductBookingPriceResult>;
276
+ getQuotationCustomerScopeInfo(): BaseSalesQuotationCustomerScopeInfo;
277
+ shouldRecalculateProductBookingPricesForContextChange(params: BaseSalesPriceRecalculationContextChange): boolean;
278
+ calculateProductBookingPrices(paramsList: BaseSalesCalculateProductBookingPriceParams[]): Promise<BaseSalesProductBookingPriceResult[]>;
271
279
  addProductToOrder(product: Partial<BaseSalesOrderProduct> & BaseSalesOrderProductIdentity, booking?: AddProductBookingInput): Promise<import("../../modules/Order/types").OrderProduct[]>;
272
280
  updateOrderProduct(params: UpdateOrderProductParams): Promise<import("../../modules/Order/types").OrderProduct[]>;
281
+ updateOrderProducts(paramsList: UpdateOrderProductParams[]): Promise<import("../../modules/Order/types").OrderProduct[]>;
273
282
  updateOrderProductQuantity(params: BaseSalesUpdateOrderProductQuantityParams): Promise<import("../../modules/Order/types").OrderProduct[]>;
274
283
  updateOrderBooking(params: UpdateOrderBookingParams): any[];
275
284
  /**