@things-factory/sales-base 8.0.2 → 8.0.5

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 (178) hide show
  1. package/dist-server/tsconfig.tsbuildinfo +1 -1
  2. package/package.json +12 -12
  3. package/server/constants/attachment-type.ts +0 -9
  4. package/server/constants/index.ts +0 -7
  5. package/server/constants/load-type.ts +0 -4
  6. package/server/constants/order.ts +0 -203
  7. package/server/constants/product-group-type.ts +0 -4
  8. package/server/constants/release-good.ts +0 -9
  9. package/server/constants/transfer-order-type.ts +0 -6
  10. package/server/constants/validation-error-code.ts +0 -3
  11. package/server/constants/vas-target-type.ts +0 -25
  12. package/server/controllers/ecommerce/ecommerce-controller.ts +0 -122
  13. package/server/controllers/ecommerce/index.ts +0 -2
  14. package/server/controllers/ecommerce/sellercraft-controller.ts +0 -182
  15. package/server/controllers/index.ts +0 -2
  16. package/server/controllers/order-controller.ts +0 -296
  17. package/server/errors/index.ts +0 -1
  18. package/server/errors/validation-error.ts +0 -25
  19. package/server/index.ts +0 -5
  20. package/server/migrations/index.ts +0 -9
  21. package/server/service/arrival-notice/arrival-notice-mutation.ts +0 -1152
  22. package/server/service/arrival-notice/arrival-notice-query.ts +0 -549
  23. package/server/service/arrival-notice/arrival-notice-types.ts +0 -310
  24. package/server/service/arrival-notice/arrival-notice.ts +0 -202
  25. package/server/service/arrival-notice/index.ts +0 -9
  26. package/server/service/claim/claim-mutation.ts +0 -308
  27. package/server/service/claim/claim-query.ts +0 -122
  28. package/server/service/claim/claim-types.ts +0 -130
  29. package/server/service/claim/claim.ts +0 -140
  30. package/server/service/claim/index.ts +0 -9
  31. package/server/service/claim-detail/claim-detail-mutation.ts +0 -102
  32. package/server/service/claim-detail/claim-detail-query.ts +0 -55
  33. package/server/service/claim-detail/claim-detail-types.ts +0 -47
  34. package/server/service/claim-detail/claim-detail.ts +0 -69
  35. package/server/service/claim-detail/index.ts +0 -9
  36. package/server/service/claim-order/claim-order-mutation.ts +0 -101
  37. package/server/service/claim-order/claim-order-query.ts +0 -47
  38. package/server/service/claim-order/claim-order-types.ts +0 -35
  39. package/server/service/claim-order/claim-order.ts +0 -81
  40. package/server/service/claim-order/index.ts +0 -9
  41. package/server/service/collection-order/collection-order-mutation.ts +0 -245
  42. package/server/service/collection-order/collection-order-query.ts +0 -97
  43. package/server/service/collection-order/collection-order-types.ts +0 -165
  44. package/server/service/collection-order/collection-order.ts +0 -135
  45. package/server/service/collection-order/index.ts +0 -9
  46. package/server/service/delivery-order/delivery-order-mutation.ts +0 -967
  47. package/server/service/delivery-order/delivery-order-query.ts +0 -631
  48. package/server/service/delivery-order/delivery-order-types.ts +0 -268
  49. package/server/service/delivery-order/delivery-order.ts +0 -258
  50. package/server/service/delivery-order/index.ts +0 -9
  51. package/server/service/draft-release-good/draft-release-good-mutation.ts +0 -765
  52. package/server/service/draft-release-good/draft-release-good-query.ts +0 -354
  53. package/server/service/draft-release-good/draft-release-good-type.ts +0 -261
  54. package/server/service/draft-release-good/draft-release-good.ts +0 -284
  55. package/server/service/draft-release-good/index.ts +0 -9
  56. package/server/service/goods-receival-note/goods-receival-note-mutation.ts +0 -129
  57. package/server/service/goods-receival-note/goods-receival-note-query.ts +0 -280
  58. package/server/service/goods-receival-note/goods-receival-note-types.ts +0 -105
  59. package/server/service/goods-receival-note/goods-receival-note.ts +0 -127
  60. package/server/service/goods-receival-note/index.ts +0 -9
  61. package/server/service/index.ts +0 -238
  62. package/server/service/inventory-check/index.ts +0 -9
  63. package/server/service/inventory-check/inventory-check-mutation.ts +0 -149
  64. package/server/service/inventory-check/inventory-check-query.ts +0 -48
  65. package/server/service/inventory-check/inventory-check-types.ts +0 -48
  66. package/server/service/inventory-check/inventory-check.ts +0 -90
  67. package/server/service/invoice/index.ts +0 -9
  68. package/server/service/invoice/invoice-mutation.ts +0 -95
  69. package/server/service/invoice/invoice-query.ts +0 -53
  70. package/server/service/invoice/invoice-types.ts +0 -279
  71. package/server/service/invoice/invoice.ts +0 -230
  72. package/server/service/invoice-product/index.ts +0 -9
  73. package/server/service/invoice-product/invoice-product-mutation.ts +0 -54
  74. package/server/service/invoice-product/invoice-product-query.ts +0 -54
  75. package/server/service/invoice-product/invoice-product-types.ts +0 -84
  76. package/server/service/invoice-product/invoice-product.ts +0 -92
  77. package/server/service/job-sheet/index.ts +0 -9
  78. package/server/service/job-sheet/job-sheet-mutation.ts +0 -92
  79. package/server/service/job-sheet/job-sheet-query.ts +0 -112
  80. package/server/service/job-sheet/job-sheet-types.ts +0 -78
  81. package/server/service/job-sheet/job-sheet.ts +0 -102
  82. package/server/service/manifest/index.ts +0 -6
  83. package/server/service/manifest/manifest-mutation.ts +0 -190
  84. package/server/service/manifest/manifest-query.ts +0 -149
  85. package/server/service/manifest/manifest-type.ts +0 -84
  86. package/server/service/manifest/manifest.ts +0 -114
  87. package/server/service/order-inventory/index.ts +0 -9
  88. package/server/service/order-inventory/order-inventory-mutation.ts +0 -54
  89. package/server/service/order-inventory/order-inventory-query.ts +0 -722
  90. package/server/service/order-inventory/order-inventory-types.ts +0 -238
  91. package/server/service/order-inventory/order-inventory.ts +0 -401
  92. package/server/service/order-product/index.ts +0 -9
  93. package/server/service/order-product/order-product-mutation.ts +0 -48
  94. package/server/service/order-product/order-product-query.ts +0 -89
  95. package/server/service/order-product/order-product-types.ts +0 -335
  96. package/server/service/order-product/order-product.ts +0 -362
  97. package/server/service/order-tote/index.ts +0 -9
  98. package/server/service/order-tote/order-tote-mutation.ts +0 -31
  99. package/server/service/order-tote/order-tote-query.ts +0 -112
  100. package/server/service/order-tote/order-tote-types.ts +0 -47
  101. package/server/service/order-tote/order-tote.ts +0 -73
  102. package/server/service/order-tote-item/index.ts +0 -9
  103. package/server/service/order-tote-item/order-tote-item-mutation.ts +0 -31
  104. package/server/service/order-tote-item/order-tote-item-query.ts +0 -82
  105. package/server/service/order-tote-item/order-tote-item-types.ts +0 -56
  106. package/server/service/order-tote-item/order-tote-item.ts +0 -72
  107. package/server/service/order-tote-seal/index.ts +0 -9
  108. package/server/service/order-tote-seal/order-tote-seal-mutation.ts +0 -31
  109. package/server/service/order-tote-seal/order-tote-seal-query.ts +0 -59
  110. package/server/service/order-tote-seal/order-tote-seal-types.ts +0 -41
  111. package/server/service/order-tote-seal/order-tote-seal.ts +0 -46
  112. package/server/service/order-vas/index.ts +0 -9
  113. package/server/service/order-vas/order-vas-mutation.ts +0 -20
  114. package/server/service/order-vas/order-vas-query.ts +0 -72
  115. package/server/service/order-vas/order-vas-types.ts +0 -159
  116. package/server/service/order-vas/order-vas.ts +0 -207
  117. package/server/service/others/index.ts +0 -5
  118. package/server/service/others/other-query.ts +0 -563
  119. package/server/service/others/other-types.ts +0 -115
  120. package/server/service/purchase-order/index.ts +0 -9
  121. package/server/service/purchase-order/purchase-order-mutation.ts +0 -458
  122. package/server/service/purchase-order/purchase-order-query.ts +0 -90
  123. package/server/service/purchase-order/purchase-order-types.ts +0 -154
  124. package/server/service/purchase-order/purchase-order.ts +0 -172
  125. package/server/service/purchase-order-other-charge/index.ts +0 -9
  126. package/server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.ts +0 -31
  127. package/server/service/purchase-order-other-charge/purchase-order-other-charge-query.ts +0 -52
  128. package/server/service/purchase-order-other-charge/purchase-order-other-charge-types.ts +0 -44
  129. package/server/service/purchase-order-other-charge/purchase-order-other-charge.ts +0 -68
  130. package/server/service/release-good/index.ts +0 -9
  131. package/server/service/release-good/release-good-mutation.ts +0 -1686
  132. package/server/service/release-good/release-good-query.ts +0 -980
  133. package/server/service/release-good/release-good-types.ts +0 -662
  134. package/server/service/release-good/release-good.ts +0 -490
  135. package/server/service/retail-replenishment-order/index.ts +0 -9
  136. package/server/service/retail-replenishment-order/retail-replenishment-order-mutation.ts +0 -382
  137. package/server/service/retail-replenishment-order/retail-replenishment-order-query.ts +0 -54
  138. package/server/service/retail-replenishment-order/retail-replenishment-order-types.ts +0 -101
  139. package/server/service/retail-replenishment-order/retail-replenishment-order.ts +0 -115
  140. package/server/service/return-order/index.ts +0 -9
  141. package/server/service/return-order/return-order-mutation.ts +0 -516
  142. package/server/service/return-order/return-order-query.ts +0 -226
  143. package/server/service/return-order/return-order-types.ts +0 -196
  144. package/server/service/return-order/return-order.ts +0 -127
  145. package/server/service/reverse-kitting-order/index.ts +0 -9
  146. package/server/service/reverse-kitting-order/reverse-kitting-order-mutation.ts +0 -500
  147. package/server/service/reverse-kitting-order/reverse-kitting-order-query.ts +0 -197
  148. package/server/service/reverse-kitting-order/reverse-kitting-order-type.ts +0 -173
  149. package/server/service/reverse-kitting-order/reverse-kitting-order.ts +0 -121
  150. package/server/service/reverse-kitting-order-inventory/index.ts +0 -9
  151. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.ts +0 -129
  152. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.ts +0 -52
  153. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-type.ts +0 -95
  154. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory.ts +0 -143
  155. package/server/service/shipping-order/index.ts +0 -9
  156. package/server/service/shipping-order/shipping-order-mutation.ts +0 -61
  157. package/server/service/shipping-order/shipping-order-query.ts +0 -61
  158. package/server/service/shipping-order/shipping-order-types.ts +0 -89
  159. package/server/service/shipping-order/shipping-order.ts +0 -129
  160. package/server/service/transfer-order/index.ts +0 -9
  161. package/server/service/transfer-order/transfer-order-mutation.ts +0 -309
  162. package/server/service/transfer-order/transfer-order-query.ts +0 -66
  163. package/server/service/transfer-order/transfer-order-types.ts +0 -97
  164. package/server/service/transfer-order/transfer-order.ts +0 -117
  165. package/server/service/vas/index.ts +0 -9
  166. package/server/service/vas/vas-mutation.ts +0 -106
  167. package/server/service/vas/vas-query.ts +0 -60
  168. package/server/service/vas/vas-types.ts +0 -71
  169. package/server/service/vas/vas.ts +0 -77
  170. package/server/service/vas-order/index.ts +0 -9
  171. package/server/service/vas-order/vas-order-mutation.ts +0 -259
  172. package/server/service/vas-order/vas-order-query.ts +0 -119
  173. package/server/service/vas-order/vas-order-types.ts +0 -49
  174. package/server/service/vas-order/vas-order.ts +0 -81
  175. package/server/utils/datetime-util.ts +0 -54
  176. package/server/utils/index.ts +0 -3
  177. package/server/utils/inventory-util.ts +0 -1155
  178. package/server/utils/order-no-generator.ts +0 -146
@@ -1,722 +0,0 @@
1
- import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
- import { Brackets, Like, OrderByCondition, SelectQueryBuilder } from 'typeorm'
3
-
4
- import { User } from '@things-factory/auth-base'
5
- import { getPermittedBizplaceIds } from '@things-factory/biz-base'
6
- import { Product } from '@things-factory/product-base'
7
- import {
8
- buildQuery,
9
- convertListParams,
10
- Domain,
11
- Filter,
12
- getQueryBuilderFromListParams,
13
- getRepository,
14
- ListParam,
15
- Pagination,
16
- Sorting
17
- } from '@things-factory/shell'
18
- import { Inventory, InventoryPatch } from '@things-factory/warehouse-base'
19
-
20
- import { ORDER_INVENTORY_STATUS, ORDER_STATUS } from '../../constants'
21
- import { ArrivalNotice } from '../arrival-notice/arrival-notice'
22
- import { OrderInventoryList } from '../order-inventory/order-inventory-types'
23
- import { ReleaseGood } from '../release-good/release-good'
24
- import { OrderInventory } from './order-inventory'
25
-
26
- interface filterInterface {
27
- name: string
28
- operator: string
29
- value: any
30
- }
31
- @Resolver(OrderInventory)
32
- export class OrderInventoryQuery {
33
- @Query(returns => OrderInventoryList)
34
- async orderInventories(
35
- @Ctx() context: ResolverContext,
36
- @Args(type => ListParam) params: ListParam
37
- ): Promise<OrderInventoryList> {
38
- const { domain } = context.state
39
- const arrivalNoticeNoParam: any = params.filters.find((param: any) => param.name === 'arrivalNoticeNo')
40
- const releaseGoodNoParam: any = params.filters.find((param: any) => param.name === 'releaseGoodNo')
41
-
42
- if (arrivalNoticeNoParam && arrivalNoticeNoParam?.value) {
43
- const foundArrivalNotice: ArrivalNotice = await getRepository(ArrivalNotice).findOne({
44
- where: {
45
- name: arrivalNoticeNoParam.value,
46
- domain: { id: domain.id }
47
- }
48
- })
49
-
50
- if (foundArrivalNotice) {
51
- params.filters.splice(
52
- params.filters.findIndex(item => item.name == 'arrivalNoticeNo'),
53
- 1
54
- )
55
- params.filters.push({ name: 'arrivalNoticeId', operator: 'eq', value: foundArrivalNotice.id })
56
- } else {
57
- throw new Error(`Cannot find result for order "${arrivalNoticeNoParam.value}"`)
58
- }
59
- }
60
-
61
- if (releaseGoodNoParam && releaseGoodNoParam?.value) {
62
- const foundReleaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
63
- where: {
64
- name: releaseGoodNoParam.value,
65
- domain: { id: domain.id }
66
- }
67
- })
68
-
69
- if (foundReleaseGood) {
70
- params.filters.splice(
71
- params.filters.findIndex(item => item.name == 'releaseGoodNo'),
72
- 1
73
- )
74
- params.filters.push({ name: 'releaseGoodId', operator: 'eq', value: foundReleaseGood.id })
75
- } else {
76
- throw new Error(`Cannot find result for order "${releaseGoodNoParam.value}"`)
77
- }
78
- }
79
-
80
- const qb: SelectQueryBuilder<OrderInventory> = getRepository(OrderInventory).createQueryBuilder('oi')
81
- buildQuery(qb, params, context)
82
-
83
- qb.leftJoinAndSelect('oi.domain', 'domain')
84
- qb.leftJoinAndSelect('oi.arrivalNotice', 'arrivalNotice')
85
- qb.leftJoinAndSelect('oi.orderProduct', 'orderProduct')
86
- qb.leftJoinAndSelect('oi.inventory', 'inventory')
87
- qb.leftJoinAndSelect('inventory.product', 'product')
88
- qb.leftJoinAndSelect('inventory.location', 'location')
89
- qb.leftJoinAndSelect('oi.releaseGood', 'releaseGood')
90
- qb.leftJoinAndSelect('oi.deliveryOrder', 'deliveryOrder')
91
- qb.leftJoinAndSelect('oi.creator', 'creator')
92
- qb.leftJoinAndSelect('oi.updater', 'updater')
93
-
94
- let sort: OrderByCondition = {}
95
- if (params?.sortings) {
96
- if (params.sortings.some(e => e.name === 'inventoryPalletId')) {
97
- // overwrite the worksheet status sorting since inventory check status is needed
98
- sort = {
99
- 'inventory.palletId': params.sortings[params.sortings.findIndex(item => item.name == 'inventoryPalletId')]
100
- .desc
101
- ? 'DESC'
102
- : 'ASC',
103
- 'oi.createdAt': params.sortings[params.sortings.findIndex(item => item.name == 'createdAt')]?.desc
104
- ? 'DESC'
105
- : 'ASC'
106
- }
107
- } else if (params.sortings.some(e => e.name === 'createdAt')) {
108
- sort = {
109
- ...sort,
110
- 'oi.createdAt': params.sortings[params.sortings.findIndex(item => item.name == 'createdAt')]?.desc
111
- ? 'DESC'
112
- : 'ASC'
113
- }
114
- }
115
- } else {
116
- sort = { 'oi.createdAt': 'ASC' }
117
- }
118
-
119
- qb.orderBy(sort)
120
-
121
- let [items, total] = await qb.getManyAndCount()
122
-
123
- return { items, total }
124
- }
125
-
126
- @Query(returns => OrderInventoryList)
127
- async mergedProductOrderInventories(
128
- @Ctx() context: ResolverContext,
129
- @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],
130
- @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,
131
- @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
132
- ): Promise<OrderInventoryList> {
133
- const convertedParams = convertListParams({ filters, pagination, sortings })
134
- let [items, total] = await getRepository(OrderInventory).findAndCount({
135
- ...convertedParams,
136
- relations: [
137
- 'domain',
138
- 'arrivalNotice',
139
- 'inventory',
140
- 'product',
141
- 'releaseGood',
142
- 'deliveryOrder',
143
- 'creator',
144
- 'updater'
145
- ]
146
- })
147
-
148
- items = items
149
- .map((item: OrderInventory) => {
150
- const product: Product = item.product
151
- return {
152
- productName: `(${product?.sku ? product.sku : '-'}) ${product.name}`,
153
- packingType: item.packingType,
154
- packingSize: item.packingSize,
155
- sku: item.product.sku,
156
- batchId: item.batchId,
157
- batchIdRef: item.batchIdRef,
158
- releaseQty: item.releaseQty,
159
- releaseUomValue: item.releaseUomValue
160
- }
161
- })
162
- .reduce((newItem, item) => {
163
- let foundItem = newItem.find(
164
- newItem =>
165
- newItem.sku === item.sku &&
166
- newItem.packingType === item.packingType &&
167
- newItem.packingSize === item.packingSize &&
168
- newItem.batchId === item.batchId
169
- )
170
- if (!foundItem) {
171
- foundItem = {
172
- productName: item.productName,
173
- packingType: item.packingType,
174
- packingSize: item.packingSize,
175
- sku: item.sku,
176
- batchId: item.batchId,
177
- batchIdRef: item.batchIdRef,
178
- releaseQty: item.releaseQty,
179
- releaseUomValue: item.releaseUomValue
180
- }
181
-
182
- newItem.push(foundItem)
183
- return newItem
184
- } else {
185
- return newItem.map(ni => {
186
- if (
187
- ni.sku === item.sku &&
188
- ni.packingType === item.packingType &&
189
- ni.packingSize === item.packingSize &&
190
- ni.batchId === item.batchId
191
- ) {
192
- return {
193
- ...ni,
194
- releaseQty: ni.releaseQty + item.releaseQty,
195
- releaseUomValue: ni.releaseUomValue + item.releaseUomValue
196
- }
197
- } else {
198
- return ni
199
- }
200
- })
201
- }
202
- }, [])
203
-
204
- return { items, total }
205
- }
206
-
207
- @Query(returns => OrderInventory)
208
- async orderInventory(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<OrderInventory> {
209
- const { domain } = context.state
210
-
211
- return await getRepository(OrderInventory).findOne({
212
- where: {
213
- domain: { id: domain.id },
214
- id
215
- },
216
- relations: ['domain', 'releaseGood', 'inventory', 'creator', 'updater']
217
- })
218
- }
219
-
220
- @Query(returns => Boolean)
221
- async validateOrderInventory(
222
- @Arg('patches', type => [InventoryPatch]) patches: InventoryPatch[],
223
- @Ctx() context: ResolverContext
224
- ) {
225
- const { domain, user, tx } = context.state
226
-
227
- let error = []
228
-
229
- for (let i = 0; i < patches.length; i++) {
230
- let foundExistingPallet: Inventory = await getRepository(Inventory).findOne({
231
- where: { domain: { id: domain.id }, palletId: patches[i]?.palletId }
232
- })
233
-
234
- if (!foundExistingPallet) {
235
- foundExistingPallet = await getRepository(Inventory).findOne({
236
- where: { id: patches[i]?.id }
237
- })
238
- }
239
-
240
- if (patches[i]?.batchId != null) {
241
- const worksheet: OrderInventory[] = await getRepository(OrderInventory).find({
242
- where: { inventory: foundExistingPallet?.id as any, status: 'PICKING' }
243
- })
244
-
245
- if (worksheet.length > 0) {
246
- error = [...worksheet]
247
- }
248
- }
249
- }
250
-
251
- if (error.length == 0) {
252
- return true
253
- } else {
254
- return false
255
- }
256
- }
257
-
258
- @Query(returns => OrderInventoryList)
259
- async inventoriesByOrder(
260
- @Ctx() context: ResolverContext,
261
- @Args(type => ListParam) params: ListParam
262
- ): Promise<OrderInventoryList> {
263
- const { domain, user } = context.state
264
-
265
- let permittedBizplaceIds: string[] = await getPermittedBizplaceIds(domain, user)
266
-
267
- if (!params.filters.find((filter: any) => filter.name === 'bizplaceId')) {
268
- params.filters.push({
269
- name: 'bizplaceId',
270
- operator: 'in',
271
- value: permittedBizplaceIds,
272
- relation: true
273
- })
274
- } else {
275
- permittedBizplaceIds = params.filters.find(filter => filter.name === 'bizplaceId').value
276
- params.filters.find(filter => filter.name === 'bizplaceId').relation = true
277
- }
278
-
279
- if (params.filters.find((filter: any) => filter.name === 'releaseGoodName')?.value) {
280
- let releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
281
- where: {
282
- name: Like(params.filters.find(filter => filter.name === 'releaseGoodName').value)
283
- }
284
- })
285
-
286
- if (releaseGood) {
287
- params.filters = params.filters.filter(filter => filter.name != 'releaseGoodName')
288
-
289
- params.filters.push({
290
- name: 'releaseGoodId',
291
- operator: 'eq',
292
- value: releaseGood.id,
293
- relation: true
294
- })
295
- }
296
- }
297
- const qb: SelectQueryBuilder<OrderInventory> = getRepository(OrderInventory).createQueryBuilder('oi')
298
- buildQuery(qb, params, context)
299
-
300
- qb.innerJoinAndSelect('oi.releaseGood', 'releaseGood')
301
- .leftJoinAndSelect('oi.domain', 'domain')
302
- .leftJoinAndSelect('oi.bizplace', 'bizplace')
303
- .leftJoinAndSelect('oi.inventory', 'inventory')
304
- .leftJoinAndSelect('inventory.product', 'product')
305
- .leftJoinAndSelect('oi.creator', 'creator')
306
- .leftJoinAndSelect('oi.updater', 'updater')
307
-
308
- qb.andWhere('releaseGood.status = :status', { status: 'DONE' })
309
- let [items, total] = await qb.getManyAndCount()
310
-
311
- items = items.map((item: OrderInventory) => {
312
- return {
313
- ...item,
314
- id: item.inventory.id,
315
- releaseGoodName: item.releaseGood.name,
316
- palletId: item.inventory.palletId,
317
- productId: item.inventory.product.id,
318
- productName: item.inventory.product.name,
319
- productSKU: item.inventory.product.sku,
320
- productBrand: item.inventory.product.brand,
321
- packingSize: item.inventory.packingSize
322
- }
323
- })
324
-
325
- return { items, total }
326
- }
327
-
328
- @Query(returns => OrderInventoryList)
329
- async nonLoadedOrderInventories(
330
- @Ctx() context: ResolverContext,
331
- @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],
332
- @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,
333
- @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
334
- ): Promise<OrderInventoryList> {
335
- const { page, limit } = pagination
336
-
337
- try {
338
- const productFilter = filters.find(x => x.name == 'productInfo')
339
- const roNoFilter = filters.find(x => x.name == 'roNo')
340
- const refNoFilter = filters.find(x => x.name == 'refNo')
341
- const binLocationFilter = filters.find(x => x.name == 'binLocation')
342
- const lotIdFilter = filters.find(x => x.name == 'palletId')
343
- const cartonIdFilter = filters.find(x => x.name == 'cartonId')
344
-
345
- filters = filters.filter(
346
- filter => ['productInfo', 'roNo', 'refNo', 'binLocation', 'palletId', 'cartonId'].indexOf(filter.name) == -1
347
- )
348
-
349
- const params = { filters, pagination }
350
- const qb: SelectQueryBuilder<OrderInventory> = getRepository(OrderInventory).createQueryBuilder('oi')
351
- buildQuery(qb, params, context)
352
-
353
- qb.select('oi')
354
- .addSelect('(oi.release_uom_value / oi.release_qty) * oi.picked_qty', 'picked_uom_value')
355
- .innerJoinAndSelect('oi.inventory', 'inv')
356
- .innerJoinAndSelect('oi.releaseGood', 'rg')
357
- .innerJoinAndSelect('oi.product', 'product')
358
- .leftJoinAndSelect('oi.binLocation', 'bin_loc')
359
- .andWhere('rg.status IN (:...releaseGoodStatus)', {
360
- releaseGoodStatus: [ORDER_STATUS.PICKING, ORDER_STATUS.LOADING]
361
- })
362
- .andWhere('oi.status IN (:...orderInventoryStatus)', {
363
- orderInventoryStatus: [
364
- ORDER_INVENTORY_STATUS.PICKED,
365
- ORDER_INVENTORY_STATUS.LOADING,
366
- ORDER_INVENTORY_STATUS.LOADED
367
- ]
368
- })
369
-
370
- if (productFilter) {
371
- let productFilterValue = `%${productFilter.value.toLowerCase()}%`
372
- qb.andWhere(qb => {
373
- const subQuery = qb
374
- .subQuery()
375
- .select()
376
- .from(Product, `products`)
377
- .where(`products.id = oi.product_id`)
378
- .andWhere(
379
- new Brackets(qb => {
380
- qb.where('Lower(products.sku) LIKE :productInfo', { productInfo: productFilterValue })
381
- .orWhere('Lower(products.name) LIKE :productInfo', { productInfo: productFilterValue })
382
- .orWhere('Lower(products.description) LIKE :productInfo', { productInfo: productFilterValue })
383
- .orWhere('Lower(products.brand) LIKE :productInfo', { productInfo: productFilterValue })
384
- })
385
- )
386
- .getQuery()
387
- return `EXISTS ${subQuery}`
388
- })
389
- }
390
-
391
- if (roNoFilter) {
392
- qb.andWhere('Lower(rg.name) LIKE :roNo', { roNo: roNoFilter.value.toLowerCase() })
393
- }
394
-
395
- if (refNoFilter) {
396
- qb.andWhere('Lower(rg.ref_no) LIKE :refNo', { refNo: refNoFilter.value.toLowerCase() })
397
- }
398
-
399
- if (binLocationFilter) {
400
- qb.andWhere('Lower(bin_loc.name) LIKE :binLocation', { binLocation: binLocationFilter.value.toLowerCase() })
401
- }
402
-
403
- if (lotIdFilter) {
404
- qb.andWhere('Lower(inv.pallet_id) LIKE :palletId', { palletId: lotIdFilter.value.toLowerCase() })
405
- }
406
-
407
- if (cartonIdFilter) {
408
- qb.andWhere('Lower(inv.carton_id) LIKE :cartonId', { cartonId: cartonIdFilter.value.toLowerCase() })
409
- }
410
-
411
- if (sortings?.length !== 0) {
412
- const sorter: OrderByCondition = (sortings || []).reduce((acc, sort) => {
413
- const order: string = sort.desc ? 'DESC' : 'ASC'
414
-
415
- switch (sort.name) {
416
- case 'productSku':
417
- acc = { ...acc, ['product.sku']: order }
418
- break
419
-
420
- case 'productName':
421
- acc = { ...acc, ['product.name']: order }
422
- break
423
-
424
- case 'productBrand':
425
- acc = { ...acc, ['product.brand']: order }
426
-
427
- case 'binLocation':
428
- acc = { ...acc, ['bin_loc.name']: order }
429
- break
430
-
431
- default:
432
- acc = { ...acc, [`oi.${sort.name}`]: order }
433
- break
434
- }
435
-
436
- return acc
437
- }, {})
438
- qb.orderBy(sorter)
439
- }
440
-
441
- let items = await qb
442
- .offset((page - 1) * limit)
443
- .limit(limit)
444
- .getRawMany()
445
-
446
- let total = await qb.getCount()
447
- return {
448
- total,
449
- items: items.reduce((acc, item) => {
450
- acc.push(
451
- Object.assign(new OrderInventory(), {
452
- id: item.oi_id,
453
- batchId: item.oi_batch_id,
454
- packingType: item.oi_packing_type,
455
- packingSize: item.oi_packing_size,
456
- uom: item.oi_uom,
457
- pickedQty: item.oi_picked_qty,
458
- pickedUomValue: item.picked_uom_value,
459
- product: new Product(item),
460
- binLocation: {
461
- id: item.bin_loc_id,
462
- name: item.bin_loc_name,
463
- description: item.bin_loc_description
464
- },
465
- releaseGood: {
466
- id: item.rg_id,
467
- name: item.rg_name,
468
- refNo: item.rg_ref_no,
469
- description: item.rg_description
470
- },
471
- inventory: {
472
- id: item.inv_id,
473
- palletId: item.inv_pallet_id,
474
- cartonId: item.inv_carton_id
475
- },
476
- createdAt: item.oi_created_at,
477
- updatedAt: item.oi_updated_at
478
- })
479
- )
480
-
481
- return acc
482
- }, [])
483
- }
484
- } catch (error) {
485
- throw error
486
- }
487
- }
488
-
489
- @Directive('@transaction')
490
- @Query(returns => OrderInventoryList)
491
- async orderInventoriesOfMultipleReleaseOrders(
492
- @Ctx() context: ResolverContext,
493
- @Arg('partnerId') partnerId: string,
494
- @Arg('priority', { nullable: true }) priority: string,
495
- @Arg('binNumber', { nullable: true }) binNumber: string,
496
- @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],
497
- @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
498
- ): Promise<OrderInventoryList> {
499
- try {
500
- const { domain, tx } = context.state
501
- const withSkuParam: any = filters.find((param: any) => param.name === 'withSku')
502
- const withToteParam: any = filters.find((param: any) => param.name === 'withTote')
503
- const mergedPageParam: any = filters.find((param: any) => param.name === 'merged')
504
-
505
- let sort = ''
506
- let prioritySort = ''
507
- let releaseOrderIdQuery = ''
508
-
509
- // Require further evaluation. Potential performance issue.
510
- if (mergedPageParam) {
511
- releaseOrderIdQuery = `
512
- select rg.id from release_goods rg
513
- inner join order_inventories oi on oi.release_good_id = rg.id
514
- inner join worksheet_details wd on wd.target_inventory_id = oi.id
515
- inner join worksheets w on w.id = wd.worksheet_id
516
- where rg.route_id is not null and rg.type = 'b2b'
517
- and rg.domain_id = $1 and rg.bizplace_id = $2
518
- and w.type in ('BATCH_PICKING', 'SORTING', 'LOADING') and w.status = 'EXECUTING'
519
- and rg.id not in (select rg2.id from release_goods rg2
520
- inner join worksheets w2 on w2.release_good_id = rg2.id
521
- where rg2.domain_id = $1 and rg2.bizplace_id = $2
522
- and rg2.route_id is not null and rg2.type = 'b2b'
523
- and w2.type in ('PICKING'))
524
- group by rg.id
525
- `
526
- } else {
527
- releaseOrderIdQuery = `
528
- select rg.id from release_goods rg
529
- inner join worksheets w on w.release_good_id = rg.id
530
- where rg.domain_id = $1 and rg.bizplace_id = $2
531
- and rg.route_id is not null and rg.type = 'b2b'
532
- and w.type in ('PICKING', 'LOADING') and w.status = 'EXECUTING'
533
- and rg.id not in (select rg2.id from release_goods rg2
534
- inner join order_inventories oi2 on oi2.release_good_id = rg2.id
535
- inner join worksheet_details wd2 on wd2.target_inventory_id = oi2.id
536
- inner join worksheets w2 on w2.id = wd2.worksheet_id
537
- where rg2.route_id is not null and rg2.type = 'b2b'
538
- and rg2.domain_id = $1 and rg2.bizplace_id = $2
539
- and w2.type in ('BATCH_PICKING'))
540
- group by rg.id
541
- `
542
- }
543
-
544
- await tx.query(
545
- `
546
- create temp table temp_route_label ON COMMIT drop as (
547
- select distinct(ot.name) as "toteNumber", oi.id, rg3.name as "releaseGoodName", (case when ot.name is null then oi.release_qty else null end) as "releaseQty",
548
- (case when ot.name is null then p.sku else null end) as "productSKU", (case when ot.name is null then p.name else null end) as "productName", (case when ot.name is null then l.name else null end) as "binNumber",
549
- rg3.route_id as "routeId", rg3.store_id as "storeId", rg3.store_name as "storeName", rg3.stop_id as "stopId",
550
- rg3.created_at as "createdAt" from order_inventories oi
551
- inner join release_goods rg3 on rg3.id = oi.release_good_id
552
- inner join products p on p.id = oi.product_id
553
- left join locations l on l.id = oi.bin_location_id
554
- left join order_tote_items oti on oti.order_inventory_id = oi.id
555
- left join order_totes ot on ot.id = oti.order_tote_id
556
- where oi.release_good_id in
557
- (${releaseOrderIdQuery})
558
- )
559
- `,
560
- [domain.id, partnerId]
561
- )
562
-
563
- let withSkuQuery = withSkuParam?.value == true ? `AND tmp."binNumber" is null AND tmp."toteNumber" is null` : ''
564
- let withBinQuery = ''
565
- let withToteQuery =
566
- withToteParam?.value == true
567
- ? (withSkuParam?.value == true || binNumber ? `OR ` : 'AND ') + `tmp."toteNumber" is not null`
568
- : ''
569
-
570
- if (binNumber) {
571
- if (binNumber !== 'all' && binNumber !== '') {
572
- withBinQuery =
573
- (withSkuParam?.value == true || withToteParam?.value == false ? `OR ` : `AND `) +
574
- `tmp."binNumber" = '` +
575
- binNumber +
576
- `'`
577
- } else if (binNumber == 'all') {
578
- withBinQuery =
579
- (withSkuParam?.value == true || withToteParam?.value == false ? `OR ` : `AND `) +
580
- `tmp."binNumber" is not null`
581
- }
582
- }
583
-
584
- if (priority) {
585
- prioritySort = ' order by '
586
-
587
- switch (priority) {
588
- case 'roSku':
589
- prioritySort = prioritySort + '"createdAt" desc, "productSKU" asc'
590
- break
591
-
592
- case 'roBin':
593
- prioritySort = prioritySort + '"createdAt" desc, "binNumber" asc'
594
- break
595
-
596
- case 'roTote':
597
- prioritySort = prioritySort + '"createdAt" desc, "toteNumber" asc'
598
- break
599
-
600
- case 'skuRo':
601
- prioritySort = prioritySort + '"productSKU" asc, "createdAt" desc'
602
- break
603
-
604
- case 'skuBin':
605
- prioritySort = prioritySort + '"productSKU" asc, "binNumber" asc'
606
- break
607
-
608
- case 'binSku':
609
- prioritySort = prioritySort + '"binNumber" asc, "productSKU" asc'
610
- break
611
-
612
- case 'binRo':
613
- prioritySort = prioritySort + '"binNumber" asc, "createdAt" desc'
614
- break
615
-
616
- case 'toteRo':
617
- prioritySort = prioritySort + '"toteNumber" asc, "createdAt" desc'
618
- break
619
- }
620
- }
621
-
622
- if (sortings?.length !== 0) {
623
- const sorter = (sortings || []).reduce((acc, sort) => {
624
- const order: string = sort.desc ? 'DESC' : 'ASC'
625
-
626
- switch (sort.name) {
627
- case 'roName':
628
- acc = [...acc, '"releaseGoodName" ' + order]
629
- break
630
-
631
- case 'productSku':
632
- acc = [...acc, '"productSKU" ' + order]
633
- break
634
-
635
- case 'binNumber':
636
- acc = [...acc, '"binNumber" ' + order]
637
- break
638
-
639
- case 'toteNumber':
640
- acc = [...acc, '"toteNumber" ' + order]
641
- break
642
- }
643
-
644
- return acc
645
- }, [])
646
-
647
- sort = (priority ? ', ' : ' order by ') + sorter.toString()
648
- }
649
-
650
- let items = await tx.query(
651
- `
652
- select * from temp_route_label tmp where 1 = 1
653
- ${withSkuQuery}
654
- ${withBinQuery}
655
- ${withToteQuery}
656
- ${prioritySort}
657
- ${sort}
658
- `
659
- )
660
-
661
- let total = items.length
662
-
663
- return { items, total }
664
- } catch (e) {
665
- throw e
666
- }
667
- }
668
-
669
- @Query(returns => OrderInventoryList)
670
- async orderInventoriesForReleaseGood(
671
- @Ctx() context: ResolverContext,
672
- @Args(type => ListParam) params: ListParam,
673
- @Arg('productTypes', type => [String], { nullable: true }) productTypes?: string[]
674
- ): Promise<OrderInventoryList> {
675
- const { domain } = context.state
676
-
677
- const qb = getQueryBuilderFromListParams({
678
- repository: getRepository(OrderInventory),
679
- params,
680
- domain,
681
- alias: 'oi',
682
- searchables: ['bizplace', 'product', 'releaseGood', 'lot'],
683
- filtersMap: {
684
- lot: {
685
- /* 조인 테이블의 필터대상 컬럼이름을 디폴트('name')에서 다른 컬럼('sku')로 변경 */
686
- relationColumn: 'inventory',
687
- columnName: 'palletId'
688
- }
689
- }
690
- })
691
-
692
- qb.leftJoinAndSelect('oi.releaseGood', 'rg')
693
- .leftJoinAndSelect('rg.deliverTo', 'deliverTo')
694
- .leftJoinAndSelect('deliverTo.bizplace', 'deliverToBizplace')
695
- .leftJoinAndSelect('oi.inventory', 'i')
696
- .leftJoinAndSelect('oi.product', 'p')
697
- .leftJoinAndSelect('oi.bizplace', 'b')
698
- .andWhere('oi.type = :oiType', { oiType: 'RELEASE_OF_GOODS' })
699
- .andWhere('p.type IN (:...productTypes)', {
700
- productTypes: productTypes
701
- })
702
-
703
- const [items, total] = await qb.getManyAndCount()
704
-
705
- return { items, total }
706
- }
707
-
708
- @FieldResolver(type => Domain)
709
- async domain(@Root() orderInventory: OrderInventory): Promise<Domain> {
710
- return await getRepository(Domain).findOneBy({ id: orderInventory.domainId })
711
- }
712
-
713
- @FieldResolver(type => User)
714
- async creator(@Root() orderInventory: OrderInventory): Promise<User> {
715
- return await getRepository(User).findOneBy({ id: orderInventory.creatorId })
716
- }
717
-
718
- @FieldResolver(type => User)
719
- async updater(@Root() orderInventory: OrderInventory): Promise<User> {
720
- return await getRepository(User).findOneBy({ id: orderInventory.updaterId })
721
- }
722
- }