@things-factory/worksheet-base 4.1.15 → 4.1.20
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.
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +168 -0
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet-detail/index.js +5 -4
- package/dist-server/graphql/resolvers/worksheet-detail/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet-detail/index.js +10 -2
- package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
- package/package.json +17 -17
- package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +243 -0
- package/server/graphql/resolvers/worksheet-detail/index.ts +5 -3
- package/server/graphql/types/worksheet-detail/index.ts +10 -2
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generatePickingWorksheetDetailsResolver = void 0;
|
|
4
|
+
const sales_base_1 = require("@things-factory/sales-base");
|
|
5
|
+
const setting_base_1 = require("@things-factory/setting-base");
|
|
6
|
+
const warehouse_base_1 = require("@things-factory/warehouse-base");
|
|
7
|
+
const constants_1 = require("../../../constants");
|
|
8
|
+
const entities_1 = require("../../../entities");
|
|
9
|
+
const utils_1 = require("../../../utils");
|
|
10
|
+
exports.generatePickingWorksheetDetailsResolver = {
|
|
11
|
+
async generatePickingWorksheetDetails(_, { bizplaceId, selectedItems, pickingStrategy, worksheetNo, locationSortingRules }, context) {
|
|
12
|
+
const { tx, user, domain } = context.state;
|
|
13
|
+
// 1. find related worksheet
|
|
14
|
+
const worksheet = await tx.getRepository(entities_1.Worksheet).findOne({
|
|
15
|
+
where: { name: worksheetNo, status: constants_1.WORKSHEET_STATUS.DEACTIVATED, domain },
|
|
16
|
+
relations: ['releaseGood']
|
|
17
|
+
});
|
|
18
|
+
if (!worksheet)
|
|
19
|
+
throw new Error('picking worksheet not found');
|
|
20
|
+
const worksheetId = worksheet.id;
|
|
21
|
+
// 2. search for sorting rules
|
|
22
|
+
const inventoryAssignmentSetting = await tx.getRepository(setting_base_1.Setting).findOne({
|
|
23
|
+
where: { domain, name: 'rule-for-inventory-assignment' }
|
|
24
|
+
});
|
|
25
|
+
if (!locationSortingRules && inventoryAssignmentSetting) {
|
|
26
|
+
locationSortingRules = [];
|
|
27
|
+
let locationSetting = JSON.parse(inventoryAssignmentSetting.value);
|
|
28
|
+
for (const key in locationSetting) {
|
|
29
|
+
locationSortingRules.push({ name: key, desc: locationSetting[key] == 'ASC' ? false : true });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
// 3. get all related inventories by strategy
|
|
34
|
+
let inventories = await (0, warehouse_base_1.getInventoriesByStrategy)(domain.id, bizplaceId, worksheetId, selectedItems, pickingStrategy, locationSortingRules, tx);
|
|
35
|
+
// 4. get worksheet details
|
|
36
|
+
let worksheetDetails = selectedItems.reduce((accWSD, oi) => {
|
|
37
|
+
const relatedInventories = inventories.filter(inv => inv.productId == oi.productId &&
|
|
38
|
+
inv.batchId == oi.batchId &&
|
|
39
|
+
inv.packingType == oi.packingType &&
|
|
40
|
+
inv.packingSize == oi.packingSize &&
|
|
41
|
+
inv.uom == oi.uom &&
|
|
42
|
+
inv.remainQty);
|
|
43
|
+
if (relatedInventories.length &&
|
|
44
|
+
oi.releaseQty <= inventories.reduce((totalQty, inv) => totalQty + inv.remainQty, 0)) {
|
|
45
|
+
let composedWSD = _composeWorksheetDetails(domain, user, worksheet.releaseGood, bizplaceId, oi, relatedInventories);
|
|
46
|
+
accWSD.push(...composedWSD);
|
|
47
|
+
}
|
|
48
|
+
return accWSD;
|
|
49
|
+
}, []);
|
|
50
|
+
let targetInventories = worksheetDetails.map((wsd) => wsd.targetInventory);
|
|
51
|
+
// 5. remove existing worksheet details and its target inventory if there's any
|
|
52
|
+
await _removeOldWorksheetDetails(targetInventories, worksheet.id, tx);
|
|
53
|
+
targetInventories = await tx.getRepository(sales_base_1.OrderInventory).save(targetInventories);
|
|
54
|
+
let newWorksheetDetails = [];
|
|
55
|
+
for (let i = 0, l = targetInventories.length; i < l; i++) {
|
|
56
|
+
const targetInventory = targetInventories[i];
|
|
57
|
+
// 6. update inventory lockedQty and lockedUomValue
|
|
58
|
+
await tx
|
|
59
|
+
.createQueryBuilder()
|
|
60
|
+
.update(warehouse_base_1.Inventory)
|
|
61
|
+
.set({
|
|
62
|
+
lockedQty: () => `COALESCE("locked_qty", 0) + ${targetInventory.releaseQty}`,
|
|
63
|
+
lockedUomValue: () => `COALESCE("locked_uom_value", 0) + ${targetInventory.releaseUomValue}`,
|
|
64
|
+
updater: user
|
|
65
|
+
})
|
|
66
|
+
.where('id = :id', { id: targetInventory.inventory.id })
|
|
67
|
+
.execute();
|
|
68
|
+
// 7. collect new worksheet details records
|
|
69
|
+
const worksheetDetail = Object.assign(new entities_1.WorksheetDetail(), {
|
|
70
|
+
domain,
|
|
71
|
+
bizplace: { id: bizplaceId },
|
|
72
|
+
worksheet,
|
|
73
|
+
name: utils_1.WorksheetNoGenerator.pickingDetail(),
|
|
74
|
+
seq: 0,
|
|
75
|
+
targetInventory,
|
|
76
|
+
type: constants_1.WORKSHEET_TYPE.PICKING,
|
|
77
|
+
status: constants_1.WORKSHEET_STATUS.DEACTIVATED,
|
|
78
|
+
creator: user,
|
|
79
|
+
updater: user
|
|
80
|
+
});
|
|
81
|
+
newWorksheetDetails.push(worksheetDetail);
|
|
82
|
+
}
|
|
83
|
+
// 8. save worksheet details
|
|
84
|
+
await tx.getRepository(entities_1.WorksheetDetail).save(newWorksheetDetails);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
function _composeWorksheetDetails(domain, user, releaseGood, bizplaceId, record, inventories) {
|
|
93
|
+
let leftReleaseQty = record.releaseQty;
|
|
94
|
+
let leftReleaseUomValue = record.releaseUomValue;
|
|
95
|
+
let compReleaseQty = 0;
|
|
96
|
+
let compReleaseUomValue = 0;
|
|
97
|
+
let worksheetDetails = [];
|
|
98
|
+
let idx = 0;
|
|
99
|
+
while (compReleaseQty < record.releaseQty) {
|
|
100
|
+
const inv = inventories[idx];
|
|
101
|
+
let releaseQty = 0;
|
|
102
|
+
let releaseUomValue = 0;
|
|
103
|
+
if (inv.remainQty > leftReleaseQty) {
|
|
104
|
+
compReleaseQty += leftReleaseQty;
|
|
105
|
+
compReleaseUomValue += leftReleaseUomValue;
|
|
106
|
+
releaseQty = leftReleaseQty;
|
|
107
|
+
releaseUomValue = leftReleaseUomValue;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
compReleaseQty += inv.remainQty;
|
|
111
|
+
compReleaseUomValue += inv.remainUomValue;
|
|
112
|
+
leftReleaseQty -= inv.remainQty;
|
|
113
|
+
leftReleaseUomValue -= inv.remainUomValue;
|
|
114
|
+
releaseQty = inv.remainQty;
|
|
115
|
+
releaseUomValue = inv.remainUomValue;
|
|
116
|
+
}
|
|
117
|
+
let worksheetDetail = Object.assign(new entities_1.WorksheetDetail(), {
|
|
118
|
+
targetInventory: {
|
|
119
|
+
domain,
|
|
120
|
+
bizplace: { id: bizplaceId },
|
|
121
|
+
name: sales_base_1.OrderNoGenerator.orderInventory(),
|
|
122
|
+
releaseGood,
|
|
123
|
+
inventory: { id: inv.id },
|
|
124
|
+
product: { id: inv.productId },
|
|
125
|
+
batchId: inv.batchId,
|
|
126
|
+
batchIdRef: inv.batchIdRef,
|
|
127
|
+
packingType: inv.packingType,
|
|
128
|
+
packingSize: inv.packingSize,
|
|
129
|
+
releaseQty,
|
|
130
|
+
releaseUomValue,
|
|
131
|
+
creator: user,
|
|
132
|
+
updater: user,
|
|
133
|
+
status: sales_base_1.ORDER_INVENTORY_STATUS.READY_TO_PICK,
|
|
134
|
+
type: sales_base_1.ORDER_TYPES.RELEASE_OF_GOODS.value
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
worksheetDetails.push(worksheetDetail);
|
|
138
|
+
idx++;
|
|
139
|
+
}
|
|
140
|
+
return worksheetDetails;
|
|
141
|
+
}
|
|
142
|
+
async function _removeOldWorksheetDetails(targetInventories, worksheetId, tx) {
|
|
143
|
+
let orderProductJson = JSON.stringify(targetInventories.map((target) => {
|
|
144
|
+
return {
|
|
145
|
+
product_id: target.product.id,
|
|
146
|
+
batch_id: target.batchId,
|
|
147
|
+
packing_type: target.packingType,
|
|
148
|
+
packing_size: target.packingSize
|
|
149
|
+
};
|
|
150
|
+
}));
|
|
151
|
+
// get worksheetDetail IDs and their targetInventory IDs
|
|
152
|
+
let existingOIandWSD = await tx.query(`
|
|
153
|
+
SELECT wsd.id AS "worksheetDetailId", oi.id AS "orderInventoryId"
|
|
154
|
+
FROM order_inventories oi
|
|
155
|
+
INNER JOIN JSON_POPULATE_RECORDSET(NULL::order_products, $1) js ON oi.batch_id = js.batch_id
|
|
156
|
+
AND oi.product_id = js.product_id
|
|
157
|
+
AND oi.packing_type = js.packing_type
|
|
158
|
+
AND oi.packing_size = js.packing_size
|
|
159
|
+
LEFT JOIN worksheet_details wsd ON oi.id = wsd.target_inventory_id
|
|
160
|
+
WHERE oi.release_good_id = $2
|
|
161
|
+
`, [orderProductJson, worksheetId]);
|
|
162
|
+
// if found the records then delete, so that we can create new records
|
|
163
|
+
if (existingOIandWSD.length) {
|
|
164
|
+
await tx.getRepository(entities_1.WorksheetDetail).delete(existingOIandWSD.map((wsd) => wsd.worksheetDetailId));
|
|
165
|
+
await tx.getRepository(sales_base_1.OrderInventory).delete(existingOIandWSD.map((wsd) => wsd.orderInventoryId));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=generate-picking-worksheet-details.js.map
|
package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-picking-worksheet-details.js","sourceRoot":"","sources":["../../../../server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Mutation = exports.Query = void 0;
|
|
4
|
+
const check_progressing_pallet_1 = require("./check-progressing-pallet");
|
|
4
5
|
const create_worksheet_detail_1 = require("./create-worksheet-detail");
|
|
5
6
|
const delete_worksheet_detail_1 = require("./delete-worksheet-detail");
|
|
6
|
-
const generate_release_good_worksheet_details_1 = require("./generate-release-good-worksheet-details");
|
|
7
7
|
const generate_batch_picking_worksheet_details_1 = require("./generate-batch-picking-worksheet-details");
|
|
8
8
|
const generate_batch_picking_worksheet_details_by_bulk_1 = require("./generate-batch-picking-worksheet-details-by-bulk");
|
|
9
|
-
const check_progressing_pallet_1 = require("./check-progressing-pallet");
|
|
10
|
-
const generate_pallet_id_1 = require("./generate-pallet-id");
|
|
11
9
|
const generate_carton_id_1 = require("./generate-carton-id");
|
|
10
|
+
const generate_pallet_id_1 = require("./generate-pallet-id");
|
|
11
|
+
const generate_picking_worksheet_details_1 = require("./generate-picking-worksheet-details");
|
|
12
|
+
const generate_release_good_worksheet_details_1 = require("./generate-release-good-worksheet-details");
|
|
12
13
|
const update_worksheet_detail_1 = require("./update-worksheet-detail");
|
|
13
14
|
const worksheet_detail_1 = require("./worksheet-detail");
|
|
14
15
|
const worksheet_details_1 = require("./worksheet-details");
|
|
15
16
|
const worksheet_details_by_product_group_1 = require("./worksheet-details-by-product-group");
|
|
16
17
|
exports.Query = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, worksheet_details_1.worksheetDetailsResolver), worksheet_detail_1.worksheetDetailResolver), worksheet_details_by_product_group_1.worksheetDetailsByProductGroupResolver), check_progressing_pallet_1.checkProgressingPalletResolver), generate_pallet_id_1.generatePalletIdResolver), generate_carton_id_1.generateCartonIdResolver);
|
|
17
|
-
exports.Mutation = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, update_worksheet_detail_1.updateWorksheetDetail), create_worksheet_detail_1.createWorksheetDetail), delete_worksheet_detail_1.deleteWorksheetDetail), generate_batch_picking_worksheet_details_1.generateBatchPickingWorksheetDetailsResolver), generate_batch_picking_worksheet_details_by_bulk_1.generateBatchPickingWorksheetDetailsByBulkResolver), generate_release_good_worksheet_details_1.generateReleaseGoodWorksheetDetailsResolver);
|
|
18
|
+
exports.Mutation = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, update_worksheet_detail_1.updateWorksheetDetail), create_worksheet_detail_1.createWorksheetDetail), delete_worksheet_detail_1.deleteWorksheetDetail), generate_batch_picking_worksheet_details_1.generateBatchPickingWorksheetDetailsResolver), generate_batch_picking_worksheet_details_by_bulk_1.generateBatchPickingWorksheetDetailsByBulkResolver), generate_picking_worksheet_details_1.generatePickingWorksheetDetailsResolver), generate_release_good_worksheet_details_1.generateReleaseGoodWorksheetDetailsResolver);
|
|
18
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/resolvers/worksheet-detail/index.ts"],"names":[],"mappings":";;;AAAA,uEAAiE;AACjE,uEAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/resolvers/worksheet-detail/index.ts"],"names":[],"mappings":";;;AAAA,yEAA2E;AAC3E,uEAAiE;AACjE,uEAAiE;AACjE,yGAAyG;AACzG,yHAAuH;AACvH,6DAA+D;AAC/D,6DAA+D;AAC/D,6FAA8F;AAC9F,uGAAuG;AACvG,uEAAiE;AACjE,yDAA4D;AAC5D,2DAA8D;AAC9D,6FAA6F;AAEhF,QAAA,KAAK,2FACb,4CAAwB,GACxB,0CAAuB,GACvB,2EAAsC,GACtC,yDAA8B,GAC9B,6CAAwB,GACxB,6CAAwB,EAC5B;AAEY,QAAA,QAAQ,yGAChB,+CAAqB,GACrB,+CAAqB,GACrB,+CAAqB,GACrB,uFAA4C,GAC5C,qGAAkD,GAClD,4EAAuC,GACvC,qFAA2C,EAC/C"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Types = exports.Query = exports.Mutation = void 0;
|
|
4
|
+
const inventory_detail_1 = require("./inventory-detail");
|
|
4
5
|
const new_worksheet_detail_1 = require("./new-worksheet-detail");
|
|
6
|
+
const pallet_info_1 = require("./pallet-info");
|
|
5
7
|
const worksheet_detail_1 = require("./worksheet-detail");
|
|
6
8
|
const worksheet_detail_list_1 = require("./worksheet-detail-list");
|
|
7
9
|
const worksheet_detail_patch_1 = require("./worksheet-detail-patch");
|
|
8
|
-
const pallet_info_1 = require("./pallet-info");
|
|
9
|
-
const inventory_detail_1 = require("./inventory-detail");
|
|
10
10
|
exports.Mutation = `
|
|
11
11
|
createWorksheetDetail (
|
|
12
12
|
worksheetDetail: NewWorksheetDetail!
|
|
@@ -46,6 +46,14 @@ exports.Mutation = `
|
|
|
46
46
|
pickingStrategy: String!
|
|
47
47
|
): Boolean @transaction
|
|
48
48
|
|
|
49
|
+
generatePickingWorksheetDetails(
|
|
50
|
+
bizplaceId: String!
|
|
51
|
+
selectedItems: [OrderInventoryPatch]!
|
|
52
|
+
pickingStrategy: String!
|
|
53
|
+
worksheetNo: String!
|
|
54
|
+
locationSortingRules: [Sorting]
|
|
55
|
+
): Boolean @transaction
|
|
56
|
+
|
|
49
57
|
`;
|
|
50
58
|
exports.Query = `
|
|
51
59
|
worksheetDetails(filters: [Filter], pagination: Pagination, sortings: [Sorting]): WorksheetDetailList @transaction
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/types/worksheet-detail/index.ts"],"names":[],"mappings":";;;AAAA,iEAA2D;AAC3D,yDAAoD;AACpD,mEAA6D;AAC7D,qEAA+D;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/types/worksheet-detail/index.ts"],"names":[],"mappings":";;;AAAA,yDAAoD;AACpD,iEAA2D;AAC3D,+CAA0C;AAC1C,yDAAoD;AACpD,mEAA6D;AAC7D,qEAA+D;AAElD,QAAA,QAAQ,GAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CrC,CAAA;AAEY,QAAA,KAAK,GAAiB;;;;;;;CAOlC,CAAA;AAEY,QAAA,KAAK,GAAG;IACnB,kCAAe;IACf,yCAAkB;IAClB,6CAAoB;IACpB,2CAAmB;IACnB,wBAAU;IACV,kCAAe;CAChB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/worksheet-base",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.20",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -24,21 +24,21 @@
|
|
|
24
24
|
"migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@things-factory/auth-base": "^4.1.
|
|
28
|
-
"@things-factory/biz-base": "^4.1.
|
|
29
|
-
"@things-factory/document-template-base": "^4.1.
|
|
30
|
-
"@things-factory/id-rule-base": "^4.1.
|
|
31
|
-
"@things-factory/integration-lmd": "^4.1.
|
|
32
|
-
"@things-factory/integration-marketplace": "^4.1.
|
|
33
|
-
"@things-factory/integration-sellercraft": "^4.1.
|
|
34
|
-
"@things-factory/integration-sftp": "^4.1.
|
|
35
|
-
"@things-factory/marketplace-base": "^4.1.
|
|
36
|
-
"@things-factory/notification": "^4.1.
|
|
37
|
-
"@things-factory/sales-base": "^4.1.
|
|
38
|
-
"@things-factory/setting-base": "^4.1.
|
|
39
|
-
"@things-factory/shell": "^4.1.
|
|
40
|
-
"@things-factory/transport-base": "^4.1.
|
|
41
|
-
"@things-factory/warehouse-base": "^4.1.
|
|
27
|
+
"@things-factory/auth-base": "^4.1.19",
|
|
28
|
+
"@things-factory/biz-base": "^4.1.19",
|
|
29
|
+
"@things-factory/document-template-base": "^4.1.19",
|
|
30
|
+
"@things-factory/id-rule-base": "^4.1.19",
|
|
31
|
+
"@things-factory/integration-lmd": "^4.1.19",
|
|
32
|
+
"@things-factory/integration-marketplace": "^4.1.19",
|
|
33
|
+
"@things-factory/integration-sellercraft": "^4.1.19",
|
|
34
|
+
"@things-factory/integration-sftp": "^4.1.20",
|
|
35
|
+
"@things-factory/marketplace-base": "^4.1.19",
|
|
36
|
+
"@things-factory/notification": "^4.1.19",
|
|
37
|
+
"@things-factory/sales-base": "^4.1.20",
|
|
38
|
+
"@things-factory/setting-base": "^4.1.19",
|
|
39
|
+
"@things-factory/shell": "^4.1.19",
|
|
40
|
+
"@things-factory/transport-base": "^4.1.19",
|
|
41
|
+
"@things-factory/warehouse-base": "^4.1.19"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "0b69ffb74cfc1810aebe5824cc5076224d9bad02"
|
|
44
44
|
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { EntityManager } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { User } from '@things-factory/auth-base'
|
|
4
|
+
import {
|
|
5
|
+
ORDER_INVENTORY_STATUS,
|
|
6
|
+
ORDER_TYPES,
|
|
7
|
+
OrderInventory,
|
|
8
|
+
OrderInventoryPatch,
|
|
9
|
+
OrderNoGenerator,
|
|
10
|
+
ReleaseGood
|
|
11
|
+
} from '@things-factory/sales-base'
|
|
12
|
+
import { Setting } from '@things-factory/setting-base'
|
|
13
|
+
import { Domain } from '@things-factory/shell'
|
|
14
|
+
import { getInventoriesByStrategy, Inventory } from '@things-factory/warehouse-base'
|
|
15
|
+
|
|
16
|
+
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
|
|
17
|
+
import { Worksheet, WorksheetDetail } from '../../../entities'
|
|
18
|
+
import { WorksheetNoGenerator } from '../../../utils'
|
|
19
|
+
|
|
20
|
+
export const generatePickingWorksheetDetailsResolver = {
|
|
21
|
+
async generatePickingWorksheetDetails(
|
|
22
|
+
_: any,
|
|
23
|
+
{ bizplaceId, selectedItems, pickingStrategy, worksheetNo, locationSortingRules },
|
|
24
|
+
context: any
|
|
25
|
+
): Promise<Boolean> {
|
|
26
|
+
const { tx, user, domain }: { tx: EntityManager; user: User; domain: Domain } = context.state
|
|
27
|
+
|
|
28
|
+
// 1. find related worksheet
|
|
29
|
+
const worksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
|
|
30
|
+
where: { name: worksheetNo, status: WORKSHEET_STATUS.DEACTIVATED, domain },
|
|
31
|
+
relations: ['releaseGood']
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
if (!worksheet) throw new Error('picking worksheet not found')
|
|
35
|
+
const worksheetId = worksheet.id
|
|
36
|
+
|
|
37
|
+
// 2. search for sorting rules
|
|
38
|
+
const inventoryAssignmentSetting: Setting = await tx.getRepository(Setting).findOne({
|
|
39
|
+
where: { domain, name: 'rule-for-inventory-assignment' }
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
if (!locationSortingRules && inventoryAssignmentSetting) {
|
|
43
|
+
locationSortingRules = []
|
|
44
|
+
let locationSetting = JSON.parse(inventoryAssignmentSetting.value)
|
|
45
|
+
for (const key in locationSetting) {
|
|
46
|
+
locationSortingRules.push({ name: key, desc: locationSetting[key] == 'ASC' ? false : true })
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
try {
|
|
51
|
+
// 3. get all related inventories by strategy
|
|
52
|
+
let inventories: any[] = await getInventoriesByStrategy(
|
|
53
|
+
domain.id,
|
|
54
|
+
bizplaceId,
|
|
55
|
+
worksheetId,
|
|
56
|
+
selectedItems,
|
|
57
|
+
pickingStrategy,
|
|
58
|
+
locationSortingRules,
|
|
59
|
+
tx
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
// 4. get worksheet details
|
|
63
|
+
let worksheetDetails: WorksheetDetail[] = selectedItems.reduce(
|
|
64
|
+
(accWSD: WorksheetDetail[], oi: OrderInventoryPatch) => {
|
|
65
|
+
const relatedInventories = inventories.filter(
|
|
66
|
+
inv =>
|
|
67
|
+
inv.productId == oi.productId &&
|
|
68
|
+
inv.batchId == oi.batchId &&
|
|
69
|
+
inv.packingType == oi.packingType &&
|
|
70
|
+
inv.packingSize == oi.packingSize &&
|
|
71
|
+
inv.uom == oi.uom &&
|
|
72
|
+
inv.remainQty
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
if (
|
|
76
|
+
relatedInventories.length &&
|
|
77
|
+
oi.releaseQty <= inventories.reduce((totalQty: number, inv) => totalQty + inv.remainQty, 0)
|
|
78
|
+
) {
|
|
79
|
+
let composedWSD: WorksheetDetail[] = _composeWorksheetDetails(
|
|
80
|
+
domain,
|
|
81
|
+
user,
|
|
82
|
+
worksheet.releaseGood,
|
|
83
|
+
bizplaceId,
|
|
84
|
+
oi,
|
|
85
|
+
relatedInventories
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
accWSD.push(...composedWSD)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return accWSD
|
|
92
|
+
},
|
|
93
|
+
[]
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
let targetInventories: OrderInventory = worksheetDetails.map((wsd: WorksheetDetail) => wsd.targetInventory)
|
|
97
|
+
|
|
98
|
+
// 5. remove existing worksheet details and its target inventory if there's any
|
|
99
|
+
await _removeOldWorksheetDetails(targetInventories, worksheet.id, tx)
|
|
100
|
+
|
|
101
|
+
targetInventories = await tx.getRepository(OrderInventory).save(targetInventories)
|
|
102
|
+
|
|
103
|
+
let newWorksheetDetails: WorksheetDetail[] = []
|
|
104
|
+
|
|
105
|
+
for (let i = 0, l = targetInventories.length; i < l; i++) {
|
|
106
|
+
const targetInventory: OrderInventory = targetInventories[i]
|
|
107
|
+
|
|
108
|
+
// 6. update inventory lockedQty and lockedUomValue
|
|
109
|
+
await tx
|
|
110
|
+
.createQueryBuilder()
|
|
111
|
+
.update(Inventory)
|
|
112
|
+
.set({
|
|
113
|
+
lockedQty: () => `COALESCE("locked_qty", 0) + ${targetInventory.releaseQty}`,
|
|
114
|
+
lockedUomValue: () => `COALESCE("locked_uom_value", 0) + ${targetInventory.releaseUomValue}`,
|
|
115
|
+
updater: user
|
|
116
|
+
})
|
|
117
|
+
.where('id = :id', { id: targetInventory.inventory.id })
|
|
118
|
+
.execute()
|
|
119
|
+
|
|
120
|
+
// 7. collect new worksheet details records
|
|
121
|
+
const worksheetDetail: WorksheetDetail = Object.assign(new WorksheetDetail(), {
|
|
122
|
+
domain,
|
|
123
|
+
bizplace: { id: bizplaceId },
|
|
124
|
+
worksheet,
|
|
125
|
+
name: WorksheetNoGenerator.pickingDetail(),
|
|
126
|
+
seq: 0,
|
|
127
|
+
targetInventory,
|
|
128
|
+
type: WORKSHEET_TYPE.PICKING,
|
|
129
|
+
status: WORKSHEET_STATUS.DEACTIVATED,
|
|
130
|
+
creator: user,
|
|
131
|
+
updater: user
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
newWorksheetDetails.push(worksheetDetail)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// 8. save worksheet details
|
|
138
|
+
await tx.getRepository(WorksheetDetail).save(newWorksheetDetails)
|
|
139
|
+
|
|
140
|
+
return true
|
|
141
|
+
} catch (error) {
|
|
142
|
+
throw error
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function _composeWorksheetDetails(
|
|
148
|
+
domain: Domain,
|
|
149
|
+
user: User,
|
|
150
|
+
releaseGood: ReleaseGood,
|
|
151
|
+
bizplaceId: string,
|
|
152
|
+
record: OrderInventoryPatch,
|
|
153
|
+
inventories: Inventory[]
|
|
154
|
+
): WorksheetDetail[] {
|
|
155
|
+
let leftReleaseQty: number = record.releaseQty
|
|
156
|
+
let leftReleaseUomValue: number = record.releaseUomValue
|
|
157
|
+
let compReleaseQty: number = 0
|
|
158
|
+
let compReleaseUomValue: number = 0
|
|
159
|
+
|
|
160
|
+
let worksheetDetails: Partial<WorksheetDetail[]> = []
|
|
161
|
+
let idx = 0
|
|
162
|
+
|
|
163
|
+
while (compReleaseQty < record.releaseQty) {
|
|
164
|
+
const inv = inventories[idx]
|
|
165
|
+
let releaseQty: number = 0
|
|
166
|
+
let releaseUomValue: number = 0
|
|
167
|
+
|
|
168
|
+
if (inv.remainQty > leftReleaseQty) {
|
|
169
|
+
compReleaseQty += leftReleaseQty
|
|
170
|
+
compReleaseUomValue += leftReleaseUomValue
|
|
171
|
+
releaseQty = leftReleaseQty
|
|
172
|
+
releaseUomValue = leftReleaseUomValue
|
|
173
|
+
} else {
|
|
174
|
+
compReleaseQty += inv.remainQty
|
|
175
|
+
compReleaseUomValue += inv.remainUomValue
|
|
176
|
+
leftReleaseQty -= inv.remainQty
|
|
177
|
+
leftReleaseUomValue -= inv.remainUomValue
|
|
178
|
+
releaseQty = inv.remainQty
|
|
179
|
+
releaseUomValue = inv.remainUomValue
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
let worksheetDetail: WorksheetDetail = Object.assign(new WorksheetDetail(), {
|
|
183
|
+
targetInventory: {
|
|
184
|
+
domain,
|
|
185
|
+
bizplace: { id: bizplaceId },
|
|
186
|
+
name: OrderNoGenerator.orderInventory(),
|
|
187
|
+
releaseGood,
|
|
188
|
+
inventory: { id: inv.id },
|
|
189
|
+
product: { id: inv.productId },
|
|
190
|
+
batchId: inv.batchId,
|
|
191
|
+
batchIdRef: inv.batchIdRef,
|
|
192
|
+
packingType: inv.packingType,
|
|
193
|
+
packingSize: inv.packingSize,
|
|
194
|
+
releaseQty,
|
|
195
|
+
releaseUomValue,
|
|
196
|
+
creator: user,
|
|
197
|
+
updater: user,
|
|
198
|
+
status: ORDER_INVENTORY_STATUS.READY_TO_PICK,
|
|
199
|
+
type: ORDER_TYPES.RELEASE_OF_GOODS.value
|
|
200
|
+
}
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
worksheetDetails.push(worksheetDetail)
|
|
204
|
+
|
|
205
|
+
idx++
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return worksheetDetails
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
async function _removeOldWorksheetDetails(targetInventories: OrderInventory[], worksheetId: string, tx: EntityManager) {
|
|
212
|
+
let orderProductJson = JSON.stringify(
|
|
213
|
+
targetInventories.map((target: OrderInventory) => {
|
|
214
|
+
return {
|
|
215
|
+
product_id: target.product.id,
|
|
216
|
+
batch_id: target.batchId,
|
|
217
|
+
packing_type: target.packingType,
|
|
218
|
+
packing_size: target.packingSize
|
|
219
|
+
}
|
|
220
|
+
})
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
// get worksheetDetail IDs and their targetInventory IDs
|
|
224
|
+
let existingOIandWSD: WorksheetDetail[] = await tx.query(
|
|
225
|
+
`
|
|
226
|
+
SELECT wsd.id AS "worksheetDetailId", oi.id AS "orderInventoryId"
|
|
227
|
+
FROM order_inventories oi
|
|
228
|
+
INNER JOIN JSON_POPULATE_RECORDSET(NULL::order_products, $1) js ON oi.batch_id = js.batch_id
|
|
229
|
+
AND oi.product_id = js.product_id
|
|
230
|
+
AND oi.packing_type = js.packing_type
|
|
231
|
+
AND oi.packing_size = js.packing_size
|
|
232
|
+
LEFT JOIN worksheet_details wsd ON oi.id = wsd.target_inventory_id
|
|
233
|
+
WHERE oi.release_good_id = $2
|
|
234
|
+
`,
|
|
235
|
+
[orderProductJson, worksheetId]
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
// if found the records then delete, so that we can create new records
|
|
239
|
+
if (existingOIandWSD.length) {
|
|
240
|
+
await tx.getRepository(WorksheetDetail).delete(existingOIandWSD.map((wsd: any) => wsd.worksheetDetailId))
|
|
241
|
+
await tx.getRepository(OrderInventory).delete(existingOIandWSD.map((wsd: any) => wsd.orderInventoryId))
|
|
242
|
+
}
|
|
243
|
+
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { checkProgressingPalletResolver } from './check-progressing-pallet'
|
|
1
2
|
import { createWorksheetDetail } from './create-worksheet-detail'
|
|
2
3
|
import { deleteWorksheetDetail } from './delete-worksheet-detail'
|
|
3
|
-
import { generateReleaseGoodWorksheetDetailsResolver } from './generate-release-good-worksheet-details'
|
|
4
4
|
import { generateBatchPickingWorksheetDetailsResolver } from './generate-batch-picking-worksheet-details'
|
|
5
5
|
import { generateBatchPickingWorksheetDetailsByBulkResolver } from './generate-batch-picking-worksheet-details-by-bulk'
|
|
6
|
-
import { checkProgressingPalletResolver } from './check-progressing-pallet'
|
|
7
|
-
import { generatePalletIdResolver } from './generate-pallet-id'
|
|
8
6
|
import { generateCartonIdResolver } from './generate-carton-id'
|
|
7
|
+
import { generatePalletIdResolver } from './generate-pallet-id'
|
|
8
|
+
import { generatePickingWorksheetDetailsResolver } from './generate-picking-worksheet-details'
|
|
9
|
+
import { generateReleaseGoodWorksheetDetailsResolver } from './generate-release-good-worksheet-details'
|
|
9
10
|
import { updateWorksheetDetail } from './update-worksheet-detail'
|
|
10
11
|
import { worksheetDetailResolver } from './worksheet-detail'
|
|
11
12
|
import { worksheetDetailsResolver } from './worksheet-details'
|
|
@@ -26,5 +27,6 @@ export const Mutation = {
|
|
|
26
27
|
...deleteWorksheetDetail,
|
|
27
28
|
...generateBatchPickingWorksheetDetailsResolver,
|
|
28
29
|
...generateBatchPickingWorksheetDetailsByBulkResolver,
|
|
30
|
+
...generatePickingWorksheetDetailsResolver,
|
|
29
31
|
...generateReleaseGoodWorksheetDetailsResolver
|
|
30
32
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { InventoryDetail } from './inventory-detail'
|
|
1
2
|
import { NewWorksheetDetail } from './new-worksheet-detail'
|
|
3
|
+
import { PalletInfo } from './pallet-info'
|
|
2
4
|
import { WorksheetDetail } from './worksheet-detail'
|
|
3
5
|
import { WorksheetDetailList } from './worksheet-detail-list'
|
|
4
6
|
import { WorksheetDetailPatch } from './worksheet-detail-patch'
|
|
5
|
-
import { PalletInfo } from './pallet-info'
|
|
6
|
-
import { InventoryDetail } from './inventory-detail'
|
|
7
7
|
|
|
8
8
|
export const Mutation = /* GraphQL */ `
|
|
9
9
|
createWorksheetDetail (
|
|
@@ -44,6 +44,14 @@ export const Mutation = /* GraphQL */ `
|
|
|
44
44
|
pickingStrategy: String!
|
|
45
45
|
): Boolean @transaction
|
|
46
46
|
|
|
47
|
+
generatePickingWorksheetDetails(
|
|
48
|
+
bizplaceId: String!
|
|
49
|
+
selectedItems: [OrderInventoryPatch]!
|
|
50
|
+
pickingStrategy: String!
|
|
51
|
+
worksheetNo: String!
|
|
52
|
+
locationSortingRules: [Sorting]
|
|
53
|
+
): Boolean @transaction
|
|
54
|
+
|
|
47
55
|
`
|
|
48
56
|
|
|
49
57
|
export const Query = /* GraphQL */ `
|