Merge branch 'dev' into dev-yj

This commit is contained in:
yjnoh 2025-02-06 18:19:12 +09:00
commit c9696158e9
13 changed files with 144 additions and 146 deletions

View File

@ -359,6 +359,7 @@ export default function Estimate({}) {
docTpCd: estimateContextState?.estimateType,
}
// console.log('param::::::::::', param)
const apiUrl = `/api/estimate/price/store-price-list?${queryStringFormatter(param)}`
get({ url: apiUrl }).then((res) => {
if (isNotEmptyArray(res?.data)) {

View File

@ -6,7 +6,7 @@ import PitchModule from '@/components/floor-plan/modal/basic/step/pitch/PitchMod
import PitchPlacement from '@/components/floor-plan/modal/basic/step/pitch/PitchPlacement'
import Placement from '@/components/floor-plan/modal/basic/step/Placement'
import { useRecoilValue, useRecoilState } from 'recoil'
import { canvasSettingState, isManualModuleSetupState } from '@/store/canvasAtom'
import { canvasSettingState, canvasState, isManualModuleSetupState } from '@/store/canvasAtom'
import { usePopup } from '@/hooks/usePopup'
import { Orientation } from '@/components/floor-plan/modal/basic/step/Orientation'
import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting'
@ -19,6 +19,7 @@ import { useCanvasPopupStatusController } from '@/hooks/common/useCanvasPopupSta
import { useMasterController } from '@/hooks/common/useMasterController'
import { loginUserStore } from '@/store/commonAtom'
import { currentCanvasPlanState } from '@/store/canvasAtom'
import { POLYGON_TYPE } from '@/common/common'
export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
const { getMessage } = useMessage()
@ -32,6 +33,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
const addedRoofs = useRecoilValue(addedRoofsState)
const loginUserState = useRecoilValue(loginUserStore)
const currentCanvasPlan = useRecoilValue(currentCanvasPlanState)
const canvas = useRecoilValue(canvasState)
// const { initEvent } = useContext(EventContext)
const { manualModuleSetup, autoModuleSetup, manualFlatroofModuleSetup, autoFlatroofModuleSetup } = useModuleBasicSetting(1)
@ -97,6 +99,17 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
const res = await updateObjectDate(params)
}
useEffect(() => {
let hasModules = canvas
.getObjects()
.filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)
.some((obj) => obj.modules?.length > 0)
if (hasModules) {
setTabNum(3)
}
}, [])
useEffect(() => {
if (canvasSetting.roofSizeSet !== '3') {
manualModuleSetup(placementRef)
@ -158,8 +171,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
</button>
</>
)}
{console.log('canvasSetting.roofSizeSet', canvasSetting.roofSizeSet)}
{canvasSetting.roofSizeSet && canvasSetting.roofSizeSet == 3 && (
{canvasSetting.roofSizeSet && canvasSetting.roofSizeSet === 3 && (
<>
<button className={`btn-frame modal mr5 ${isManualModuleSetup ? 'act' : ''}`} onClick={handleManualModuleSetup}>
{getMessage('modal.module.basic.setting.passivity.placement')}

View File

@ -507,6 +507,7 @@ export default function CircuitTrestleSetting({ id }) {
selectedModels,
setSelectedModels,
managementState,
getUseModuleItemList,
}
//

View File

@ -27,6 +27,7 @@ export default function PowerConditionalSelect(props) {
selectedModels,
setSelectedModels,
managementState,
getUseModuleItemList,
} = props
const [pcsCheck, setPcsCheck] = useRecoilState(pcsCheckState)
@ -159,8 +160,14 @@ export default function PowerConditionalSelect(props) {
setModels([])
setSelectedModels([])
setSelectedMaker(option)
console.log('option', option)
getUseModuleItemList
const param = {
pcsMkrCd: option.pcsMkrCd,
mixMatlNo: getUseModuleItemList()[0].mixMatlNo,
}
getPcsMakerList(option).then((res) => {
getPcsMakerList(param).then((res) => {
setSeries(
res.data.map((series) => {
return { ...series, selected: false }

View File

@ -12,6 +12,7 @@ import { useMasterController } from '@/hooks/common/useMasterController'
import { v4 as uuidv4 } from 'uuid'
import { globalLocaleStore } from '@/store/localeAtom'
import { POLYGON_TYPE } from '@/common/common'
import { useSwal } from '@/hooks/useSwal'
import { circuitNumDisplaySelector } from '@/store/settingAtom'
export default function StepUp(props) {
@ -28,6 +29,7 @@ export default function StepUp(props) {
getModuleList,
} = props
const { getMessage } = useMessage()
const { swalFire } = useSwal()
const globalLocale = useRecoilValue(globalLocaleStore)
const [moduleTab, setModuleTab] = useState(1)
const [moduleTabs, setModuleTabs] = useState({})
@ -70,35 +72,73 @@ export default function StepUp(props) {
...props.getOptYn(), // Y/N
useModuleItemList: props.getUseModuleItemList(), // List
roofSurfaceList: props.getRoofSurfaceList(), //
pcsItemList: selectedModels.length === 0 ? props.getPcsItemList() : getSelectedPcsItemList(), // PCS
pcsItemList: props.getSelectedPcsItemList(), // PCS
}
//
getPcsVoltageChk({ ...params, pcsItemList: getSelectedPcsItemList() }).then((res) => {
if (res.resultCode === 'S') {
//
getPcsVoltageStepUpList(params).then((res) => {
if (res?.result.code === 200 && res?.data) {
if (selectedModels.length === 0) {
setSelectedModels(res.data.pcsItemList)
//
getPcsVoltageStepUpList(params).then((res) => {
if (res.result.resultCode === 'S') {
if (res?.result.code === 200 && res?.data) {
const dataArray = Array.isArray(res.data) ? res.data : [res.data]
const stepUpListData = formatStepUpListData(dataArray)
// PCS SET
setStepUpListData(stepUpListData)
// PCS
const formattedOptCodes = formatOptionCodes(res.data.optionList)
setOptCodes(formattedOptCodes)
setSeletedOption(formattedOptCodes[0])
//
//stepUpListData[0].pcsItemList.forEach((pcsItem) => {
stepUpListData[0].pcsItemList.forEach((pcsItem) => {
const selectedSerQty = pcsItem.serQtyList.find((serQty) => serQty.selected)
if (selectedSerQty) {
selectedSerQty.roofSurfaceList.forEach((roofSurface) => {
const targetSurface = canvas.getObjects().filter((obj) => obj.id === roofSurface.roofSurfaceId)[0]
const moduleIds = targetSurface.modules.map((module) => module.id)
//
canvas
.getObjects()
.filter((obj) => moduleIds.includes(obj.parentId))
.forEach((text) => canvas.remove(text))
//
roofSurface.moduleList.forEach((module) => {
const targetModule = canvas.getObjects().filter((obj) => obj.id === module.uniqueId)[0]
const moduleCircuitText = new fabric.Text(module.circuit, {
left: targetModule.left + targetModule.width / 2,
top: targetModule.top + targetModule.height / 2,
fill: 'black',
fontSize: 20,
width: targetModule.width,
height: targetModule.height,
textAlign: 'center',
originX: 'center',
originY: 'center',
name: 'circuitNumber',
parentId: targetModule.id,
circuitInfo: module.pcsItemId,
visible: isDisplayCircuitNumber,
})
targetModule.circuit = moduleCircuitText
targetModule.pcsItemId = module.pcsItemId
targetModule.circuitNumber = module.circuit
canvas.add(moduleCircuitText)
})
})
}
const dataArray = Array.isArray(res.data) ? res.data : [res.data]
const stepUpListData = formatStepUpListData(dataArray)
})
// PCS SET
setStepUpListData(stepUpListData)
// PCS
const formattedOptCodes = formatOptionCodes(res.data.optionList)
setOptCodes(formattedOptCodes)
setSeletedOption(formattedOptCodes[0])
}
})
} else {
swalFire({
title: res.resultMsg,
type: 'alert',
})
canvas.renderAll()
} else {
swalFire({
title: res.result.resultMsg,
type: 'alert',
})
}
}
})
} catch (error) {
@ -170,7 +210,6 @@ export default function StepUp(props) {
// Update res.data with modified pcsItemList
res.data.pcsItemList = pcsItemListWithSerQty
setSelectedModels(pcsItemListWithSerQty)
const dataArray = Array.isArray(res.data) ? res.data : [res.data]
const stepUpListData = formatStepUpListData(dataArray)
@ -303,8 +342,8 @@ export default function StepUp(props) {
//
setStepUpListData(tempStepUpListData)
console.log('🚀 ~ handleRowClick ~ tempStepUpListData:', tempStepUpListData)
console.log('🚀 ~ handleRowClick ~ selectedData:', selectedData)
// console.log('🚀 ~ handleRowClick ~ tempStepUpListData:', tempStepUpListData)
// console.log('🚀 ~ handleRowClick ~ selectedData:', selectedData)
//
const params = {
@ -350,6 +389,12 @@ export default function StepUp(props) {
return module.id
})
targetSurface.modules.map((module) => {
module.circuit = null
module.circuitNumber = null
module.pcsItemId = null
})
//
canvas
.getObjects()
@ -363,6 +408,7 @@ export default function StepUp(props) {
roofSurface.moduleList.forEach((module) => {
const targetModule = canvas.getObjects().filter((obj) => obj.id === module.uniqueId)[0]
if (module.circuit === '') return
const moduleCircuitText = new fabric.Text(module.circuit, {
left: targetModule.left + targetModule.width / 2,
top: targetModule.top + targetModule.height / 2,

View File

@ -33,9 +33,6 @@ export default function PassivityCircuitAllocation(props) {
const isDisplayCircuitNumber = useRecoilValue(circuitNumDisplaySelector)
useEffect(() => {
console.log('header, rows', header, rows)
console.log('selectedModels', selectedModels)
// setSurfaceInfo()
setModuleStatisticsData()
if (!managementState) {
setManagementState(managementStateLoaded)
@ -78,80 +75,6 @@ export default function PassivityCircuitAllocation(props) {
canvas.renderAll()
}
const setSurfaceInfo = () => {
const surfaces = canvas.getObjects().filter((obj) => POLYGON_TYPE.MODULE_SETUP_SURFACE === obj.name)
// setHeaders([header[0], { name: '', prop: 'circuit' }, ...header.slice(1)])
// setRows(
// rows.map((row) => {
// return {
// ...row,
// circuit: '',
// }
// }),
// )
// let totals = {}
// rows.forEach((row) => {
// if (header.length === 4) {
// if (!totals[header[2].prop]) totals[header[2].prop] = 0
// totals[header[2].prop] += +row[header[2].prop]
// } else if (header.length === 5) {
// if (!totals[header[2].prop]) totals[header[2].prop] = 0
// totals[header[2].prop] += +row[header[2].prop]
// if (!totals[header[3].prop]) totals[header[3].prop] = 0
// totals[header[3]] += +row[header[3]]
// }
// })
// setFooter([
// ...['', ''],
// ...Object.keys(totals).map((key) => {
// return totals[key]
// }),
// Object.keys(totals).reduce((acc, key) => {
// return acc + totals[key]
// }, 0),
// ])
// let totalWpout = 0
// const rows = surfaces.map((surface) => {
// let wpOut = 0
// let moduleInfo = {}
// surface.modules.forEach((module) => {
// wpOut += +module.moduleInfo.wpOut
// if (!moduleInfo[module.moduleInfo.itemId]) moduleInfo[module.moduleInfo.itemId] = 0
// moduleInfo[module.moduleInfo.itemId]++
// })
// totalWpout += wpOut
// console.log('🚀 ~ moduleData.rows=surfaces.map ~ module:', module)
// return {
// roofShape: DIRECTION[surface.direction],
// powerGeneration: wpOut.toLocaleString('ko-KR', { maximumFractionDigits: 4 }),
// ...moduleInfo,
// }
// })
// setTotalWpout(totalWpout)
// -> ->
// wpOut
// setModuleData({
// header: [
// { name: getMessage('modal.panel.batch.statistic.roof.shape'), prop: 'roofShape' },
// { name: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.circuit'), prop: 'circuit' },
// ...selectedModules.itemList.map((module) => {
// return {
// name: module.itemNm,
// prop: module.itemId,
// }
// }),
// {
// name: `${getMessage('modal.panel.batch.statistic.power.generation.amount')}(kW)`,
// prop: 'powerGeneration',
// },
// ],
// rows: rows,
// })
}
const handleCircuitNumberFix = () => {
let uniqueCircuitNumbers = [
...new Set(
@ -177,6 +100,7 @@ export default function PassivityCircuitAllocation(props) {
return
} else if (selectedModels.length > 1) {
let result = false
uniqueCircuitNumbers.forEach((number) => {
if (
number.split('-')[1] === circuitNumber + ')' &&
@ -229,20 +153,14 @@ export default function PassivityCircuitAllocation(props) {
setSelectedPcs(tempSelectedPcs)
canvas.add(moduleCircuitText)
})
console.log('🚀 ~ handleCircuitNumberFix ~ selectedModels:', selectedModels)
// let pcsList = [...selectedModels.map((model) => ({ ...model }))]
let pcsList = JSON.parse(JSON.stringify(selectedModels))
pcsList = pcsList.map((model) => {
console.log('🚀 ~ handleCircuitNumberFix ~ pcsList:', pcsList)
let pcsList = JSON.parse(JSON.stringify(selectedModels)).map((model) => {
if (model.id === selectedPcs.id) {
model.isUsed = true
}
return model
})
console.log('🚀 ~ handleCircuitNumberFix ~ pcsList:', pcsList)
const roofSurfaceList = canvas
.getObjects()
.filter((obj) => POLYGON_TYPE.MODULE_SETUP_SURFACE === obj.name && obj?.modules.length > 0)
@ -261,7 +179,6 @@ export default function PassivityCircuitAllocation(props) {
}
})
console.log('uniqueCircuitNumbers', uniqueCircuitNumbers)
const usedPcses = pcsList.filter((model) => model.isUsed)
const pcsItemList = usedPcses.map((model, index) => {
return {
@ -289,7 +206,6 @@ export default function PassivityCircuitAllocation(props) {
}
getPcsManualConfChk(params).then((res) => {
console.log('targetModules', targetModules)
if (res.resultCode === 'E') {
swalFire({
text: res.resultMsg,
@ -321,8 +237,6 @@ export default function PassivityCircuitAllocation(props) {
setModuleStatisticsData()
})
}
console.log('🚀 ~ handleCircuitNumberFix ~ selectedModels:', selectedModels)
console.log('🚀 ~ handleCircuitNumberFix ~ selectedModels:', selectedModels)
const getCircuitNumber = () => {
if (selectedModels.length === 1) {
@ -334,7 +248,7 @@ export default function PassivityCircuitAllocation(props) {
const initSelectedPcsCircuitNumber = () => {
swalFire({
title: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.init.info'),
title: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional.reset.info'),
type: 'confirm',
icon: 'warning',
confirmFn: () => {
@ -355,7 +269,7 @@ export default function PassivityCircuitAllocation(props) {
const initAllPcsCircuitNumber = () => {
canvas.discardActiveObject()
swalFire({
title: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.init.setting.info'),
title: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset.info'),
type: 'confirm',
icon: 'warning',
confirmFn: () => {
@ -444,18 +358,6 @@ export default function PassivityCircuitAllocation(props) {
</label>
</div>
))}
{/* <div className="d-check-radio pop mb10">
<input type="radio" name="radio01" id="ra01" />
<label htmlFor="ra01">HQJP-KA55-5 (標準回路2枚10)</label>
</div>
<div className="d-check-radio pop mb10">
<input type="radio" name="radio01" id="ra02" />
<label htmlFor="ra02">HQJP-KA55-5 (標準回路2枚10)</label>
</div>
<div className="d-check-radio pop">
<input type="radio" name="radio01" id="ra03" />
<label htmlFor="ra03">HQJP-KA55-5 (標準回路2枚10)</label>
</div>*/}
</div>
</div>
</div>

View File

@ -210,10 +210,12 @@ export const useEstimateController = (planNo) => {
//새로 첨부한 파일이 없으면
//북면 먼저 체크
if (estimateData?.northArrangement === '1') {
fileFlg = false
setIsGlobalLoading(false)
return swalFire({ text: getMessage('estimate.detail.save.requiredNorthArrangementFileUpload'), type: 'alert' })
if (estimateData.fileFlg === '0') {
if (estimateData?.northArrangement === '1') {
fileFlg = false
setIsGlobalLoading(false)
return swalFire({ text: getMessage('estimate.detail.save.requiredNorthArrangementFileUpload'), type: 'alert' })
}
}
if (estimateData.itemList.length > 1) {

View File

@ -1010,10 +1010,10 @@ export function useModule() {
wpOut: 0,
circuits: { wpOut: 0 },
}
}
if (!surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId]) {
surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId] = 0
}
if (!surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId]) {
surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId] = 0
}
surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId]++
surfaceObjects[surface.id].circuits[module.circuitNumber].circuits.wpOut += +module.moduleInfo.wpOut
@ -1027,7 +1027,7 @@ export function useModule() {
let tempRow = {
name: surfaceObjects[key].roofSurface,
circuit: surfaceObjects[key].circuit,
wpOut: parseInt((surfaceObjects[key].wpOut / 1000).toFixed(3)),
wpOut: parseFloat(surfaceObjects[key].wpOut / 1000),
}
selectedModules.itemList.forEach((module) => {
tempRow[module.itemId] = surfaceObjects[key][module.itemId]
@ -1038,7 +1038,7 @@ export function useModule() {
let row = {
name: surfaceObjects[key].roofSurface,
circuit: surfaceObjects[key].circuits[circuit].circuit,
wpOut: parseInt((surfaceObjects[key].circuits[circuit].circuits.wpOut / 1000).toFixed(3)),
wpOut: parseFloat(surfaceObjects[key].circuits[circuit].circuits.wpOut / 1000),
}
selectedModules.itemList.forEach((module) => {
row[module.itemId] = surfaceObjects[key].circuits[circuit].circuits[module.itemId]

View File

@ -240,7 +240,7 @@ export function useRoofAllocationSetting(id) {
const onDeleteRoofMaterial = (idx) => {
const isSelected = currentRoofList[idx].selected
const newRoofList = [...currentRoofList].filter((_, index) => index !== idx)
const newRoofList = JSON.parse(JSON.stringify(currentRoofList)).filter((_, index) => index !== idx)
if (isSelected) {
newRoofList[0].selected = true
}

View File

@ -167,9 +167,14 @@ export function useRoofShapeSetting(id) {
]
const handleSave = () => {
let outerLines
let outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine' && obj.visible)
let direction
if (outerLines.length < 2) {
swalFire({ text: '외벽선이 없습니다.', icon: 'error' })
return
}
switch (shapeNum) {
case 1: {
outerLines = saveRidge()

View File

@ -3,7 +3,7 @@
import { useContext, useEffect, useState } from 'react'
import { usePathname, useRouter, useSearchParams } from 'next/navigation'
import { useRecoilState } from 'recoil'
import { useRecoilState, useResetRecoilState } from 'recoil'
import { canvasState, currentCanvasPlanState, plansState } from '@/store/canvasAtom'
import { useAxios } from '@/hooks/useAxios'
@ -14,6 +14,8 @@ import { SAVE_KEY } from '@/common/common'
import { readImage, removeImage } from '@/lib/fileAction'
import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider'
import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController'
import { outerLinePointsState } from '@/store/outerLineAtom'
import { placementShapeDrawingPointsState } from '@/store/placementShapeDrawingAtom'
export function usePlan(params = {}) {
const { floorPlanState } = useContext(FloorPlanContext)
@ -33,6 +35,10 @@ export function usePlan(params = {}) {
const { get, promisePost, promisePut, promiseDel, promiseGet } = useAxios()
const { setEstimateContextState } = useEstimateController()
const resetOuterLinePoints = useResetRecoilState(outerLinePointsState)
const resetPlacementShapeDrawingPoints = useResetRecoilState(placementShapeDrawingPointsState)
/**
* 마우스 포인터의 가이드라인을 제거합니다.
*/
@ -284,6 +290,8 @@ export function usePlan(params = {}) {
} else {
if (!currentCanvasPlan || currentCanvasPlan.id !== newCurrentId) {
await saveCanvas(true)
clearRecoilState()
}
setCurrentCanvasPlan(plans.find((plan) => plan.id === newCurrentId))
setPlans((plans) => plans.map((plan) => ({ ...plan, isCurrent: plan.id === newCurrentId })))
@ -296,6 +304,12 @@ export function usePlan(params = {}) {
// setBgImage()
}, [currentCanvasPlan])
const clearRecoilState = () => {
//clear가 필요한 recoil state 관리
resetOuterLinePoints()
resetPlacementShapeDrawingPoints()
}
const handleCurrentPlanUrl = () => {
const currentPlan = plans.find((plan) => plan.isCurrent)
// if (currentPlan) router.push(`${pathname}?pid=${currentPlan?.planNo}&objectNo=${floorPlanState?.objectNo}`)

View File

@ -153,7 +153,9 @@
"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.selected.power.conditional.reset": "選択したパワーコンディショナーの回路番号の初期化",
"modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional.reset.info": "선택된 파워 컨디셔너의 회로할당을 초기화합니다.(JA)",
"modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset": "すべての回路番号の初期化",
"modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset.info": "회로 할당의 설정을 초기화합니다.(JA)",
"modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.num.fix": "番号確定",
"modal.circuit.trestle.setting.step.up.allocation": "昇圧設定",
"modal.circuit.trestle.setting.step.up.allocation.serial.amount": "シリアル枚数",
@ -877,6 +879,7 @@
"estimate.detail.roofCns": "屋根材・仕様施工",
"estimate.detail.remarks": "備考",
"estimate.detail.fileFlg": "後日資料提出",
"estimate.detail.dragFileGuide": "(※北面設置の場合、ファイル添付が必須です.)",
"estimate.detail.header.fileList1": "ファイル添付",
"estimate.detail.fileList.btn": "ファイル選択",
"estimate.detail.fileList.extCheck": "画像ファイルのみ添付可能です。",
@ -942,6 +945,7 @@
"estimate.detail.save.alertMsg": "保存されました。見積書で製品を変更すると、図面や回路には反映されません。",
"estimate.detail.copy.alertMsg": "コピーされました。",
"estimate.detail.save.requiredFileUpload": "ファイル添付が必須のアイテムがあります。ファイルを添付するか、後日添付をチェックしてください。",
"estimate.detail.save.requiredNorthArrangementFileUpload": "北面にモジュールを配置した場合、北面配置許可書を必ず添付する必要があります.",
"estimate.detail.save.requiredItem": "製品は1つ以上登録する必要があります。",
"estimate.detail.save.requiredCharger": "担当者は必須です。",
"estimate.detail.save.requiredObjectName": "案件名は必須です。",

View File

@ -153,7 +153,9 @@
"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.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": "모든 회로번호 초기화",
"modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset.info": "회로 할당의 설정을 초기화합니다.",
"modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.num.fix": "번호 확정",
"modal.circuit.trestle.setting.step.up.allocation": "승압 설정",
"modal.circuit.trestle.setting.step.up.allocation.serial.amount": "직렬매수",
@ -877,6 +879,7 @@
"estimate.detail.roofCns": "지붕재・사양시공",
"estimate.detail.remarks": "비고",
"estimate.detail.fileFlg": "후일자료제출",
"estimate.detail.dragFileGuide": "(※ 북면설치인 경우, 파일 첨부가 필수입니다.)",
"estimate.detail.header.fileList1": "파일첨부",
"estimate.detail.fileList.btn": "파일선택",
"estimate.detail.fileList.extCheck": "이미지 파일만 첨부 가능합니다.",
@ -942,6 +945,7 @@
"estimate.detail.save.alertMsg": "저장되었습니다. 견적서에서 제품을 변경할 경우 도면 및 회로에 반영되지 않습니다.",
"estimate.detail.copy.alertMsg": "복사되었습니다.",
"estimate.detail.save.requiredFileUpload": "파일첨부가 필수인 아이템이 있습니다. 파일을 첨부하거나 후일첨부를 체크해주십시오.",
"estimate.detail.save.requiredNorthArrangementFileUpload": "북면에 모듈을 배치한 경우, 북면배치허가서를 반드시 첨부해야 합니다.",
"estimate.detail.save.requiredItem": "제품은 1개이상 등록해야 됩니다.",
"estimate.detail.save.requiredCharger": "담당자는 필수값 입니다.",
"estimate.detail.save.requiredObjectName": "안건명은 필수값 입니다.",