Compare commits

..

No commits in common. "8de8416160b822ae4b142dab68e2cb3b2a380158" and "3d8e8dfed1736c512a6da4a48867fd362478f64d" have entirely different histories.

11 changed files with 114 additions and 117 deletions

View File

@ -1,13 +1,21 @@
'use client'
import { createContext, useState } from 'react'
import { createContext, useEffect, useState } from 'react'
import { useLocalStorage } from 'usehooks-ts'
export const GlobalDataContext = createContext(null)
const GlobalDataProvider = ({ children }) => {
const [managementState, setManagementState] = useState(null)
const [managementStateLoaded, setManagementStateLoaded] = useLocalStorage('managementStateLoaded', null)
return <GlobalDataContext.Provider value={{ managementState, setManagementState }}>{children}</GlobalDataContext.Provider>
useEffect(() => {
if (managementState !== null) {
setManagementStateLoaded(managementState)
}
}, [managementState])
return <GlobalDataContext.Provider value={{ managementState, setManagementState, managementStateLoaded }}>{children}</GlobalDataContext.Provider>
}
export default GlobalDataProvider

View File

@ -498,18 +498,6 @@ export default function Estimate({}) {
})
}
//Pricing confirm
const handlePricingBtn = (showPriceCd) => {
swalFire({
text: getMessage('estimate.detail.showPrice.pricingBtn.confirm'),
type: 'confirm',
icon: 'warning',
confirmFn: () => {
handlePricing(showPriceCd)
},
})
}
//Pricing
const handlePricing = async (showPriceCd) => {
const param = {
@ -1820,10 +1808,9 @@ export default function Estimate({}) {
<button
type="button"
className="btn-origin grey ml5"
onClick={(event) => {
onClick={() => {
setHandlePricingFlag(true)
handlePricingBtn(showPriceCd)
handlePricing(showPriceCd)
}}
>
{getMessage('estimate.detail.showPrice.pricingBtn')}

View File

@ -1,18 +1,15 @@
'use client'
import { useContext, useEffect } from 'react'
import { useEffect } from 'react'
import CanvasMenu from '@/components/floor-plan/CanvasMenu'
import { useCanvasMenu } from '@/hooks/common/useCanvasMenu'
import { useCanvasSetting } from '@/hooks/option/useCanvasSetting'
import { usePopup } from '@/hooks/usePopup'
import '@/styles/contents.scss'
import { notFound, useSearchParams } from 'next/navigation'
import { useRecoilState, useRecoilValue, useResetRecoilState } from 'recoil'
import { useRecoilState, useResetRecoilState } from 'recoil'
import { correntObjectNoState } from '@/store/settingAtom'
import { currentMenuState } from '@/store/canvasAtom'
import { globalLocaleStore } from '@/store/localeAtom'
import { useAxios } from '@/hooks/useAxios'
import { GlobalDataContext } from '@/app/GlobalDataProvider'
export default function FloorPlan({ children }) {
const [correntObjectNo, setCurrentObjectNo] = useRecoilState(correntObjectNoState)
@ -23,39 +20,12 @@ export default function FloorPlan({ children }) {
const { selectedMenu, setSelectedMenu } = useCanvasMenu()
const { fetchSettings } = useCanvasSetting()
const resetCurrentMenu = useResetRecoilState(currentMenuState)
const globalLocaleState = useRecoilValue(globalLocaleStore)
const { promiseGet } = useAxios(globalLocaleState)
const { setManagementState } = useContext(GlobalDataContext)
useEffect(() => {
getStuffDetailInfo()
return () => {
resetCurrentMenu()
}
}, [])
const getStuffDetailInfo = () => {
promiseGet({ url: `/api/object/${objectNo}/detail` }).then((res) => {
if (res.status === 200) {
const { data } = res
console.log(data)
let surfaceTypeValue
if (res.data.surfaceType === 'Ⅲ・Ⅳ') {
surfaceTypeValue = '3'
} else if (res.data.surfaceType === 'Ⅱ') {
surfaceTypeValue = '2'
}
// 0
if (res.data.installHeight === '0') {
res.data.installHeight = ''
}
setManagementState({ ...res.data, surfaceTypeValue: surfaceTypeValue })
}
})
}
/**
* URL 파라미터에서 objectNo 설정
*/

View File

@ -48,6 +48,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
const [manualSetupMode, setManualSetupMode] = useRecoilState(toggleManualSetupModeState)
const [layoutSetup, setLayoutSetup] = useState([{}])
const {
moduleSelectionInitParams,
selectedModules,
roughnessCodes,
windSpeedCodes,
@ -240,6 +241,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
setTabNum,
compasDeg, //
setCompasDeg,
moduleSelectionInitParams,
selectedModules,
moduleSelectionData,
setModuleSelectionData,

View File

@ -23,6 +23,7 @@ export const Orientation = forwardRef((props, ref) => {
setTabNum,
compasDeg,
setCompasDeg,
moduleSelectionInitParams,
selectedModules,
roughnessCodes,
windSpeedCodes,

View File

@ -83,6 +83,9 @@ export default function CircuitTrestleSetting({ id }) {
} = useCircuitTrestle()
// const { trigger: moduleSelectedDataTrigger } = useCanvasPopupStatusController(2)
useEffect(() => {
if (!managementState) {
setManagementState(managementStateLoaded)
}
// setCircuitData({
// makers,
// selectedMaker,

View File

@ -37,7 +37,9 @@ export default function PassivityCircuitAllocation(props) {
const circuitNumberText = useRecoilValue(fontSelector('circuitNumberText'))
useEffect(() => {
setModuleStatisticsData()
if (!managementState) {
setManagementState(managementStateLoaded)
}
canvas
.getObjects()
.filter((obj) => obj.name === POLYGON_TYPE.MODULE)

View File

@ -3,7 +3,7 @@ import { useContext, useEffect, useState } from 'react'
import { GlobalDataContext } from '@/app/GlobalDataProvider'
import { useMasterController } from '@/hooks/common/useMasterController'
import { useCommonCode } from '@/hooks/common/useCommonCode'
import { selectedModuleState, moduleSelectionDataState } from '@/store/selectedModuleOptions'
import { selectedModuleState, moduleSelectionInitParamsState, moduleSelectionDataState } from '@/store/selectedModuleOptions'
import { isObjectNotEmpty } from '@/util/common-utils'
import { canvasState } from '@/store/canvasAtom'
import { POLYGON_TYPE } from '@/common/common'
@ -12,7 +12,7 @@ import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting'
export function useModuleSelection(props) {
const canvas = useRecoilValue(canvasState)
const { managementState, setManagementState } = useContext(GlobalDataContext)
const { managementState, setManagementState, managementStateLoaded } = useContext(GlobalDataContext)
const [roughnessCodes, setRoughnessCodes] = useState([]) //면조도 목록
const [windSpeedCodes, setWindSpeedCodes] = useState([]) //기준풍속 목록
const [moduleList, setModuleList] = useState([{}]) //모듈 목록
@ -21,8 +21,8 @@ export function useModuleSelection(props) {
const [standardWindSpeed, setStandardWindSpeed] = useState() //기준풍속
const [verticalSnowCover, setVerticalSnowCover] = useState(managementState?.verticalSnowCover) //수직적설량
const [selectedModules, setSelectedModules] = useRecoilState(selectedModuleState) //선택된 모듈
// const [moduleSelectionInitParams, setModuleSelectionInitParams] = useRecoilState(moduleSelectionInitParamsState) //모듈 기본 데이터 ex) 면조도, 높이등등
const [margin, setMargin] = useState(100)
const [moduleSelectionInitParams, setModuleSelectionInitParams] = useRecoilState(moduleSelectionInitParamsState) //모듈 기본 데이터 ex) 면조도, 높이등등
const { getModuleTypeItemList } = useMasterController()
const { findCommonCode } = useCommonCode()
const resetStatisticsData = useResetRecoilState(moduleStatisticsState)
@ -40,21 +40,21 @@ export function useModuleSelection(props) {
//탭별 파라메터 초기화
useEffect(() => {
bindInitData()
// const initParams = {
// illuminationTp: managementState?.surfaceTypeValue, //면조도
// illuminationTpNm: managementState?.surfaceType, //면조도명
// instHt: managementState?.installHeight, //설치높이
// stdWindSpeed: managementState?.standardWindSpeedId, //기준풍속
// stdSnowLd: managementState?.verticalSnowCover, //기준적설량
// saleStoreNorthFlg: managementState?.saleStoreNorthFlg, //북쪽 설치 여부
// }
const initParams = {
illuminationTp: managementState?.surfaceTypeValue, //면조도
illuminationTpNm: managementState?.surfaceType, //면조도명
instHt: managementState?.installHeight, //설치높이
stdWindSpeed: managementState?.standardWindSpeedId, //기준풍속
stdSnowLd: managementState?.verticalSnowCover, //기준적설량
saleStoreNorthFlg: managementState?.saleStoreNorthFlg, //북쪽 설치 여부
}
// if (selectedModules) {
// initParams.moduleTpCd = selectedModules.itemTp
// initParams.moduleItemId = selectedModules.itemId
// }
if (selectedModules) {
initParams.moduleTpCd = selectedModules.itemTp
initParams.moduleItemId = selectedModules.itemId
}
// setModuleSelectionInitParams(initParams)
setModuleSelectionInitParams(initParams)
}, [managementState])
useEffect(() => {
@ -122,19 +122,19 @@ export function useModuleSelection(props) {
setSelectedModules(option) //선택값 저장
//init 데이터에 선택된 모듈 추가
// setModuleSelectionInitParams({
// ...moduleSelectionInitParams,
// moduleTpCd: option.itemTp,
// moduleItemId: option.itemId,
// })
setModuleSelectionInitParams({
...moduleSelectionInitParams,
moduleTpCd: option.itemTp,
moduleItemId: option.itemId,
})
}
const handleChangeSurfaceType = (option) => {
// setModuleSelectionInitParams({
// ...moduleSelectionInitParams,
// illuminationTp: option.clCode,
// illuminationTpNm: option.clCodeNm,
// })
setModuleSelectionInitParams({
...moduleSelectionInitParams,
illuminationTp: option.clCode,
illuminationTpNm: option.clCodeNm,
})
setManagementState({
...managementState,
@ -144,10 +144,10 @@ export function useModuleSelection(props) {
}
const handleChangeWindSpeed = (option) => {
// setModuleSelectionInitParams({
// ...moduleSelectionInitParams,
// stdWindSpeed: option.clCode,
// })
setModuleSelectionInitParams({
...moduleSelectionInitParams,
stdWindSpeed: option.clCode,
})
setManagementState({
...managementState,
@ -157,10 +157,10 @@ export function useModuleSelection(props) {
const handleChangeInstallHeight = (option) => {
setInstallHeight(option)
// setModuleSelectionInitParams({
// ...moduleSelectionInitParams,
// instHt: option,
// })
setModuleSelectionInitParams({
...moduleSelectionInitParams,
instHt: option,
})
setManagementState({
...managementState,
@ -170,10 +170,10 @@ export function useModuleSelection(props) {
const handleChangeVerticalSnowCover = (option) => {
setVerticalSnowCover(option)
// setModuleSelectionInitParams({
// ...moduleSelectionInitParams,
// stdSnowLd: option,
// })
setModuleSelectionInitParams({
...moduleSelectionInitParams,
stdSnowLd: option,
})
setManagementState({
...managementState,
@ -181,8 +181,36 @@ export function useModuleSelection(props) {
})
}
//TODO: 설치높이, 기준적설량 debounce 적용해서 추가해야됨
// useEffect(() => {
// getConstructionListData(constructionListParams)
// }, [constructionListParams])
// const getConstructionListData = async (params) => {
// if (params.trestleMkrCd && params.constMthdCd && params.roofBaseCd) {
// const optionsList = await getConstructionList(params)
// console.log('optionsList', optionsList)
// setConstructionList(optionsList.data)
// }
// }
//state 배열에 데이터 추가 함수
// const addRoofTabParams = (key, value, excludeArray = []) => {
// const index = roofTabParams.findIndex((obj) => obj.roofTab === roofTab)
// if (index !== -1) {
// roofTabParams[index][key] = value
// if (excludeArray.length > 0) {
// excludeArray.forEach((exclude) => {
// roofTabParams[index][exclude] = ''
// })
// }
// setRoofTabParams((prev) => [...prev.slice(0, index), roofTabParams[index], ...prev.slice(index + 1)])
// }
// }
return {
// moduleSelectionInitParams,
moduleSelectionInitParams,
selectedModules,
roughnessCodes,
windSpeedCodes,

View File

@ -13,7 +13,7 @@ import { useTrestle } from '@/hooks/module/useTrestle'
import { usePlan } from '@/hooks/usePlan'
export function useEstimate() {
const { managementState } = useContext(GlobalDataContext)
const { managementStateLoaded } = useContext(GlobalDataContext)
const { setIsGlobalLoading } = useContext(QcastContext)
const router = useRouter()
const loginUserState = useRecoilValue(loginUserStore)
@ -31,18 +31,16 @@ export function useEstimate() {
* @param {Object} estimateParam - 견적서 저장 데이터
*/
const saveEstimate = async (estimateParam) => {
console.log('managementState', managementState)
const userId = loginUserState.userId
const saleStoreId = managementState.saleStoreId
const saleStoreId = managementStateLoaded.saleStoreId
const objectNo = currentCanvasPlan.objectNo
const planNo = currentCanvasPlan.planNo
const slope = estimateParam.roofSurfaceList[0].slope
const angle = estimateParam.roofSurfaceList[0].angle
const surfaceType = managementState.surfaceType
const setupHeight = managementState.installHeight
const standardWindSpeedId = managementState.standardWindSpeedId
const snowfall = managementState.verticalSnowCover
const surfaceType = managementStateLoaded.surfaceType
const setupHeight = managementStateLoaded.installHeight
const standardWindSpeedId = managementStateLoaded.standardWindSpeedId
const snowfall = managementStateLoaded.verticalSnowCover
const drawingFlg = '1'
const saveEstimateData = {

View File

@ -94,7 +94,7 @@
"modal.module.basic.setting.module.trestle.maker": "架台メーカー",
"modal.module.basic.setting.module.rafter.margin": "垂木の間隔",
"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.placement.area": "モジュール配置領域",
"modal.module.basic.setting.module.placement.area.eaves": "軒側",
@ -130,8 +130,8 @@
"modal.module.basic.setting.module.placement.waterfowl.arrangement": "千鳥配置",
"modal.module.basic.setting.module.placement.max.row.amount": "Max単数",
"modal.module.basic.setting.module.placement.mix.max.row.amount": "混合Max単数",
"modal.module.basic.setting.module.placement.row.amount": "数",
"modal.module.basic.setting.module.placement.column.amount": "列数",
"modal.module.basic.setting.module.placement.row.amount": "数",
"modal.module.basic.setting.module.placement.column.amount": "熱水",
"modal.module.basic.setting.module.placement.do": "する",
"modal.module.basic.setting.module.placement.do.not": "しない",
"modal.module.basic.setting.module.placement.arrangement.standard": "配置基準",
@ -149,7 +149,7 @@
"modal.module.basic.setting.pitch.module.column.amount": "列数",
"modal.module.basic.setting.pitch.module.column.margin": "左右間隔",
"modal.module.basic.setting.prev": "前に戻る",
"modal.module.basic.setting.row.batch": "段・列数指定配置",
"modal.module.basic.setting.row.batch": "数指定配置",
"modal.module.basic.setting.passivity.placement": "手動配置",
"modal.module.basic.setting.auto.placement": "自動配置",
"plan.menu.module.circuit.setting.circuit.trestle.setting": "回路設定",
@ -163,7 +163,7 @@
"modal.circuit.trestle.setting.power.conditional.select.max.connection": "標準枚数",
"modal.circuit.trestle.setting.power.conditional.select.max.overload": "最大枚数",
"modal.circuit.trestle.setting.power.conditional.select.output.current": "出力電流",
"modal.circuit.trestle.setting.power.conditional.select.check1": "同一勾配・同一方面の面である場合、同じ面として回路分けを行う",
"modal.circuit.trestle.setting.power.conditional.select.check1": "同じ傾斜同じ方向の面積ケース同じ面として回路分ける。",
"modal.circuit.trestle.setting.power.conditional.select.check2": "MAX接続過積で回路を分ける。",
"modal.circuit.trestle.setting.circuit.allocation": "回路割り当て",
"modal.circuit.trestle.setting.circuit.allocation.auto": "自動回路割り当て",
@ -174,7 +174,7 @@
"modal.circuit.trestle.setting.circuit.allocation.passivity.info": "同じ回路のモジュールを選択状態にした後、[番号確定]ボタンを押すと番号が割り当てられます。",
"modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional": "選択したパワーコンディショナー",
"modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.num": "設定する回路番号1",
"modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.info": "標準回路{0}{1}直",
"modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.info": "標準回路{0}章~{1}章",
"modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional.reset": "選択したパワーコンディショナーの回路番号の初期化",
"modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional.reset.info": "選択したパワーコンディショナーの回路割り当てを初期化します。",
"modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset": "すべての回路番号の初期化",
@ -941,7 +941,6 @@
"estimate.detail.header.unitPrice": "定価",
"estimate.detail.showPrice.pricingBtn": "Pricing",
"estimate.detail.showPrice.pricingBtn.noItemId": "Pricingが欠落しているアイテムがあります。 Pricingを進めてください。",
"estimate.detail.showPrice.pricingBtn.confirm": "価格登録初期化されますがよろしいですか?",
"estimate.detail.showPrice.description1": "製品価格OPEN",
"estimate.detail.showPrice.description2": "追加の変更品目",
"estimate.detail.showPrice.description3": "添付必須",
@ -1060,7 +1059,7 @@
"outerLine.property.fix": "外壁線の属性設定 を完了しますか?",
"outerLine.property.close": "外壁線の属性設定 を終了しますか?",
"want.to.complete.auxiliary.creation": "補助線の作成を完了しますか?",
"module.layout.setup.has.zero.value": "モジュールの列数、段数を入力して下さい。",
"module.layout.setup.has.zero.value": "モジュールの列、行を入力してください.",
"modal.placement.initial.setting.plan.drawing.only.number": "(※数字は[半角]入力のみ可能です。)",
"wall.line.not.found": "外壁がありません",
"roof.line.not.found": "屋根形状がありません",
@ -1069,10 +1068,10 @@
"module.layout.setup.max.count": "モジュールの最大段数は{0}、最大列数は{1}です。 (JA)",
"module.layout.setup.max.count.multiple": "モジュール{0}の最大段数は{1}、最大列数は{2}です。 (JA)",
"roofAllocation.not.found": "割り当てる屋根がありません。 (JA)",
"modal.module.basic.setting.module.placement.max.size.check": "屋根材別モジュールの単体の最大段数、2種混合の段数を確認して下さい",
"modal.module.basic.setting.module.placement.max.row": "最大段数",
"modal.module.basic.setting.module.placement.max.rows.multiple": "2種混合最大段数",
"modal.module.basic.setting.module.placement.max.size.check": "屋根材別モジュールの最大単数。混合最大単数を確認してください。 (JA)",
"modal.module.basic.setting.module.placement.max.row": "最大 単数(JA)",
"modal.module.basic.setting.module.placement.max.rows.multiple": "混合単数(JA)",
"modal.module.basic.setting.module.placement.mix.asg.yn.error": "混合インストール不可能なモジュールです。 (JA)",
"modal.module.basic.setting.module.placement.mix.asg.yn": "混合",
"modal.module.basic.setting.module.placement.mix.asg.yn": "ミックス. (JA)",
"modal.module.basic.setting.layoutpassivity.placement": "layout配置 (JA)"
}

View File

@ -150,7 +150,7 @@
"modal.module.basic.setting.pitch.module.column.amount": "열수",
"modal.module.basic.setting.pitch.module.column.margin": "좌우간격",
"modal.module.basic.setting.prev": "이전",
"modal.module.basic.setting.row.batch": "단·열 지정 배치",
"modal.module.basic.setting.row.batch": "단수지정 배치",
"modal.module.basic.setting.passivity.placement": "수동 배치",
"modal.module.basic.setting.auto.placement": "설정값으로 자동 배치",
"plan.menu.module.circuit.setting.circuit.trestle.setting": "회로설정",
@ -164,7 +164,7 @@
"modal.circuit.trestle.setting.power.conditional.select.max.connection": "표준매수",
"modal.circuit.trestle.setting.power.conditional.select.max.overload": "최대매수",
"modal.circuit.trestle.setting.power.conditional.select.output.current": "출력전류",
"modal.circuit.trestle.setting.power.conditional.select.check1": "동일 구배·동일 방면의 면인 경우, 같은 면으로서 회로를 나눈다",
"modal.circuit.trestle.setting.power.conditional.select.check1": "동일경사 동일방면의 면인 경우 같은 면으로서 회로를 나눈다.",
"modal.circuit.trestle.setting.power.conditional.select.check2": "MAX 접속(과적)으로 회로를 나눈다.",
"modal.circuit.trestle.setting.circuit.allocation": "회로 할당",
"modal.circuit.trestle.setting.circuit.allocation.auto": "자동회로 할당",
@ -175,7 +175,7 @@
"modal.circuit.trestle.setting.circuit.allocation.passivity.info": "동일한 회로의 모듈을 선택 상태로 만든 후 [번호 확정] 버튼을 누르면 번호가 할당됩니다.",
"modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional": "선택된 파워컨디셔너",
"modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.num": "설정할 회로번호(1~)",
"modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.info": "표준회로{0}{1}직",
"modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.info": "표준회로{0}장~{1}장",
"modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional.reset": "선택된 파워컨디셔너의 회로번호 초기화",
"modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional.reset.info": "선택된 파워 컨디셔너의 회로할당을 초기화합니다.",
"modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset": "모든 회로번호 초기화",
@ -942,7 +942,6 @@
"estimate.detail.header.unitPrice": "정가",
"estimate.detail.showPrice.pricingBtn": "Pricing",
"estimate.detail.showPrice.pricingBtn.noItemId": "Pricing이 누락된 아이템이 있습니다. 제품 선택 후 Pricing을 진행해주세요.",
"estimate.detail.showPrice.pricingBtn.confirm": "가격등록을 초기화 하시겠습니까?",
"estimate.detail.showPrice.description1": "제품 가격 OPEN",
"estimate.detail.showPrice.description2": "추가 변경 자재",
"estimate.detail.showPrice.description3": "첨부필수",
@ -1061,7 +1060,7 @@
"outerLine.property.fix": "외벽선 속성 설정을 완료하시겠습니까?",
"outerLine.property.close": "외벽선 속성 설정을 종료하시겠습니까?",
"want.to.complete.auxiliary.creation": "보조선 작성을 완료하시겠습니까?",
"module.layout.setup.has.zero.value": "모듈의 열수, 단수를 입력해 주세요.",
"module.layout.setup.has.zero.value": "모듈의 열, 행을 입력해 주세요.",
"modal.placement.initial.setting.plan.drawing.only.number": "(※ 숫자는 [반각]입력만 가능합니다.)",
"wall.line.not.found": "외벽선이 없습니다.",
"roof.line.not.found": "지붕형상이 없습니다.",
@ -1070,9 +1069,9 @@
"module.layout.setup.max.count": "모듈의 최대 단수는 {0}, 최대 열수는 {1} 입니다.",
"module.layout.setup.max.count.multiple": "모듈 {0}번의 최대 단수는 {1}, 최대 열수는 {2} 입니다.",
"roofAllocation.not.found": "할당할 지붕이 없습니다.",
"modal.module.basic.setting.module.placement.max.size.check": "지붕재별 모듈 단체의 최대 단수, 2종 혼합 단수를 확인하십시오.",
"modal.module.basic.setting.module.placement.max.size.check": "지붕재별 모듈의 최대 단수. 혼합 최대 단수를 확인하십시오.",
"modal.module.basic.setting.module.placement.max.row": "최대 단수",
"modal.module.basic.setting.module.placement.max.rows.multiple": "2종 혼합 최대단수",
"modal.module.basic.setting.module.placement.max.rows.multiple": "혼합 단수",
"modal.module.basic.setting.module.placement.mix.asg.yn.error": "혼합 설치 불가능한 모듈입니다.",
"modal.module.basic.setting.module.placement.mix.asg.yn": "혼합",
"modal.module.basic.setting.layoutpassivity.placement": "레이아웃 배치"