견적서 PDF API 개발

This commit is contained in:
LAPTOP-L3VE7KK2\USER 2024-11-15 18:14:01 +09:00
parent cae5be7af7
commit dcc5e6818e
6 changed files with 465 additions and 97 deletions

View File

@ -19,12 +19,12 @@ import com.interplug.qcast.config.message.Messages;
import com.interplug.qcast.util.ExcelUtil;
import com.interplug.qcast.util.InterfaceQsp;
import com.interplug.qcast.util.PdfUtil;
import io.micrometer.common.util.StringUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
@ -33,6 +33,7 @@ import java.util.*;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.springframework.beans.factory.annotation.Autowired;
@ -765,6 +766,14 @@ public class EstimateService {
BigDecimal vol =
new BigDecimal(StringUtils.isEmpty(roofVol.getVolKw()) ? "0" : roofVol.getVolKw());
String classTypeName = "";
if ("0".equals(roofVol.getClassType())) {
classTypeName = roofVol.getSlope() + "";
} else {
classTypeName = roofVol.getAngle() + "º";
}
roofVol.setClassTypeName(classTypeName);
moduleTotAmount = moduleTotAmount.add(amount);
moduleTotVolKw = moduleTotVolKw.add(vol);
}
@ -800,7 +809,8 @@ public class EstimateService {
String.format("%1$,.0f", Double.parseDouble(itemResponse.getSaleTotPrice())));
if ("YJSS".equals(estimateResponse.getEstimateType())
&& !"1".equals(itemResponse.getPkgMaterialFlg())) {
&& (!StringUtils.isEmpty(itemResponse.getPaDispOrder())
|| !"1".equals(itemResponse.getPkgMaterialFlg()))) {
itemResponse.setSalePrice("");
itemResponse.setSaleTotPrice("");
}
@ -862,19 +872,20 @@ public class EstimateService {
iSection++;
arrSection[iSection] = "div.section2";
iSection++;
// 견적서 상세 pdf Html 생성
doc = this.estimatePdfHtml(doc, estimateResponse, estimateItemList);
if ("1".equals(estimateRequest.getSchDrawingFlg())) {
arrSection[iSection] = "div.section3";
iSection++;
arrSection[iSection] = "div.section4";
iSection++;
arrSection[iSection] = "div.section5";
iSection++;
// 발전시뮬레이션 pdf Html 생성
if (true) {
arrSection[iSection] = "div.section3";
iSection++;
doc = pwrGnrSimService.pwrGnrSimPdfHtml(doc, pwrGnrSimResponse);
} else {
elm = doc.getElementsByClass("section3").first();
elm.remove();
}
// pdf 다운로드
@ -1081,6 +1092,351 @@ public class EstimateService {
return quoteList;
}
/**
* 견적서 PDF HTML 생성
*
* @param doc Document
* @param data 견적서 상세정보
* @param list 견적서 아이템 목록 정보
* @return Document Document
* @throws IOException
* @throws QcastException
*/
public Document estimatePdfHtml(Document doc, EstimateResponse data, List<ItemResponse> list)
throws IOException, QcastException {
Element elm;
// 견적서 상세 정보 설정
elm = doc.getElementById("custSaleStoreName");
elm.text(StringUtils.defaultString(data.getCustSaleStoreName()));
elm = doc.getElementById("custOmit");
elm.text(StringUtils.defaultString(data.getCustOmit()));
elm = doc.getElementById("estimateValidityTerm");
elm.text(StringUtils.defaultString(data.getEstimateValidityTerm()));
elm = doc.getElementById("objectName1");
elm.text(StringUtils.defaultString(data.getObjectName()));
elm = doc.getElementById("objectNo1");
elm.text(StringUtils.defaultString(data.getObjectNo()));
elm = doc.getElementById("planNo");
elm.text(StringUtils.defaultString(data.getPlanNo()));
elm = doc.getElementById("estimateDate");
elm.text(StringUtils.defaultString(data.getEstimateDate()));
elm = doc.getElementById("bizNo");
elm.text(StringUtils.defaultString(data.getBizNo()));
elm = doc.getElementById("zipNo");
elm.text(StringUtils.defaultString(data.getZipNo()));
elm = doc.getElementById("address");
elm.text(StringUtils.defaultString(data.getAddress()));
elm = doc.getElementById("tel");
elm.text(StringUtils.defaultString(data.getTel()));
elm = doc.getElementById("fax");
elm.text(StringUtils.defaultString(data.getFax()));
elm = doc.getElementById("totVolKw1");
elm.text(StringUtils.defaultString(data.getTotVolKw()));
elm = doc.getElementById("totPrice");
elm.text(StringUtils.defaultString(data.getTotPrice()));
StringBuilder sb = new StringBuilder();
for (ItemResponse itemResponse : list) {
sb.append("<tr>");
sb.append(
"<td style='width:60px;'>" + StringUtils.defaultString(itemResponse.getNo()) + "</td>");
sb.append(
"<td style='width:120px;text-align:left;'>"
+ StringUtils.defaultString(itemResponse.getItemName())
+ "</td>");
sb.append(
"<td style='width:120px;'>"
+ StringUtils.defaultString(itemResponse.getItemNo())
+ "</td>");
sb.append(
"<td style='width:80px;text-align:right;'>"
+ StringUtils.defaultString(itemResponse.getSalePrice())
+ "</td>");
sb.append(
"<td style='width:60px;text-align:right;'>"
+ StringUtils.defaultString(itemResponse.getAmount())
+ "</td>");
sb.append(
"<td style='width:60px;'>" + StringUtils.defaultString(itemResponse.getUnit()) + "</td>");
sb.append(
"<td style='width:80px;text-align:right;'>"
+ StringUtils.defaultString(itemResponse.getSaleTotPrice())
+ "</td>");
sb.append("</tr>");
}
if ("Y".equals(data.getPkgYn())) {
sb.append("<tr>");
sb.append("<td style='width:60px;'>" + StringUtils.defaultString(data.getPkgNo()) + "</td>");
sb.append("<td style='width:120px;text-align:left;'>住宅 PKG</td>");
sb.append("<td style='width:120px;'>-</td>");
sb.append(
"<td style='width:80px;text-align:right;'>"
+ StringUtils.defaultString(data.getPkgAsp())
+ "</td>");
sb.append(
"<td style='width:60px;text-align:right;'>"
+ StringUtils.defaultString(data.getTotVol())
+ "</td>");
sb.append("<td style='width:60px;'>W</td>");
sb.append(
"<td style='width:80px;text-align:right;'>"
+ StringUtils.defaultString(data.getPkgTotPrice())
+ "</td>");
sb.append("</tr>");
}
elm = doc.getElementById("itemList_detail");
elm.before(sb.toString());
elm = doc.getElementById("supplyPrice");
elm.text(StringUtils.defaultString(data.getSupplyPrice()));
elm = doc.getElementById("vatPrice");
elm.text(StringUtils.defaultString(data.getVatPrice()));
elm = doc.getElementById("totPrice1");
elm.text(StringUtils.defaultString(data.getTotPrice()));
elm = doc.getElementById("remarks");
elm.text(StringUtils.defaultString(data.getRemarks()));
// 견적서 특이사항 목록 설정
if (data.getNoteList() != null) {
sb = new StringBuilder();
for (NoteResponse noteResponse : data.getNoteList()) {
sb.append("<tr>");
sb.append(
"<td style='text-align:left;'>"
+ StringUtils.defaultString(noteResponse.getCodeNm())
+ "</td>");
sb.append(
"<td style='text-align:left;'>"
+ StringUtils.defaultString(noteResponse.getRemarks())
+ "</td>");
sb.append("</tr>");
}
elm = doc.getElementById("noteList_detail");
elm.append(sb.toString());
}
// 도면 설정
elm = doc.getElementById("objectNo4");
elm.text(
StringUtils.defaultString(data.getObjectNo())
+ " (Plan No : "
+ StringUtils.defaultString(data.getPlanNo())
+ ")");
elm = doc.getElementById("objectName");
elm.text(StringUtils.defaultString(data.getObjectName()));
elm = doc.getElementById("totVolKw");
elm.text(StringUtils.defaultString(data.getTotVolKw()) + " Kw");
elm = doc.getElementById("certVolKw");
elm.text(StringUtils.defaultString(data.getRoofInfo().getCertVolKw()) + " Kw");
elm = doc.getElementById("drawingEstimateCreateDate4");
elm.text(StringUtils.defaultString(data.getDrawingEstimateCreateDate()));
elm = doc.getElementById("prefName4");
elm.text(StringUtils.defaultString(data.getPrefName()));
elm = doc.getElementById("areaName4");
elm.text(StringUtils.defaultString(data.getAreaName()));
elm = doc.getElementById("snowfall4");
elm.text(StringUtils.defaultString(data.getSnowfall()) + " cm");
elm = doc.getElementById("standardWindSpeedName4");
elm.text(StringUtils.defaultString(data.getStandardWindSpeedName()));
// 도면(가대제외 이미지) 노출 ???
int no = 1;
sb = new StringBuilder();
for (ItemResponse itemResponse : list) {
if (!"STAND_".equals(itemResponse.getItemGroup())) {
sb.append("<tr>");
sb.append("<td>" + (no++) + "</td>");
sb.append(
"<td style='text-align:left;'>"
+ StringUtils.defaultString(itemResponse.getItemNo())
+ "</td>");
sb.append(
"<td style='text-align:right;'>"
+ StringUtils.defaultString(itemResponse.getAmount())
+ "</td>");
sb.append("</tr>");
}
}
elm = doc.getElementById("notStandItemList_detail");
elm.append(sb.toString());
if (data.getRoofInfo().getRoofPcList() != null) {
no = 1;
sb = new StringBuilder();
for (RoofResponse roofResponse : data.getRoofInfo().getRoofPcList()) {
sb.append("<tr>");
sb.append("<td>" + (no++) + "</td>");
sb.append(
"<td style='text-align:left;'>"
+ StringUtils.defaultString(roofResponse.getItemNo())
+ "["
+ roofResponse.getPcModuleAmount()
+ "]"
+ "</td>");
sb.append("</tr>");
}
elm = doc.getElementById("pcsItemList_detail");
elm.append(sb.toString());
}
if (data.getRoofInfo().getRoofVolList() != null) {
sb = new StringBuilder();
for (RoofResponse roofResponse : data.getRoofInfo().getRoofVolList()) {
sb.append("<tr>");
sb.append("<td>" + StringUtils.defaultString(roofResponse.getRoofSurface()) + "</td>");
sb.append("<td>" + StringUtils.defaultString(roofResponse.getClassTypeName()) + "</td>");
sb.append("<td>" + StringUtils.defaultString(roofResponse.getAmount()) + "</td>");
sb.append(
"<td style='text-align:right;'>"
+ StringUtils.defaultString(roofResponse.getVolKw())
+ "</td>");
sb.append("</tr>");
}
elm = doc.getElementById("surFaceList_detail");
elm.before(sb.toString());
elm = doc.getElementById("moduleTotAmount");
elm.text(StringUtils.defaultString(data.getRoofInfo().getModuleTotAmount()));
elm = doc.getElementById("moduleTotVolKw");
elm.text(StringUtils.defaultString(data.getRoofInfo().getModuleTotVolKw()));
}
if (data.getRoofInfo().getRoofList() != null) {
sb = new StringBuilder();
for (RoofResponse roofResponse : data.getRoofInfo().getRoofList()) {
sb.append("<tr>");
sb.append("<td>" + StringUtils.defaultString(roofResponse.getRoofSurface()) + "</td>");
sb.append(
"<td style='text-align:left;'>"
+ StringUtils.defaultString(roofResponse.getRoofMaterialName())
+ "</td>");
sb.append("<td>" + StringUtils.defaultString(roofResponse.getSlope()) + "寸</td>");
sb.append(
"<td>"
+ StringUtils.defaultString(roofResponse.getConstructSpecificationName())
+ "</td>");
sb.append(
"<td style='text-align:left;'>"
+ StringUtils.defaultString(roofResponse.getSupportMethodName())
+ "</td>");
sb.append("<td>" + StringUtils.defaultString(roofResponse.getSurfaceType()) + "</td>");
sb.append("<td>" + StringUtils.defaultString(roofResponse.getSetupHeight()) + "</td>");
sb.append("</tr>");
}
elm = doc.getElementById("surFaceList_detail2");
elm.before(sb.toString());
}
elm = doc.getElementById("objectNo5");
elm.text(
StringUtils.defaultString(data.getObjectNo())
+ " (Plan No : "
+ StringUtils.defaultString(data.getPlanNo())
+ ")");
elm = doc.getElementById("objectName5");
elm.text(StringUtils.defaultString(data.getObjectName()));
elm = doc.getElementById("totVolKw5");
elm.text(StringUtils.defaultString(data.getTotVolKw()) + " Kw");
elm = doc.getElementById("certVolKw5");
elm.text(StringUtils.defaultString(data.getRoofInfo().getCertVolKw()) + " Kw");
elm = doc.getElementById("drawingEstimateCreateDate5");
elm.text(StringUtils.defaultString(data.getDrawingEstimateCreateDate()));
elm = doc.getElementById("prefName5");
elm.text(StringUtils.defaultString(data.getPrefName()));
elm = doc.getElementById("areaName5");
elm.text(StringUtils.defaultString(data.getAreaName()));
elm = doc.getElementById("snowfall5");
elm.text(StringUtils.defaultString(data.getSnowfall()) + " cm");
elm = doc.getElementById("standardWindSpeedName5");
elm.text(StringUtils.defaultString(data.getStandardWindSpeedName()));
// 도면(가대 이미지) 노출 ???
no = 1;
sb = new StringBuilder();
for (ItemResponse itemResponse : list) {
if ("STAND_".equals(itemResponse.getItemGroup())) {
sb.append("<tr>");
sb.append("<td>" + (no++) + "</td>");
sb.append(
"<td style='text-align:left;'>"
+ StringUtils.defaultString(itemResponse.getItemNo())
+ "</td>");
sb.append(
"<td style='text-align:right;'>"
+ StringUtils.defaultString(itemResponse.getAmount())
+ "</td>");
sb.append("</tr>");
}
}
elm = doc.getElementById("standItemList_detail");
elm.append(sb.toString());
if (data.getRoofInfo().getRoofList() != null) {
sb = new StringBuilder();
for (RoofResponse roofResponse : data.getRoofInfo().getRoofList()) {
sb.append("<tr>");
sb.append("<td>" + StringUtils.defaultString(roofResponse.getRoofSurface()) + "</td>");
sb.append(
"<td style='text-align:left;'>"
+ StringUtils.defaultString(roofResponse.getRoofMaterialName())
+ "</td>");
sb.append("<td>" + StringUtils.defaultString(roofResponse.getSlope()) + "寸</td>");
sb.append(
"<td>"
+ StringUtils.defaultString(roofResponse.getConstructSpecificationName())
+ "</td>");
sb.append(
"<td style='text-align:left;'>"
+ StringUtils.defaultString(roofResponse.getSupportMethodName())
+ "</td>");
sb.append("<td>" + StringUtils.defaultString(roofResponse.getSurfaceType()) + "</td>");
sb.append("<td>" + StringUtils.defaultString(roofResponse.getSetupHeight()) + "</td>");
sb.append("</tr>");
}
elm = doc.getElementById("roofList_detail");
elm.before(sb.toString());
}
return doc;
}
/**
* Object => Map 변환 함수
*

View File

@ -175,7 +175,7 @@ public class EstimateRequest {
@Schema(description = "검색 - 가대중량표 포함 여부")
private String schWeightFlg;
@Schema(description = "검색 - 도면 포함 여부")
@Schema(description = "검색 - 도면/시뮬레이션 포함 여부")
private String schDrawingFlg;
@Schema(description = "검색 - 아이템 그룹")

View File

@ -59,6 +59,12 @@ public class RoofResponse {
@Schema(description = "방위각")
private String azimuth;
@Schema(description = "경사각 선택코드")
private String classType;
@Schema(description = "경사각 선택명")
private String classTypeName;
@Schema(description = "면조도구분")
private String surfaceType;

View File

@ -298,6 +298,7 @@
, ROUND(CAST(RE.SLOPE AS FLOAT), 2) AS SLOPE
, RE.ANGLE
, RE.AZIMUTH
, RE.CLASS_TYPE
, ISNULL(C1.CODE_NM, '') AS ROOF_MATERIAL_NAME
, ISNULL(C2.CODE_NM, '') AS SUPPORT_METHOD_NAME
, ISNULL(C3.CODE_NM, '') AS CONSTRUCT_SPECIFICATION_NAME
@ -364,6 +365,8 @@
, T.ROOF_NO
, T.ROOF_SURFACE
, T.SLOPE
, T.ANGLE
, T.CLASS_TYPE
, SUM(T.AMOUNT) AS AMOUNT
, ROUND(SUM(T.AMOUNT * T.SPECIFICATION / 1000), 4) AS VOL_KW
FROM
@ -374,6 +377,8 @@
, RE.ROOF_NO
, RE.ROOF_SURFACE
, ROUND(CAST(RE.SLOPE AS FLOAT), 2) AS SLOPE
, ROUND(CAST(RE.ANGLE AS FLOAT), 2) AS ANGLE
, RE.CLASS_TYPE
, RIE.AMOUNT
, CAST(RIE.SPECIFICATION AS FLOAT) SPECIFICATION
, I.ITEM_ID
@ -394,7 +399,7 @@
AND I.ITEM_GROUP = #{schItemGroup}
</if>
) T
GROUP BY T.OBJECT_NO, T.PLAN_NO, T.ROOF_NO, T.ROOF_SURFACE, T.SLOPE
GROUP BY T.OBJECT_NO, T.PLAN_NO, T.ROOF_NO, T.ROOF_SURFACE, T.SLOPE, T.ANGLE, T.CLASS_TYPE
</select>
<select id="selectEstimateNoteList" parameterType="com.interplug.qcast.biz.estimate.dto.NoteRequest" resultType="com.interplug.qcast.biz.estimate.dto.NoteResponse">

View File

@ -490,12 +490,13 @@
</div>
<div class="section2">
<table class="mb20">
<tbody>
<thead>
<tr>
<th class="col-15">項目</th>
<th class="col-15">文言</th>
</tr>
<tr id="noteList_detail"></tr>
</thead>
<tbody id="noteList_detail">
</tbody>
</table>
</div>
@ -588,10 +589,10 @@
<thead>
<tr>
<th class="col-15">屋根面</th>
<th class="col-15">傾斜角</th>
<th class="col-15">傾斜角</th>
<th class="col-15">方位角(度)</th>
<th>太陽電池モジュール</th>
<th class="col-15">枚数</th>
<th class="col-15">枚数(枚)</th>
</tr>
</thead>
<tbody id="roofModuleList_detail">
@ -618,37 +619,37 @@
<table class="mb20">
<tbody>
<tr>
<th class="col-15">물건번호</th>
<td id="objectNo4" colspan="3"></td>
<th class="col-15">물건명</th>
<td id="objectName"></td>
</tr>
<tr>
<th class="col-15">설치용량</th>
<td class="col-12" id="totVolKw"></td>
<th class="col-15">인증용량</th>
<td class="col-12" id="certVolKw"></td>
<th class="col-15">작성일</th>
<th class="col-15">物件番号</th>
<td class="al-l" id="objectNo4" colspan="3"></td>
<th class="col-15">作成日</th>
<td id="drawingEstimateCreateDate4"></td>
</tr>
<tr>
<th class="col-15">도도부현</th>
<td id="prefName4" colspan="3"></td>
<th class="col-15">일사량 관측지점</th>
<td id="areaName4"></td>
<th class="col-15">物件名</th>
<td class="al-l" id="objectName" colspan="3"></td>
<th class="col-15">積雪条件</th>
<td id="snowfall4"></td>
</tr>
<tr>
<th class="col-15">적설량</th>
<td id="snowfall4" colspan="3"></td>
<th class="col-15">풍속조건</th>
<th class="col-15">設備容量</th>
<td class="col-12" id="totVolKw"></td>
<th class="col-15">認証容量</th>
<td class="col-12" id="certVolKw"></td>
<th class="col-15">風速条件</th>
<td id="standardWindSpeedName4"></td>
</tr>
<tr>
<th class="col-15">都道府県</th>
<td id="prefName4" colspan="3"></td>
<th class="col-15">日射量観測地点</th>
<td id="areaName4"></td>
</tr>
</tbody>
</table>
<div class="guide-box">
<div class="guide-content">
<img src="C:\Users\dlsgk\OneDrive\바탕 화면\펭귄부부.jpg" style="width: 100%;height: auto;display: block;"/>
<!-- <img src="C:\Users\dlsgk\OneDrive\바탕 화면\펭귄부부.jpg" style="width: 100%;height: auto;display: block;"/> -->
</div>
</div>
@ -656,13 +657,11 @@
<thead>
<tr>
<th class="col-15">No</th>
<th>부재명(형번)</th>
<th class="col-15">매수</th>
<th>部材名</th>
<th class="col-15">数量</th>
</tr>
</thead>
<tbody>
<tr id="notStandItemList_detail">
</tr>
<tbody id="notStandItemList_detail">
</tbody>
</table>
@ -670,26 +669,27 @@
<thead>
<tr>
<th class="col-15">No</th>
<th>파워컨디셔너</th>
<th>パワーコンディショナ型式</th>
</tr>
</thead>
<tbody>
<tr id="pcsItemList_detail">
</tr>
<tbody id="pcsItemList_detail">
</tbody>
</table>
<table class="mb20">
<table class="price-table mb20">
<thead>
<tr>
<th class="col-15">지붕면</th>
<th>경사각</th>
<th>설치매수</th>
<th>용량(kW)</th>
<th class="col-15">屋根面</th>
<th>勾配</th>
<th>設置枚数</th>
<th>容量(kW)</th>
</tr>
</thead>
<tbody>
<tr id="surFaceList_detail">
<tbody id="surFaceList_detail">
<tr>
<th class="end" colspan="2">合計</th>
<td id="moduleTotAmount"></td>
<td class="al-r" id="moduleTotVolKw"></td>
</tr>
</tbody>
</table>
@ -714,15 +714,16 @@
<table class="mb20">
<thead>
<tr>
<th class="col-15">지붕명</th>
<th class="col-15">지붕재종류</th>
<th class="col-15">경사</th>
<th class="col-15">시공레벨</th>
<th style="width:10%;">屋根面</th>
<th style="width:15%;">屋根材種類</th>
<th style="width:10%;">勾配</th>
<th style="width:10%;">施工レベル</th>
<th style="width:30%;">施工方法</th>
<th style="width:15%;">面粗度区分</th>
<th style="width:10%;">設置高さ</th>
</tr>
</thead>
<tbody>
<tr id="surFaceList_detail2">
</tr>
<tbody id="surFaceList_detail2">
</tbody>
</table>
</div>
@ -730,48 +731,49 @@
<table class="mb20">
<tbody>
<tr>
<th class="col-15">물건번호</th>
<td id="objectNo5" colspan="3"></td>
<th class="col-15">물건명</th>
<td id="objectName5"></td>
</tr>
<tr>
<th class="col-15">설치용량</th>
<td class="col-12" id="totVolKw5"></td>
<th class="col-15">인증용량</th>
<td class="col-12" id="certVolKw5"></td>
<th class="col-15">작성일</th>
<th class="col-15">物件番号</th>
<td class="al-l" id="objectNo5" colspan="3"></td>
<th class="col-15">作成日</th>
<td id="drawingEstimateCreateDate5"></td>
</tr>
<tr>
<th class="col-15">도도부현</th>
<td id="prefName5" colspan="3"></td>
<th class="col-15">일사량 관측지점</th>
<td id="areaName5"></td>
<th class="col-15">物件名</th>
<td class="al-l" id="objectName5" colspan="3"></td>
<th class="col-15">積雪条件</th>
<td id="snowfall5"></td>
</tr>
<tr>
<th class="col-15">적설량</th>
<td id="snowfall5" colspan="3"></td>
<th class="col-15">풍속조건</th>
<th class="col-15">設備容量</th>
<td class="col-12" id="totVolKw5"></td>
<th class="col-15">認証容量</th>
<td class="col-12" id="certVolKw5"></td>
<th class="col-15">風速条件</th>
<td id="standardWindSpeedName5"></td>
</tr>
<tr>
<th class="col-15">都道府県</th>
<td id="prefName5" colspan="3"></td>
<th class="col-15">日射量観測地点</th>
<td id="areaName5"></td>
</tr>
</tbody>
</table>
<div class="guide-box">
<div class="guide-content">
<img src="C:\Users\dlsgk\OneDrive\바탕 화면\펭귄부부.jpg" style="width: 100%;height: auto;display: block;"/>
<!-- <img src="C:\Users\dlsgk\OneDrive\바탕 화면\펭귄부부.jpg" style="width: 100%;height: auto;display: block;"/> -->
</div>
</div>
<table class="mb20">
<tbody>
<thead>
<tr>
<th class="col-15">No</th>
<th class="col-15">부재명(형변)</th>
<th class="col-15">매수</th>
<th class="col-15">部材名</th>
<th class="col-15">数量</th>
</tr>
<tr id="standItemList_detail"></tr>
</thead>
<tbody id="standItemList_detail">
</tbody>
</table>
@ -795,17 +797,16 @@
<table class="mb20">
<thead>
<tr>
<th class="col-15">지붕명</th>
<th class="col-15">지붕재종류</th>
<th class="col-15">경사</th>
<th class="col-15">시공레벨</th>
<th class="col-15">시공방법</th>
<th class="col-15">면조도구분</th>
<th class="col-15">설치높이</th>
<th style="width:10%;">屋根面</th>
<th style="width:15%;">屋根材種類</th>
<th style="width:10%;">勾配</th>
<th style="width:10%;">施工レベル</th>
<th style="width:30%;">施工方法</th>
<th style="width:15%;">面粗度区分</th>
<th style="width:10%;">設置高さ</th>
</tr>
</thead>
<tbody>
<tr id="roofList_detail">
<tbody id="roofList_detail">
</tr>
</tbody>
</table>