@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.
Files changed (31) hide show
  1. package/README.md +5 -4
  2. package/dist/assets/index-Z6GAS_qc.js +367 -0
  3. package/dist/cell-status/loading.d.ts +7 -0
  4. package/dist/cell-status/loading.js +25 -0
  5. package/dist/components/App.d.ts +0 -5
  6. package/dist/components/App.js +1 -1
  7. package/dist/components/operations/AllMaterial.js +9 -12
  8. package/dist/components/station-monitor/BasketLoadStationWork.d.ts +1 -7
  9. package/dist/components/station-monitor/BasketLoadStationWork.js +11 -7
  10. package/dist/components/station-monitor/InvalidateCycle.js +21 -17
  11. package/dist/components/station-monitor/LoadStation.d.ts +0 -5
  12. package/dist/components/station-monitor/LoadStation.js +29 -69
  13. package/dist/components/station-monitor/Material.js +4 -2
  14. package/dist/components/station-monitor/QuarantineButton.js +17 -26
  15. package/dist/components/station-monitor/Whiteboard.js +14 -15
  16. package/dist/data/material-operation-policy.d.ts +6 -0
  17. package/dist/data/material-operation-policy.js +26 -2
  18. package/dist/extension.d.ts +0 -1
  19. package/dist/index.html +1 -1
  20. package/dist/index.js +1 -6
  21. package/dist/network/api.d.ts +16 -34
  22. package/dist/network/api.js +64 -64
  23. package/dist/network/backend-mock.js +3 -0
  24. package/dist/network/backend.d.ts +1 -0
  25. package/docs/material-quarantine.md +5 -4
  26. package/docs/mazak.md +9 -12
  27. package/docs/operator-procedures.md +14 -0
  28. package/package.json +9 -4
  29. package/dist/assets/index-Dxxgr-QV.js +0 -367
  30. package/dist/components/station-monitor/BasketMovementArrival.d.ts +0 -40
  31. 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 { useAddExistingMaterialToQueue } from "../../cell-status/material-details.js";
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 [addExistingMatToQueue] = useAddExistingMaterialToQueue();
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
- if (over && active.id !== over.id && activeMatId !== null && overMatId !== null) {
60
- const overIdx = props.matIds.indexOf(overMatId);
61
- void addExistingMatToQueue({
62
- materialId: activeMatId,
63
- queue: props.queueName,
64
- queuePosition: overIdx,
65
- operator: operator,
66
- }).catch(console.error);
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: overIdx,
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 (cancellationId !== null || hasLoadStationAction(material)) {
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 && materialOperationState(material).kind === "AutomationControlled";
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
+ }
@@ -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-Dxxgr-QV.js"></script>
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
- const developmentProps = import.meta.env.DEV
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);
@@ -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[];
@@ -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. If this setting is given, the
40
- [station monitor webpages](client-station-monitor) will contain a button _Quarantine Material_: if
41
- pressed the material is moved out of the "active" whiteboard regions/queues and into the quarantine
42
- queue specified in the server configuration file.
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 works with all Palletech cell controller versions from Mazak: Version E, Web Version,
6
- and Smooth PMC. FMS Insight can read all events from the cell controller and can also edit almost
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 works with all Palletech cell controller versions from Mazak: Version E, Web Version,
13
- and Smooth PMC. FMS Insight can read all events from the cell controller and can also edit almost
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 (Version E, Web, or
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 Version E and MazakWeb, one parameter must be changed. If you are using Mazak Smooth PMC, this
53
- step can be skipped! Open the Mazak Palletech software, go to the parameter edit screen, select `X`,
54
- and scroll to the setting `X-31`. Set the `X-31` setting from 0 to 1. This setting will cause CSV
55
- files describing the current load and unload operation at the load station to be output to the
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.13",
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",