diff --git a/.env.development b/.env.development index f59d542c..50d1be04 100644 --- a/.env.development +++ b/.env.development @@ -1,5 +1,7 @@ NEXT_PUBLIC_API_SERVER_PATH="http://1.248.227.176:38080" +NEXT_PUBLIC_HOST_URL="http://localhost:4000" + SESSION_SECRET="i3iHH1yp2/2SpQSIySQ4bpyc4g0D+zCF9FAn5xUG0+Y=" NEXT_PUBLIC_CONVERTER_API_URL="https://v2.convertapi.com/convert/dwg/to/png?Secret=secret_bV5zuYMyyIYFlOb3" diff --git a/.env.production b/.env.production index c4c7918d..517ae831 100644 --- a/.env.production +++ b/.env.production @@ -1,5 +1,7 @@ NEXT_PUBLIC_API_SERVER_PATH="http://1.248.227.176:38080" +NEXT_PUBLIC_HOST_URL="http://localhost:4000" + SESSION_SECRET="i3iHH1yp2/2SpQSIySQ4bpyc4g0D+zCF9FAn5xUG0+Y=" NEXT_PUBLIC_CONVERTER_API_URL="https://v2.convertapi.com/convert/dwg/to/png?Secret=secret_bV5zuYMyyIYFlOb3" diff --git a/src/common/common.js b/src/common/common.js index a35dc8c4..2578e138 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -177,6 +177,7 @@ export const SAVE_KEY = [ 'moduleRowsTotCnt', 'seq', 'smartRackId', + 'directionText', 'quotationParam', 'pcses', ] diff --git a/src/components/Main.jsx b/src/components/Main.jsx index cbdea01d..520014b1 100644 --- a/src/components/Main.jsx +++ b/src/components/Main.jsx @@ -13,6 +13,8 @@ import { QcastContext } from '@/app/QcastProvider' import { sessionStore } from '@/store/commonAtom' import { isObjectNotEmpty } from '@/util/common-utils' +import BoardDetailModal from './community/modal/BoardDetailModal' + export default function MainPage() { const [sessionState, setSessionState] = useRecoilState(sessionStore) const [chagePasswordPopOpen, setChagePasswordPopOpen] = useState(false) @@ -79,8 +81,13 @@ export default function MainPage() { } }, [sessionState]) + // FAQ 팝업 관련 + const [open, setOpen] = useState(false) + const [modalNoticeNo, setModalNoticeNo] = useState('') + return ( <> + {open && } {(!chagePasswordPopOpen && ( <>
@@ -120,7 +127,7 @@ export default function MainPage() { - + )) || ( diff --git a/src/components/floor-plan/modal/basic/step/Orientation.jsx b/src/components/floor-plan/modal/basic/step/Orientation.jsx index 590c9d46..d06b6b39 100644 --- a/src/components/floor-plan/modal/basic/step/Orientation.jsx +++ b/src/components/floor-plan/modal/basic/step/Orientation.jsx @@ -28,8 +28,10 @@ export const Orientation = forwardRef(({ tabNum }, ref) => { }, [compasDeg]) const checkDegree = (e) => { - if (numberCheck(Number(e)) && Number(e) >= -180 && Number(e) <= 180) { - setCompasDeg(Number(e)) + if (Number(e) >= -180 && Number(e) <= 180) { + if (numberCheck(Number(e))) { + setCompasDeg(Number(e)) + } } else { setCompasDeg(compasDeg) } @@ -46,8 +48,8 @@ export const Orientation = forwardRef(({ tabNum }, ref) => { {Array.from({ length: 180 / 15 }).map((dot, index) => (
setCompasDeg(15 * (12 + index))} + className={`circle ${getDegreeInOrientation(compasDeg) === -1 * (-15 * index + 180) ? 'act' : ''}`} + onClick={() => setCompasDeg(-1 * (-15 * index + 180))} > {index === 0 && 180°} {index === 6 && -90°} diff --git a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx index 3783e033..109da999 100644 --- a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx @@ -51,7 +51,9 @@ export default function CircuitTrestleSetting({ id }) { const [selectedStepUpValues, setSelectedStepUpValues] = useState({}) const [getStepUpSelections, setGetStepUpSelections] = useState(null) - const [stepUpListData, setStepUpListData] = useRecoilState(stepUpListDataState) + // const [stepUpListData, setStepUpListData] = useRecoilState(stepUpListDataState) + const [stepUpListData, setStepUpListData] = useState([]) + const [seletedOption, setSeletedOption] = useState(null) useEffect(() => { if (!managementState) { @@ -67,10 +69,6 @@ export default function CircuitTrestleSetting({ id }) { } }, [tabNum]) - useEffect(() => { - console.log('stepUpListData >>> ', stepUpListData) - }, [stepUpListData]) - const onAutoRecommend = () => { if (series.filter((s) => s.selected).length === 0) { swalFire({ @@ -159,27 +157,26 @@ export default function CircuitTrestleSetting({ id }) { } const getRoofSurfaceList = () => { - return canvas - .getObjects() - .filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) - .map((obj) => { - return { - roofSurfaceId: obj.id, - roofSurface: canvas - .getObjects() - .filter((o) => o.id === obj.parentId)[0] - .directionText.replace(/[0-9]/g, ''), - roofSurfaceIncl: canvas.getObjects().filter((o) => o.id === obj.parentId)[0].roofMaterial.pitch, - moduleList: getModuleList(obj).map((module) => { - return { - itemId: module.moduleInfo.itemId, - circuit: module.circuitNumber ? module.circuitNumber : null, - pcsItemId: module.circuit ? module.circuit?.pcsItemId : null, - uniqueId: module.id ? module.id : null, - } - }), - } - }) + const roofSurfaceList = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) + roofSurfaceList.sort((a, b) => a.left - b.left || b.top - a.top) + return roofSurfaceList.map((obj) => { + return { + roofSurfaceId: obj.id, + roofSurface: canvas + .getObjects() + .filter((o) => o.id === obj.parentId)[0] + .directionText.replace(/[0-9]/g, ''), + roofSurfaceIncl: canvas.getObjects().filter((o) => o.id === obj.parentId)[0].roofMaterial.pitch, + moduleList: getModuleList(obj).map((module) => { + return { + itemId: module.moduleInfo.itemId, + circuit: module.circuitNumber ? module.circuitNumber : null, + pcsItemId: module.circuit ? module.circuit?.pcsItemId : null, + uniqueId: module.id ? module.id : null, + } + }), + } + }) } const getModuleList = (surface) => { @@ -358,60 +355,17 @@ export default function CircuitTrestleSetting({ id }) { 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', + canvas + .getObjects() + .filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) + .map((obj) => { + obj.pcses = getStepUpListData() }) - 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', - }) - } + console.log(canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)) + apply() } const onClickPrev = () => { @@ -474,6 +428,32 @@ export default function CircuitTrestleSetting({ id }) { getRoofSurfaceList, // 지붕면 목록 getPcsItemList, // PCS 아이템 목록 onValuesSelected: handleStepUpValuesSelected, // 선택된 값들을 처리하는 함수 + stepUpListData, + setStepUpListData, + seletedOption, + setSeletedOption, + } + + const getStepUpListData = () => { + return stepUpListData[0].pcsItemList.map((item) => { + return item.serQtyList + .filter((serQty) => serQty.selected) + .map((serQty) => { + return { + pcsMkrCd: item.pcsMkrCd, + pcsSerCd: item.pcsSerCd, + pcsItemId: item.itemId, + pscOptCd: seletedOption.code, + // pcsOptCd: 'CLC_RMC', + paralQty: serQty.paralQty, + connections: [ + { + connItemId: item.connList[0].itemId, + }, + ], + } + })[0] + }) } return ( diff --git a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx index d5b19b77..9f558f16 100644 --- a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx @@ -12,6 +12,7 @@ import { useMasterController } from '@/hooks/common/useMasterController' import { v4 as uuidv4 } from 'uuid' export default function StepUp(props) { + const { stepUpListData, setStepUpListData, seletedOption, setSeletedOption } = props const { getMessage } = useMessage() const [moduleTab, setModuleTab] = useState(1) const [moduleTabs, setModuleTabs] = useState({}) @@ -22,7 +23,6 @@ export default function StepUp(props) { const { managementState, setManagementState, managementStateLoaded } = useContext(GlobalDataContext) const canvas = useRecoilValue(canvasState) const selectedModules = useRecoilValue(selectedModuleState) - const [stepUpListData, setStepUpListData] = useState([]) const [optCodes, setOptCodes] = useState([]) const [selectedRows, setSelectedRows] = useState({}) @@ -65,6 +65,7 @@ export default function StepUp(props) { // PCS 옵션 조회 const formattedOptCodes = formatOptionCodes(res.data.optionList) setOptCodes(formattedOptCodes) + setSeletedOption(formattedOptCodes[0]) } } catch (error) { console.error('Error fetching step up data:', error) @@ -80,16 +81,6 @@ export default function StepUp(props) { })) } - // // 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 = []) => { const formattedData = dataArray?.map((stepUps) => ({ @@ -98,12 +89,12 @@ export default function StepUp(props) { pcsItemList: formatPcsItemList(stepUps.pcsItemList), selectedPcsItem: formatPcsItemList(stepUps.pcsItemList), })) - console.log('🚀 ~ formatStepUpListData ~ formattedData:', formattedData) + // 초기 추천 값들을 selectedValues에 저장 const initialSelectedValues = {} formattedData.forEach((stepUp) => { stepUp.pcsItemList.forEach((pcsItem, pcsIdx) => { - const pcsKey = `${stepUp.id}_${pcsIdx}` + const pcsKey = `${pcsItem.goodsNo}_${pcsIdx}` // 추천 값(rmdYn === 'Y') 찾기 const recommendedRow = pcsItem.serQtyList.find((item) => item.rmdYn === 'Y') @@ -122,8 +113,8 @@ export default function StepUp(props) { }, } - initialSelectedValues[stepUp.id] = { - ...initialSelectedValues[stepUp.id], + initialSelectedValues[pcsItem.goodsNo] = { + ...initialSelectedValues[pcsItem.goodsNo], [pcsKey]: selectionData, } } @@ -212,12 +203,7 @@ export default function StepUp(props) { } // 행 선택 핸들러 함수 추가 - // const handleRowClick = (goodsNo, pcsIdx, serQtyIdx, serQty, paralQty) => { const handleRowClick = (mainIdx, subIdx) => { - // const rowKey = `${goodsNo}_${pcsIdx}_${serQtyIdx}` - // const pcsKey = `${goodsNo}_${pcsIdx}` - // setSelectedRow(rowKey) - // item.selected = !item.selected\ let tempStepUpListData = [...stepUpListData] let selectedData = {} tempStepUpListData[0].pcsItemList[mainIdx].serQtyList.forEach((item, index) => { @@ -227,6 +213,7 @@ export default function StepUp(props) { item.selected = index === subIdx }) setStepUpListData(tempStepUpListData) + console.log('🚀 ~ handleRowClick ~ tempStepUpListData:', tempStepUpListData) console.log('🚀 ~ handleRowClick ~ selectedData:', selectedData) @@ -235,19 +222,16 @@ export default function StepUp(props) { const moduleIds = targetSurface.modules.map((module) => { return module.id }) - console.log(moduleIds) + canvas .getObjects() .filter((obj) => moduleIds.includes(obj.parentId)) .map((text) => { - console.log('🚀 ~ handleRowClick ~ text:', text) canvas.remove(text) }) canvas.renderAll() roofSurface.moduleList.forEach((module) => { - console.log('🚀 ~ handleRowClick ~ module:', module.uniqueId) - const targetModule = canvas.getObjects().filter((obj) => obj.id === module.uniqueId)[0] const moduleCircuitText = new fabric.Text(module.circuit, { left: targetModule.left + targetModule.width / 2, @@ -270,69 +254,26 @@ export default function StepUp(props) { }) canvas.renderAll() - // console.log('goodsNo >> ', goodsNo, serQty, paralQty) - // 현재 선택된 PCS 아이템 정보 가져오기 - // const pcsItem = stepUpListData.find((stepUp) => stepUp.pcsItemList.find((item) => item.goodsNo === goodsNo))?.pcsItemList[pcsIdx] - - // 선택된 값들 업데이트 - 더 자세한 정보 포함 - // const selectionData = { - // goodsNo: tempStepUpListData[mainIdx].pcsItemList[subIdx].goodsNo, - // pcsInfo: { - // itemId: tempStepUpListData[mainIdx].pcsItemList[subIdx].itemId, - // goodsNo: tempStepUpListData[mainIdx].pcsItemList[subIdx].goodsNo, - // pcsMkrCd: tempStepUpListData[mainIdx].pcsItemList[subIdx].pcsMkrCd, - // pcsSerCd: tempStepUpListData[mainIdx].pcsItemList[subIdx].pcsSerCd, - // }, - // allocation: { - // serQty: tempStepUpListData[mainIdx].pcsItemList[subIdx].serQtyList[subIdx].serQty, - // paralQty: tempStepUpListData[mainIdx].pcsItemList[subIdx].serQtyList[subIdx]. paralQty, - // }, - // } - - // // 선택된 값들 업데이트 - // setSelectedValues((prev) => ({ - // ...prev, - // [tempStepUpListData[mainIdx].pcsItemList[subIdx].goodsNo]: { - // ...prev[tempStepUpListData[mainIdx].pcsItemList[subIdx].goodsNo], - // [pcsKey]: selectionData, - // }, - // })) - - // // 부모 컴포넌트에 선택된 값들 전달 - // if (props.onValuesSelected) { - // props.onValuesSelected(selectionData) - // } - - // setSelectedRows((prev) => { - // // 현재 stepUpId에 대한 선택 상태가 없으면 빈 객체로 초기화 - // const currentStepUpSelections = prev[goodsNo] || {} - - // // 이미 선택된 행을 다시 클릭하는 경우, 선택을 해제하지 않음 - // if (currentStepUpSelections[pcsKey] === rowKey) { - // return prev - // } - - // return { - // ...prev, - // [goodsNo]: { - // ...currentStepUpSelections, - // [pcsKey]: rowKey, - // }, - // } - // }) - - // // 수동 선택 상태를 업데이트하되, 기존 추천 선택은 유지 - // setIsManualSelection((prev) => ({ - // ...prev, - // [goodsNo]: { - // ...prev[goodsNo], - // [pcsKey]: true, - // }, - // })) } // 현재 선택된 값들을 가져오는 함수 추가 const getCurrentSelections = () => { + const selectedValues = stepUpListData[0].pcsItemList.forEach((item) => { + item.serQtyList.filter((serQty) => serQty.selected) + return item.serQtyList.map((serQty) => { + return { + pcsMkrCd: serQty.pcsMkrCd, + pcsSerCd: serQty.pcsSerCd, + pcsItemId: serQty.itemId, + pcsOptCd: seletedOption, + paralQty: serQty.paralQty, + connections: { + connItemId: item.connList[0].itemId, + }, + } + }) + }) + return selectedValues } @@ -472,7 +413,15 @@ export default function StepUp(props) { {optCodes.length > 0 && (
{/* */} - + setSeletedOption(e)} + />
)}
diff --git a/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx b/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx index 32b15236..77404733 100644 --- a/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx @@ -206,6 +206,9 @@ export default function PassivityCircuitAllocation(props) { .getObjects() .filter((obj) => targetModules.includes(obj.id)) .forEach((obj) => { + if (obj.circuit) { + canvas.remove(obj.circuit) + } const moduleCircuitText = new fabric.Text(getCircuitNumber(), { left: obj.left + obj.width / 2, top: obj.top + obj.height / 2, diff --git a/src/components/main/MainContents.jsx b/src/components/main/MainContents.jsx index 3c1e184b..2985484e 100644 --- a/src/components/main/MainContents.jsx +++ b/src/components/main/MainContents.jsx @@ -14,10 +14,9 @@ import { useMainContentsController } from '@/hooks/main/useMainContentsControlle import { QcastContext } from '@/app/QcastProvider' import { useSwal } from '@/hooks/useSwal' -import BoardDetailModal from '../community/modal/BoardDetailModal' import { handleFileDown } from '@/util/board-utils' -export default function MainContents() { +export default function MainContents({ setFaqOpen, setFaqModalNoticeNo }) { const { swalFire } = useSwal() const { getMessage } = useMessage() @@ -116,10 +115,6 @@ export default function MainContents() { } } - // FAQ 팝업 관련 - const [open, setOpen] = useState(false) - const [modalNoticeNo, setModalNoticeNo] = useState('') - return (
@@ -178,7 +173,6 @@ export default function MainContents() {
- {open && }
{recentFaqList.length > 0 ? ( @@ -192,8 +186,8 @@ export default function MainContents() { className="faq-title pre" style={{ cursor: 'pointer' }} onClick={() => { - setOpen(true) - setModalNoticeNo(row.noticeNo) + setFaqOpen(true) + setFaqModalNoticeNo(row.noticeNo) }} > {row.title} diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index 4e095cea..9b5bc193 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -303,11 +303,6 @@ export default function Stuff() { stuffSearchParams.schSaleStoreId = session.storeId stuffSearchParams.schOtherSelSaleStoreId = '' stuffSearchParams.schSelSaleStoreId = '' - // if (session.storeLvl === '1') { - // stuffSearchParams.schSaleStoreId = session.storeId - // stuffSearchParams.schOtherSelSaleStoreId = '' - // stuffSearchParams.schSelSaleStoreId = '' - // } } async function fetchData() { diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index bb820b7c..684b464d 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -283,15 +283,19 @@ export default function StuffDetail() { cellStyle: { justifyContent: 'center' }, cellRenderer: (params) => { let buttonStyle + let buttonStyle2 if (params.value == null) { buttonStyle = { display: 'none', } - } - if (managementState?.createUser === 'T01') { - if (session.userId !== 'T01') { - // #474 - buttonStyle = { display: 'none' } + buttonStyle2 = { + display: 'none', + } + } else { + if (managementState?.createSaleStoreId === 'T01') { + if (session?.storeId !== 'T01') { + buttonStyle = { display: 'none' } + } } } return ( @@ -312,7 +316,7 @@ export default function StuffDetail() { {getMessage('stuff.detail.planGrid.btn1')}