@things-factory/ops-master 10.1.81 → 10.1.106
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-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/ai-entry/master-entry-rules.d.ts +175 -0
- package/dist-server/service/ai-entry/master-entry-rules.js +302 -0
- package/dist-server/service/ai-entry/master-entry-rules.js.map +1 -0
- package/dist-server/service/ai-entry/master-entry-targets.d.ts +23 -0
- package/dist-server/service/ai-entry/master-entry-targets.js +293 -0
- package/dist-server/service/ai-entry/master-entry-targets.js.map +1 -0
- package/dist-server/service/index.d.ts +2 -0
- package/dist-server/service/index.js +10 -1
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/translations/en.json +21 -1
- package/translations/ja.json +21 -1
- package/translations/ko.json +21 -1
- package/translations/ms.json +21 -1
- package/translations/zh.json +21 -1
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.changeableFieldsOf = exports.OPS_MASTER_ENTRY_SPECS = void 0;
|
|
37
|
+
exports.opsMasterEntryTargetOf = opsMasterEntryTargetOf;
|
|
38
|
+
exports.opsMasterEntryTargets = opsMasterEntryTargets;
|
|
39
|
+
/*
|
|
40
|
+
* AI 입력 대상 — the master records the assistant may enter and change from material: a spreadsheet of locations, a
|
|
41
|
+
* list of equipment, a page of stop reasons (operato-application/design/ai/data-entry.md).
|
|
42
|
+
*
|
|
43
|
+
* Plain declarations. An application that runs `@things-factory/ai-assistant` registers each one:
|
|
44
|
+
*
|
|
45
|
+
* for (const target of opsMasterEntryTargets()) registerEntryTarget(target)
|
|
46
|
+
*
|
|
47
|
+
* and opens the ones a mode should offer by key (`entryTargets: ['ops-master.equipment']`).
|
|
48
|
+
*
|
|
49
|
+
* Every row goes through the master screen's own mutation (`updateMultiple<Axis>`), one row per call, run with the
|
|
50
|
+
* person's request state - the same privilege, the same change policy, the same refusals as the grid. A row is sent
|
|
51
|
+
* with **only the declared fields**: a change saves `{ ...found, ...values }`, so anything else would overwrite the
|
|
52
|
+
* record. `applied` is never sent: a tracked field changed here is claimed from now.
|
|
53
|
+
*/
|
|
54
|
+
const ops_contract_1 = require("@operato/ops-contract");
|
|
55
|
+
const state_period_rules_1 = require("../equipment/state-period-rules");
|
|
56
|
+
const master_entry_rules_1 = require("./master-entry-rules");
|
|
57
|
+
const PAGE = { page: 1, limit: 20 };
|
|
58
|
+
const namedBy = (list) => ({
|
|
59
|
+
query: `query ($search: String, $pagination: Pagination) { ${list}(search: $search, pagination: $pagination) { items { name description } } }`,
|
|
60
|
+
variables: text => ({ search: text, pagination: PAGE }),
|
|
61
|
+
recordsOf: (data, text) => (0, master_entry_rules_1.mastersNamed)(data, list, text)
|
|
62
|
+
});
|
|
63
|
+
const NAME = { name: 'name', type: 'string', required: true, labelKey: 'field.name', description: 'the name (code) exactly as the material writes it - unique on this list; never make one up' };
|
|
64
|
+
const DESCRIPTION = { name: 'description', type: 'string', labelKey: 'field.description', description: 'what it is, in the words of the material' };
|
|
65
|
+
const homeLocation = (required) => ({
|
|
66
|
+
name: 'homeLocation',
|
|
67
|
+
type: 'reference',
|
|
68
|
+
...(required ? { required } : {}),
|
|
69
|
+
labelKey: 'field.home-location',
|
|
70
|
+
description: 'the operational location it belongs to, as the material names it - its name or its description',
|
|
71
|
+
reference: namedBy('operationalLocations')
|
|
72
|
+
});
|
|
73
|
+
const classList = (name, labelKey, what) => ({
|
|
74
|
+
name,
|
|
75
|
+
type: 'string',
|
|
76
|
+
labelKey,
|
|
77
|
+
description: `the ${what} it belongs to, as names separated by commas - each must already exist`
|
|
78
|
+
});
|
|
79
|
+
const baseClasses = (what) => ({
|
|
80
|
+
name: 'baseIds',
|
|
81
|
+
type: 'string',
|
|
82
|
+
labelKey: 'field.base-classes',
|
|
83
|
+
description: `the ${what} this one inherits from, as names separated by commas - each must already exist; enter a base before the classes under it`
|
|
84
|
+
});
|
|
85
|
+
const classAxis = (axis, list, mutation, what, snapshotKey) => ({
|
|
86
|
+
axis,
|
|
87
|
+
list,
|
|
88
|
+
mutation,
|
|
89
|
+
description: `one ${what}: its name, what it is, and the ${what}es it inherits from.`,
|
|
90
|
+
fields: [NAME, DESCRIPTION, baseClasses(`${what}es`)],
|
|
91
|
+
lists: { baseIds: axis },
|
|
92
|
+
snapshotKey,
|
|
93
|
+
recordFields: ['name', 'description', 'baseIds']
|
|
94
|
+
});
|
|
95
|
+
exports.OPS_MASTER_ENTRY_SPECS = [
|
|
96
|
+
{
|
|
97
|
+
axis: 'operationalLocation',
|
|
98
|
+
list: 'operationalLocations',
|
|
99
|
+
mutation: 'updateMultipleOperationalLocation',
|
|
100
|
+
description: 'one operational location - a site, area, line, cell, store or dock: its name, what it is, its type, which system owns it, its ISA-95 level, ' +
|
|
101
|
+
'how many it holds and works at once, and the location it sits under. A change of the parent is recorded as a tracked change from now.',
|
|
102
|
+
fields: [
|
|
103
|
+
NAME,
|
|
104
|
+
DESCRIPTION,
|
|
105
|
+
{ name: 'type', type: 'string', required: true, labelKey: 'field.location-type', description: "the location type key of the site's catalog as the material writes it (raw-store, weld-station, dock)" },
|
|
106
|
+
{ name: 'system', type: 'enum', values: [...ops_contract_1.DOMAIN_SYSTEMS], labelKey: 'field.owning-system', description: 'which system owns the place: wms = warehouse, yms = yard, mes = factory, ems = energy; leave empty when the material does not say' },
|
|
107
|
+
{ name: 'level', type: 'enum', values: [...ops_contract_1.EQUIPMENT_LEVEL], labelKey: 'field.equipment-level', description: 'the ISA-95 equipment hierarchy level' },
|
|
108
|
+
{ name: 'capacity', type: 'integer', labelKey: 'field.capacity', description: 'how many it holds - leave empty when unknown' },
|
|
109
|
+
{ name: 'parallelism', type: 'integer', labelKey: 'field.parallelism', description: 'how many it works on at once - leave empty when unknown' },
|
|
110
|
+
{
|
|
111
|
+
name: 'parentId',
|
|
112
|
+
type: 'reference',
|
|
113
|
+
labelKey: 'field.parent-location',
|
|
114
|
+
description: 'the location it sits under, as the material names it; empty for a top location. A change is recorded as a tracked change from now',
|
|
115
|
+
reference: namedBy('operationalLocations')
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
lists: {},
|
|
119
|
+
parentField: 'parentId',
|
|
120
|
+
snapshotKey: 'operationalLocations',
|
|
121
|
+
recordFields: ['name', 'description', 'type', 'system', 'level', 'capacity', 'parallelism', 'parentId']
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
axis: 'equipment',
|
|
125
|
+
list: 'equipmentList',
|
|
126
|
+
mutation: 'updateMultipleEquipment',
|
|
127
|
+
description: 'one equipment: its name, what it is, its kind, where it is installed, its identifier and its classes. A change of where it is installed is recorded as a tracked change from now.',
|
|
128
|
+
fields: [
|
|
129
|
+
NAME,
|
|
130
|
+
DESCRIPTION,
|
|
131
|
+
{ name: 'kind', type: 'string', required: true, labelKey: 'field.equipment-class', description: 'the kind of equipment as the material writes it (press, robot, conveyor)' },
|
|
132
|
+
{ ...homeLocation(true), description: 'where it is installed - the operational location as the material names it. A change is recorded as a tracked change from now' },
|
|
133
|
+
{ name: 'identity', type: 'string', labelKey: 'field.identity', description: 'its GS1 identifier, only when the material gives one' },
|
|
134
|
+
classList('equipmentClassIds', 'field.equipment-classes', 'equipment classes')
|
|
135
|
+
],
|
|
136
|
+
lists: { equipmentClassIds: 'equipmentClass' },
|
|
137
|
+
snapshotKey: 'equipment',
|
|
138
|
+
recordFields: ['name', 'description', 'kind', 'homeLocation', 'identity', 'equipmentClassIds']
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
axis: 'person',
|
|
142
|
+
list: 'persons',
|
|
143
|
+
mutation: 'updateMultiplePerson',
|
|
144
|
+
description: 'one person on the floor: the name they are known by, a note, their qualifications and where they work.',
|
|
145
|
+
fields: [NAME, DESCRIPTION, classList('personnelClassIds', 'field.personnel-classes', 'personnel classes (qualifications)'), homeLocation(false)],
|
|
146
|
+
lists: { personnelClassIds: 'personnelClass' },
|
|
147
|
+
snapshotKey: 'persons',
|
|
148
|
+
recordFields: ['name', 'description', 'personnelClassIds', 'homeLocation']
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
axis: 'physicalAsset',
|
|
152
|
+
list: 'physicalAssets',
|
|
153
|
+
mutation: 'updateMultiplePhysicalAsset',
|
|
154
|
+
description: 'one physical asset - a tool, jig, mold or gauge: its name, what it is, its classes, where it is kept and its identifier.',
|
|
155
|
+
fields: [
|
|
156
|
+
NAME,
|
|
157
|
+
DESCRIPTION,
|
|
158
|
+
classList('assetClassIds', 'field.asset-classes', 'physical asset classes'),
|
|
159
|
+
{ ...homeLocation(false), description: 'where it is kept - the operational location as the material names it' },
|
|
160
|
+
{ name: 'identity', type: 'string', labelKey: 'field.grai', description: 'its GRAI, only when the material gives one' }
|
|
161
|
+
],
|
|
162
|
+
lists: { assetClassIds: 'physicalAssetClass' },
|
|
163
|
+
snapshotKey: 'physicalAssets',
|
|
164
|
+
recordFields: ['name', 'description', 'assetClassIds', 'homeLocation', 'identity']
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
axis: 'stopReason',
|
|
168
|
+
list: 'stopReasonList',
|
|
169
|
+
mutation: 'updateMultipleStopReason',
|
|
170
|
+
description: 'one equipment stop reason: its code, what it means, the equipment state it is for, its parent reason, and whether the floor must add a note.',
|
|
171
|
+
fields: [
|
|
172
|
+
{ ...NAME, description: 'the reason code exactly as the material writes it - unique on this list; never make one up' },
|
|
173
|
+
DESCRIPTION,
|
|
174
|
+
{
|
|
175
|
+
name: 'status',
|
|
176
|
+
type: 'enum',
|
|
177
|
+
required: true,
|
|
178
|
+
values: [...state_period_rules_1.STOP_REASON_STATUS],
|
|
179
|
+
labelKey: 'field.status',
|
|
180
|
+
valueKeyPrefix: 'text.state-',
|
|
181
|
+
description: 'the equipment state the reason is for: down = broken down, setup = changeover, planned-stop = a planned stop, idle = waiting'
|
|
182
|
+
},
|
|
183
|
+
{ name: 'parentName', type: 'reference', labelKey: 'field.parent-reason', description: 'the reason it sits under, as the material names it', reference: namedBy('stopReasonList') },
|
|
184
|
+
{ name: 'detailRequired', type: 'boolean', labelKey: 'field.detail-required', description: 'true when the floor must add a note on choosing it' }
|
|
185
|
+
],
|
|
186
|
+
lists: {},
|
|
187
|
+
parentField: 'parentName',
|
|
188
|
+
snapshotKey: 'stopReasons',
|
|
189
|
+
recordFields: ['name', 'description', 'status', 'parentName', 'detailRequired']
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
axis: 'nonconformanceCause',
|
|
193
|
+
list: 'nonconformanceCauseList',
|
|
194
|
+
mutation: 'updateMultipleNonconformanceCause',
|
|
195
|
+
description: 'one nonconformance cause: its code, what it means, its parent cause, and whether a note must be added.',
|
|
196
|
+
fields: [
|
|
197
|
+
{ ...NAME, description: 'the cause code exactly as the material writes it - unique on this list; never make one up' },
|
|
198
|
+
DESCRIPTION,
|
|
199
|
+
{ name: 'parentName', type: 'reference', labelKey: 'field.parent-reason', description: 'the cause it sits under, as the material names it', reference: namedBy('nonconformanceCauseList') },
|
|
200
|
+
{ name: 'detailRequired', type: 'boolean', labelKey: 'field.detail-required', description: 'true when a note must be added on choosing it' }
|
|
201
|
+
],
|
|
202
|
+
lists: {},
|
|
203
|
+
parentField: 'parentName',
|
|
204
|
+
recordFields: ['name', 'description', 'parentName', 'detailRequired']
|
|
205
|
+
},
|
|
206
|
+
classAxis('equipmentClass', 'equipmentClasses', 'updateMultipleEquipmentClass', 'equipment class', 'equipmentClasses'),
|
|
207
|
+
classAxis('personnelClass', 'personnelClasses', 'updateMultiplePersonnelClass', 'personnel class', 'personnelClasses'),
|
|
208
|
+
classAxis('physicalAssetClass', 'physicalAssetClasses', 'updateMultiplePhysicalAssetClass', 'physical asset class', 'physicalAssetClasses'),
|
|
209
|
+
classAxis('materialClass', 'materialClasses', 'updateMultipleMaterialClass', 'material class', 'materialClasses')
|
|
210
|
+
];
|
|
211
|
+
/** The fields a change may touch - every declared field; the update check reads the names a change gives. */
|
|
212
|
+
const changeableFieldsOf = (spec) => spec.fields.map(field => field.name);
|
|
213
|
+
exports.changeableFieldsOf = changeableFieldsOf;
|
|
214
|
+
/** A list field read back as the comma list it was written as. */
|
|
215
|
+
function recordOf(spec, item) {
|
|
216
|
+
const record = { id: item.id };
|
|
217
|
+
for (const name of spec.recordFields) {
|
|
218
|
+
const value = item[name];
|
|
219
|
+
record[name] = spec.lists[name] && Array.isArray(value) ? value.join(', ') : value ?? null;
|
|
220
|
+
}
|
|
221
|
+
return record;
|
|
222
|
+
}
|
|
223
|
+
const labelOf = (record) => [record.name, record.description].filter(value => typeof value === 'string' && value).join(' · ');
|
|
224
|
+
/** Names on an axis in the domain, read from the master table - lazy, so the rules load without the shell. */
|
|
225
|
+
async function namesInDomain(domain, axis, names) {
|
|
226
|
+
const found = new Map();
|
|
227
|
+
if (!names.length)
|
|
228
|
+
return found;
|
|
229
|
+
const [{ getRepository }, { In }, { masterAxisOf }] = await Promise.all([Promise.resolve().then(() => __importStar(require('@things-factory/shell'))), Promise.resolve().then(() => __importStar(require('typeorm'))), Promise.resolve().then(() => __importStar(require('../master-axis')))]);
|
|
230
|
+
const repository = getRepository(masterAxisOf(axis).entity);
|
|
231
|
+
for (let at = 0; at < names.length; at += 500) {
|
|
232
|
+
const rows = await repository.find({ where: { domain: { id: domain.id }, name: In(names.slice(at, at + 500)) } });
|
|
233
|
+
for (const row of rows)
|
|
234
|
+
found.set(row.name, row);
|
|
235
|
+
}
|
|
236
|
+
return found;
|
|
237
|
+
}
|
|
238
|
+
/** One axis as an entry target. */
|
|
239
|
+
function opsMasterEntryTargetOf(spec, options = {}) {
|
|
240
|
+
const returned = `{ id name }`;
|
|
241
|
+
const mutation = `mutation ($patches: [Object!]!) { ${spec.mutation}(patches: $patches) ${returned} }`;
|
|
242
|
+
const items = `items { id ${spec.recordFields.join(' ')} }`;
|
|
243
|
+
const lookup = options.lookup ?? ((domain) => (axis, names) => namesInDomain(domain, axis, names));
|
|
244
|
+
return {
|
|
245
|
+
key: (0, master_entry_rules_1.opsMasterEntryKey)(spec.axis),
|
|
246
|
+
labelKey: (0, master_entry_rules_1.opsMasterEntryLabelKey)(spec.axis),
|
|
247
|
+
description: spec.description,
|
|
248
|
+
fields: spec.fields,
|
|
249
|
+
mutation,
|
|
250
|
+
/* One row per call - each row is answered by its place, and one taken name does not undo the others. */
|
|
251
|
+
variables: row => ({ patches: [{ cuFlag: '+', ...(0, master_entry_rules_1.masterPatchOf)(row.values, spec) }] }),
|
|
252
|
+
appliedOf: (data, row) => {
|
|
253
|
+
const saved = data?.[spec.mutation]?.[0];
|
|
254
|
+
return { ...(saved?.id ? { id: saved.id } : {}), label: saved?.name ?? (0, master_entry_rules_1.nameOf)(row.values) };
|
|
255
|
+
},
|
|
256
|
+
maxRows: 200,
|
|
257
|
+
check: async (rows, { state }) => {
|
|
258
|
+
const domain = state?.domain;
|
|
259
|
+
if (!domain?.id)
|
|
260
|
+
return rows.map(() => []);
|
|
261
|
+
return (0, master_entry_rules_1.checkMasterRows)(spec, rows, lookup(domain));
|
|
262
|
+
},
|
|
263
|
+
update: {
|
|
264
|
+
read: {
|
|
265
|
+
query: `query ($filters: [Filter!], $pagination: Pagination) { ${spec.list}(filters: $filters, pagination: $pagination) { ${items} } }`,
|
|
266
|
+
variables: ids => ({ filters: [{ name: 'id', operator: 'in', value: ids }], pagination: { page: 1, limit: Math.max(ids.length, 1) } }),
|
|
267
|
+
recordsOf: (data, ids) => (data?.[spec.list]?.items ?? []).filter((item) => ids.includes(item?.id)).map((item) => recordOf(spec, item))
|
|
268
|
+
},
|
|
269
|
+
find: {
|
|
270
|
+
query: `query ($search: String, $pagination: Pagination) { ${spec.list}(search: $search, pagination: $pagination) { ${items} } }`,
|
|
271
|
+
variables: criteria => ({ ...(typeof criteria.text === 'string' && criteria.text ? { search: criteria.text } : {}), pagination: PAGE }),
|
|
272
|
+
recordsOf: data => (data?.[spec.list]?.items ?? []).map((item) => recordOf(spec, item)),
|
|
273
|
+
criteria: [{ name: 'text', type: 'string', description: 'a name, a code or words of the description, as the person said them' }]
|
|
274
|
+
},
|
|
275
|
+
mutation,
|
|
276
|
+
/* Only the fields that change - the rest of the record is the saved one, not a copy the card read. */
|
|
277
|
+
variables: ({ id, values }) => ({ patches: [{ cuFlag: 'M', id, ...(0, master_entry_rules_1.masterPatchOf)(values, spec, true) }] }),
|
|
278
|
+
labelOf,
|
|
279
|
+
fields: (0, exports.changeableFieldsOf)(spec),
|
|
280
|
+
check: async (changes, { state }) => {
|
|
281
|
+
const domain = state?.domain;
|
|
282
|
+
if (!domain?.id)
|
|
283
|
+
return changes.map(() => []);
|
|
284
|
+
return (0, master_entry_rules_1.checkMasterChanges)(spec, changes, lookup(domain));
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/** Every master axis the assistant may enter, as targets to register. */
|
|
290
|
+
function opsMasterEntryTargets(options = {}) {
|
|
291
|
+
return exports.OPS_MASTER_ENTRY_SPECS.map(spec => opsMasterEntryTargetOf(spec, options));
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=master-entry-targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"master-entry-targets.js","sourceRoot":"","sources":["../../../server/service/ai-entry/master-entry-targets.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * AI 입력 대상 — the master records the assistant may enter and change from material: a spreadsheet of locations, a\n * list of equipment, a page of stop reasons (operato-application/design/ai/data-entry.md).\n *\n * Plain declarations. An application that runs `@things-factory/ai-assistant` registers each one:\n *\n * for (const target of opsMasterEntryTargets()) registerEntryTarget(target)\n *\n * and opens the ones a mode should offer by key (`entryTargets: ['ops-master.equipment']`).\n *\n * Every row goes through the master screen's own mutation (`updateMultiple<Axis>`), one row per call, run with the\n * person's request state - the same privilege, the same change policy, the same refusals as the grid. A row is sent\n * with **only the declared fields**: a change saves `{ ...found, ...values }`, so anything else would overwrite the\n * record. `applied` is never sent: a tracked field changed here is claimed from now.\n */\nimport { DOMAIN_SYSTEMS, EQUIPMENT_LEVEL } from '@operato/ops-contract'\n\nimport { STOP_REASON_STATUS } from '../equipment/state-period-rules'\nimport {\n checkMasterChanges,\n checkMasterRows,\n masterPatchOf,\n mastersNamed,\n nameOf,\n opsMasterEntryKey,\n opsMasterEntryLabelKey,\n type MasterEntryRuleSpec,\n type MasterNamesLookup,\n type MasterRow,\n type OpsMasterEntryAxis,\n type OpsMasterEntryField,\n type OpsMasterEntryRecord,\n type OpsMasterEntryTarget\n} from './master-entry-rules'\n\nconst PAGE = { page: 1, limit: 20 }\n\n/** The list query an axis is read and searched through, and the grid's mutation. */\nexport interface OpsMasterEntryAxisSpec extends MasterEntryRuleSpec {\n /** `operationalLocations` · `equipmentList` … */\n list: string\n /** `updateMultipleOperationalLocation` … */\n mutation: string\n /** What one row is, for the model. */\n description: string\n /** The fields the read query asks besides `id`. */\n recordFields: string[]\n}\n\nconst namedBy = (list: string): OpsMasterEntryField['reference'] => ({\n query: `query ($search: String, $pagination: Pagination) { ${list}(search: $search, pagination: $pagination) { items { name description } } }`,\n variables: text => ({ search: text, pagination: PAGE }),\n recordsOf: (data, text) => mastersNamed(data, list, text)\n})\n\nconst NAME: OpsMasterEntryField = { name: 'name', type: 'string', required: true, labelKey: 'field.name', description: 'the name (code) exactly as the material writes it - unique on this list; never make one up' }\nconst DESCRIPTION: OpsMasterEntryField = { name: 'description', type: 'string', labelKey: 'field.description', description: 'what it is, in the words of the material' }\n\nconst homeLocation = (required: boolean): OpsMasterEntryField => ({\n name: 'homeLocation',\n type: 'reference',\n ...(required ? { required } : {}),\n labelKey: 'field.home-location',\n description: 'the operational location it belongs to, as the material names it - its name or its description',\n reference: namedBy('operationalLocations')\n})\n\nconst classList = (name: string, labelKey: string, what: string): OpsMasterEntryField => ({\n name,\n type: 'string',\n labelKey,\n description: `the ${what} it belongs to, as names separated by commas - each must already exist`\n})\n\nconst baseClasses = (what: string): OpsMasterEntryField => ({\n name: 'baseIds',\n type: 'string',\n labelKey: 'field.base-classes',\n description: `the ${what} this one inherits from, as names separated by commas - each must already exist; enter a base before the classes under it`\n})\n\nconst classAxis = (axis: OpsMasterEntryAxis, list: string, mutation: string, what: string, snapshotKey: OpsMasterEntryAxisSpec['snapshotKey']): OpsMasterEntryAxisSpec => ({\n axis,\n list,\n mutation,\n description: `one ${what}: its name, what it is, and the ${what}es it inherits from.`,\n fields: [NAME, DESCRIPTION, baseClasses(`${what}es`)],\n lists: { baseIds: axis },\n snapshotKey,\n recordFields: ['name', 'description', 'baseIds']\n})\n\nexport const OPS_MASTER_ENTRY_SPECS: readonly OpsMasterEntryAxisSpec[] = [\n {\n axis: 'operationalLocation',\n list: 'operationalLocations',\n mutation: 'updateMultipleOperationalLocation',\n description:\n 'one operational location - a site, area, line, cell, store or dock: its name, what it is, its type, which system owns it, its ISA-95 level, ' +\n 'how many it holds and works at once, and the location it sits under. A change of the parent is recorded as a tracked change from now.',\n fields: [\n NAME,\n DESCRIPTION,\n { name: 'type', type: 'string', required: true, labelKey: 'field.location-type', description: \"the location type key of the site's catalog as the material writes it (raw-store, weld-station, dock)\" },\n { name: 'system', type: 'enum', values: [...DOMAIN_SYSTEMS], labelKey: 'field.owning-system', description: 'which system owns the place: wms = warehouse, yms = yard, mes = factory, ems = energy; leave empty when the material does not say' },\n { name: 'level', type: 'enum', values: [...EQUIPMENT_LEVEL], labelKey: 'field.equipment-level', description: 'the ISA-95 equipment hierarchy level' },\n { name: 'capacity', type: 'integer', labelKey: 'field.capacity', description: 'how many it holds - leave empty when unknown' },\n { name: 'parallelism', type: 'integer', labelKey: 'field.parallelism', description: 'how many it works on at once - leave empty when unknown' },\n {\n name: 'parentId',\n type: 'reference',\n labelKey: 'field.parent-location',\n description: 'the location it sits under, as the material names it; empty for a top location. A change is recorded as a tracked change from now',\n reference: namedBy('operationalLocations')\n }\n ],\n lists: {},\n parentField: 'parentId',\n snapshotKey: 'operationalLocations',\n recordFields: ['name', 'description', 'type', 'system', 'level', 'capacity', 'parallelism', 'parentId']\n },\n {\n axis: 'equipment',\n list: 'equipmentList',\n mutation: 'updateMultipleEquipment',\n description:\n 'one equipment: its name, what it is, its kind, where it is installed, its identifier and its classes. A change of where it is installed is recorded as a tracked change from now.',\n fields: [\n NAME,\n DESCRIPTION,\n { name: 'kind', type: 'string', required: true, labelKey: 'field.equipment-class', description: 'the kind of equipment as the material writes it (press, robot, conveyor)' },\n { ...homeLocation(true), description: 'where it is installed - the operational location as the material names it. A change is recorded as a tracked change from now' },\n { name: 'identity', type: 'string', labelKey: 'field.identity', description: 'its GS1 identifier, only when the material gives one' },\n classList('equipmentClassIds', 'field.equipment-classes', 'equipment classes')\n ],\n lists: { equipmentClassIds: 'equipmentClass' },\n snapshotKey: 'equipment',\n recordFields: ['name', 'description', 'kind', 'homeLocation', 'identity', 'equipmentClassIds']\n },\n {\n axis: 'person',\n list: 'persons',\n mutation: 'updateMultiplePerson',\n description: 'one person on the floor: the name they are known by, a note, their qualifications and where they work.',\n fields: [NAME, DESCRIPTION, classList('personnelClassIds', 'field.personnel-classes', 'personnel classes (qualifications)'), homeLocation(false)],\n lists: { personnelClassIds: 'personnelClass' },\n snapshotKey: 'persons',\n recordFields: ['name', 'description', 'personnelClassIds', 'homeLocation']\n },\n {\n axis: 'physicalAsset',\n list: 'physicalAssets',\n mutation: 'updateMultiplePhysicalAsset',\n description: 'one physical asset - a tool, jig, mold or gauge: its name, what it is, its classes, where it is kept and its identifier.',\n fields: [\n NAME,\n DESCRIPTION,\n classList('assetClassIds', 'field.asset-classes', 'physical asset classes'),\n { ...homeLocation(false), description: 'where it is kept - the operational location as the material names it' },\n { name: 'identity', type: 'string', labelKey: 'field.grai', description: 'its GRAI, only when the material gives one' }\n ],\n lists: { assetClassIds: 'physicalAssetClass' },\n snapshotKey: 'physicalAssets',\n recordFields: ['name', 'description', 'assetClassIds', 'homeLocation', 'identity']\n },\n {\n axis: 'stopReason',\n list: 'stopReasonList',\n mutation: 'updateMultipleStopReason',\n description: 'one equipment stop reason: its code, what it means, the equipment state it is for, its parent reason, and whether the floor must add a note.',\n fields: [\n { ...NAME, description: 'the reason code exactly as the material writes it - unique on this list; never make one up' },\n DESCRIPTION,\n {\n name: 'status',\n type: 'enum',\n required: true,\n values: [...STOP_REASON_STATUS],\n labelKey: 'field.status',\n valueKeyPrefix: 'text.state-',\n description: 'the equipment state the reason is for: down = broken down, setup = changeover, planned-stop = a planned stop, idle = waiting'\n },\n { name: 'parentName', type: 'reference', labelKey: 'field.parent-reason', description: 'the reason it sits under, as the material names it', reference: namedBy('stopReasonList') },\n { name: 'detailRequired', type: 'boolean', labelKey: 'field.detail-required', description: 'true when the floor must add a note on choosing it' }\n ],\n lists: {},\n parentField: 'parentName',\n snapshotKey: 'stopReasons',\n recordFields: ['name', 'description', 'status', 'parentName', 'detailRequired']\n },\n {\n axis: 'nonconformanceCause',\n list: 'nonconformanceCauseList',\n mutation: 'updateMultipleNonconformanceCause',\n description: 'one nonconformance cause: its code, what it means, its parent cause, and whether a note must be added.',\n fields: [\n { ...NAME, description: 'the cause code exactly as the material writes it - unique on this list; never make one up' },\n DESCRIPTION,\n { name: 'parentName', type: 'reference', labelKey: 'field.parent-reason', description: 'the cause it sits under, as the material names it', reference: namedBy('nonconformanceCauseList') },\n { name: 'detailRequired', type: 'boolean', labelKey: 'field.detail-required', description: 'true when a note must be added on choosing it' }\n ],\n lists: {},\n parentField: 'parentName',\n recordFields: ['name', 'description', 'parentName', 'detailRequired']\n },\n classAxis('equipmentClass', 'equipmentClasses', 'updateMultipleEquipmentClass', 'equipment class', 'equipmentClasses'),\n classAxis('personnelClass', 'personnelClasses', 'updateMultiplePersonnelClass', 'personnel class', 'personnelClasses'),\n classAxis('physicalAssetClass', 'physicalAssetClasses', 'updateMultiplePhysicalAssetClass', 'physical asset class', 'physicalAssetClasses'),\n classAxis('materialClass', 'materialClasses', 'updateMultipleMaterialClass', 'material class', 'materialClasses')\n]\n\n/** The fields a change may touch - every declared field; the update check reads the names a change gives. */\nexport const changeableFieldsOf = (spec: Pick<OpsMasterEntryAxisSpec, 'fields'>) => spec.fields.map(field => field.name)\n\n/** A list field read back as the comma list it was written as. */\nfunction recordOf(spec: OpsMasterEntryAxisSpec, item: any): OpsMasterEntryRecord {\n const record: OpsMasterEntryRecord = { id: item.id }\n for (const name of spec.recordFields) {\n const value = item[name]\n record[name] = spec.lists[name] && Array.isArray(value) ? value.join(', ') : value ?? null\n }\n return record\n}\n\nconst labelOf = (record: OpsMasterEntryRecord) => [record.name, record.description].filter(value => typeof value === 'string' && value).join(' · ')\n\n/** Names on an axis in the domain, read from the master table - lazy, so the rules load without the shell. */\nasync function namesInDomain(domain: any, axis: OpsMasterEntryAxis, names: string[]): Promise<Map<string, MasterRow>> {\n const found = new Map<string, MasterRow>()\n if (!names.length) return found\n const [{ getRepository }, { In }, { masterAxisOf }] = await Promise.all([import('@things-factory/shell'), import('typeorm'), import('../master-axis')])\n const repository = getRepository(masterAxisOf(axis).entity)\n for (let at = 0; at < names.length; at += 500) {\n const rows = await repository.find({ where: { domain: { id: domain.id }, name: In(names.slice(at, at + 500)) } as any })\n for (const row of rows) found.set(row.name, row as MasterRow)\n }\n return found\n}\n\nexport interface OpsMasterEntryOptions {\n /** Which names exist - the master tables by default; a test gives its own. */\n lookup?: (domain: any) => MasterNamesLookup\n}\n\n/** One axis as an entry target. */\nexport function opsMasterEntryTargetOf(spec: OpsMasterEntryAxisSpec, options: OpsMasterEntryOptions = {}): OpsMasterEntryTarget {\n const returned = `{ id name }`\n const mutation = `mutation ($patches: [Object!]!) { ${spec.mutation}(patches: $patches) ${returned} }`\n const items = `items { id ${spec.recordFields.join(' ')} }`\n const lookup = options.lookup ?? ((domain: any): MasterNamesLookup => (axis, names) => namesInDomain(domain, axis, names))\n\n return {\n key: opsMasterEntryKey(spec.axis),\n labelKey: opsMasterEntryLabelKey(spec.axis),\n description: spec.description,\n fields: spec.fields,\n mutation,\n /* One row per call - each row is answered by its place, and one taken name does not undo the others. */\n variables: row => ({ patches: [{ cuFlag: '+', ...masterPatchOf(row.values, spec) }] }),\n appliedOf: (data, row) => {\n const saved = data?.[spec.mutation]?.[0]\n return { ...(saved?.id ? { id: saved.id } : {}), label: saved?.name ?? nameOf(row.values) }\n },\n maxRows: 200,\n check: async (rows, { state }) => {\n const domain = state?.domain\n if (!domain?.id) return rows.map(() => [])\n return checkMasterRows(spec, rows, lookup(domain))\n },\n update: {\n read: {\n query: `query ($filters: [Filter!], $pagination: Pagination) { ${spec.list}(filters: $filters, pagination: $pagination) { ${items} } }`,\n variables: ids => ({ filters: [{ name: 'id', operator: 'in', value: ids }], pagination: { page: 1, limit: Math.max(ids.length, 1) } }),\n recordsOf: (data, ids) => (data?.[spec.list]?.items ?? []).filter((item: any) => ids.includes(item?.id)).map((item: any) => recordOf(spec, item))\n },\n find: {\n query: `query ($search: String, $pagination: Pagination) { ${spec.list}(search: $search, pagination: $pagination) { ${items} } }`,\n variables: criteria => ({ ...(typeof criteria.text === 'string' && criteria.text ? { search: criteria.text } : {}), pagination: PAGE }),\n recordsOf: data => (data?.[spec.list]?.items ?? []).map((item: any) => recordOf(spec, item)),\n criteria: [{ name: 'text', type: 'string', description: 'a name, a code or words of the description, as the person said them' }]\n },\n mutation,\n /* Only the fields that change - the rest of the record is the saved one, not a copy the card read. */\n variables: ({ id, values }) => ({ patches: [{ cuFlag: 'M', id, ...masterPatchOf(values, spec, true) }] }),\n labelOf,\n fields: changeableFieldsOf(spec),\n check: async (changes, { state }) => {\n const domain = state?.domain\n if (!domain?.id) return changes.map(() => [])\n return checkMasterChanges(spec, changes, lookup(domain))\n }\n }\n }\n}\n\n/** Every master axis the assistant may enter, as targets to register. */\nexport function opsMasterEntryTargets(options: OpsMasterEntryOptions = {}): OpsMasterEntryTarget[] {\n return OPS_MASTER_ENTRY_SPECS.map(spec => opsMasterEntryTargetOf(spec, options))\n}\n"]}
|
|
@@ -77,3 +77,5 @@ export declare const schema: {
|
|
|
77
77
|
export * from './assignment/master-value-claim';
|
|
78
78
|
export * from './assignment/assignment-history';
|
|
79
79
|
export * from './assignment/assignment-write';
|
|
80
|
+
export { opsMasterEntryTargets, opsMasterEntryTargetOf, OPS_MASTER_ENTRY_SPECS, type OpsMasterEntryAxisSpec, type OpsMasterEntryOptions } from './ai-entry/master-entry-targets';
|
|
81
|
+
export { OPS_MASTER_ENTRY_AXES, opsMasterEntryKey, opsMasterEntryLabelKey, type OpsMasterEntryAxis, type OpsMasterEntryField, type OpsMasterEntryIssue, type OpsMasterEntryRow, type OpsMasterEntryTarget } from './ai-entry/master-entry-rules';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.schema = exports.entities = void 0;
|
|
3
|
+
exports.opsMasterEntryLabelKey = exports.opsMasterEntryKey = exports.OPS_MASTER_ENTRY_AXES = exports.OPS_MASTER_ENTRY_SPECS = exports.opsMasterEntryTargetOf = exports.opsMasterEntryTargets = exports.schema = exports.entities = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
/* EXPORT ENTITY TYPES */
|
|
6
6
|
tslib_1.__exportStar(require("./resource/resource-class"), exports);
|
|
@@ -130,4 +130,13 @@ exports.schema = {
|
|
|
130
130
|
tslib_1.__exportStar(require("./assignment/master-value-claim"), exports);
|
|
131
131
|
tslib_1.__exportStar(require("./assignment/assignment-history"), exports);
|
|
132
132
|
tslib_1.__exportStar(require("./assignment/assignment-write"), exports);
|
|
133
|
+
/* AI 입력 — the master records an application's assistant may enter (`registerEntryTarget` on each). */
|
|
134
|
+
var master_entry_targets_1 = require("./ai-entry/master-entry-targets");
|
|
135
|
+
Object.defineProperty(exports, "opsMasterEntryTargets", { enumerable: true, get: function () { return master_entry_targets_1.opsMasterEntryTargets; } });
|
|
136
|
+
Object.defineProperty(exports, "opsMasterEntryTargetOf", { enumerable: true, get: function () { return master_entry_targets_1.opsMasterEntryTargetOf; } });
|
|
137
|
+
Object.defineProperty(exports, "OPS_MASTER_ENTRY_SPECS", { enumerable: true, get: function () { return master_entry_targets_1.OPS_MASTER_ENTRY_SPECS; } });
|
|
138
|
+
var master_entry_rules_1 = require("./ai-entry/master-entry-rules");
|
|
139
|
+
Object.defineProperty(exports, "OPS_MASTER_ENTRY_AXES", { enumerable: true, get: function () { return master_entry_rules_1.OPS_MASTER_ENTRY_AXES; } });
|
|
140
|
+
Object.defineProperty(exports, "opsMasterEntryKey", { enumerable: true, get: function () { return master_entry_rules_1.opsMasterEntryKey; } });
|
|
141
|
+
Object.defineProperty(exports, "opsMasterEntryLabelKey", { enumerable: true, get: function () { return master_entry_rules_1.opsMasterEntryLabelKey; } });
|
|
133
142
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,oEAAyC;AACzC,gFAAqD;AACrD,gFAAqD;AACrD,wEAA6C;AAC7C,8EAAmD;AACnD,8EAAmD;AACnD,gFAAqD;AACrD,0EAA+C;AAC/C,gFAAqD;AACrD,wDAA6B;AAC7B,wDAA6B;AAC7B,iEAAsC;AACtC,8DAAmC;AACnC,2DAAgC;AAChC,+DAAoC;AACpC,wEAA6C;AAC7C,wDAA6B;AAC7B,6DAAkC;AAClC,sEAA2C;AAC3C,uEAA4C;AAC5C,sEAA2C;AAC3C,oEAAyC;AACzC,gEAAqC;AACrC,sEAA2C;AAC3C,yEAA8C;AAC9C,kEAAuC;AACvC,uEAA4C;AAC5C,sEAA2C;AAC3C,kEAAuC;AACvC,iEAAsC;AACtC,uEAA4C;AAC5C,+DAAoC;AACpC,8DAAmC;AACnC,0EAA+C;AAC/C,qEAA0C;AAC1C,oEAAyC;AACzC,oEAAyC;AACzC,yEAA8C;AAC9C,uEAA4C;AAC5C,+EAAoD;AACpD,gFAAqD;AACrD,6EAAkD;AAClD,qEAA0C;AAC1C,oEAAyC;AACzC,2EAAgD;AAChD,uEAA4C;AAC5C,sEAA2C;AAC3C,0EAA+C;AAC/C,mFAAwD;AACxD,qEAA0C;AAC1C,mEAAwC;AACxC,wEAA6C;AAC7C,2EAAgD;AAChD,2EAAgD;AAChD,4EAAiD;AACjD,yEAA8C;AAC9C,oEAAyC;AACzC,iEAAsC;AACtC,gEAAqC;AACrC,yEAA8C;AAC9C,yEAA8C;AAC9C,iFAAsD;AACtD,kFAAuD;AACvD,+EAAoD;AACpD,uEAA4C;AAC5C,sEAA2C;AAC3C,8DAAmC;AACnC,iEAAsC;AACtC,yEAA8C;AAE9C,mCAAmC;AACnC,mCAAgF;AAChF,2CAA4F;AAC5F,yCAAyF;AACzF,yCAAyF;AACzF,2CAA4F;AAC5F,2CAA4F;AAC5F,uCAAsF;AACtF,wEAAwE;AACxE,qCAAmF;AACnF,qCAAuD;AACvD,uCAAuC;AACvC,+EAAyE;AACzE,iEAAuF;AACvF,wEAAkE;AAClE,2CAA0F;AAE7E,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,yCAAkB;IAClB;;;OAGG;IACH,qCAAgB;IAChB,GAAG,oBAAiB;IACpB,GAAG,kBAAe;IAClB,GAAG,oBAAiB;IACpB,GAAG,gBAAa;IAChB,GAAG,mBAAgB;IACnB,GAAG,mBAAgB;IACnB,GAAG,oBAAiB;IACpB,GAAG,iBAAc;IACjB,GAAG,oBAAgB;CACpB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,iDAA0B;QAC1B,GAAG,qBAAkB;QACrB,GAAG,mBAAgB;QACnB,GAAG,qBAAkB;QACrB,GAAG,iBAAc;QACjB,GAAG,oBAAiB;QACpB,GAAG,oBAAiB;QACpB,GAAG,qBAAkB;QACrB,GAAG,kBAAe;QAClB,GAAG,qBAAiB;QACpB,GAAG,kBAAe;QAElB;;;WAGG;QACH,uDAAyB;KAC1B;CACF,CAAA;AACD,0EAA+C;AAC/C,0EAA+C;AAC/C,wEAA6C","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './resource/resource-class'\nexport * from './personnel/personnel-master-resolver'\nexport * from './equipment/equipment-master-resolver'\nexport * from './asset/asset-master-resolver'\nexport * from './material/material-master-resolver'\nexport * from './location/location-master-resolver'\nexport * from './operation/operation-master-resolver'\nexport * from './recipe/recipe-master-resolver'\nexport * from './test-spec/test-spec-master-resolver'\nexport * from './master-crud'\nexport * from './master-axis'\nexport * from './master-change-policy'\nexport * from './revision-baseline'\nexport * from './approval-route'\nexport * from './master-conformance'\nexport * from './master-conformance-resolver'\nexport * from './master-list'\nexport * from './personnel/person'\nexport * from './personnel/personnel-class'\nexport * from './personnel/personnel-master'\nexport * from './personnel/personnel-query'\nexport * from './personnel/qualification'\nexport * from './equipment/equipment'\nexport * from './equipment/equipment-class'\nexport * from './equipment/state-period-rules'\nexport * from './equipment/stop-reason'\nexport * from './equipment/equipment-master'\nexport * from './equipment/equipment-query'\nexport * from './asset/asset-lifecycle'\nexport * from './asset/physical-asset'\nexport * from './asset/physical-asset-class'\nexport * from './asset/asset-master'\nexport * from './asset/asset-query'\nexport * from './location/operational-location'\nexport * from './location/location-master'\nexport * from './location/location-query'\nexport * from './material/material-class'\nexport * from './material/material-definition'\nexport * from './material/material-revision'\nexport * from './material/material-revision-service'\nexport * from './material/material-revision-resolver'\nexport * from './material/material-effective-list'\nexport * from './material/material-master'\nexport * from './material/material-query'\nexport * from './operation/operation-definition'\nexport * from './operation/operation-master'\nexport * from './operation/operation-query'\nexport * from './operation/operation-readiness'\nexport * from './operation/operation-readiness-resolver'\nexport * from './recipe/recipe-definition'\nexport * from './recipe/recipe-revision'\nexport * from './recipe/recipe-revision-line'\nexport * from './recipe/recipe-revision-content'\nexport * from './recipe/recipe-revision-service'\nexport * from './recipe/recipe-revision-resolver'\nexport * from './recipe/recipe-effective-list'\nexport * from './recipe/route-definition'\nexport * from './recipe/recipe-master'\nexport * from './recipe/recipe-query'\nexport * from './test-spec/test-specification'\nexport * from './test-spec/test-spec-revision'\nexport * from './test-spec/test-spec-revision-service'\nexport * from './test-spec/test-spec-revision-resolver'\nexport * from './test-spec/test-spec-effective-list'\nexport * from './test-spec/test-spec-master'\nexport * from './test-spec/test-spec-query'\nexport * from './status/axis-stamp'\nexport * from './status/master-status'\nexport * from './quality/nonconformance-cause'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { entities as AssetEntities, resolvers as AssetResolvers } from './asset'\nimport { entities as EquipmentEntities, resolvers as EquipmentResolvers } from './equipment'\nimport { entities as LocationEntities, resolvers as LocationResolvers } from './location'\nimport { entities as MaterialEntities, resolvers as MaterialResolvers } from './material'\nimport { entities as OperationEntities, resolvers as OperationResolvers } from './operation'\nimport { entities as PersonnelEntities, resolvers as PersonnelResolvers } from './personnel'\nimport { entities as QualityEntities, resolvers as QualityResolvers } from './quality'\n/* 라우팅·레시피 — 품목→지시서를 이으려면 그 사이에 이 둘이 있어야 한다(§`recipe-definition.ts`). */\nimport { entities as RecipeEntities, resolvers as RecipeResolvers } from './recipe'\nimport { resolvers as StatusResolvers } from './status'\n/* 마스터 정합성 — 축을 가로지르므로 어느 축에도 안 속한다. */\nimport { MasterConformanceResolver } from './master-conformance-resolver'\nimport { MasterChangePolicy, MasterChangePolicyResolver } from './master-change-policy'\nimport { MasterValueClaim } from './assignment/master-value-claim'\nimport { entities as TestSpecEntities, resolvers as TestSpecResolvers } from './test-spec'\n\nexport const entities = [\n /* ENTITIES */\n MasterChangePolicy,\n /*\n * 배정 이력. **등록이 빠져 있었다**(2026-09-23 확인) — 표가 안 서니 이력을 쓰는 길이 실제\n * 설치본에는 없었다. 시험 하네스가 자기 목록에 직접 넣어서 초록이었다.\n */\n MasterValueClaim,\n ...PersonnelEntities,\n ...QualityEntities,\n ...EquipmentEntities,\n ...AssetEntities,\n ...LocationEntities,\n ...MaterialEntities,\n ...OperationEntities,\n ...RecipeEntities,\n ...TestSpecEntities\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n MasterChangePolicyResolver,\n ...PersonnelResolvers,\n ...QualityResolvers,\n ...EquipmentResolvers,\n ...AssetResolvers,\n ...LocationResolvers,\n ...MaterialResolvers,\n ...OperationResolvers,\n ...RecipeResolvers,\n ...TestSpecResolvers,\n ...StatusResolvers,\n\n /*\n * **파일을 export 하는 것만으로는 스키마에 안 올라온다.** 여기 적어야 한다 — 처음에 그것을\n * 빠뜨려 `masterConformance` 가 「Cannot query field」로 나왔다. [확인함] 2026-09-04\n */\n MasterConformanceResolver\n ]\n}\nexport * from './assignment/master-value-claim'\nexport * from './assignment/assignment-history'\nexport * from './assignment/assignment-write'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,oEAAyC;AACzC,gFAAqD;AACrD,gFAAqD;AACrD,wEAA6C;AAC7C,8EAAmD;AACnD,8EAAmD;AACnD,gFAAqD;AACrD,0EAA+C;AAC/C,gFAAqD;AACrD,wDAA6B;AAC7B,wDAA6B;AAC7B,iEAAsC;AACtC,8DAAmC;AACnC,2DAAgC;AAChC,+DAAoC;AACpC,wEAA6C;AAC7C,wDAA6B;AAC7B,6DAAkC;AAClC,sEAA2C;AAC3C,uEAA4C;AAC5C,sEAA2C;AAC3C,oEAAyC;AACzC,gEAAqC;AACrC,sEAA2C;AAC3C,yEAA8C;AAC9C,kEAAuC;AACvC,uEAA4C;AAC5C,sEAA2C;AAC3C,kEAAuC;AACvC,iEAAsC;AACtC,uEAA4C;AAC5C,+DAAoC;AACpC,8DAAmC;AACnC,0EAA+C;AAC/C,qEAA0C;AAC1C,oEAAyC;AACzC,oEAAyC;AACzC,yEAA8C;AAC9C,uEAA4C;AAC5C,+EAAoD;AACpD,gFAAqD;AACrD,6EAAkD;AAClD,qEAA0C;AAC1C,oEAAyC;AACzC,2EAAgD;AAChD,uEAA4C;AAC5C,sEAA2C;AAC3C,0EAA+C;AAC/C,mFAAwD;AACxD,qEAA0C;AAC1C,mEAAwC;AACxC,wEAA6C;AAC7C,2EAAgD;AAChD,2EAAgD;AAChD,4EAAiD;AACjD,yEAA8C;AAC9C,oEAAyC;AACzC,iEAAsC;AACtC,gEAAqC;AACrC,yEAA8C;AAC9C,yEAA8C;AAC9C,iFAAsD;AACtD,kFAAuD;AACvD,+EAAoD;AACpD,uEAA4C;AAC5C,sEAA2C;AAC3C,8DAAmC;AACnC,iEAAsC;AACtC,yEAA8C;AAE9C,mCAAmC;AACnC,mCAAgF;AAChF,2CAA4F;AAC5F,yCAAyF;AACzF,yCAAyF;AACzF,2CAA4F;AAC5F,2CAA4F;AAC5F,uCAAsF;AACtF,wEAAwE;AACxE,qCAAmF;AACnF,qCAAuD;AACvD,uCAAuC;AACvC,+EAAyE;AACzE,iEAAuF;AACvF,wEAAkE;AAClE,2CAA0F;AAE7E,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,yCAAkB;IAClB;;;OAGG;IACH,qCAAgB;IAChB,GAAG,oBAAiB;IACpB,GAAG,kBAAe;IAClB,GAAG,oBAAiB;IACpB,GAAG,gBAAa;IAChB,GAAG,mBAAgB;IACnB,GAAG,mBAAgB;IACnB,GAAG,oBAAiB;IACpB,GAAG,iBAAc;IACjB,GAAG,oBAAgB;CACpB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,iDAA0B;QAC1B,GAAG,qBAAkB;QACrB,GAAG,mBAAgB;QACnB,GAAG,qBAAkB;QACrB,GAAG,iBAAc;QACjB,GAAG,oBAAiB;QACpB,GAAG,oBAAiB;QACpB,GAAG,qBAAkB;QACrB,GAAG,kBAAe;QAClB,GAAG,qBAAiB;QACpB,GAAG,kBAAe;QAElB;;;WAGG;QACH,uDAAyB;KAC1B;CACF,CAAA;AACD,0EAA+C;AAC/C,0EAA+C;AAC/C,wEAA6C;AAE7C,sGAAsG;AACtG,wEAMwC;AALtC,6HAAA,qBAAqB,OAAA;AACrB,8HAAA,sBAAsB,OAAA;AACtB,8HAAA,sBAAsB,OAAA;AAIxB,oEASsC;AARpC,2HAAA,qBAAqB,OAAA;AACrB,uHAAA,iBAAiB,OAAA;AACjB,4HAAA,sBAAsB,OAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './resource/resource-class'\nexport * from './personnel/personnel-master-resolver'\nexport * from './equipment/equipment-master-resolver'\nexport * from './asset/asset-master-resolver'\nexport * from './material/material-master-resolver'\nexport * from './location/location-master-resolver'\nexport * from './operation/operation-master-resolver'\nexport * from './recipe/recipe-master-resolver'\nexport * from './test-spec/test-spec-master-resolver'\nexport * from './master-crud'\nexport * from './master-axis'\nexport * from './master-change-policy'\nexport * from './revision-baseline'\nexport * from './approval-route'\nexport * from './master-conformance'\nexport * from './master-conformance-resolver'\nexport * from './master-list'\nexport * from './personnel/person'\nexport * from './personnel/personnel-class'\nexport * from './personnel/personnel-master'\nexport * from './personnel/personnel-query'\nexport * from './personnel/qualification'\nexport * from './equipment/equipment'\nexport * from './equipment/equipment-class'\nexport * from './equipment/state-period-rules'\nexport * from './equipment/stop-reason'\nexport * from './equipment/equipment-master'\nexport * from './equipment/equipment-query'\nexport * from './asset/asset-lifecycle'\nexport * from './asset/physical-asset'\nexport * from './asset/physical-asset-class'\nexport * from './asset/asset-master'\nexport * from './asset/asset-query'\nexport * from './location/operational-location'\nexport * from './location/location-master'\nexport * from './location/location-query'\nexport * from './material/material-class'\nexport * from './material/material-definition'\nexport * from './material/material-revision'\nexport * from './material/material-revision-service'\nexport * from './material/material-revision-resolver'\nexport * from './material/material-effective-list'\nexport * from './material/material-master'\nexport * from './material/material-query'\nexport * from './operation/operation-definition'\nexport * from './operation/operation-master'\nexport * from './operation/operation-query'\nexport * from './operation/operation-readiness'\nexport * from './operation/operation-readiness-resolver'\nexport * from './recipe/recipe-definition'\nexport * from './recipe/recipe-revision'\nexport * from './recipe/recipe-revision-line'\nexport * from './recipe/recipe-revision-content'\nexport * from './recipe/recipe-revision-service'\nexport * from './recipe/recipe-revision-resolver'\nexport * from './recipe/recipe-effective-list'\nexport * from './recipe/route-definition'\nexport * from './recipe/recipe-master'\nexport * from './recipe/recipe-query'\nexport * from './test-spec/test-specification'\nexport * from './test-spec/test-spec-revision'\nexport * from './test-spec/test-spec-revision-service'\nexport * from './test-spec/test-spec-revision-resolver'\nexport * from './test-spec/test-spec-effective-list'\nexport * from './test-spec/test-spec-master'\nexport * from './test-spec/test-spec-query'\nexport * from './status/axis-stamp'\nexport * from './status/master-status'\nexport * from './quality/nonconformance-cause'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { entities as AssetEntities, resolvers as AssetResolvers } from './asset'\nimport { entities as EquipmentEntities, resolvers as EquipmentResolvers } from './equipment'\nimport { entities as LocationEntities, resolvers as LocationResolvers } from './location'\nimport { entities as MaterialEntities, resolvers as MaterialResolvers } from './material'\nimport { entities as OperationEntities, resolvers as OperationResolvers } from './operation'\nimport { entities as PersonnelEntities, resolvers as PersonnelResolvers } from './personnel'\nimport { entities as QualityEntities, resolvers as QualityResolvers } from './quality'\n/* 라우팅·레시피 — 품목→지시서를 이으려면 그 사이에 이 둘이 있어야 한다(§`recipe-definition.ts`). */\nimport { entities as RecipeEntities, resolvers as RecipeResolvers } from './recipe'\nimport { resolvers as StatusResolvers } from './status'\n/* 마스터 정합성 — 축을 가로지르므로 어느 축에도 안 속한다. */\nimport { MasterConformanceResolver } from './master-conformance-resolver'\nimport { MasterChangePolicy, MasterChangePolicyResolver } from './master-change-policy'\nimport { MasterValueClaim } from './assignment/master-value-claim'\nimport { entities as TestSpecEntities, resolvers as TestSpecResolvers } from './test-spec'\n\nexport const entities = [\n /* ENTITIES */\n MasterChangePolicy,\n /*\n * 배정 이력. **등록이 빠져 있었다**(2026-09-23 확인) — 표가 안 서니 이력을 쓰는 길이 실제\n * 설치본에는 없었다. 시험 하네스가 자기 목록에 직접 넣어서 초록이었다.\n */\n MasterValueClaim,\n ...PersonnelEntities,\n ...QualityEntities,\n ...EquipmentEntities,\n ...AssetEntities,\n ...LocationEntities,\n ...MaterialEntities,\n ...OperationEntities,\n ...RecipeEntities,\n ...TestSpecEntities\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n MasterChangePolicyResolver,\n ...PersonnelResolvers,\n ...QualityResolvers,\n ...EquipmentResolvers,\n ...AssetResolvers,\n ...LocationResolvers,\n ...MaterialResolvers,\n ...OperationResolvers,\n ...RecipeResolvers,\n ...TestSpecResolvers,\n ...StatusResolvers,\n\n /*\n * **파일을 export 하는 것만으로는 스키마에 안 올라온다.** 여기 적어야 한다 — 처음에 그것을\n * 빠뜨려 `masterConformance` 가 「Cannot query field」로 나왔다. [확인함] 2026-09-04\n */\n MasterConformanceResolver\n ]\n}\nexport * from './assignment/master-value-claim'\nexport * from './assignment/assignment-history'\nexport * from './assignment/assignment-write'\n\n/* AI 입력 — the master records an application's assistant may enter (`registerEntryTarget` on each). */\nexport {\n opsMasterEntryTargets,\n opsMasterEntryTargetOf,\n OPS_MASTER_ENTRY_SPECS,\n type OpsMasterEntryAxisSpec,\n type OpsMasterEntryOptions\n} from './ai-entry/master-entry-targets'\nexport {\n OPS_MASTER_ENTRY_AXES,\n opsMasterEntryKey,\n opsMasterEntryLabelKey,\n type OpsMasterEntryAxis,\n type OpsMasterEntryField,\n type OpsMasterEntryIssue,\n type OpsMasterEntryRow,\n type OpsMasterEntryTarget\n} from './ai-entry/master-entry-rules'\n"]}
|