dev #335

Merged
ysCha merged 4 commits from dev into dev-deploy 2025-09-10 18:27:00 +09:00
5 changed files with 141 additions and 11 deletions

View File

@ -7,16 +7,21 @@ import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'
import QSelectBox from '@/components/common/select/QSelectBox' import QSelectBox from '@/components/common/select/QSelectBox'
import { roofsState } from '@/store/roofAtom' import { roofsState } from '@/store/roofAtom'
import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting'
import { useCommonCode } from '@/hooks/common/useCommonCode'
import Swal from 'sweetalert2' import Swal from 'sweetalert2'
import { normalizeDecimal} from '@/util/input-utils' import { normalizeDecimal} from '@/util/input-utils'
export const Orientation = forwardRef((props, ref) => { export const Orientation = forwardRef((props, ref) => {
const { getMessage } = useMessage() const { getMessage } = useMessage()
const { findCommonCode } = useCommonCode()
const [hasAnglePassivity, setHasAnglePassivity] = useState(false) const [hasAnglePassivity, setHasAnglePassivity] = useState(false)
const basicSetting = useRecoilValue(basicSettingState) const basicSetting = useRecoilValue(basicSettingState)
const [addedRoofs, setAddedRoofs] = useRecoilState(addedRoofsState) // const [addedRoofs, setAddedRoofs] = useRecoilState(addedRoofsState) //
const [roofsStore, setRoofsStore] = useRecoilState(roofsState) const [roofsStore, setRoofsStore] = useRecoilState(roofsState)
const [roofTab, setRoofTab] = useState(0) // const [roofTab, setRoofTab] = useState(0) //
const [selectedModuleSeries, setSelectedModuleSeries] = useState(null)
const [moduleSeriesList, setModuleSeriesList] = useState([])
const [filteredModuleList, setFilteredModuleList] = useState([])
const { const {
roofs, roofs,
setRoofs, setRoofs,
@ -80,9 +85,20 @@ export const Orientation = forwardRef((props, ref) => {
useEffect(() => { useEffect(() => {
if (selectedModules) { if (selectedModules) {
setSelectedModules(moduleList.find((module) => module.itemId === selectedModules.itemId)) const foundModule = moduleList.find((module) => module.itemId === selectedModules.itemId)
if (foundModule) {
setSelectedModules(foundModule)
// ( )
if (moduleSeriesList.length > 0 && foundModule.moduleSerCd) {
const currentSeries = moduleSeriesList.find(series => series.moduleSerCd === foundModule.moduleSerCd)
if (currentSeries && (!selectedModuleSeries || selectedModuleSeries.moduleSerCd !== currentSeries.moduleSerCd)) {
setSelectedModuleSeries(currentSeries)
}
}
}
} }
}, [selectedModules]) }, [selectedModules, moduleList, moduleSeriesList])
useEffect(() => { useEffect(() => {
if (selectedSurfaceType) { if (selectedSurfaceType) {
@ -206,6 +222,31 @@ export const Orientation = forwardRef((props, ref) => {
return true return true
} }
const handleChangeModuleSeries = (e) => {
resetRoofs()
setSelectedModuleSeries(e)
//
if (e && moduleList.length > 0) {
let filtered
if (e.moduleSerCd === 'ALL') {
// ""
filtered = moduleList
} else {
//
filtered = moduleList.filter(module => module.moduleSerCd === e.moduleSerCd)
}
setFilteredModuleList(filtered)
//
if (filtered.length > 0) {
setSelectedModules(filtered[0])
}
}
}
const handleChangeModule = (e) => { const handleChangeModule = (e) => {
resetRoofs() resetRoofs()
setSelectedModules(e) setSelectedModules(e)
@ -264,12 +305,69 @@ export const Orientation = forwardRef((props, ref) => {
setRoofsStore(newRoofs) setRoofsStore(newRoofs)
} }
// commonCode
useEffect(() => { useEffect(() => {
// selectedModules handleChangeModule if (moduleList.length > 0 && moduleSeriesList.length === 0) {
if (moduleList.length > 0 && (!selectedModules || !selectedModules.itemId)) { const moduleSeriesCodes = findCommonCode(207100) || []
handleChangeModule(moduleList[0]);
// moduleList moduleSerCd
const uniqueSeriesCd = [...new Set(moduleList.map(module => module.moduleSerCd).filter(Boolean))]
if (uniqueSeriesCd.length > 0) {
// moduleSerCd commonCode moduleSeriesList
const mappedSeries = uniqueSeriesCd.map(serCd => {
const matchedCode = moduleSeriesCodes.find(code => code.clCode === serCd)
return {
moduleSerCd: serCd,
moduleSerNm: matchedCode ? matchedCode.clCodeNm : serCd
}
})
// ""
const allOption = {
moduleSerCd: 'ALL',
moduleSerNm: getMessage("board.sub.total") || 'ALL'
}
const seriesList = [allOption, ...mappedSeries]
setModuleSeriesList(seriesList)
//
if (selectedModules && selectedModules.moduleSerCd) {
const currentSeries = seriesList.find(series => series.moduleSerCd === selectedModules.moduleSerCd)
if (currentSeries) {
setSelectedModuleSeries(currentSeries)
} else {
setSelectedModuleSeries(allOption)
}
} else {
// ""
setSelectedModuleSeries(allOption)
}
}
} }
}, [moduleList]); // }, [moduleList, selectedModules])
//
useEffect(() => {
if (moduleList.length > 0 && filteredModuleList.length === 0 && selectedModuleSeries) {
let filtered
if (selectedModuleSeries.moduleSerCd === 'ALL') {
// ""
filtered = moduleList
} else {
//
filtered = moduleList.filter(module => module.moduleSerCd === selectedModuleSeries.moduleSerCd)
}
setFilteredModuleList(filtered)
if (filtered.length > 0 && !selectedModules) {
setSelectedModules(filtered[0])
}
}
}, [moduleList, selectedModuleSeries]);
return ( return (
<> <>
<div className="properties-setting-wrap"> <div className="properties-setting-wrap">
@ -336,11 +434,26 @@ export const Orientation = forwardRef((props, ref) => {
<div className="compas-table-wrap"> <div className="compas-table-wrap">
<div className="compas-table-box mb10"> <div className="compas-table-box mb10">
<div className="outline-form mb10"> <div className="outline-form mb10">
<span>{getMessage('modal.module.basic.setting.module.setting')}</span> <span>{getMessage('modal.module.basic.setting.module.series.setting')}</span>
<div className="grid-select"> <div className="grid-select">
{moduleList && ( {moduleSeriesList.length > 0 && (
<QSelectBox <QSelectBox
options={moduleList} options={moduleSeriesList}
value={selectedModuleSeries}
targetKey={'moduleSerCd'}
sourceKey={'moduleSerCd'}
showKey={'moduleSerNm'}
onChange={(e) => handleChangeModuleSeries(e)}
/>
)}
</div>
</div>
<div className="outline-form mb10">
<span>{getMessage('modal.module.basic.setting.module.setting2')}</span>
<div className="grid-select">
{filteredModuleList && (
<QSelectBox
options={filteredModuleList}
value={selectedModules} value={selectedModules}
targetKey={'itemId'} targetKey={'itemId'}
sourceKey={'itemId'} sourceKey={'itemId'}

View File

@ -173,6 +173,13 @@ export function usePlan(params = {}) {
* @param {boolean} saveAlert - 저장 완료 알림 표시 여부 * @param {boolean} saveAlert - 저장 완료 알림 표시 여부
*/ */
const saveCanvas = async (saveAlert = true) => { const saveCanvas = async (saveAlert = true) => {
// 저장 전 선택되어 있는 object 제거
const setupSurfaces = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)
setupSurfaces.forEach((surface) => {
surface.set({ fill: 'rgba(255,255,255,0.1)', strokeDashArray: [10, 4], strokeWidth: 1 })
})
const canvasStatus = currentCanvasData('save') const canvasStatus = currentCanvasData('save')
const result = await putCanvasStatus(canvasStatus, saveAlert) const result = await putCanvasStatus(canvasStatus, saveAlert)
//캔버스 저장 완료 후 //캔버스 저장 완료 후

View File

@ -852,7 +852,10 @@ export const usePolygon = () => {
if (checkLineOverlap(innerLine, polygonLine)) { if (checkLineOverlap(innerLine, polygonLine)) {
// innerLine의 type을 polygonLine의 type으로 변경 // innerLine의 type을 polygonLine의 type으로 변경
if (innerLine.attributes && polygonLine.attributes.type) { if (innerLine.attributes && polygonLine.attributes.type) {
// polygonLine.need = false // innerLine이 polygonLine보다 긴 경우 polygonLine.need를 false로 변경
if (polygonLine.length < innerLine.length) {
polygonLine.need = false
}
innerLine.attributes.planeSize = innerLine.attributes.planeSize ?? polygonLine.attributes.planeSize innerLine.attributes.planeSize = innerLine.attributes.planeSize ?? polygonLine.attributes.planeSize
innerLine.attributes.actualSize = innerLine.attributes.actualSize ?? polygonLine.attributes.actualSize innerLine.attributes.actualSize = innerLine.attributes.actualSize ?? polygonLine.attributes.actualSize
innerLine.attributes.type = polygonLine.attributes.type innerLine.attributes.type = polygonLine.attributes.type
@ -1008,6 +1011,9 @@ export const usePolygon = () => {
/*const originInnerStroke = innerLine.stroke /*const originInnerStroke = innerLine.stroke
innerLine.set({ stroke: 'red' }) innerLine.set({ stroke: 'red' })
canvas.renderAll()*/ canvas.renderAll()*/
if (checkLineOverlap(line, innerLine)) {
return
}
if (isPointOnLine(line, innerLine.startPoint)) { if (isPointOnLine(line, innerLine.startPoint)) {
canvas.renderAll() canvas.renderAll()
if (isSamePoint(line.startPoint, innerLine.startPoint) || isSamePoint(line.endPoint, innerLine.startPoint)) { if (isSamePoint(line.startPoint, innerLine.startPoint) || isSamePoint(line.endPoint, innerLine.startPoint)) {

View File

@ -99,6 +99,8 @@
"modal.module.basic.setting.module.construction.method": "工法", "modal.module.basic.setting.module.construction.method": "工法",
"modal.module.basic.setting.module.under.roof": "屋根下地", "modal.module.basic.setting.module.under.roof": "屋根下地",
"modal.module.basic.setting.module.setting": "架台設定", "modal.module.basic.setting.module.setting": "架台設定",
"modal.module.basic.setting.module.series.setting": "モジュールシリーズ",
"modal.module.basic.setting.module.setting2": "モジュール選択",
"modal.module.basic.setting.module.placement.area": "モジュール配置領域", "modal.module.basic.setting.module.placement.area": "モジュール配置領域",
"modal.module.basic.setting.module.placement.margin": "モジュール間の間隙", "modal.module.basic.setting.module.placement.margin": "モジュール間の間隙",
"modal.module.basic.setting.module.placement.area.eaves": "軒側", "modal.module.basic.setting.module.placement.area.eaves": "軒側",

View File

@ -98,7 +98,9 @@
"modal.module.basic.setting.module.rafter.margin": "서까래 간격", "modal.module.basic.setting.module.rafter.margin": "서까래 간격",
"modal.module.basic.setting.module.construction.method": "공법", "modal.module.basic.setting.module.construction.method": "공법",
"modal.module.basic.setting.module.under.roof": "지붕밑바탕", "modal.module.basic.setting.module.under.roof": "지붕밑바탕",
"modal.module.basic.setting.module.setting": "모듈 선택", "modal.module.basic.setting.module.setting": "가대 설정",
"modal.module.basic.setting.module.series.setting": "모듈 시리즈",
"modal.module.basic.setting.module.setting2": "모듈 선택",
"modal.module.basic.setting.module.placement.area": "모듈 배치 영역", "modal.module.basic.setting.module.placement.area": "모듈 배치 영역",
"modal.module.basic.setting.module.placement.margin": "모듈 배치 간격", "modal.module.basic.setting.module.placement.margin": "모듈 배치 간격",
"modal.module.basic.setting.module.placement.area.eaves": "처마쪽", "modal.module.basic.setting.module.placement.area.eaves": "처마쪽",