엑셀업로드하여 건설현장 입력

main
유지인 2025-06-27 17:54:21 +09:00
parent 87306a7636
commit 1a67d34ca9
1 changed files with 168 additions and 13 deletions

View File

@ -79,7 +79,9 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe
</ul>
<p class="check-title">기관명이 없을 시, 연락 바랍니다. 연락처: <span class="contact-tel">031-995-0934</span></p>
</div>
<button class="btn-green" type="button" id="excel-input-btn">엑셀자료입력</button>
<!-- 실제 파일 선택 input (숨김 처리) -->
<input type="file" id="excel-file-input" accept=".xls" style="display: none;">
<button class="btn-green" type="button" onclick="triggerExcelUpload()">엑셀자료입력</button>
                        <button class="btn-green btn-excel-download" type="button" id="excel-download-btn">엑셀 양식 다운로드</button>
</div>
<div id="table-container">
@ -106,6 +108,7 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe
<div id="calenderDiv" class="trViewOff" style="position:absolute;"></div>
<!-- javascript start-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
<script type="text/javascript">
var tableId = 0;
@ -314,52 +317,52 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe
dataIndexValue = tableDataElements[i].getAttribute('data-index');
// 사업명
var constNameEle = document.getElementById('const-name-' + (i + 1));
var constNameEle = document.getElementById('const-name-' + dataIndexValue);
if (constNameEle) {
jsonItem.constName = constNameEle.value;
}
// 사업기간 - 시작
var constStartDateEle = document.getElementById('const-start-date-' + (i + 1));
var constStartDateEle = document.getElementById('const-start-date-' + dataIndexValue);
if (constStartDateEle) {
jsonItem.constStartDate = constStartDateEle.value;
}
// 사업기간 - 종료
var constEndDateEle = document.getElementById('const-end-date-' + (i + 1));
var constEndDateEle = document.getElementById('const-end-date-' + dataIndexValue);
if (constEndDateEle) {
jsonItem.constEndDate = constEndDateEle.value;
}
// 사업단계
var constStateCodeEle = document.getElementById('const-state-code-' + (i + 1));
var constStateCodeEle = document.getElementById('const-state-code-' + dataIndexValue);
if (constStateCodeEle) {
jsonItem.constStateCode = constStateCodeEle.value;
}
// 발주기관 - 담당부서
var masterCompanyDeptEle = document.getElementById('master-company-dept-' + (i + 1));
var masterCompanyDeptEle = document.getElementById('master-company-dept-' + dataIndexValue);
if (masterCompanyDeptEle) {
jsonItem.masterCompanyDept = masterCompanyDeptEle.value;
}
// 발주기관 - 담당자
var masterCompanyAdminEle = document.getElementById('master-company-admin-' + (i + 1));
var masterCompanyAdminEle = document.getElementById('master-company-admin-' + dataIndexValue);
if (masterCompanyAdminEle) {
jsonItem.masterCompanyAdmin = masterCompanyAdminEle.value;
}
// 발주기관 - 담당자 연락처
var masterCompanyTelEle = document.getElementById('master-company-tel-' + (i + 1));
var masterCompanyTelEle = document.getElementById('master-company-tel-' + dataIndexValue);
if (masterCompanyTelEle) {
jsonItem.masterCompanyTel = masterCompanyTelEle.value;
}
// 건설사 - 건설사명
var constCompanyNameEle = document.getElementById('const-company-dept-' + (i + 1));
var constCompanyNameEle = document.getElementById('const-company-dept-' + dataIndexValue);
if (constCompanyNameEle) {
jsonItem.constCompanyName = constCompanyNameEle.value;
}
// 건설사 - 담당자
var constCompanyAdminEle = document.getElementById('const-company-admin-' + (i + 1));
var constCompanyAdminEle = document.getElementById('const-company-admin-' + dataIndexValue);
if (constCompanyAdminEle) {
jsonItem.constCompanyAdmin = constCompanyAdminEle.value;
}
// 건설사 - 담당자 연락처
var constCompanyTelEle = document.getElementById('const-company-tel-' + (i + 1));
var constCompanyTelEle = document.getElementById('const-company-tel-' + dataIndexValue);
if (constCompanyTelEle) {
jsonItem.constCompanyTel = constCompanyTelEle.value;
}
@ -368,7 +371,7 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe
jsonItem.cid=cid;
}
if ( isValid(i + 1) == false ) {
if ( isValid(dataIndexValue) == false ) {
return false;
}
jsonData.push(jsonItem);
@ -386,10 +389,13 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
// 요청 성공 시 처리
let result = JSON.parse(xhr.response);
console.log(result.resultCode)
console.log(xhr.responseText);
const obj = JSON.parse(xhr.responseText);
alert(obj.message);
window.location.href='/drilling/inquiry.do';
// window.location.href='/drilling/inquiry.do';
} else if (xhr.readyState === 4) {
// 요청 실패 시 처리
console.error('요청 실패:', xhr.status);
@ -528,7 +534,156 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe
        };
        xhr.send();
    }
function triggerExcelUpload() {
// 숨겨진 파일 선택 input을 클릭시킴
document.getElementById('excel-file-input').click();
}
document.getElementById('excel-file-input').addEventListener('change', function (event) {
const file = event.target.files[0];
if (file) {
handleExcelUpload(file);
}
});
function handleExcelUpload(file) {
document.getElementById("table-container").innerHTML = '';
const reader = new FileReader();
reader.onload = function (e) {
const data = new Uint8Array(e.target.result);
const workbook = XLSX.read(data, { type: 'array', cellDates: true });
const firstSheet = workbook.Sheets[workbook.SheetNames[0]];
const json = XLSX.utils.sheet_to_json(firstSheet, { header: 1, defval: "" });
populateFromExcel(json);
};
reader.readAsArrayBuffer(file);
}
function populateFromExcel(rows) {
// rows[0] = 헤더, rows[1..] = 실제 데이터
for (let i = 2; i < rows.length; i++) {
const row = rows[i];
if (row[1] != "" || row[2] != "" || row[3] != "" || row[4] != "" || row[5] != "" || row[6] != "" || row[7] != "" || row[8] != "" || row[9] != "" || row[10] != "" || row[11]) {
const data = {
constName: row[1], // 사업명
constStartDate: row[2], // 사업기간 시작일
constEndDate: row[3], // 사업기간 종료일
constStateCode: row[4], // 사업단계
masterCompanyDept: row[5], // 발주기관 담당부서
masterCompanyAdmin: row[6], // 발주기관 담당자
masterCompanyTel: row[7], // 발주기관 담당자 연락처
constCompanyDept: row[8], // 건설사 건설사명
constCompanyAdmin: row[9], // 건설사 담당자
constCompanyTel: row[10], // 건설사 담당자 연락처
unselected: row[11] === '미지정' // 건설사 미지정
};
addItemWithData(data);
}
}
document.getElementById('excel-file-input').value = ''
}
function addItemWithData(data) {
tableId += 1;
const today = getToday();
// 사업단계 코드가 문자열로 전달되면 숫자로 비교하도록 수정
const stateCode = [
{value:1, txt:"타당성조사 및 계획검토", selected:false},
{value:2, txt:"기본설계", selected:false},
{value:3, txt:"실시설계", selected:false},
{value:4, txt:"시공중", selected:false},
{value:5, txt:"준공", selected:false},
{value:6, txt:"유지보수", selected:false}
];
let const_name = data.constName == "" ? "" : data.constName;
let const_state_code = data.constStateCode == "" ? "타당성조사 및 계획검토" : data.constStateCode;
let const_start_date = data.constStartDate == "" ? "" : data.constStartDate.toISOString().split('T')[0];
let const_end_date = data.constEndDate == "" ? "" : data.constEndDate.toISOString().split('T')[0];
let master_company_dept = data.masterCompanyDept == "" ? "" : data.masterCompanyDept;
let master_company_name = data.masterCompanyAdmin == "" ? "" : data.masterCompanyAdmin;
let master_company_tel = data.masterCompanyTel == "" ? "" : data.masterCompanyTel;
let const_company_dept = data.constCompanyDept == "" ? "" : data.constCompanyDept;
let const_company_name = data.constCompanyAdmin == "" ? "" : data.constCompanyAdmin;
let const_company_tel = data.constCompanyTel == "" ? "" : data.constCompanyTel;
let fin_const_company = data.unselected ? 'checked' : '';
let stateOptions = '';
for (let i = 0; i < stateCode.length; i++) {
if (stateCode[i].txt === const_state_code) {
stateOptions += `<option value="` + stateCode[i].value + `" selected>` + stateCode[i].txt + `</option>`;
} else {
stateOptions += `<option value="` + stateCode[i].value + `">` + stateCode[i].txt + `</option>`;
}
}
const tableHtml = `
<div class="table-scrollable" data-index="`+ tableId +`" data-` + tableId + `>
<table class="table-bordered table-data" data-index="` + tableId + `">
<colgroup>
<col style="width: 15%;">
<col style="width: 35%;">
<col style="width: 15%;">
<col style="width: 35%;">
</colgroup>
<tbody>
<tr>
<th>사업명</th>
<td colspan="3">
<input type="text" value="`+ const_name +`" onfocusout="duplicateCheckProjectName(this)" class="input-box" id="const-name-` + tableId + `" placeholder="사업명">
</td>
</tr>
<tr>
<th>사업기간</th>
<td>
<input type="date" value="` + const_start_date + `" class="date" id="const-start-date-` + tableId + `">
<span>~</span>
<input type="date" value="` + const_end_date + `" class="date date-2" id="const-end-date-` + tableId + `">
</td>
<th>사업단계</th>
<td>
<select class="selectbox" id="const-state-code-` + tableId + `">
<option disabled>사업단계선택</option>
` +
stateOptions
+ `
</select>
</td>
</tr>
<tr>
<th>발주기관</th>
<td colspan="3">
<input type="text" value="` + master_company_dept + `" class="input-box information1" id="master-company-dept-` + tableId + `" placeholder="담당부서">
<input type="text" value="` + master_company_name + `" class="input-box information2" id="master-company-admin-` + tableId + `" placeholder="담당자">
<input type="text" value="` + master_company_tel + `" class="input-box information3" id="master-company-tel-` + tableId + `" placeholder="담당자 연락처">
</td>
</tr>
<tr>
<th>건설사</th>
<td colspan="3">
<input type="text" value="` + const_company_dept + `" class="input-box information1" id="const-company-dept-` + tableId + `" placeholder="건설사명">
<input type="text" value="` + const_company_name + `" class="input-box information2" id="const-company-admin-` + tableId + `" placeholder="담당자">
<input type="text" value="` + const_company_tel + `" class="input-box information3" id="const-company-tel-` + tableId + `" placeholder="담당자 연락처">
<label class="check-box unselected-constructor-label" for="unselected-constructor-` + tableId + `"><input type="checkbox" id="unselected-constructor-` + tableId + `" ` + fin_const_company + `>
<span class="unselected-constructor-label-text">건설사 미선정</span>
</label>
</td>
</tr>
</tbody>
</table>
</div>`
;
document.getElementById("table-container").insertAdjacentHTML("beforeend", tableHtml);
if (document.getElementsByClassName('table-scrollable').length < 1) {addItem()} // 엑셀로 받아오기 중 실패할 경우 삭제한 빈 양식 원복
}
</script>
<!-- javascript end-->