@things-factory/sales-base 4.3.516 → 4.3.520

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.
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./ecommerce-controller"), exports);
18
18
  __exportStar(require("./sellercraft-controller"), exports);
19
19
  __exportStar(require("./powrup-controller"), exports);
20
+ __exportStar(require("./webspert-controller"), exports);
20
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/controllers/ecommerce/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAsC;AACtC,2DAAwC;AACxC,sDAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/controllers/ecommerce/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAsC;AACtC,2DAAwC;AACxC,sDAAmC;AACnC,wDAAqC"}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebspertController = void 0;
4
+ const typeorm_1 = require("typeorm");
5
+ const env_1 = require("@things-factory/env");
6
+ const warehouse_base_1 = require("@things-factory/warehouse-base");
7
+ const constants_1 = require("../../constants");
8
+ const service_1 = require("../../service");
9
+ const utils_1 = require("@things-factory/utils");
10
+ const utils_2 = require("../../utils");
11
+ class WebspertController {
12
+ static async packOrder(releaseGood, domain, user) {
13
+ await (0, typeorm_1.getConnection)().transaction(async (trx) => {
14
+ var _a;
15
+ releaseGood = await trx.getRepository(service_1.ReleaseGood).findOne({ where: { id: releaseGood.id, domain } });
16
+ // let releaseOrder = await trx.getRepository(ReleaseGood).findOne({ refNo: releaseGood.refNo, refNo2: releaseGood.refNo2, refNo3: releaseGood.refNo3, domain })
17
+ // // only recall if releaseGood exists and pack Order fail
18
+ if (!releaseGood && (releaseGood.packOrderFail == false))
19
+ return false;
20
+ try {
21
+ let results = await warehouse_base_1.WebspertController.sendRequestToAPI('order/set_order_status_to_packed', {
22
+ order_identifier: releaseGood.refNo
23
+ }, domain, user);
24
+ if (results.status != 200) {
25
+ throw new Error(results.statusText);
26
+ }
27
+ if (((_a = results === null || results === void 0 ? void 0 : results.data) === null || _a === void 0 ? void 0 : _a.code) === 200) {
28
+ await updatePackOrderStatus(trx, releaseGood);
29
+ return true;
30
+ }
31
+ }
32
+ catch (error) {
33
+ env_1.logger.error(`webspert-controller[packOrder]: ${error}`);
34
+ await updatePackOrderStatus(trx, releaseGood, true);
35
+ return false;
36
+ }
37
+ });
38
+ }
39
+ static async fetchPackageAndDocument(releaseGood, domain, user) {
40
+ await (0, typeorm_1.getConnection)().transaction(async (trx) => {
41
+ let roUpdateFields = null;
42
+ let releaseOrder = await trx.getRepository(service_1.ReleaseGood).findOne({
43
+ where: { id: releaseGood.id, domain },
44
+ relations: ['bizplace', 'domain', 'orderProducts', 'orderProducts.productDetail', 'orderProducts.productDetail.product']
45
+ });
46
+ if (releaseOrder) {
47
+ try {
48
+ // capture update fields
49
+ roUpdateFields = {
50
+ lastMarketPackCall: new Date()
51
+ };
52
+ let results = await warehouse_base_1.WebspertController.sendRequestToAPI('order/get_order_package', {
53
+ order_identifier: releaseOrder.refNo
54
+ }, domain, user);
55
+ if (results.status != 200) {
56
+ throw new Error(results.statusText);
57
+ }
58
+ roUpdateFields = await generatePackage(releaseOrder, results === null || results === void 0 ? void 0 : results.data.data.package, user, trx);
59
+ }
60
+ catch (error) {
61
+ roUpdateFields = {
62
+ packOrderFail: true
63
+ };
64
+ }
65
+ }
66
+ await updateRO(releaseGood.id, roUpdateFields, trx);
67
+ return await trx.getRepository(service_1.ReleaseGood).findOne({
68
+ where: { id: releaseGood.id, domain },
69
+ relations: ['bizplace', 'domain', 'orderProducts', 'orderProducts.productDetail']
70
+ });
71
+ });
72
+ }
73
+ static async initiateShipment(releaseGood, orderPackages, domain, user) {
74
+ if (orderPackages == null || orderPackages.length == 0) {
75
+ if (releaseGood) {
76
+ orderPackages = await (0, typeorm_1.getRepository)(service_1.OrderPackage).find({ where: { releaseGood } });
77
+ }
78
+ else {
79
+ console.error('webspert-controller[initiateShipment]: releaseGood is not found');
80
+ return false;
81
+ }
82
+ }
83
+ await orderPackages.forEach(async (orderPackage) => {
84
+ try {
85
+ let results = await warehouse_base_1.WebspertController.sendRequestToAPI('order/set_order_status_to_ready_ship', {
86
+ package_id: orderPackage.packageId
87
+ }, domain, user);
88
+ if (results.status != 200) {
89
+ throw new Error(results.statusText);
90
+ }
91
+ await (0, typeorm_1.getRepository)(service_1.OrderPackage).update({ id: orderPackage.id }, { marketRtsCallSuccess: new Date() });
92
+ }
93
+ catch (error) {
94
+ await (0, typeorm_1.getRepository)(service_1.OrderPackage)
95
+ .createQueryBuilder()
96
+ .update(service_1.OrderPackage)
97
+ .set({ marketRtsCallRetry: () => `coalesce("market_rts_call_retry", 0) + 1` })
98
+ .where('id = :id', { id: orderPackage.id })
99
+ .execute();
100
+ env_1.logger.error(`webspert-controller[initiateShipment]: ${error}`);
101
+ }
102
+ });
103
+ }
104
+ static async triggerOrderProcesses(releaseGood, domain, user, triggerRTS) {
105
+ try {
106
+ const waitTime = 200;
107
+ releaseGood = await (0, typeorm_1.getRepository)(service_1.ReleaseGood).findOne({ where: { id: releaseGood.id, domain } });
108
+ // // only recall if fail
109
+ if (releaseGood.packOrderFail == false || releaseGood.packOrderFail === null) {
110
+ await this.packOrder(releaseGood, domain, user);
111
+ await (0, utils_1.sleep)(waitTime);
112
+ }
113
+ await this.fetchPackageAndDocument(releaseGood, domain, user);
114
+ await (0, utils_1.sleep)(waitTime);
115
+ if (triggerRTS) {
116
+ await this.initiateShipment(releaseGood, null, domain, user);
117
+ }
118
+ return true;
119
+ }
120
+ catch (error) {
121
+ env_1.logger.error(error);
122
+ }
123
+ }
124
+ }
125
+ exports.WebspertController = WebspertController;
126
+ async function updateRO(releaseGoodId, roUpdateFields, trxMgr) {
127
+ if (roUpdateFields) {
128
+ await trxMgr.getRepository(service_1.ReleaseGood).update({ id: releaseGoodId }, roUpdateFields);
129
+ }
130
+ }
131
+ async function generatePackage(releaseGood, packages, user, trxMgr) {
132
+ if (packages.length > 0) {
133
+ packages = await Promise.all(packages.map(async (pkg) => {
134
+ const [items, awbUrl, packageId, trackingNo, transporter] = [pkg.products, pkg.awb_link, pkg.package_id, pkg.tracking_number, pkg.transporter];
135
+ if (items.length < 1) {
136
+ throw new Error('No items found in package');
137
+ }
138
+ try {
139
+ let orderPackage = await trxMgr.getRepository(service_1.OrderPackage).findOne({
140
+ where: { packageId: packageId, releaseGood, domain: releaseGood.domain, bizplace: releaseGood.bizplace }
141
+ });
142
+ if (!orderPackage) {
143
+ orderPackage = await trxMgr.getRepository(service_1.OrderPackage).save({
144
+ name: utils_2.OrderNoGenerator.orderPackage(),
145
+ packageId: packageId,
146
+ airwayBill: awbUrl,
147
+ transporter,
148
+ trackingNo,
149
+ status: constants_1.ORDER_STATUS.PROCESSING,
150
+ releaseGood,
151
+ domain: releaseGood.domain,
152
+ bizplace: releaseGood.bizplace,
153
+ creator: releaseGood.creator,
154
+ updater: releaseGood.updater
155
+ });
156
+ }
157
+ else {
158
+ orderPackage = await trxMgr.getRepository(service_1.OrderPackage).save(Object.assign(Object.assign({}, orderPackage), { packageId: packageId, airwayBill: awbUrl, transporter,
159
+ trackingNo, updater: user }));
160
+ }
161
+ let orderPackageItems = await trxMgr.getRepository(service_1.OrderPackageItem).find({
162
+ where: { orderPackage },
163
+ relations: ['productDetail', 'productDetail.product']
164
+ });
165
+ orderPackageItems = items.map(itm => {
166
+ const { sku, qty } = itm;
167
+ if (!sku) {
168
+ throw new Error(`universalIdentifier missing`);
169
+ }
170
+ const matchedOrderPackageItem = orderPackageItems.find(op => op.productDetail.product.sku == sku && op.releaseQty == qty);
171
+ if (matchedOrderPackageItem) {
172
+ return matchedOrderPackageItem;
173
+ }
174
+ else {
175
+ const matchedOrderProduct = releaseGood.orderProducts.find(op => op.productDetail.product.sku == sku);
176
+ return {
177
+ name: utils_2.OrderNoGenerator.orderPackageItem(),
178
+ orderProduct: matchedOrderProduct,
179
+ status: constants_1.ORDER_STATUS.PROCESSING,
180
+ releaseQty: qty,
181
+ orderPackage: orderPackage,
182
+ domain: releaseGood.domain,
183
+ bizplace: releaseGood.bizplace,
184
+ creator: releaseGood.creator,
185
+ updater: releaseGood.updater,
186
+ productDetail: matchedOrderProduct === null || matchedOrderProduct === void 0 ? void 0 : matchedOrderProduct.productDetail
187
+ };
188
+ }
189
+ });
190
+ await trxMgr.getRepository(service_1.OrderPackageItem).save(orderPackageItems);
191
+ return orderPackage;
192
+ }
193
+ catch (error) {
194
+ console.error(error);
195
+ }
196
+ }));
197
+ if (packages.length == packages.filter(pkg => pkg.packageId).length) {
198
+ return {
199
+ packageId: packages[0].packageId,
200
+ marketPackCallSuccess: new Date(),
201
+ lastMarketPackCall: new Date(),
202
+ updatedAt: new Date()
203
+ };
204
+ }
205
+ else {
206
+ return {
207
+ lastMarketPackCall: new Date(),
208
+ updatedAt: new Date()
209
+ };
210
+ }
211
+ }
212
+ }
213
+ async function updatePackOrderStatus(trx, releaseOrder, status = false) {
214
+ await trx.getRepository(service_1.ReleaseGood).update({ id: releaseOrder.id }, { lastMarketPackCall: new Date(), packOrderFail: status });
215
+ return true;
216
+ }
217
+ //# sourceMappingURL=webspert-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webspert-controller.js","sourceRoot":"","sources":["../../../server/controllers/ecommerce/webspert-controller.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ __exportStar(require("./constants"), exports);
22
22
  __exportStar(require("./errors"), exports);
23
23
  __exportStar(require("./controllers/ecommerce/sellercraft-controller"), exports);
24
24
  __exportStar(require("./controllers/ecommerce/powrup-controller"), exports);
25
+ __exportStar(require("./controllers/ecommerce"), exports);
25
26
  var release_good_logs_mutation_1 = require("./service/release-good-logs/release-good-logs-mutation");
26
27
  Object.defineProperty(exports, "createReleaseGoodLog", { enumerable: true, get: function () { return release_good_logs_mutation_1.createReleaseGoodLog; } });
27
28
  var draft_release_good_create_1 = require("./service/draft-release-good/draft-release-good-create");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,+CAA4B;AAC5B,0CAAuB;AACvB,8CAA2B;AAC3B,2CAAwB;AACxB,iFAA8D;AAC9D,4EAAyD;AAEzD,qGAA6F;AAApF,kIAAA,oBAAoB,OAAA;AAC7B,oGAA+F;AAAtF,mIAAA,sBAAsB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,+CAA4B;AAC5B,0CAAuB;AACvB,8CAA2B;AAC3B,2CAAwB;AACxB,iFAA8D;AAC9D,4EAAyD;AACzD,0DAAuC;AAGvC,qGAA6F;AAApF,kIAAA,oBAAoB,OAAA;AAC7B,oGAA+F;AAAtF,mIAAA,sBAAsB,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/sales-base",
3
- "version": "4.3.516",
3
+ "version": "4.3.520",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -23,20 +23,21 @@
23
23
  "migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
24
24
  },
25
25
  "dependencies": {
26
- "@things-factory/attachment-base": "^4.3.452",
27
- "@things-factory/auth-base": "^4.3.452",
28
- "@things-factory/biz-base": "^4.3.452",
29
- "@things-factory/code-base": "^4.3.452",
30
- "@things-factory/integration-accounting": "^4.3.512",
31
- "@things-factory/integration-base": "^4.3.512",
32
- "@things-factory/integration-powrup": "^4.3.512",
33
- "@things-factory/integration-sftp": "^4.3.512",
34
- "@things-factory/notification": "^4.3.452",
35
- "@things-factory/product-base": "^4.3.495",
36
- "@things-factory/setting-base": "^4.3.452",
26
+ "@things-factory/attachment-base": "^4.3.518",
27
+ "@things-factory/auth-base": "^4.3.518",
28
+ "@things-factory/biz-base": "^4.3.518",
29
+ "@things-factory/code-base": "^4.3.518",
30
+ "@things-factory/integration-accounting": "^4.3.518",
31
+ "@things-factory/integration-base": "^4.3.518",
32
+ "@things-factory/integration-powrup": "^4.3.518",
33
+ "@things-factory/integration-sftp": "^4.3.518",
34
+ "@things-factory/notification": "^4.3.518",
35
+ "@things-factory/product-base": "^4.3.518",
36
+ "@things-factory/setting-base": "^4.3.518",
37
37
  "@things-factory/shell": "^4.3.434",
38
- "@things-factory/transport-base": "^4.3.452",
39
- "@things-factory/warehouse-base": "^4.3.516"
38
+ "@things-factory/transport-base": "^4.3.518",
39
+ "@things-factory/warehouse-base": "^4.3.520",
40
+ "axios": "1.7.7"
40
41
  },
41
- "gitHead": "e978cd97325cd1fe187d81e566f393f5d94093ea"
42
+ "gitHead": "5b8fa6d6bef3ece5265eef8b11afb8942b74ca05"
42
43
  }
@@ -1,3 +1,4 @@
1
1
  export * from './ecommerce-controller'
2
2
  export * from './sellercraft-controller'
3
3
  export * from './powrup-controller'
4
+ export * from './webspert-controller'
@@ -0,0 +1,287 @@
1
+ import { EntityManager, getConnection, getRepository } from 'typeorm'
2
+
3
+ import { logger } from '@things-factory/env'
4
+ import { Domain, User } from '@things-factory/shell'
5
+ import { config } from '@things-factory/env'
6
+
7
+ import { WebspertController as BaseWebspertController } from '@things-factory/warehouse-base'
8
+
9
+ import { ORDER_STATUS } from '../../constants'
10
+ import { ReleaseGood, OrderProduct, OrderPackageItem, OrderPackage } from '../../service'
11
+
12
+ import { sleep } from '@things-factory/utils'
13
+ import { OrderNoGenerator } from '../../utils'
14
+
15
+ export class WebspertController {
16
+ public static async packOrder(
17
+ releaseGood: ReleaseGood,
18
+ domain: Domain,
19
+ user: User
20
+ ) {
21
+ await getConnection().transaction(async trx => {
22
+ releaseGood = await trx.getRepository(ReleaseGood).findOne({ where: { id: releaseGood.id, domain } })
23
+
24
+ // let releaseOrder = await trx.getRepository(ReleaseGood).findOne({ refNo: releaseGood.refNo, refNo2: releaseGood.refNo2, refNo3: releaseGood.refNo3, domain })
25
+
26
+ // // only recall if releaseGood exists and pack Order fail
27
+ if (!releaseGood && (releaseGood.packOrderFail == false)) return false
28
+
29
+ try {
30
+ let results = await BaseWebspertController.sendRequestToAPI(
31
+ 'order/set_order_status_to_packed',
32
+ {
33
+ order_identifier: releaseGood.refNo
34
+ },
35
+ domain,
36
+ user
37
+ )
38
+ if (results.status != 200) {
39
+ throw new Error(results.statusText)
40
+ }
41
+
42
+ if (results?.data?.code === 200) {
43
+ await updatePackOrderStatus(trx, releaseGood)
44
+ return true
45
+ }
46
+ } catch (error) {
47
+ logger.error(`webspert-controller[packOrder]: ${error}`)
48
+ await updatePackOrderStatus(trx, releaseGood, true)
49
+ return false
50
+ }
51
+ })
52
+ }
53
+
54
+ public static async fetchPackageAndDocument(
55
+ releaseGood: ReleaseGood,
56
+ domain: Domain,
57
+ user: User
58
+ ) {
59
+ await getConnection().transaction(async trx => {
60
+ let roUpdateFields: Partial<ReleaseGood> = null
61
+
62
+ let releaseOrder = await trx.getRepository(ReleaseGood).findOne({
63
+ where: { id: releaseGood.id, domain },
64
+ relations: ['bizplace', 'domain', 'orderProducts', 'orderProducts.productDetail', 'orderProducts.productDetail.product']
65
+ })
66
+
67
+ if (releaseOrder) {
68
+ try {
69
+ // capture update fields
70
+ roUpdateFields = {
71
+ lastMarketPackCall: new Date()
72
+ }
73
+
74
+ let results = await BaseWebspertController.sendRequestToAPI(
75
+ 'order/get_order_package',
76
+ {
77
+ order_identifier: releaseOrder.refNo
78
+ },
79
+ domain,
80
+ user
81
+ )
82
+ if (results.status != 200) {
83
+ throw new Error(results.statusText)
84
+ }
85
+
86
+ roUpdateFields = await generatePackage(releaseOrder, results?.data.data.package, user, trx)
87
+ } catch (error) {
88
+ roUpdateFields = {
89
+ packOrderFail: true
90
+ }
91
+ }
92
+ }
93
+
94
+ await updateRO(releaseGood.id, roUpdateFields, trx)
95
+ return await trx.getRepository(ReleaseGood).findOne({
96
+ where: { id: releaseGood.id, domain },
97
+ relations: ['bizplace', 'domain', 'orderProducts', 'orderProducts.productDetail']
98
+ })
99
+ })
100
+ }
101
+
102
+ public static async initiateShipment(
103
+ releaseGood: ReleaseGood,
104
+ orderPackages: OrderPackage[],
105
+ domain: Domain,
106
+ user: User,
107
+ ) {
108
+ if (orderPackages == null || orderPackages.length == 0) {
109
+ if (releaseGood) {
110
+ orderPackages = await getRepository(OrderPackage).find({ where: { releaseGood } })
111
+ }
112
+ else {
113
+ console.error('webspert-controller[initiateShipment]: releaseGood is not found')
114
+ return false
115
+ }
116
+ }
117
+
118
+ await orderPackages.forEach(async orderPackage => {
119
+ try {
120
+ let results: any = await BaseWebspertController.sendRequestToAPI(
121
+ 'order/set_order_status_to_ready_ship',
122
+ {
123
+ package_id: orderPackage.packageId
124
+ },
125
+ domain,
126
+ user
127
+ )
128
+ if (results.status != 200) {
129
+ throw new Error(results.statusText)
130
+ }
131
+
132
+ await getRepository(OrderPackage).update({ id: orderPackage.id }, { marketRtsCallSuccess: new Date() })
133
+ } catch (error) {
134
+ await getRepository(OrderPackage)
135
+ .createQueryBuilder()
136
+ .update(OrderPackage)
137
+ .set({ marketRtsCallRetry: () => `coalesce("market_rts_call_retry", 0) + 1` })
138
+ .where('id = :id', { id: orderPackage.id })
139
+ .execute()
140
+
141
+ logger.error(`webspert-controller[initiateShipment]: ${error}`)
142
+ }
143
+ })
144
+ }
145
+
146
+ public static async triggerOrderProcesses(
147
+ releaseGood: ReleaseGood,
148
+ domain: Domain,
149
+ user: User,
150
+ triggerRTS: false
151
+ ) {
152
+ try {
153
+ const waitTime = 200
154
+
155
+ releaseGood = await getRepository(ReleaseGood).findOne({ where: { id: releaseGood.id, domain } })
156
+ // // only recall if fail
157
+ if (releaseGood.packOrderFail == false || releaseGood.packOrderFail === null) {
158
+ await this.packOrder(releaseGood, domain, user)
159
+ await sleep(waitTime)
160
+ }
161
+
162
+ await this.fetchPackageAndDocument(releaseGood, domain, user)
163
+ await sleep(waitTime)
164
+
165
+ if (triggerRTS) {
166
+ await this.initiateShipment(releaseGood, null, domain, user)
167
+ }
168
+
169
+ return true
170
+
171
+ } catch (error) {
172
+ logger.error(error)
173
+ }
174
+ }
175
+ }
176
+
177
+ async function updateRO(releaseGoodId, roUpdateFields, trxMgr) {
178
+ if (roUpdateFields) {
179
+ await trxMgr.getRepository(ReleaseGood).update({ id: releaseGoodId }, roUpdateFields)
180
+ }
181
+ }
182
+
183
+ async function generatePackage(
184
+ releaseGood: ReleaseGood,
185
+ packages: any[],
186
+ user: User,
187
+ trxMgr: EntityManager
188
+ ) {
189
+ if (packages.length > 0) {
190
+ packages = await Promise.all(
191
+ packages.map(async pkg => {
192
+ const [items, awbUrl, packageId, trackingNo, transporter] = [pkg.products, pkg.awb_link, pkg.package_id, pkg.tracking_number, pkg.transporter]
193
+
194
+ if (items.length < 1) {
195
+ throw new Error('No items found in package')
196
+ }
197
+
198
+ try {
199
+ let orderPackage = await trxMgr.getRepository(OrderPackage).findOne({
200
+ where: { packageId: packageId, releaseGood, domain: releaseGood.domain, bizplace: releaseGood.bizplace }
201
+ })
202
+
203
+ if (!orderPackage) {
204
+ orderPackage = await trxMgr.getRepository(OrderPackage).save({
205
+ name: OrderNoGenerator.orderPackage(),
206
+ packageId: packageId,
207
+ airwayBill: awbUrl,
208
+ transporter,
209
+ trackingNo,
210
+ status: ORDER_STATUS.PROCESSING,
211
+ releaseGood,
212
+ domain: releaseGood.domain,
213
+ bizplace: releaseGood.bizplace,
214
+ creator: releaseGood.creator,
215
+ updater: releaseGood.updater
216
+ })
217
+ } else {
218
+ orderPackage = await trxMgr.getRepository(OrderPackage).save({
219
+ ...orderPackage,
220
+ packageId: packageId,
221
+ airwayBill: awbUrl,
222
+ transporter,
223
+ trackingNo,
224
+ updater: user
225
+ })
226
+ }
227
+
228
+ let orderPackageItems: OrderPackageItem[] = await trxMgr.getRepository(OrderPackageItem).find({
229
+ where: { orderPackage },
230
+ relations: ['productDetail', 'productDetail.product']
231
+ })
232
+
233
+ orderPackageItems = items.map(itm => {
234
+ const { sku, qty } = itm
235
+ if (!sku) {
236
+ throw new Error(`universalIdentifier missing`)
237
+ }
238
+ const matchedOrderPackageItem: OrderPackageItem = orderPackageItems.find(op => op.productDetail.product.sku == sku && op.releaseQty == qty)
239
+
240
+ if (matchedOrderPackageItem) {
241
+ return matchedOrderPackageItem
242
+ } else {
243
+ const matchedOrderProduct: OrderProduct = releaseGood.orderProducts.find(op => op.productDetail.product.sku == sku)
244
+ return {
245
+ name: OrderNoGenerator.orderPackageItem(),
246
+ orderProduct: matchedOrderProduct,
247
+ status: ORDER_STATUS.PROCESSING,
248
+ releaseQty: qty,
249
+ orderPackage: orderPackage,
250
+ domain: releaseGood.domain,
251
+ bizplace: releaseGood.bizplace,
252
+ creator: releaseGood.creator,
253
+ updater: releaseGood.updater,
254
+ productDetail: matchedOrderProduct?.productDetail
255
+ }
256
+ }
257
+ })
258
+
259
+ await trxMgr.getRepository(OrderPackageItem).save(orderPackageItems)
260
+
261
+ return orderPackage
262
+ } catch (error) {
263
+ console.error(error)
264
+ }
265
+ })
266
+ )
267
+
268
+ if (packages.length == packages.filter(pkg => pkg.packageId).length) {
269
+ return {
270
+ packageId: packages[0].packageId,
271
+ marketPackCallSuccess: new Date(),
272
+ lastMarketPackCall: new Date(),
273
+ updatedAt: new Date()
274
+ }
275
+ } else {
276
+ return {
277
+ lastMarketPackCall: new Date(),
278
+ updatedAt: new Date()
279
+ }
280
+ }
281
+ }
282
+ }
283
+
284
+ async function updatePackOrderStatus(trx, releaseOrder, status: Boolean = false) {
285
+ await trx.getRepository(ReleaseGood).update({ id: releaseOrder.id }, { lastMarketPackCall: new Date(), packOrderFail: status })
286
+ return true
287
+ }
package/server/index.ts CHANGED
@@ -5,6 +5,8 @@ export * from './constants'
5
5
  export * from './errors'
6
6
  export * from './controllers/ecommerce/sellercraft-controller'
7
7
  export * from './controllers/ecommerce/powrup-controller'
8
+ export * from './controllers/ecommerce'
9
+
8
10
 
9
11
  export { createReleaseGoodLog } from './service/release-good-logs/release-good-logs-mutation'
10
12
  export { DraftReleaseGoodCreate } from './service/draft-release-good/draft-release-good-create'