@seedtactics/insight-client 17.0.1-beta.13 → 17.0.1-beta.15
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/README.md +5 -4
- package/dist/assets/index-Z6GAS_qc.js +367 -0
- package/dist/cell-status/loading.d.ts +7 -0
- package/dist/cell-status/loading.js +25 -0
- package/dist/components/App.d.ts +0 -5
- package/dist/components/App.js +1 -1
- package/dist/components/operations/AllMaterial.js +9 -12
- package/dist/components/station-monitor/BasketLoadStationWork.d.ts +1 -7
- package/dist/components/station-monitor/BasketLoadStationWork.js +11 -7
- package/dist/components/station-monitor/InvalidateCycle.js +21 -17
- package/dist/components/station-monitor/LoadStation.d.ts +0 -5
- package/dist/components/station-monitor/LoadStation.js +29 -69
- package/dist/components/station-monitor/Material.js +4 -2
- package/dist/components/station-monitor/QuarantineButton.js +17 -26
- package/dist/components/station-monitor/Whiteboard.js +14 -15
- package/dist/data/material-operation-policy.d.ts +6 -0
- package/dist/data/material-operation-policy.js +26 -2
- package/dist/extension.d.ts +0 -1
- package/dist/index.html +1 -1
- package/dist/index.js +1 -6
- package/dist/network/api.d.ts +16 -34
- package/dist/network/api.js +64 -64
- package/dist/network/backend-mock.js +3 -0
- package/dist/network/backend.d.ts +1 -0
- package/docs/material-quarantine.md +5 -4
- package/docs/mazak.md +9 -12
- package/docs/operator-procedures.md +14 -0
- package/package.json +9 -4
- package/dist/assets/index-Dxxgr-QV.js +0 -367
- package/dist/components/station-monitor/BasketMovementArrival.d.ts +0 -40
- package/dist/components/station-monitor/BasketMovementArrival.js +0 -165
|
@@ -34,9 +34,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
34
34
|
import { memo, useMemo, useState } from "react";
|
|
35
35
|
import { closestCenter, DndContext, DragOverlay, KeyboardSensor, PointerSensor, useSensor, useSensors, } from "@dnd-kit/core";
|
|
36
36
|
import { rectSortingStrategy, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy, } from "@dnd-kit/sortable";
|
|
37
|
-
import {
|
|
38
|
-
import { reorderQueuedMatInCurrentStatus } from "../../cell-status/current-status.js";
|
|
37
|
+
import { moveQueuedMatInCurrentStatus } from "../../cell-status/loading.js";
|
|
39
38
|
import { currentOperator } from "../../data/operators.js";
|
|
39
|
+
import { canSetMaterialInQueue } from "../../data/material-operation-policy.js";
|
|
40
40
|
import { useAtomValue, useSetAtom } from "jotai";
|
|
41
41
|
function isSortableMatData(value) {
|
|
42
42
|
return typeof value === "object" && value !== null && "mat" in value;
|
|
@@ -46,8 +46,7 @@ function numericId(id) {
|
|
|
46
46
|
}
|
|
47
47
|
export const SortableRegion = memo(function SortableRegion(props) {
|
|
48
48
|
const [activeMat, setActiveMat] = useState(undefined);
|
|
49
|
-
const
|
|
50
|
-
const reorderQueuedMat = useSetAtom(reorderQueuedMatInCurrentStatus);
|
|
49
|
+
const moveQueuedMat = useSetAtom(moveQueuedMatInCurrentStatus);
|
|
51
50
|
const operator = useAtomValue(currentOperator);
|
|
52
51
|
const sortableItemIds = useMemo(() => props.matIds.slice(), [props.matIds]);
|
|
53
52
|
const sensors = useSensors(useSensor(PointerSensor), useSensor(KeyboardSensor, {
|
|
@@ -56,19 +55,19 @@ export const SortableRegion = memo(function SortableRegion(props) {
|
|
|
56
55
|
return (_jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragStart: ({ active }) => setActiveMat(isSortableMatData(active.data.current) ? active.data.current.mat : undefined), onDragCancel: () => setActiveMat(undefined), onDragEnd: ({ active, over }) => {
|
|
57
56
|
const activeMatId = numericId(active.id);
|
|
58
57
|
const overMatId = over ? numericId(over.id) : null;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
reorderQueuedMat({
|
|
58
|
+
const mat = isSortableMatData(active.data.current) ? active.data.current.mat : null;
|
|
59
|
+
if (over &&
|
|
60
|
+
active.id !== over.id &&
|
|
61
|
+
activeMatId !== null &&
|
|
62
|
+
overMatId !== null &&
|
|
63
|
+
mat !== null &&
|
|
64
|
+
canSetMaterialInQueue(mat, props.queueName)) {
|
|
65
|
+
moveQueuedMat({
|
|
68
66
|
queue: props.queueName,
|
|
69
67
|
matId: activeMatId,
|
|
70
|
-
newIdx:
|
|
71
|
-
|
|
68
|
+
newIdx: props.matIds.indexOf(overMatId),
|
|
69
|
+
operator,
|
|
70
|
+
}).catch(console.error);
|
|
72
71
|
}
|
|
73
72
|
setActiveMat(undefined);
|
|
74
73
|
}, children: _jsxs(SortableContext, { items: sortableItemIds, strategy: props.direction === "vertical" ? verticalListSortingStrategy : rectSortingStrategy, children: [props.children, _jsx(DragOverlay, { children: activeMat !== undefined ? props.renderDragOverlay(activeMat) : undefined })] }) }));
|
|
@@ -18,4 +18,10 @@ export declare function canDirectlyQuarantine(material: MaterialForPolicy): bool
|
|
|
18
18
|
export declare function canRemoveFromQueue(material: MaterialForPolicy): boolean;
|
|
19
19
|
export declare function canInvalidateMaterial(material: MaterialForPolicy): boolean;
|
|
20
20
|
export declare function canAddOrMoveMaterialToQueue(material: MaterialForPolicy): boolean;
|
|
21
|
+
export declare function canReorderQueuedMaterial(material: MaterialForPolicy): boolean;
|
|
22
|
+
export declare function canSetMaterialInQueue(material: MaterialForPolicy, queue: string): boolean;
|
|
23
|
+
export declare function quarantineRoute(material: Readonly<IInProcessMaterial>): {
|
|
24
|
+
readonly process: number;
|
|
25
|
+
readonly path: number;
|
|
26
|
+
};
|
|
21
27
|
export {};
|
|
@@ -46,8 +46,10 @@ function hasLoadStationAction(material) {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
export function materialOperationState(material) {
|
|
49
|
+
if (material.action.automatedTransfer === true)
|
|
50
|
+
return { kind: "AutomationControlled" };
|
|
49
51
|
const cancellationId = nonBlankCancellationId(material);
|
|
50
|
-
if (
|
|
52
|
+
if (material.action.loadCancellationId !== undefined || hasLoadStationAction(material)) {
|
|
51
53
|
return { kind: "ActiveLoadStationOperation", cancellationId };
|
|
52
54
|
}
|
|
53
55
|
if (material.location.type === LocType.InQueue && material.action.type === ActionType.Waiting) {
|
|
@@ -70,7 +72,11 @@ export function canCancelLoad(material) {
|
|
|
70
72
|
return state.kind === "ActiveLoadStationOperation" && state.cancellationId !== null;
|
|
71
73
|
}
|
|
72
74
|
export function canSignalQuarantine(material) {
|
|
73
|
-
return material !== null &&
|
|
75
|
+
return (material !== null &&
|
|
76
|
+
material.materialID >= 0 &&
|
|
77
|
+
(materialOperationState(material).kind === "AutomationControlled" ||
|
|
78
|
+
material.action.type === ActionType.UnloadToInProcess ||
|
|
79
|
+
material.action.type === ActionType.UnloadToCompletedMaterial));
|
|
74
80
|
}
|
|
75
81
|
export function canDirectlyQuarantine(material) {
|
|
76
82
|
return material !== null && materialOperationState(material).kind === "HumanControlledQueue";
|
|
@@ -87,3 +93,21 @@ export function canAddOrMoveMaterialToQueue(material) {
|
|
|
87
93
|
const state = materialOperationState(material);
|
|
88
94
|
return state.kind === "AddToQueueProposal" || state.kind === "HumanControlledQueue";
|
|
89
95
|
}
|
|
96
|
+
export function canReorderQueuedMaterial(material) {
|
|
97
|
+
// Priority changes within the source queue remain allowed during human station work.
|
|
98
|
+
return (material !== null &&
|
|
99
|
+
material.location.type === LocType.InQueue &&
|
|
100
|
+
material.action.automatedTransfer !== true);
|
|
101
|
+
}
|
|
102
|
+
export function canSetMaterialInQueue(material, queue) {
|
|
103
|
+
return material?.location.type === LocType.InQueue && material.location.currentQueue === queue
|
|
104
|
+
? canReorderQueuedMaterial(material)
|
|
105
|
+
: canAddOrMoveMaterialToQueue(material);
|
|
106
|
+
}
|
|
107
|
+
export function quarantineRoute(material) {
|
|
108
|
+
return material.action.automatedTransfer === true &&
|
|
109
|
+
(material.action.type === ActionType.Loading ||
|
|
110
|
+
material.action.type === ActionType.LoadingToBasket)
|
|
111
|
+
? { process: material.action.processAfterLoad ?? 0, path: material.action.pathAfterLoad ?? 0 }
|
|
112
|
+
: { process: material.process, path: material.path };
|
|
113
|
+
}
|
package/dist/extension.d.ts
CHANGED
|
@@ -10,4 +10,3 @@ export { defaultChooseModes } from "./components/ChooseMode.js";
|
|
|
10
10
|
export type { ChooseModeItem } from "./components/ChooseMode.js";
|
|
11
11
|
export { RouteLocation } from "./components/routes.js";
|
|
12
12
|
export { authenticatedFetch } from "./network/backend.js";
|
|
13
|
-
export type { BasketMovementCompletionCommand, BasketMovementCompletionReceipt, BasketLocationCorrectionCommand, SubmitBasketLocationCorrection, SubmitBasketMovementCompletion, } from "./components/station-monitor/BasketMovementArrival.js";
|
package/dist/index.html
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<link rel="shortcut icon" href="/assets/favicon-gWFxiJK2.ico" />
|
|
7
7
|
<title>SeedTactic FMS Insight</title>
|
|
8
8
|
<style type="text/css">.download-loader{width:100px;height:100px;display:inline-block}.download-circular{width:100px;height:100px;animation:2s linear infinite rotate}.download-path{stroke-dasharray:1 200;stroke-dashoffset:0;stroke-linecap:round;stroke:#8d6e63;animation:1.5s ease-out infinite dash}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes dash{0%{stroke-dasharray:1 200;stroke-dashoffset:0}50%{stroke-dasharray:89 200;stroke-dashoffset:-35px}to{stroke-dasharray:89 200;stroke-dashoffset:-124px}}</style>
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-Z6GAS_qc.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/assets/index-DXfAwuj-.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
package/dist/index.js
CHANGED
|
@@ -33,12 +33,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
33
33
|
import { bootstrapInsight } from "./extension.js";
|
|
34
34
|
import { ApiException } from "./network/api.js";
|
|
35
35
|
async function main() {
|
|
36
|
-
|
|
37
|
-
? {
|
|
38
|
-
submitBasketLoadStationCommand: async () => "accepted",
|
|
39
|
-
}
|
|
40
|
-
: {};
|
|
41
|
-
await bootstrapInsight(developmentProps);
|
|
36
|
+
await bootstrapInsight();
|
|
42
37
|
}
|
|
43
38
|
main().catch((e) => {
|
|
44
39
|
console.log(e);
|
package/dist/network/api.d.ts
CHANGED
|
@@ -31,6 +31,8 @@ export declare class JobsClient {
|
|
|
31
31
|
protected processRecent(response: Response): Promise<RecentHistoricData>;
|
|
32
32
|
latestSchedule(signal?: AbortSignal): Promise<MostRecentSchedule>;
|
|
33
33
|
protected processLatestSchedule(response: Response): Promise<MostRecentSchedule>;
|
|
34
|
+
completeBasketLoadStation(completion: BasketLoadStationCompletion, signal?: AbortSignal): Promise<void>;
|
|
35
|
+
protected processCompleteBasketLoadStation(response: Response): Promise<void>;
|
|
34
36
|
currentStatus(signal?: AbortSignal): Promise<CurrentStatus>;
|
|
35
37
|
protected processCurrentStatus(response: Response): Promise<CurrentStatus>;
|
|
36
38
|
unscheduledRebookings(signal?: AbortSignal): Promise<Rebooking[]>;
|
|
@@ -710,7 +712,6 @@ export declare class CurrentStatus implements ICurrentStatus {
|
|
|
710
712
|
baskets?: {
|
|
711
713
|
[key: string]: BasketStatus;
|
|
712
714
|
} | undefined;
|
|
713
|
-
basketMoveInstructions?: BasketMoveInstruction[] | undefined;
|
|
714
715
|
customState?: any | undefined;
|
|
715
716
|
constructor(data?: ICurrentStatus);
|
|
716
717
|
init(_data?: any): void;
|
|
@@ -735,7 +736,6 @@ export interface ICurrentStatus {
|
|
|
735
736
|
baskets?: {
|
|
736
737
|
[key: string]: BasketStatus;
|
|
737
738
|
} | undefined;
|
|
738
|
-
basketMoveInstructions?: BasketMoveInstruction[] | undefined;
|
|
739
739
|
customState?: any | undefined;
|
|
740
740
|
}
|
|
741
741
|
export declare class HistoricJob extends Job implements IHistoricJob {
|
|
@@ -893,6 +893,7 @@ export declare enum LocType {
|
|
|
893
893
|
}
|
|
894
894
|
export declare class InProcessMaterialAction implements IInProcessMaterialAction {
|
|
895
895
|
type: ActionType;
|
|
896
|
+
automatedTransfer?: boolean;
|
|
896
897
|
workId?: string | undefined;
|
|
897
898
|
loadCancellationId?: string | undefined;
|
|
898
899
|
loadOntoPalletNum?: number | undefined;
|
|
@@ -916,6 +917,7 @@ export declare class InProcessMaterialAction implements IInProcessMaterialAction
|
|
|
916
917
|
}
|
|
917
918
|
export interface IInProcessMaterialAction {
|
|
918
919
|
type: ActionType;
|
|
920
|
+
automatedTransfer?: boolean;
|
|
919
921
|
workId?: string | undefined;
|
|
920
922
|
loadCancellationId?: string | undefined;
|
|
921
923
|
loadOntoPalletNum?: number | undefined;
|
|
@@ -1077,6 +1079,7 @@ export declare class BasketLoadStationWork implements IBasketLoadStationWork {
|
|
|
1077
1079
|
type: BasketLoadStationWorkType;
|
|
1078
1080
|
readyToConfirm: boolean;
|
|
1079
1081
|
confirmationBlockedReason?: string | undefined;
|
|
1082
|
+
instructionWarning?: string | undefined;
|
|
1080
1083
|
awaitingMaterialSlots?: number[];
|
|
1081
1084
|
constructor(data?: IBasketLoadStationWork);
|
|
1082
1085
|
init(_data?: any): void;
|
|
@@ -1088,6 +1091,7 @@ export interface IBasketLoadStationWork {
|
|
|
1088
1091
|
type: BasketLoadStationWorkType;
|
|
1089
1092
|
readyToConfirm: boolean;
|
|
1090
1093
|
confirmationBlockedReason?: string | undefined;
|
|
1094
|
+
instructionWarning?: string | undefined;
|
|
1091
1095
|
awaitingMaterialSlots?: number[];
|
|
1092
1096
|
}
|
|
1093
1097
|
export declare enum BasketLoadStationWorkType {
|
|
@@ -1116,38 +1120,6 @@ export declare enum BasketLocationEnum {
|
|
|
1116
1120
|
Storage = "Storage",
|
|
1117
1121
|
InTransit = "InTransit"
|
|
1118
1122
|
}
|
|
1119
|
-
export declare class BasketMoveInstruction implements IBasketMoveInstruction {
|
|
1120
|
-
instructionId: string;
|
|
1121
|
-
basketId: number;
|
|
1122
|
-
source?: BasketPosition | undefined;
|
|
1123
|
-
destination: BasketPosition;
|
|
1124
|
-
reason: BasketMoveReason;
|
|
1125
|
-
displayText: string;
|
|
1126
|
-
prerequisiteInstructionId?: string | undefined;
|
|
1127
|
-
constructor(data?: IBasketMoveInstruction);
|
|
1128
|
-
init(_data?: any): void;
|
|
1129
|
-
static fromJS(data: any): BasketMoveInstruction;
|
|
1130
|
-
toJSON(data?: any): any;
|
|
1131
|
-
}
|
|
1132
|
-
export interface IBasketMoveInstruction {
|
|
1133
|
-
instructionId: string;
|
|
1134
|
-
basketId: number;
|
|
1135
|
-
source?: BasketPosition | undefined;
|
|
1136
|
-
destination: BasketPosition;
|
|
1137
|
-
reason: BasketMoveReason;
|
|
1138
|
-
displayText: string;
|
|
1139
|
-
prerequisiteInstructionId?: string | undefined;
|
|
1140
|
-
}
|
|
1141
|
-
export declare enum BasketMoveReason {
|
|
1142
|
-
LoadMaterial = "LoadMaterial",
|
|
1143
|
-
UnloadMaterial = "UnloadMaterial",
|
|
1144
|
-
ProcessTransfer = "ProcessTransfer",
|
|
1145
|
-
SupplyMaterialToCell = "SupplyMaterialToCell",
|
|
1146
|
-
SupplyEmptyBasket = "SupplyEmptyBasket",
|
|
1147
|
-
ReturnToStorage = "ReturnToStorage",
|
|
1148
|
-
RemoveForCorrection = "RemoveForCorrection",
|
|
1149
|
-
Other = "Other"
|
|
1150
|
-
}
|
|
1151
1123
|
export declare class ProblemDetails implements IProblemDetails {
|
|
1152
1124
|
type?: string | undefined;
|
|
1153
1125
|
title?: string | undefined;
|
|
@@ -1330,6 +1302,16 @@ export interface IRebooking {
|
|
|
1330
1302
|
notes?: string | undefined;
|
|
1331
1303
|
workorder?: string | undefined;
|
|
1332
1304
|
}
|
|
1305
|
+
export declare class BasketLoadStationCompletion implements IBasketLoadStationCompletion {
|
|
1306
|
+
workId: string;
|
|
1307
|
+
constructor(data?: IBasketLoadStationCompletion);
|
|
1308
|
+
init(_data?: any): void;
|
|
1309
|
+
static fromJS(data: any): BasketLoadStationCompletion;
|
|
1310
|
+
toJSON(data?: any): any;
|
|
1311
|
+
}
|
|
1312
|
+
export interface IBasketLoadStationCompletion {
|
|
1313
|
+
workId: string;
|
|
1314
|
+
}
|
|
1333
1315
|
export declare class SimulationResults implements ISimulationResults {
|
|
1334
1316
|
scheduleId: string;
|
|
1335
1317
|
jobs: Job[];
|
package/dist/network/api.js
CHANGED
|
@@ -393,6 +393,40 @@ export class JobsClient {
|
|
|
393
393
|
}
|
|
394
394
|
return Promise.resolve(null);
|
|
395
395
|
}
|
|
396
|
+
completeBasketLoadStation(completion, signal) {
|
|
397
|
+
let url_ = this.baseUrl + "/api/v1/jobs/basket-load-station/complete";
|
|
398
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
399
|
+
const content_ = JSON.stringify(completion);
|
|
400
|
+
let options_ = {
|
|
401
|
+
body: content_,
|
|
402
|
+
method: "POST",
|
|
403
|
+
signal,
|
|
404
|
+
headers: {
|
|
405
|
+
"Content-Type": "application/json",
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
return this.http.fetch(url_, options_).then((_response) => {
|
|
409
|
+
return this.processCompleteBasketLoadStation(_response);
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
processCompleteBasketLoadStation(response) {
|
|
413
|
+
const status = response.status;
|
|
414
|
+
let _headers = {};
|
|
415
|
+
if (response.headers && response.headers.forEach) {
|
|
416
|
+
response.headers.forEach((v, k) => (_headers[k] = v));
|
|
417
|
+
}
|
|
418
|
+
if (status === 200) {
|
|
419
|
+
return response.text().then((_responseText) => {
|
|
420
|
+
return;
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
else if (status !== 200 && status !== 204) {
|
|
424
|
+
return response.text().then((_responseText) => {
|
|
425
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
return Promise.resolve(null);
|
|
429
|
+
}
|
|
396
430
|
currentStatus(signal) {
|
|
397
431
|
let url_ = this.baseUrl + "/api/v1/jobs/status";
|
|
398
432
|
url_ = url_.replace(/[?&]$/, "");
|
|
@@ -3625,11 +3659,6 @@ export class CurrentStatus {
|
|
|
3625
3659
|
: new BasketStatus();
|
|
3626
3660
|
}
|
|
3627
3661
|
}
|
|
3628
|
-
if (Array.isArray(_data["BasketMoveInstructions"])) {
|
|
3629
|
-
this.basketMoveInstructions = [];
|
|
3630
|
-
for (let item of _data["BasketMoveInstructions"])
|
|
3631
|
-
this.basketMoveInstructions.push(BasketMoveInstruction.fromJS(item));
|
|
3632
|
-
}
|
|
3633
3662
|
this.customState = _data["CustomState"];
|
|
3634
3663
|
}
|
|
3635
3664
|
}
|
|
@@ -3700,11 +3729,6 @@ export class CurrentStatus {
|
|
|
3700
3729
|
: undefined;
|
|
3701
3730
|
}
|
|
3702
3731
|
}
|
|
3703
|
-
if (Array.isArray(this.basketMoveInstructions)) {
|
|
3704
|
-
data["BasketMoveInstructions"] = [];
|
|
3705
|
-
for (let item of this.basketMoveInstructions)
|
|
3706
|
-
data["BasketMoveInstructions"].push(item ? item.toJSON() : undefined);
|
|
3707
|
-
}
|
|
3708
3732
|
data["CustomState"] = this.customState;
|
|
3709
3733
|
return data;
|
|
3710
3734
|
}
|
|
@@ -4050,6 +4074,7 @@ export class InProcessMaterialAction {
|
|
|
4050
4074
|
init(_data) {
|
|
4051
4075
|
if (_data) {
|
|
4052
4076
|
this.type = _data["Type"];
|
|
4077
|
+
this.automatedTransfer = _data["AutomatedTransfer"];
|
|
4053
4078
|
this.workId = _data["WorkId"];
|
|
4054
4079
|
this.loadCancellationId = _data["LoadCancellationId"];
|
|
4055
4080
|
this.loadOntoPalletNum = _data["LoadOntoPalletNum"];
|
|
@@ -4077,6 +4102,7 @@ export class InProcessMaterialAction {
|
|
|
4077
4102
|
toJSON(data) {
|
|
4078
4103
|
data = typeof data === "object" ? data : {};
|
|
4079
4104
|
data["Type"] = this.type;
|
|
4105
|
+
data["AutomatedTransfer"] = this.automatedTransfer;
|
|
4080
4106
|
data["WorkId"] = this.workId;
|
|
4081
4107
|
data["LoadCancellationId"] = this.loadCancellationId;
|
|
4082
4108
|
data["LoadOntoPalletNum"] = this.loadOntoPalletNum;
|
|
@@ -4426,6 +4452,7 @@ export class BasketLoadStationWork {
|
|
|
4426
4452
|
this.type = _data["Type"];
|
|
4427
4453
|
this.readyToConfirm = _data["ReadyToConfirm"];
|
|
4428
4454
|
this.confirmationBlockedReason = _data["ConfirmationBlockedReason"];
|
|
4455
|
+
this.instructionWarning = _data["InstructionWarning"];
|
|
4429
4456
|
if (Array.isArray(_data["AwaitingMaterialSlots"])) {
|
|
4430
4457
|
this.awaitingMaterialSlots = [];
|
|
4431
4458
|
for (let item of _data["AwaitingMaterialSlots"])
|
|
@@ -4445,6 +4472,7 @@ export class BasketLoadStationWork {
|
|
|
4445
4472
|
data["Type"] = this.type;
|
|
4446
4473
|
data["ReadyToConfirm"] = this.readyToConfirm;
|
|
4447
4474
|
data["ConfirmationBlockedReason"] = this.confirmationBlockedReason;
|
|
4475
|
+
data["InstructionWarning"] = this.instructionWarning;
|
|
4448
4476
|
if (Array.isArray(this.awaitingMaterialSlots)) {
|
|
4449
4477
|
data["AwaitingMaterialSlots"] = [];
|
|
4450
4478
|
for (let item of this.awaitingMaterialSlots)
|
|
@@ -4497,60 +4525,6 @@ export var BasketLocationEnum;
|
|
|
4497
4525
|
BasketLocationEnum["Storage"] = "Storage";
|
|
4498
4526
|
BasketLocationEnum["InTransit"] = "InTransit";
|
|
4499
4527
|
})(BasketLocationEnum || (BasketLocationEnum = {}));
|
|
4500
|
-
export class BasketMoveInstruction {
|
|
4501
|
-
constructor(data) {
|
|
4502
|
-
if (data) {
|
|
4503
|
-
for (var property in data) {
|
|
4504
|
-
if (data.hasOwnProperty(property))
|
|
4505
|
-
this[property] = data[property];
|
|
4506
|
-
}
|
|
4507
|
-
}
|
|
4508
|
-
if (!data) {
|
|
4509
|
-
this.destination = new BasketPosition();
|
|
4510
|
-
}
|
|
4511
|
-
}
|
|
4512
|
-
init(_data) {
|
|
4513
|
-
if (_data) {
|
|
4514
|
-
this.instructionId = _data["InstructionId"];
|
|
4515
|
-
this.basketId = _data["BasketId"];
|
|
4516
|
-
this.source = _data["Source"] ? BasketPosition.fromJS(_data["Source"]) : undefined;
|
|
4517
|
-
this.destination = _data["Destination"]
|
|
4518
|
-
? BasketPosition.fromJS(_data["Destination"])
|
|
4519
|
-
: new BasketPosition();
|
|
4520
|
-
this.reason = _data["Reason"];
|
|
4521
|
-
this.displayText = _data["DisplayText"];
|
|
4522
|
-
this.prerequisiteInstructionId = _data["PrerequisiteInstructionId"];
|
|
4523
|
-
}
|
|
4524
|
-
}
|
|
4525
|
-
static fromJS(data) {
|
|
4526
|
-
data = typeof data === "object" ? data : {};
|
|
4527
|
-
let result = new BasketMoveInstruction();
|
|
4528
|
-
result.init(data);
|
|
4529
|
-
return result;
|
|
4530
|
-
}
|
|
4531
|
-
toJSON(data) {
|
|
4532
|
-
data = typeof data === "object" ? data : {};
|
|
4533
|
-
data["InstructionId"] = this.instructionId;
|
|
4534
|
-
data["BasketId"] = this.basketId;
|
|
4535
|
-
data["Source"] = this.source ? this.source.toJSON() : undefined;
|
|
4536
|
-
data["Destination"] = this.destination ? this.destination.toJSON() : undefined;
|
|
4537
|
-
data["Reason"] = this.reason;
|
|
4538
|
-
data["DisplayText"] = this.displayText;
|
|
4539
|
-
data["PrerequisiteInstructionId"] = this.prerequisiteInstructionId;
|
|
4540
|
-
return data;
|
|
4541
|
-
}
|
|
4542
|
-
}
|
|
4543
|
-
export var BasketMoveReason;
|
|
4544
|
-
(function (BasketMoveReason) {
|
|
4545
|
-
BasketMoveReason["LoadMaterial"] = "LoadMaterial";
|
|
4546
|
-
BasketMoveReason["UnloadMaterial"] = "UnloadMaterial";
|
|
4547
|
-
BasketMoveReason["ProcessTransfer"] = "ProcessTransfer";
|
|
4548
|
-
BasketMoveReason["SupplyMaterialToCell"] = "SupplyMaterialToCell";
|
|
4549
|
-
BasketMoveReason["SupplyEmptyBasket"] = "SupplyEmptyBasket";
|
|
4550
|
-
BasketMoveReason["ReturnToStorage"] = "ReturnToStorage";
|
|
4551
|
-
BasketMoveReason["RemoveForCorrection"] = "RemoveForCorrection";
|
|
4552
|
-
BasketMoveReason["Other"] = "Other";
|
|
4553
|
-
})(BasketMoveReason || (BasketMoveReason = {}));
|
|
4554
4528
|
export class ProblemDetails {
|
|
4555
4529
|
constructor(data) {
|
|
4556
4530
|
if (data) {
|
|
@@ -5005,6 +4979,32 @@ export class Rebooking {
|
|
|
5005
4979
|
return data;
|
|
5006
4980
|
}
|
|
5007
4981
|
}
|
|
4982
|
+
export class BasketLoadStationCompletion {
|
|
4983
|
+
constructor(data) {
|
|
4984
|
+
if (data) {
|
|
4985
|
+
for (var property in data) {
|
|
4986
|
+
if (data.hasOwnProperty(property))
|
|
4987
|
+
this[property] = data[property];
|
|
4988
|
+
}
|
|
4989
|
+
}
|
|
4990
|
+
}
|
|
4991
|
+
init(_data) {
|
|
4992
|
+
if (_data) {
|
|
4993
|
+
this.workId = _data["WorkId"];
|
|
4994
|
+
}
|
|
4995
|
+
}
|
|
4996
|
+
static fromJS(data) {
|
|
4997
|
+
data = typeof data === "object" ? data : {};
|
|
4998
|
+
let result = new BasketLoadStationCompletion();
|
|
4999
|
+
result.init(data);
|
|
5000
|
+
return result;
|
|
5001
|
+
}
|
|
5002
|
+
toJSON(data) {
|
|
5003
|
+
data = typeof data === "object" ? data : {};
|
|
5004
|
+
data["WorkId"] = this.workId;
|
|
5005
|
+
return data;
|
|
5006
|
+
}
|
|
5007
|
+
}
|
|
5008
5008
|
export class SimulationResults {
|
|
5009
5009
|
constructor(data) {
|
|
5010
5010
|
if (data) {
|
|
@@ -229,6 +229,9 @@ export function registerMockBackend(offsetSeconds, mockD, mockEvts) {
|
|
|
229
229
|
quarantineQueuedMaterial() {
|
|
230
230
|
return Promise.resolve();
|
|
231
231
|
},
|
|
232
|
+
completeBasketLoadStation() {
|
|
233
|
+
return Promise.resolve();
|
|
234
|
+
},
|
|
232
235
|
cancelLoad() {
|
|
233
236
|
return Promise.resolve();
|
|
234
237
|
},
|
|
@@ -12,6 +12,7 @@ export interface JobAPI {
|
|
|
12
12
|
addUnallocatedCastingToQueue(castingName: string, queue: string, qty: number, operatrorName: string | null, workorder: string | null, serials: string[]): Promise<ReadonlyArray<Readonly<api.IInProcessMaterial>>>;
|
|
13
13
|
signalMaterialForQuarantine(materialId: number, operName: string | null, reason: string | undefined): Promise<void>;
|
|
14
14
|
quarantineQueuedMaterial(materialId: number, operName: string | null, reason: string | undefined): Promise<void>;
|
|
15
|
+
completeBasketLoadStation(request: Readonly<api.IBasketLoadStationCompletion>): Promise<void>;
|
|
15
16
|
cancelLoad(materialId: number, operName: string | null, request: Readonly<api.ICancelLoadRequest>): Promise<void>;
|
|
16
17
|
invalidatePalletCycle(materialId: number, operName: string | null | undefined, changeCastingTo: string | null | undefined, changeJobUniqueTo: string | null | undefined, process: number): Promise<Readonly<api.IMaterialDetails> | null | undefined>;
|
|
17
18
|
unscheduledRebookings(signal?: AbortSignal): Promise<ReadonlyArray<Readonly<api.IRebooking>> | null>;
|
|
@@ -36,10 +36,11 @@ The [operations](client-operations#material) and [quality](client-quality#quaran
|
|
|
36
36
|
webpages allow supervisors, quality engineers and others to manually move material between the
|
|
37
37
|
various quarantined queues, view all the material, add notes, re-introduce material to "active"
|
|
38
38
|
queues, or scrap material. In addition, the [server configuration](server-config) contains a setting
|
|
39
|
-
_QuarantineQueue_ for the initial quarantine queue.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
_QuarantineQueue_ for the initial quarantine queue. Direct quarantine moves material that is waiting
|
|
40
|
+
in a queue into this configured queue. A quarantine signal instead records a request for the backend
|
|
41
|
+
to handle material when it leaves automation control; it does not immediately move material or
|
|
42
|
+
cancel a load. The [operator procedures](operator-procedures#quarantine-material) explain this
|
|
43
|
+
distinction. The available actions depend on the installation and the material's current state.
|
|
43
44
|
|
|
44
45
|
FMS Insight allows arbitrary quarantined material queues, but we suggest you follow a scheme similar
|
|
45
46
|
to the "TODO, In-Progress, Done" Kanban task management/project management technique.
|
package/docs/mazak.md
CHANGED
|
@@ -2,16 +2,14 @@
|
|
|
2
2
|
title: Mazak Palletech Integration
|
|
3
3
|
nav: FMS Insight Server > Mazak
|
|
4
4
|
description: >-
|
|
5
|
-
FMS Insight
|
|
6
|
-
|
|
7
|
-
all the data in the cell controller.
|
|
5
|
+
FMS Insight supports Mazak Palletech Web Version and Smooth/Neo PMC. FMS Insight can read all
|
|
6
|
+
events from the cell controller and can also edit almost all the data in the cell controller.
|
|
8
7
|
---
|
|
9
8
|
|
|
10
9
|
# FMS Insight Mazak Palletech Integration
|
|
11
10
|
|
|
12
|
-
FMS Insight
|
|
13
|
-
|
|
14
|
-
all the data in the cell controller.
|
|
11
|
+
FMS Insight supports Mazak Palletech Web Version and Smooth/Neo PMC. FMS Insight can read all events
|
|
12
|
+
from the cell controller and can also edit almost all the data in the cell controller.
|
|
15
13
|
|
|
16
14
|
## Load station numbering
|
|
17
15
|
|
|
@@ -31,8 +29,7 @@ updating configuration.
|
|
|
31
29
|
To facilitate the communication between FMS Insight and the Mazak cell controller, you must acquire
|
|
32
30
|
a program called "Mazak Open Database Kit". This is a software program developed by Mazak which
|
|
33
31
|
allows safe access to the data inside the cell controller. Please contact your Mazak representative
|
|
34
|
-
and ask to obtain "Open Database Kit" that matches the specific cell controller (
|
|
35
|
-
Smooth PMC).
|
|
32
|
+
and ask to obtain "Open Database Kit" that matches the specific cell controller (Web or Smooth PMC).
|
|
36
33
|
|
|
37
34
|
## Enable Log CSV
|
|
38
35
|
|
|
@@ -49,10 +46,10 @@ specify the same folder in the FMS Insight server configuration file.
|
|
|
49
46
|
|
|
50
47
|
## Load Instructions
|
|
51
48
|
|
|
52
|
-
On
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
On MazakWeb, one parameter must be changed. If you are using Mazak Smooth PMC, this step can be
|
|
50
|
+
skipped! Open the Mazak Palletech software, go to the parameter edit screen, select `X`, and scroll
|
|
51
|
+
to the setting `X-31`. Set the `X-31` setting from 0 to 1. This setting will cause CSV files
|
|
52
|
+
describing the current load and unload operation at the load station to be output to the
|
|
56
53
|
`c:\Mazak\FMS\LDS` directory. FMS Insight monitors this directory and uses the CSV files to display
|
|
57
54
|
the parts being loaded and unloaded from each pallet at the load station.
|
|
58
55
|
|
|
@@ -69,6 +69,12 @@ detailed inspection, or some other rework. Material can be quarantined on the qu
|
|
|
69
69
|
the material dialog and clicking a button. This moves the material to the quarantine queue where it
|
|
70
70
|
is visible on the supervisor's material page.
|
|
71
71
|
|
|
72
|
+
A quarantine signal records a request for the backend to handle material when it leaves automation
|
|
73
|
+
control. The signal does not immediately move material or cancel a load. Direct quarantine moves
|
|
74
|
+
material that is waiting in a queue into the configured quarantine queue. The available actions
|
|
75
|
+
depend on the installation and the material's current state. Follow the displayed instructions and
|
|
76
|
+
the installation's procedure before moving physical material.
|
|
77
|
+
|
|
72
78
|
Once the material is ready to be re-introduced into the cell, the operator should bring it back to
|
|
73
79
|
the shop floor. Once the material has arrived, the operator can click a button on the queues webpage
|
|
74
80
|
(or scan the barcode) to add the material into the queue. Once it is back in the queue, the cell
|
|
@@ -94,6 +100,14 @@ quarantine queue. That material can then be re-introduced back into the queue so
|
|
|
94
100
|
FMS Insight matches the material on the shop floor. In addition, FMS Insight allows the ability to
|
|
95
101
|
invalidate the inadvertent load events that were created.
|
|
96
102
|
|
|
103
|
+
Only the latest still-valid process can be invalidated. For material with recorded processes 1, 2,
|
|
104
|
+
and 3, first invalidate process 3, then review the refreshed history before invalidating process 2
|
|
105
|
+
in a separate action. Continue backwards one process at a time as needed. To change a casting or job
|
|
106
|
+
assignment, first invalidate any later processes in separate actions.
|
|
107
|
+
|
|
108
|
+
Invalidation affects whole recorded cycle events and all material listed in the confirmation. The
|
|
109
|
+
original events remain in the event log but no longer contribute to active material reconstruction.
|
|
110
|
+
|
|
97
111
|
Insight does not reassign recorded pallet manufacturing history from one material identity to
|
|
98
112
|
another. If machining was attributed to the wrong identity, record an explanatory operator note and
|
|
99
113
|
use the installation's traceability exception procedure. Quarantine, invalidation, and readmission
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seedtactics/insight-client",
|
|
3
|
-
"version": "17.0.1-beta.
|
|
3
|
+
"version": "17.0.1-beta.15",
|
|
4
4
|
"license": "BSD-3-Clause",
|
|
5
5
|
"repository": {
|
|
6
6
|
"url": "https://github.com/SeedTactics/fms-insight"
|
|
@@ -42,13 +42,10 @@
|
|
|
42
42
|
"date-fns": "^4.4.0",
|
|
43
43
|
"highlight.js": "^11.12.0",
|
|
44
44
|
"jdenticon": "^3.3.0",
|
|
45
|
-
"jotai": "^3.0.0",
|
|
46
45
|
"jotai-family": "^1.1.0",
|
|
47
46
|
"jsbarcode": "^3.12.3",
|
|
48
47
|
"oidc-client-ts": "^3.5.0",
|
|
49
|
-
"react": "^19.3.0",
|
|
50
48
|
"react-calendar": "^6.0.1",
|
|
51
|
-
"react-dom": "^19.3.0",
|
|
52
49
|
"react-error-boundary": "^6.1.6",
|
|
53
50
|
"react-resize-detector": "^12.3.0",
|
|
54
51
|
"react-timeago": "^8.3.0",
|
|
@@ -66,17 +63,25 @@
|
|
|
66
63
|
"@types/react-dom": "^19.3.0",
|
|
67
64
|
"@vitejs/plugin-react": "^6.1.1",
|
|
68
65
|
"@vitest/browser-playwright": "^5.0.2",
|
|
66
|
+
"jotai": "^3.0.1",
|
|
69
67
|
"jsdom": "^30.1.1",
|
|
70
68
|
"nswag": "^14.7.1",
|
|
71
69
|
"oxfmt": "^0.71.0",
|
|
72
70
|
"oxlint": "^1.86.0",
|
|
73
71
|
"oxlint-tsgolint": "^7.0.2003",
|
|
74
72
|
"playwright": "^1.63.0",
|
|
73
|
+
"react": "^19.3.0",
|
|
74
|
+
"react-dom": "^19.3.0",
|
|
75
75
|
"typescript": "^7.0.2",
|
|
76
76
|
"vite": "^8.3.1",
|
|
77
77
|
"vitest": "^5.0.2",
|
|
78
78
|
"vitest-browser-react": "^2.3.0"
|
|
79
79
|
},
|
|
80
|
+
"peerDependencies": {
|
|
81
|
+
"jotai": "^3.0.1",
|
|
82
|
+
"react": "^19.3.0",
|
|
83
|
+
"react-dom": "^19.3.0"
|
|
84
|
+
},
|
|
80
85
|
"scripts": {
|
|
81
86
|
"type-check": "tsc --noEmit --skipLibCheck",
|
|
82
87
|
"lint": "oxlint --type-aware",
|