@things-factory/sales-base 5.0.0-alpha.24 → 5.0.0-alpha.27

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 (22) hide show
  1. package/dist-server/controllers/ecommerce/sellercraft-controller.js +10 -3
  2. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  3. package/dist-server/service/order-inventory/order-inventory-query.js +194 -11
  4. package/dist-server/service/order-inventory/order-inventory-query.js.map +1 -1
  5. package/dist-server/service/order-inventory/order-inventory-types.js +4 -0
  6. package/dist-server/service/order-inventory/order-inventory-types.js.map +1 -1
  7. package/dist-server/service/release-good/release-good-mutation.js +2 -2
  8. package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
  9. package/dist-server/service/release-good/release-good-query.js +10 -0
  10. package/dist-server/service/release-good/release-good-query.js.map +1 -1
  11. package/dist-server/service/release-good/release-good-types.js +32 -0
  12. package/dist-server/service/release-good/release-good-types.js.map +1 -1
  13. package/dist-server/service/release-good/release-good.js +20 -0
  14. package/dist-server/service/release-good/release-good.js.map +1 -1
  15. package/package.json +13 -13
  16. package/server/controllers/ecommerce/sellercraft-controller.ts +10 -3
  17. package/server/service/order-inventory/order-inventory-query.ts +234 -15
  18. package/server/service/order-inventory/order-inventory-types.ts +3 -0
  19. package/server/service/release-good/release-good-mutation.ts +5 -1
  20. package/server/service/release-good/release-good-query.ts +18 -6
  21. package/server/service/release-good/release-good-types.ts +24 -0
  22. package/server/service/release-good/release-good.ts +16 -0
@@ -1,5 +1,5 @@
1
1
  import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
- import { Brackets, getRepository, Like, SelectQueryBuilder } from 'typeorm'
2
+ import { Brackets, getRepository, Like, SelectQueryBuilder, In, Not, IsNull } from 'typeorm'
3
3
 
4
4
  import { User } from '@things-factory/auth-base'
5
5
  import { getPermittedBizplaceIds } from '@things-factory/biz-base'
@@ -11,6 +11,7 @@ import { ArrivalNotice } from '../arrival-notice/arrival-notice'
11
11
  import { OrderInventoryList } from '../order-inventory/order-inventory-types'
12
12
  import { ReleaseGood } from '../release-good/release-good'
13
13
  import { OrderInventory } from './order-inventory'
14
+ import { Location } from '@things-factory/warehouse-base'
14
15
 
15
16
  interface filterInterface {
16
17
  name: string
@@ -245,18 +246,18 @@ export class OrderInventoryQuery {
245
246
  @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,
246
247
  @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
247
248
  ): Promise<OrderInventoryList> {
248
- const { domain, user }: { domain: Domain; user: User } = context.state
249
249
  const { page, limit }: { page: number; limit: number } = pagination
250
250
 
251
251
  try {
252
252
  const productFilter = filters.find(x => x.name == 'productInfo')
253
253
  const roNoFilter = filters.find(x => x.name == 'roNo')
254
+ const refNoFilter = filters.find(x => x.name == 'refNo')
254
255
  const binLocationFilter = filters.find(x => x.name == 'binLocation')
255
256
  const lotIdFilter = filters.find(x => x.name == 'palletId')
256
257
  const cartonIdFilter = filters.find(x => x.name == 'cartonId')
257
258
 
258
259
  filters = filters.filter(
259
- filter => ['productInfo', 'roNo', 'binLocation', 'palletId', 'cartonId'].indexOf(filter.name) == -1
260
+ filter => ['productInfo', 'roNo', 'refNo', 'binLocation', 'palletId', 'cartonId'].indexOf(filter.name) == -1
260
261
  )
261
262
 
262
263
  const params = { filters, pagination }
@@ -305,6 +306,10 @@ export class OrderInventoryQuery {
305
306
  qb.andWhere('Lower(rg.name) LIKE :roNo', { roNo: roNoFilter.value.toLowerCase() })
306
307
  }
307
308
 
309
+ if (refNoFilter) {
310
+ qb.andWhere('Lower(rg.ref_no) LIKE :refNo', { refNo: refNoFilter.value.toLowerCase() })
311
+ }
312
+
308
313
  if (binLocationFilter) {
309
314
  qb.andWhere('Lower(bin_loc.name) LIKE :binLocation', { binLocation: binLocationFilter.value.toLowerCase() })
310
315
  }
@@ -322,10 +327,6 @@ export class OrderInventoryQuery {
322
327
  const order: string = sort.desc ? 'DESC' : 'ASC'
323
328
 
324
329
  switch (sort.name) {
325
- case 'releaseOrderNo':
326
- acc = { ...acc, ['rg.name']: order }
327
- break
328
-
329
330
  case 'productSku':
330
331
  acc = { ...acc, ['Product.sku']: order }
331
332
  break
@@ -341,14 +342,6 @@ export class OrderInventoryQuery {
341
342
  acc = { ...acc, ['bin_loc.name']: order }
342
343
  break
343
344
 
344
- case 'palletId':
345
- acc = { ...acc, ['inv.pallet_id']: order }
346
- break
347
-
348
- case 'cartonId':
349
- acc = { ...acc, ['inv.carton_id']: order }
350
- break
351
-
352
345
  default:
353
346
  acc = { ...acc, [`oi.${sort.name}`]: order }
354
347
  break
@@ -386,6 +379,7 @@ export class OrderInventoryQuery {
386
379
  releaseGood: {
387
380
  id: item.rg_id,
388
381
  name: item.rg_name,
382
+ refNo: item.rg_ref_no,
389
383
  description: item.rg_description
390
384
  },
391
385
  inventory: {
@@ -406,6 +400,231 @@ export class OrderInventoryQuery {
406
400
  }
407
401
  }
408
402
 
403
+ @Query(returns => OrderInventoryList)
404
+ async orderInventoriesOfMultipleReleaseOrders(
405
+ @Ctx() context: any,
406
+ @Arg('partnerId') partnerId: string,
407
+ @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],
408
+ @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
409
+ ): Promise<OrderInventoryList> {
410
+ try {
411
+ const { domain }: { domain: Domain } = context.state
412
+ const binNumberParam: any = filters.find((param: any) => param.name === 'binNumber')
413
+ let arrFilters = []
414
+
415
+ if (binNumberParam) {
416
+ let binLocation: Location = await getRepository(Location).findOne({
417
+ where: { domain, name: binNumberParam.value }
418
+ })
419
+
420
+ filters.splice(
421
+ filters.findIndex(item => item.name == 'binNumber'),
422
+ 1
423
+ )
424
+ arrFilters.push({ ...binNumberParam, name: 'binLocationId', value: binLocation.id })
425
+ }
426
+
427
+ const releaseGoodsList: ReleaseGood[] = await getRepository(ReleaseGood).query(
428
+ `select id from release_goods where domain_id = '${domain.id}' and bizplace_id = '${partnerId}' and route_id is not null and status = 'PICKING'`
429
+ )
430
+
431
+ if (releaseGoodsList && releaseGoodsList.length) {
432
+ arrFilters.push({
433
+ name: 'releaseGoodId',
434
+ operator: 'in',
435
+ value: releaseGoodsList.map((foundRG: ReleaseGood) => foundRG.id),
436
+ relation: false
437
+ })
438
+ } else {
439
+ arrFilters.push({
440
+ name: 'releaseGoodId',
441
+ operator: 'is_null',
442
+ relation: false
443
+ })
444
+ }
445
+
446
+ const params = { filters: arrFilters }
447
+ const qb: SelectQueryBuilder<OrderInventory> = getRepository(OrderInventory).createQueryBuilder('oi')
448
+ buildQuery(qb, params, context)
449
+
450
+ qb.select('oi')
451
+ qb.innerJoinAndSelect('oi.releaseGood', 'rg')
452
+ qb.innerJoinAndSelect('oi.product', 'Product')
453
+ qb.leftJoinAndSelect('oi.binLocation', 'bin_loc')
454
+ qb.leftJoinAndSelect('oi.domain', 'domain')
455
+ qb.leftJoinAndSelect('oi.creator', 'creator')
456
+ qb.leftJoinAndSelect('oi.updater', 'updater')
457
+
458
+ if (sortings?.length !== 0) {
459
+ const sorter = (sortings || []).reduce((acc, sort) => {
460
+ const order: string = sort.desc ? 'DESC' : 'ASC'
461
+
462
+ switch (sort.name) {
463
+ case 'roName':
464
+ acc = { ...acc, ['rg.name']: order }
465
+ break
466
+
467
+ case 'productSku':
468
+ acc = { ...acc, ['Product.sku']: order }
469
+ break
470
+
471
+ case 'binNumber':
472
+ acc = { ...acc, ['bin_loc.name']: order }
473
+ break
474
+ }
475
+
476
+ return acc
477
+ }, {})
478
+ qb.orderBy(sorter)
479
+ }
480
+
481
+ const [items, total] = await qb.getManyAndCount()
482
+
483
+ return { items, total }
484
+ } catch (e) {
485
+ throw e
486
+ }
487
+ }
488
+
489
+ @Query(returns => OrderInventoryList)
490
+ async orderInventoriesOfMergedReleaseOrders(
491
+ @Ctx() context: any,
492
+ @Arg('partnerId') partnerId: string,
493
+ @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],
494
+ @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
495
+ ): Promise<OrderInventoryList> {
496
+ try {
497
+ const { domain }: { domain: Domain } = context.state
498
+ const binNumberParam: any = filters.find((param: any) => param.name === 'binNumber')
499
+ const priorityParam: any = filters.find((param: any) => param.name === 'priority')
500
+ let arrFilters = []
501
+
502
+ if (priorityParam) {
503
+ filters.splice(
504
+ filters.findIndex(item => item.name == 'priority'),
505
+ 1
506
+ )
507
+
508
+ switch (priorityParam.value) {
509
+ case 'roSku':
510
+ sortings.push({ name: 'releaseGood', desc: true })
511
+ sortings.push({ name: 'productSku', desc: false })
512
+ break
513
+
514
+ case 'roBin':
515
+ sortings.push({ name: 'releaseGood', desc: true })
516
+ sortings.push({ name: 'binNumber', desc: false })
517
+ break
518
+
519
+ case 'skuRo':
520
+ sortings.push({ name: 'productSku', desc: false })
521
+ sortings.push({ name: 'releaseGood', desc: true })
522
+ break
523
+
524
+ case 'skuBin':
525
+ sortings.push({ name: 'productSku', desc: false })
526
+ sortings.push({ name: 'binNumber', desc: false })
527
+ break
528
+
529
+ case 'binSku':
530
+ sortings.push({ name: 'binNumber', desc: false })
531
+ sortings.push({ name: 'productSku', desc: false })
532
+ break
533
+
534
+ case 'binRo':
535
+ sortings.push({ name: 'binNumber', desc: false })
536
+ sortings.push({ name: 'releaseGood', desc: true })
537
+ break
538
+ }
539
+ }
540
+
541
+ const releaseGoodsList: ReleaseGood[] = await getRepository(ReleaseGood).query(
542
+ `select oi.release_good_id as id from worksheets w
543
+ inner join worksheet_details wd on wd.worksheet_id =w.id
544
+ inner join order_inventories oi on oi.id =wd.target_inventory_id
545
+ inner join release_goods rg on rg.id = oi.release_good_id
546
+ and oi.status in ('PICKING', 'PICKED', 'SORTING', 'SORTED')
547
+ and w.type = 'BATCH_PICKING' and w.status != 'DEACTIVATED'
548
+ and rg.domain_id = '${domain.id}' and rg.bizplace_id = '${partnerId}'
549
+ and rg.route_id is not null
550
+ group by oi.release_good_id`
551
+ )
552
+
553
+ if (releaseGoodsList && releaseGoodsList.length) {
554
+ arrFilters.push({
555
+ name: 'releaseGoodId',
556
+ operator: 'in',
557
+ value: releaseGoodsList.map((foundRG: ReleaseGood) => foundRG.id),
558
+ relation: false
559
+ })
560
+ } else {
561
+ arrFilters.push({
562
+ name: 'releaseGoodId',
563
+ operator: 'is_null',
564
+ relation: false
565
+ })
566
+ }
567
+
568
+ const params = { filters: arrFilters }
569
+ const qb: SelectQueryBuilder<OrderInventory> = getRepository(OrderInventory).createQueryBuilder('oi')
570
+ buildQuery(qb, params, context)
571
+
572
+ qb.select('oi')
573
+ qb.innerJoinAndSelect('oi.releaseGood', 'rg')
574
+ qb.innerJoinAndSelect('oi.product', 'Product')
575
+ qb.leftJoinAndSelect('oi.binLocation', 'bin_loc')
576
+ qb.leftJoinAndSelect('oi.domain', 'domain')
577
+ qb.leftJoinAndSelect('oi.creator', 'creator')
578
+ qb.leftJoinAndSelect('oi.updater', 'updater')
579
+
580
+ if (binNumberParam) {
581
+ let binLocation: Location = await getRepository(Location).findOne({
582
+ where: { domain, name: binNumberParam.value }
583
+ })
584
+
585
+ filters.splice(
586
+ filters.findIndex(item => item.name == 'binNumber'),
587
+ 1
588
+ )
589
+
590
+ qb.andWhere('bin_loc.id = :id', { id: binLocation.id })
591
+ }
592
+
593
+ if (sortings?.length !== 0) {
594
+ const sorter = (sortings || []).reduce((acc, sort) => {
595
+ const order: string = sort.desc ? 'DESC' : 'ASC'
596
+
597
+ switch (sort.name) {
598
+ case 'roName':
599
+ acc = { ...acc, ['rg.name']: order }
600
+ break
601
+
602
+ case 'releaseGood':
603
+ acc = { ...acc, ['rg.created_at']: order }
604
+ break
605
+
606
+ case 'productSku':
607
+ acc = { ...acc, ['Product.sku']: order }
608
+ break
609
+
610
+ case 'binNumber':
611
+ acc = { ...acc, ['bin_loc.name']: order }
612
+ break
613
+ }
614
+
615
+ return acc
616
+ }, {})
617
+ qb.orderBy(sorter)
618
+ }
619
+
620
+ const [items, total] = await qb.getManyAndCount()
621
+
622
+ return { items, total }
623
+ } catch (e) {
624
+ throw e
625
+ }
626
+ }
627
+
409
628
  @FieldResolver(type => Domain)
410
629
  async domain(@Root() orderInventory: OrderInventory): Promise<Domain> {
411
630
  return await getRepository(Domain).findOne(orderInventory.domainId)
@@ -223,4 +223,7 @@ export class OrderInventoryPatch {
223
223
 
224
224
  @Field({ nullable: true })
225
225
  status: string
226
+
227
+ @Field({ nullable: true })
228
+ pickingStrategy: string
226
229
  }
@@ -565,6 +565,10 @@ export async function generateReleaseGoodFunction(
565
565
  orderInventories: releaseGood.orderInventories,
566
566
  type: releaseGood?.type ? releaseGood.type : 'b2b',
567
567
  status: ORDER_STATUS.PENDING,
568
+ storeName: releaseGood?.storeName,
569
+ storeId: releaseGood?.storeId,
570
+ routeId: releaseGood?.routeId,
571
+ stopId: releaseGood?.stopId,
568
572
  creator: user,
569
573
  updater: user
570
574
  }
@@ -762,7 +766,7 @@ export async function confirmReleaseGood(name: string, context: any, tx?: Entity
762
766
  // query orderProducts separately from releaseGood to reduce resource usage
763
767
  let foundOPs: OrderProduct[] = await tx.getRepository(OrderProduct).find({
764
768
  where: { domain, releaseGood: foundReleaseGood },
765
- relations: ['product', 'product.productDetails']
769
+ relations: ['bizplace', 'product', 'product.productDetails']
766
770
  })
767
771
 
768
772
  let foundBundleInfo: any[] = JSON.parse(foundReleaseGood.bundleInfo)
@@ -263,6 +263,7 @@ export class ReleaseGoodQuery {
263
263
  const bizplaceFilter = params.filters.find(param => param.name === 'bizplaceId')
264
264
  const noOfItemsFilter = params.filters.find(param => param.name === 'noOfItems')
265
265
  const skuFilter = params.filters.find(param => param.name === 'sku')
266
+ const routeId = params.filters.find(param => param.name === 'routeId')
266
267
 
267
268
  if (await checkUserBelongsDomain(domain, user)) {
268
269
  if (!statusFilter && !params.filters.some(e => e.name === 'name')) {
@@ -288,6 +289,15 @@ export class ReleaseGoodQuery {
288
289
  params.filters = params.filters.filter(param => param.name !== 'sku')
289
290
  }
290
291
 
292
+ if (routeId) {
293
+ if (routeId.value == true) {
294
+ params.filters.find(param => param.name === 'routeId').value = 'null'
295
+ } else {
296
+ params.filters.find(param => param.name === 'routeId').operator = 'is_null'
297
+ params.filters.find(param => param.name === 'routeId').value = null
298
+ }
299
+ }
300
+
291
301
  const fromDateParamIdx = params.filters.findIndex(param => param.name === 'fromDate')
292
302
  if (fromDateParamIdx >= 0) {
293
303
  let fromDateVal = new Date(params.filters[fromDateParamIdx].value)
@@ -389,9 +399,13 @@ export class ReleaseGoodQuery {
389
399
  const PROD_ALIAS = 'PROD'
390
400
  const GAN_ALIAS = 'GAN'
391
401
  const conditions = filters
392
- let { batchId = null, containerNo = null, product = [], packingType = null, inventory = [] } = getConditionValues(
393
- conditions
394
- )
402
+ let {
403
+ batchId = null,
404
+ containerNo = null,
405
+ product = [],
406
+ packingType = null,
407
+ inventory = []
408
+ } = getConditionValues(conditions)
395
409
 
396
410
  const SELECT: string = `
397
411
  SELECT
@@ -812,9 +826,7 @@ function _extractData(rawData, validatedData) {
812
826
  })
813
827
  }
814
828
 
815
- function getConditionValues(
816
- conditions: Filter[]
817
- ): {
829
+ function getConditionValues(conditions: Filter[]): {
818
830
  batchId?: string
819
831
  containerNo?: string
820
832
  product?: string[]
@@ -347,6 +347,18 @@ export class NewReleaseGood {
347
347
 
348
348
  @Field({ nullable: true })
349
349
  errorMsg: string
350
+
351
+ @Field({ nullable: true })
352
+ storeName: string
353
+
354
+ @Field({ nullable: true })
355
+ storeId: string
356
+
357
+ @Field({ nullable: true })
358
+ routeId: string
359
+
360
+ @Field({ nullable: true })
361
+ stopId: string
350
362
  }
351
363
 
352
364
  @InputType()
@@ -503,4 +515,16 @@ export class ReleaseGoodPatch {
503
515
 
504
516
  @Field({ nullable: true })
505
517
  description: string
518
+
519
+ @Field({ nullable: true })
520
+ storeName: string
521
+
522
+ @Field({ nullable: true })
523
+ storeId: string
524
+
525
+ @Field({ nullable: true })
526
+ routeId: string
527
+
528
+ @Field({ nullable: true })
529
+ stopId: string
506
530
  }
@@ -389,4 +389,20 @@ export class ReleaseGood {
389
389
 
390
390
  @Field({ nullable: true })
391
391
  errorMsg: string
392
+
393
+ @Column({ nullable: true })
394
+ @Field({ nullable: true })
395
+ storeId: string
396
+
397
+ @Column({ nullable: true })
398
+ @Field({ nullable: true })
399
+ storeName: string
400
+
401
+ @Column({ nullable: true })
402
+ @Field({ nullable: true })
403
+ routeId: string
404
+
405
+ @Column({ nullable: true })
406
+ @Field({ nullable: true })
407
+ stopId: string
392
408
  }