From 683977e3a9f84cf80f528861f1bc8af59f9defb1 Mon Sep 17 00:00:00 2001 From: Justine Devaux Date: Thu, 3 Apr 2025 17:04:43 +0200 Subject: [PATCH] feat: EAM-4438 propose available spare during replace equipment --- src/tools/WSEquipment.js | 15 +++++++++++ src/tools/WSGrids.js | 6 ++--- .../pages/equipment/replaceeqp/ReplaceEqp.jsx | 25 +++++++++++++++++++ .../replaceeqp/ReplaceEqpGeneral.jsx | 11 ++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/tools/WSEquipment.js b/src/tools/WSEquipment.js index 36bde4eb..1b3237a0 100644 --- a/src/tools/WSEquipment.js +++ b/src/tools/WSEquipment.js @@ -23,6 +23,21 @@ class WSEquipment { return getGridData(gridRequest).then(response => transformResponse(response, WSWorkorders.myWorkOrderMapper)); } + getSparePart(originalEquipment) { + let gridRequest = new GridRequest("OSOBJA", GridTypes.LIST); //we only display 100 records per default + if(!originalEquipment.partCode) { + return; + } + gridRequest.addFilter("equipmentno", originalEquipment.code, "!="); + gridRequest.addFilter("part", originalEquipment.partCode, "="); + gridRequest.addFilter("statusrcode", 'C', "!="); + gridRequest.addFilter("position", '', "IS EMPTY"); + gridRequest.addFilter("parentasset", '', "IS EMPTY"); + gridRequest.addFilter("outofservice", '-', "NOT_SELECTED"); + + return getGridData(gridRequest).then(response => response.body.data); + } + getEquipmentEvents(equipmentCode, equipmentType, config = {}) { return WS._get(`/equipment/events?c=${equipmentCode}&t=${equipmentType}`, config); } diff --git a/src/tools/WSGrids.js b/src/tools/WSGrids.js index be85e28c..d4f80dea 100644 --- a/src/tools/WSGrids.js +++ b/src/tools/WSGrids.js @@ -8,7 +8,7 @@ export function transformResponse(response, keyMap, additionalData = []) { return { body: { data: [ - ...response.body.data.map(item => + ...response.body.data.map(item => Object.fromEntries(Object.entries(keyMap).map(([newKey, oldKey]) => [newKey, typeof oldKey === 'function' ? oldKey(item) : item[oldKey]])) ), ...additionalData @@ -24,14 +24,14 @@ export const readStatuses = (entity, newEntity, oldStatus) => { gridRequest.addFilter("usergroupcode", userData.eamAccount.userGroup, "=", "OR", true, false) gridRequest.addFilter("usercode", userData.eamAccount.userCode, "=", "AND", false, true) gridRequest.addFilter("entity", entity, "=") - + if (newEntity) { gridRequest.addFilter("fromstatus", "-", "=") } else { gridRequest.addFilter("fromstatus", oldStatus, "=") } - return getGridData(gridRequest).then(response => transformResponse(response, {code: "tostatus", desc: "tostatusdesc"}, + return getGridData(gridRequest).then(response => transformResponse(response, {code: "tostatus", desc: "tostatusdesc"}, newEntity && response.body.data.length > 0 ? [] : [{ code: oldStatus, desc: response.body.data[0].fromstatusdesc }] )); diff --git a/src/ui/pages/equipment/replaceeqp/ReplaceEqp.jsx b/src/ui/pages/equipment/replaceeqp/ReplaceEqp.jsx index f8ad69d9..c1c15bfa 100644 --- a/src/ui/pages/equipment/replaceeqp/ReplaceEqp.jsx +++ b/src/ui/pages/equipment/replaceeqp/ReplaceEqp.jsx @@ -32,6 +32,9 @@ const ReplaceEqp = (props) => { const [oldEquipment, setOldEquipment] = useState(undefined); const [replaceEquipment, setReplaceEquipment] = useState(initEqpReplacement); const [stateList, setStateList] = useState([]); + const [eqpSuggestions, setEqpSuggestions] = useState([]); + const [selectedSuggestion, setSelectedSuggestion] = useState(null); + const [statusList, setStatusList] = useState([]); const { userData } = useUserDataStore(); const { applicationData } = useApplicationDataStore(); @@ -103,6 +106,8 @@ const ReplaceEqp = (props) => { }; const onChangeOldEquipment = (value) => { + setEqpSuggestions([]); + setSelectedSuggestion(null); if (value) { loadEquipmentData(value, 'oldEquipment'); } else { @@ -119,6 +124,20 @@ const ReplaceEqp = (props) => { } }; + const onChangeSelectedSuggestion = (value) => { + setSelectedSuggestion(value); + const suggestion = eqpSuggestions.find(x => value.code === x.equipmentno); + updateEqpReplacementProp('newEquipment', value.code); + updateEqpReplacementProp('newEquipmentDesc', suggestion ? suggestion.equipmentdesc : value.desc); + updateEqpReplacementProp('newEquipmentStatus', suggestion ? suggestion.assetstatus : ''); + onChangeNewEquipment(value.code); + } + + const getDescription = (value) => { + return `${value.equipmentdesc} - ${value.location} - ${value.bin} - ${value.assetstatus_display}` + }; + + /** * Load the equipment data when it is selected * @param code the equipment code @@ -130,6 +149,9 @@ const ReplaceEqp = (props) => { const response = await WSEquipment.getEquipment(code); if (destination === 'oldEquipment') { + WSEquipment.getSparePart(response.body.data).then((x) => setEqpSuggestions(x.map((eqp)=> { + return {code: eqp.equipmentno, desc: getDescription(eqp)} + }))); setOldEquipment(response.body.data); // Set status/state for old equipment @@ -189,9 +211,12 @@ const ReplaceEqp = (props) => { updateProperty={updateEqpReplacementProp} onChangeOldEquipment={onChangeOldEquipment} onChangeNewEquipment={onChangeNewEquipment} + onChangeSelectedSuggestion={onChangeSelectedSuggestion} + selectedSuggestion={selectedSuggestion} equipmentLayout={equipmentLayout} statusList={statusList} stateList={stateList} + eqpSuggestions={eqpSuggestions} replaceEquipmentHandler={replaceEquipmentHandler} showError={showError} handleError={handleError} diff --git a/src/ui/pages/equipment/replaceeqp/ReplaceEqpGeneral.jsx b/src/ui/pages/equipment/replaceeqp/ReplaceEqpGeneral.jsx index 982be650..59f7c939 100644 --- a/src/ui/pages/equipment/replaceeqp/ReplaceEqpGeneral.jsx +++ b/src/ui/pages/equipment/replaceeqp/ReplaceEqpGeneral.jsx @@ -34,8 +34,11 @@ const ReplaceEqpGeneral = (props) => { equipmentLayout, onChangeNewEquipment, onChangeOldEquipment, + onChangeSelectedSuggestion, + selectedSuggestion, replaceEquipmentHandler, replaceEquipment, + eqpSuggestions, stateList, statusList, showError, @@ -204,6 +207,14 @@ const ReplaceEqpGeneral = (props) => { )} /> + {eqpSuggestions && eqpSuggestions.length > 0 ? () : null } +