diff --git a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx index 8c9d31af..b4d13d20 100644 --- a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx @@ -20,6 +20,8 @@ import { useTrestle } from '@/hooks/module/useTrestle' import { selectedModuleState } from '@/store/selectedModuleOptions' import { v4 as uuidv4 } from 'uuid' +import { stepUpListDataState } from '@/store/circuitTrestleAtom' + const ALLOCATION_TYPE = { AUTO: 'auto', PASSIVITY: 'passivity', @@ -45,6 +47,12 @@ export default function CircuitTrestleSetting({ id }) { const selectedModules = useRecoilValue(selectedModuleState) const { getPcsAutoRecommendList, getPcsVoltageChk } = useMasterController() + // 회로할당(승합설정)에서 선택된 값들을 저장할 상태 추가 + const [selectedStepUpValues, setSelectedStepUpValues] = useState({}) + const [getStepUpSelections, setGetStepUpSelections] = useState(null) + + const [stepUpListData, setStepUpListData] = useRecoilState(stepUpListDataState) + useEffect(() => { if (!managementState) { setManagementState(managementStateLoaded) @@ -59,6 +67,10 @@ export default function CircuitTrestleSetting({ id }) { } }, [tabNum]) + useEffect(() => { + console.log('stepUpListData >>> ', stepUpListData) + }, [stepUpListData]) + const onAutoRecommend = () => { if (series.filter((s) => s.selected).length === 0) { swalFire({ @@ -331,6 +343,77 @@ export default function CircuitTrestleSetting({ id }) { setAllocationType(ALLOCATION_TYPE.PASSIVITY) } + // StepUp에서 선택된 값들을 처리하는 함수 수정 + const handleStepUpValuesSelected = (selectionData) => { + const { gooodsNo } = selectionData + + setSelectedStepUpValues((prev) => ({ + ...prev, + [gooodsNo]: selectionData, + })) + } + + // StepUp 컴포넌트 초기화 핸들러 + const handleStepUpInitialize = (getCurrentSelections) => { + setGetStepUpSelections(() => getCurrentSelections) + } + + // apply 함수 수정 + const onApply = () => { + // 현재 선택된 값들 가져오기 + const currentSelections = getStepUpSelections ? getStepUpSelections() : {} + + console.log('currentSelections >>> ', currentSelections) + + // 실제 선택된 값이 있는지 더 정확하게 확인 + const hasSelections = Object.values(currentSelections).some((stepUpConfig) => Object.values(stepUpConfig).length > 0) + + console.log('hasSelections >>> ', hasSelections) + + if (!hasSelections) { + swalFire({ + title: '승압 설정값을 선택해주세요.1', + type: 'alert', + }) + return + } + + // 선택된 값들 로그 + console.log('Applying StepUp configurations:', currentSelections) + + // StepUp 컴포넌트로부터 stepUpListData 받아오기 + //const stepUpData = getStepUpSelections().stepUpListData + //console.log('stepUpData >>> ', stepUpData) + // stepUpListData를 Recoil state에 저장 + // setStepUpListData(stepUpData) + + // 선택된 값들을 배열로 변환하여 처리 + const configurations = Object.values(currentSelections) + .map((stepUpConfig) => { + const firstConfig = Object.values(stepUpConfig)[0] // 첫 번째 설정만 사용 + return { + pcsInfo: firstConfig.pcsInfo, + allocation: firstConfig.allocation, + } + }) + .filter((config) => config.pcsInfo && config.allocation) // 유효한 설정만 필터링 + + console.log('Processed configurations:', configurations) + + // stepUpListData를 Recoil state에 저장 + setStepUpListData(configurations) + + // 기존 apply 로직 실행 전에 필요한 데이터가 모두 있는지 확인 + if (configurations.length > 0) { + apply() + } else { + swalFire({ + title: '승압 설정값을 선택해주세요.2', + type: 'alert', + }) + } + } + const onClickPrev = () => { setAllocationType(ALLOCATION_TYPE.AUTO) swalFire({ @@ -388,6 +471,7 @@ export default function CircuitTrestleSetting({ id }) { getUseModuleItemList, // 사용된 모듈아이템 List getRoofSurfaceList, // 지붕면 목록 getPcsItemList, // PCS 아이템 목록 + onValuesSelected: handleStepUpValuesSelected, // 선택된 값들을 처리하는 함수 } return ( @@ -409,7 +493,7 @@ export default function CircuitTrestleSetting({ id }) { {tabNum === 1 && allocationType === ALLOCATION_TYPE.AUTO && } {tabNum === 1 && allocationType === ALLOCATION_TYPE.PASSIVITY && } - {tabNum === 2 && } + {tabNum === 2 && } {tabNum === 1 && allocationType === ALLOCATION_TYPE.AUTO && (
-
diff --git a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx index bd722b8e..b098f409 100644 --- a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx @@ -27,6 +27,9 @@ export default function StepUp(props) { const [selectedRows, setSelectedRows] = useState({}) const [isManualSelection, setIsManualSelection] = useState({}) + // 선택된 값들을 저장할 상태 추가 + const [selectedValues, setSelectedValues] = useState({}) + // useCanvasPopupStatusController(6) // const canvasPopupStatusState = useRecoilValue(canvasPopupStatusStore) // if (Object.keys(canvasPopupStatusState[6]).length !== 0) { @@ -76,14 +79,59 @@ export default function StepUp(props) { })) } - // PCS 승압설정 정보 포맷 + // // PCS 승압설정 정보 포맷 + // const formatStepUpListData = (dataArray = []) => { + // return dataArray?.map((stepUps) => ({ + // ...stepUps, + // optionList: formatOptionList(stepUps.optionList), + // pcsItemList: formatPcsItemList(stepUps.pcsItemList), + // selectedPcsItem: formatPcsItemList(stepUps.pcsItemList), + // })) + // } + + // PCS 승압설정 정보 포맷 후 추천 값 저장 const formatStepUpListData = (dataArray = []) => { - return dataArray?.map((stepUps) => ({ + const formattedData = dataArray?.map((stepUps) => ({ ...stepUps, optionList: formatOptionList(stepUps.optionList), pcsItemList: formatPcsItemList(stepUps.pcsItemList), selectedPcsItem: formatPcsItemList(stepUps.pcsItemList), })) + + // 초기 추천 값들을 selectedValues에 저장 + const initialSelectedValues = {} + formattedData.forEach((stepUp) => { + stepUp.pcsItemList.forEach((pcsItem, pcsIdx) => { + const pcsKey = `${stepUp.id}_${pcsIdx}` + + // 추천 값(rmdYn === 'Y') 찾기 + const recommendedRow = pcsItem.serQtyList.find((item) => item.rmdYn === 'Y') + if (recommendedRow) { + const selectionData = { + stepUpId: pcsItem.goodsNo, + pcsInfo: { + itemId: pcsItem.itemId, + goodsNo: pcsItem.goodsNo, + pcsMkrCd: pcsItem.pcsMkrCd, + pcsSerCd: pcsItem.pcsSerCd, + }, + allocation: { + serQty: recommendedRow.serQty, + paralQty: recommendedRow.paralQty, + }, + } + + initialSelectedValues[stepUp.id] = { + ...initialSelectedValues[stepUp.id], + [pcsKey]: selectionData, + } + } + }) + }) + + setSelectedValues(initialSelectedValues) + + return formattedData } // PCS 옵션 포맷 @@ -133,21 +181,60 @@ export default function StepUp(props) { } // 각 모듈의 탭을 변경하는 함수 - const handleTabChange = (stepUpId, idx, tabNumber) => { + const handleTabChange = (goodsNo, idx, tabNumber) => { setModuleTabs((prev) => ({ ...prev, - [`${stepUpId}_${idx}`]: tabNumber, + [`${goodsNo}_${idx}`]: tabNumber, })) } // 행 선택 핸들러 함수 추가 - const handleRowClick = (stepUpId, pcsIdx, serQtyIdx) => { - const rowKey = `${stepUpId}_${pcsIdx}_${serQtyIdx}` - const pcsKey = `${stepUpId}_${pcsIdx}` + const handleRowClick = (goodsNo, pcsIdx, serQtyIdx, serQty, paralQty) => { + const rowKey = `${goodsNo}_${pcsIdx}_${serQtyIdx}` + const pcsKey = `${goodsNo}_${pcsIdx}` + + console.log('goodsNo >> ', goodsNo, serQty, paralQty) + + // 현재 선택된 PCS 아이템 정보 가져오기 + const pcsItem = stepUpListData.find((stepUp) => stepUp.pcsItemList.find((item) => item.goodsNo === goodsNo))?.pcsItemList[pcsIdx] + + if (!pcsItem) { + console.error('PCS item not found:', { goodsNo, pcsIdx }) + return + } + + // 선택된 값들 업데이트 - 더 자세한 정보 포함 + const selectionData = { + goodsNo: goodsNo, + pcsInfo: { + itemId: pcsItem?.itemId, + goodsNo: pcsItem?.goodsNo, + pcsMkrCd: pcsItem?.pcsMkrCd, + pcsSerCd: pcsItem?.pcsSerCd, + }, + allocation: { + serQty: serQty, + paralQty: paralQty, + }, + } + + // 선택된 값들 업데이트 + setSelectedValues((prev) => ({ + ...prev, + [goodsNo]: { + ...prev[goodsNo], + [pcsKey]: selectionData, + }, + })) + + // 부모 컴포넌트에 선택된 값들 전달 + if (props.onValuesSelected) { + props.onValuesSelected(selectionData) + } setSelectedRows((prev) => { // 현재 stepUpId에 대한 선택 상태가 없으면 빈 객체로 초기화 - const currentStepUpSelections = prev[stepUpId] || {} + const currentStepUpSelections = prev[goodsNo] || {} // 이미 선택된 행을 다시 클릭하는 경우, 선택을 해제하지 않음 if (currentStepUpSelections[pcsKey] === rowKey) { @@ -156,7 +243,7 @@ export default function StepUp(props) { return { ...prev, - [stepUpId]: { + [goodsNo]: { ...currentStepUpSelections, [pcsKey]: rowKey, }, @@ -166,13 +253,36 @@ export default function StepUp(props) { // 수동 선택 상태를 업데이트하되, 기존 추천 선택은 유지 setIsManualSelection((prev) => ({ ...prev, - [stepUpId]: { - ...prev[stepUpId], + [goodsNo]: { + ...prev[goodsNo], [pcsKey]: true, }, })) } + // 현재 선택된 값들을 가져오는 함수 추가 + const getCurrentSelections = () => { + return selectedValues + } + + // props로 getCurrentSelections 함수 전달 + useEffect(() => { + if (props.onInitialize) { + props.onInitialize(getCurrentSelections) + } + }, []) + + // stepUpListData가 변경될 때마다 업데이트하는 useEffect + useEffect(() => { + if (props.onInitialize) { + // onInitialize를 props에서 가져옴 + props.onInitialize(() => ({ + ...getCurrentSelections(), + stepUpListData, // stepUpListData를 포함하여 반환 + })) + } + }, [stepUpListData]) + return ( <>
@@ -194,18 +304,18 @@ export default function StepUp(props) { {stepUp.pcsItemList[idx].serQtyList.map((item, serQtyIdx) => { - const rowKey = `${stepUp.id}_${idx}_${serQtyIdx}` - const pcsKey = `${stepUp.id}_${idx}` + const rowKey = `${stepUp.pcsItemList[idx].goodsNo}_${idx}_${serQtyIdx}` + const pcsKey = `${stepUp.pcsItemList[idx].goodsNo}_${idx}` return ( handleRowClick(stepUp.id, idx, serQtyIdx)} + onClick={() => handleRowClick(stepUp.pcsItemList[idx].goodsNo, idx, serQtyIdx, item.serQty, item.paralQty)} style={{ cursor: 'pointer' }} > {item.serQty} @@ -219,20 +329,20 @@ export default function StepUp(props) {
- {(moduleTabs[`${stepUp.id}_${idx}`] || 1) === 1 && ( + {(moduleTabs[`${stepUp.pcsItemList[idx].goodsNo}_${idx}`] || 1) === 1 && (
@@ -262,7 +372,7 @@ export default function StepUp(props) { )} - {(moduleTabs[`${stepUp.id}_${idx}`] || 1) === 2 && ( + {(moduleTabs[`${stepUp.pcsItemList[idx].goodsNo}_${idx}`] || 1) === 2 && (
diff --git a/src/store/circuitTrestleAtom.js b/src/store/circuitTrestleAtom.js index ad77c778..ea54835a 100644 --- a/src/store/circuitTrestleAtom.js +++ b/src/store/circuitTrestleAtom.js @@ -44,3 +44,8 @@ export const moduleStatisticsState = atom({ }, dangerouslyAllowMutability: true, }) + +export const stepUpListDataState = atom({ + key: 'stepUpListDataState', + default: [], +})