fix: 엑셀업로드 시 시추공 개요에서 코어 사진 설명이 없는 경우 코어 사진 설명을 입력하라는 메시지 추가

main
thkim 2025-10-20 17:51:24 +09:00
parent 40ea5fedac
commit 34e9421ba2
4 changed files with 144 additions and 113 deletions

View File

@ -106,6 +106,20 @@ public class CompleteServiceImpl implements CompleteService {
params.put("searchCreateName", searchCreateName);
/*params.put("LoginUserId", LoginUserId);*/
params.put("cls", nCls);
// 정렬 파라미터 가공
if (params.get("sort[0][field]") != null) {
String sortField = (String) params.get("sort[0][field]");
String sortDir = (String) params.get("sort[0][dir]");
// SQL Injection 방지를 위해 허용된 컬럼명인지 확인하는 로직 추가 필요
// 예: if ("projectName".equals(sortField) || "userName".equals(sortField) ...)
// MyBatis에서 사용할 단순한 이름으로 파라미터를 추가합니다.
params.put("sortField", sortField);
params.put("sortDir", sortDir);
}
Long pageSize = MyUtil.getLongFromObject( params.get("pageSize") );
if( pageSize == null ) {

View File

@ -7128,7 +7128,17 @@ public class ManageExcelUploadProc03Controller {
map.put("CORE_NUM",j+1 );
map.put("CORE_LOCAL",extracted[j].getName() );
map.put("CORE_PIC", saveName );
map.put("CORE_DESC",excel3Wp.get("col1",j+1).trim() );
String CoreDesc = null;
if( 1 < excel3Wp.getLength() ) {
CoreDesc = excel3Wp.get("col1",j+1);
CoreDesc = CoreDesc.trim();
} else {
CoreDesc = "-";
params.put("resultMsg", "코어 사진 설명을 입력하세요. 없는 경우 '- 를 입력하세요.");
return params;
}
map.put("CORE_DESC", CoreDesc );
map.put("USERID",request.getSession().getAttribute("USERID"));
coreList.add(map);
//headerService.insertTempHeaderCore(params);

View File

@ -14,97 +14,87 @@
</select>
<select id="selectCompleteItems" parameterType="map" resultType="egovMap">
SELECT
*
FROM
(
SELECT
T.CLASS_CODE
, T.PROJECT_CODE
, T.REPORT_TYPE
, T.REPORT_TYPE_NAME
, REPLACE(T.PROJECT_NAME,'"','''') AS PROJECT_NAME
, T.USERID
, T.USER_NAME
, T.STATE
, T.STATE_NAME
, T.CREATE_NAME
, T.CREATE_USERID
, T.DATETIME
, T.MAP
, T.INS
, T.MODIFYCALL
, OB.HIST_SEQ
, TO_CHAR(OB.CREATEDATE,'YYYY-MM-DD HH24:MI:SS') AS CREATEDATE
, TO_CHAR(OB.MODIFY_CALL_DATE,'YYYY-MM-DD HH24:MI:SS') AS MODIFYCALLDATE
, NVL((SELECT DISTINCT(REPORT_FILE) FROM TEMP_EXPERT_OPINION WHERE PROJECT_CODE = T.PROJECT_CODE),'NO') AS EXPERT_FILE
, ROW_NUMBER() OVER(ORDER BY T.DATETIME DESC) AS RNK
FROM
(
SELECT
CLASS_CODE
, PROJECT_CODE
, REPORT_TYPE
, FUNC_COMM_NAME('CM016',REPORT_TYPE ) REPORT_TYPE_NAME
, PROJECT_NAME
, USERID
, (SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = INFO.USERID) AS USER_NAME
, STATE
, FUNC_COMM_NAME('CM001',STATE ) STATE_NAME
, (
SELECT
(SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = M.USERID)
FROM
TEMP_MANAGE_STATE M
WHERE
M.PROJECT_CODE = INFO.PROJECT_CODE
) AS CREATE_NAME
, (SELECT M.USERID FROM TEMP_MANAGE_STATE M WHERE M.PROJECT_CODE = INFO.PROJECT_CODE) AS CREATE_USERID
, TO_CHAR(DATETIME,'YYYY-MM-DD HH24:MI:SS') AS DATETIME
, DECODE(REPORT_TYPE,'CH','map','') AS MAP
, PROJECT_MASTER_COMPANY_O_CODE
, DECODE(STATE,'6','insert') AS INS
, DECODE(STATE,'6','modifycall') AS MODIFYCALL
FROM
TEMP_PROJECT_INFO INFO
<![CDATA[
WHERE NVL(USE_YN,' ') <> 'N' AND STATE = '6'
]]>
) T
, TEMP_MANAGE_STATE OB
WHERE
T.PROJECT_CODE = OB.PROJECT_CODE(+)
<if test="srchReportType != null and srchReportType != '' and srchReportType != 'null'">
AND T.REPORT_TYPE = #{srchReportType}
</if>
<if test="searchProjectName != null and searchProjectName != '' and searchProjectName != 'null'">
AND T.PROJECT_NAME LIKE '%${searchProjectName}%'
</if>
<if test="searchProjectCode != null and searchProjectCode != '' and searchProjectCode != 'null'">
AND T.PROJECT_CODE LIKE '%${searchProjectCode}%'
</if>
<if test="searchUserName != null and searchUserName != '' and searchUserName != 'null'">
AND T.USER_NAME = #{searchUserName}
</if>
<if test="searchCreateName != null and searchCreateName != '' and searchCreateName != 'null'">
AND T.CREATE_NAME = #{searchCreateName}
</if>
<if test="searchHistSeq != null and searchHistSeq != '' and searchHistSeq != 'null'">
AND OB.HIST_SEQ = #{searchHistSeq}
</if>
<if test="LoginUserId != 'admin_user' and LoginUserId != null and LoginUserId != '' and cls != 65535 ">
AND T.PROJECT_MASTER_COMPANY_O_CODE = (SELECT MASTER_COMPANY_CODE FROM WEB_MEMBER_IN WHERE USERID = #{LoginUserId})
</if>
ORDER BY
T.DATETIME DESC
) A
WHERE
<![CDATA[
A.RNK BETWEEN #{firstIndex} + 1
AND #{firstIndex} + #{recordCountPerPage}
]]>
SELECT
*
FROM
(
SELECT
T.CLASS_CODE,
T.PROJECT_CODE,
T.REPORT_TYPE,
T.REPORT_TYPE_NAME,
REPLACE(T.PROJECT_NAME, '"', '''') AS "projectName",
T.USERID,
T.USER_NAME AS "userName",
T.STATE,
T.STATE_NAME AS "stateName",
T.CREATE_NAME AS "createName",
T.CREATE_USERID AS "createUserid",
T.DATETIME AS "datetime",
T.MAP AS "map",
T.INS AS "ins",
T.MODIFYCALL AS "modifycall",
OB.HIST_SEQ AS "histSeq",
TO_CHAR(OB.CREATEDATE, 'YYYY-MM-DD HH24:MI:SS') AS "createdate",
TO_CHAR(OB.MODIFY_CALL_DATE, 'YYYY-MM-DD HH24:MI:SS') AS "modifycalldate",
NVL((SELECT DISTINCT (REPORT_FILE) FROM TEMP_EXPERT_OPINION WHERE PROJECT_CODE = T.PROJECT_CODE), 'NO') AS "expertFile",
ROW_NUMBER() OVER(
ORDER BY
<choose>
<when test="sortField == 'projectName'"> T.PROJECT_NAME ${sortDir} </when>
<when test="sortField == 'userName'"> T.USER_NAME ${sortDir} </when>
<when test="sortField == 'datetime'">
T.DATETIME ${sortDir} <if test='sortDir == "desc"'> NULLS LAST </if>
</when>
<when test="sortField == 'createdate'">
OB.CREATEDATE ${sortDir} <if test='sortDir == "desc"'> NULLS LAST </if>
</when>
<when test="sortField == 'modifycalldate'">
OB.MODIFY_CALL_DATE ${sortDir} <if test='sortDir == "desc"'> NULLS LAST </if>
</when>
<when test="sortField == 'stateName'"> T.STATE_NAME ${sortDir} </when>
<when test="sortField == 'createName'"> T.CREATE_NAME ${sortDir} </when>
<when test="sortField == 'histSeq'">
OB.HIST_SEQ ${sortDir} <if test='sortDir == "desc"'> NULLS LAST </if>
</when>
<otherwise> T.DATETIME DESC NULLS LAST </otherwise>
</choose>
) AS RNK
FROM
(
SELECT
CLASS_CODE,
PROJECT_CODE,
REPORT_TYPE,
FUNC_COMM_NAME('CM016', REPORT_TYPE) REPORT_TYPE_NAME,
PROJECT_NAME,
USERID,
(SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = INFO.USERID) AS USER_NAME,
STATE,
FUNC_COMM_NAME('CM001', STATE) STATE_NAME,
(SELECT (SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = M.USERID)
FROM TEMP_MANAGE_STATE M
WHERE M.PROJECT_CODE = INFO.PROJECT_CODE) AS CREATE_NAME,
(SELECT M.USERID FROM TEMP_MANAGE_STATE M WHERE M.PROJECT_CODE = INFO.PROJECT_CODE) AS CREATE_USERID,
TO_CHAR(DATETIME, 'YYYY-MM-DD HH24:MI:SS') AS DATETIME,
DECODE(REPORT_TYPE, 'CH', 'map', '') AS MAP,
PROJECT_MASTER_COMPANY_O_CODE,
DECODE(STATE, '6', 'insert') AS INS,
DECODE(STATE, '6', 'modifycall') AS MODIFYCALL
FROM TEMP_PROJECT_INFO INFO
WHERE NVL(USE_YN, ' ') != 'N' AND STATE = '6'
) T,
TEMP_MANAGE_STATE OB
WHERE T.PROJECT_CODE = OB.PROJECT_CODE(+)
<if test="searchProjectName != null and searchProjectName != '' and searchProjectName != 'null'">
AND T.PROJECT_NAME LIKE '%${searchProjectName}%'
</if>
) A
WHERE
A.RNK BETWEEN #{firstIndex} + 1 AND #{firstIndex} + #{recordCountPerPage}
</select>
<select id="selectCompleteItemsCnt" parameterType="hashmap" resultType="long">

View File

@ -18,7 +18,11 @@ function fn_Search() {
if (!fn_fromToCheckAlert($("#startDate").val(), $("#endDate").val(), "기간시작일", "기간종료일", "startDate"))
return false;
document.frmSearch.submit();
var grid = kendoJQuery("#grid_type_1").data("kendoGrid");
if (grid) {
// 검색 시 항상 첫 페이지로 이동
grid.dataSource.page(1);
}
}
//load
@ -224,25 +228,37 @@ function kendoGrid() {
if( searchCreateNameEle ) {
searchCreateName = searchCreateNameEle.value;
}
$.ajax({
url: "/manage/complete/list.do?pageIndex=" + currentPage
+ "&" + "searchProjectName=" + searchProjectName
+ "&" + "searchProjectCode=" + searchProjectCode
+ "&" + "searchHistSeq=" + searchHistSeq
+ "&" + "searchUserName=" + searchUserName
+ "&" + "searchCreateName=" + searchCreateName
,
contentType: 'application/json',
dataType: "json",
type: 'GET',
success: function(result) {
options.success(result);
},
error: function(result) {
options.error(result);
}
});
// 정렬 파라미터를 담을 변수 추가
var sortParams = "";
if (options.data.sort && options.data.sort.length > 0) {
for (var i = 0; i < options.data.sort.length; i++) {
sortParams += "&sort[" + i + "][field]=" + options.data.sort[i].field;
sortParams += "&sort[" + i + "][dir]=" + options.data.sort[i].dir;
}
}
$.ajax({
              url: "/manage/complete/list.do", // URL은 순수 경로만 지정
data: { // 파라미터는 data 객체로 전달
pageIndex: currentPage,
searchProjectName: searchProjectName,
searchProjectCode: searchProjectCode,
searchHistSeq: searchHistSeq,
searchUserName: searchUserName,
searchCreateName: searchCreateName,
// Kendo UI가 전달하는 정렬, 페이징 정보 등을 options.data에서 가져와 추가
sort: options.data.sort
},
              contentType: 'application/json',
              dataType: "json",
              type: 'GET',
              success: function(result) {
                  options.success(result);
              },
              error: function(result) {
                options.error(result);
              }
            });
},
},
schema: {
@ -254,7 +270,8 @@ function kendoGrid() {
}
},
pageSize: 10,
serverPaging: true
serverPaging: true,
serverSorting: true
});
kendoJQuery("#grid_type_1").kendoGrid({