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

@ -107,6 +107,20 @@ public class CompleteServiceImpl implements CompleteService {
/*params.put("LoginUserId", LoginUserId);*/ /*params.put("LoginUserId", LoginUserId);*/
params.put("cls", nCls); 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") ); Long pageSize = MyUtil.getLongFromObject( params.get("pageSize") );
if( pageSize == null ) { if( pageSize == null ) {
pageSize = 10l; pageSize = 10l;

View File

@ -7128,7 +7128,17 @@ public class ManageExcelUploadProc03Controller {
map.put("CORE_NUM",j+1 ); map.put("CORE_NUM",j+1 );
map.put("CORE_LOCAL",extracted[j].getName() ); map.put("CORE_LOCAL",extracted[j].getName() );
map.put("CORE_PIC", saveName ); 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")); map.put("USERID",request.getSession().getAttribute("USERID"));
coreList.add(map); coreList.add(map);
//headerService.insertTempHeaderCore(params); //headerService.insertTempHeaderCore(params);

View File

@ -19,92 +19,82 @@
FROM FROM
( (
SELECT SELECT
T.CLASS_CODE T.CLASS_CODE,
, T.PROJECT_CODE T.PROJECT_CODE,
, T.REPORT_TYPE T.REPORT_TYPE,
, T.REPORT_TYPE_NAME T.REPORT_TYPE_NAME,
, REPLACE(T.PROJECT_NAME,'"','''') AS PROJECT_NAME REPLACE(T.PROJECT_NAME, '"', '''') AS "projectName",
, T.USERID T.USERID,
, T.USER_NAME T.USER_NAME AS "userName",
, T.STATE T.STATE,
, T.STATE_NAME T.STATE_NAME AS "stateName",
, T.CREATE_NAME T.CREATE_NAME AS "createName",
, T.CREATE_USERID T.CREATE_USERID AS "createUserid",
, T.DATETIME T.DATETIME AS "datetime",
, T.MAP T.MAP AS "map",
, T.INS T.INS AS "ins",
, T.MODIFYCALL T.MODIFYCALL AS "modifycall",
, OB.HIST_SEQ OB.HIST_SEQ AS "histSeq",
, TO_CHAR(OB.CREATEDATE,'YYYY-MM-DD HH24:MI:SS') AS CREATEDATE 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 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 NVL((SELECT DISTINCT (REPORT_FILE) FROM TEMP_EXPERT_OPINION WHERE PROJECT_CODE = T.PROJECT_CODE), 'NO') AS "expertFile",
, ROW_NUMBER() OVER(ORDER BY T.DATETIME DESC) AS RNK 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 FROM
( (
SELECT SELECT
CLASS_CODE CLASS_CODE,
, PROJECT_CODE PROJECT_CODE,
, REPORT_TYPE REPORT_TYPE,
, FUNC_COMM_NAME('CM016',REPORT_TYPE ) REPORT_TYPE_NAME FUNC_COMM_NAME('CM016', REPORT_TYPE) REPORT_TYPE_NAME,
, PROJECT_NAME PROJECT_NAME,
, USERID USERID,
, (SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = INFO.USERID) AS USER_NAME (SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = INFO.USERID) AS USER_NAME,
, STATE STATE,
, FUNC_COMM_NAME('CM001',STATE ) STATE_NAME FUNC_COMM_NAME('CM001', STATE) STATE_NAME,
, ( (SELECT (SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = M.USERID)
SELECT FROM TEMP_MANAGE_STATE M
(SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = M.USERID) WHERE M.PROJECT_CODE = INFO.PROJECT_CODE) AS CREATE_NAME,
FROM (SELECT M.USERID FROM TEMP_MANAGE_STATE M WHERE M.PROJECT_CODE = INFO.PROJECT_CODE) AS CREATE_USERID,
TEMP_MANAGE_STATE M TO_CHAR(DATETIME, 'YYYY-MM-DD HH24:MI:SS') AS DATETIME,
WHERE DECODE(REPORT_TYPE, 'CH', 'map', '') AS MAP,
M.PROJECT_CODE = INFO.PROJECT_CODE PROJECT_MASTER_COMPANY_O_CODE,
) AS CREATE_NAME DECODE(STATE, '6', 'insert') AS INS,
, (SELECT M.USERID FROM TEMP_MANAGE_STATE M WHERE M.PROJECT_CODE = INFO.PROJECT_CODE) AS CREATE_USERID DECODE(STATE, '6', 'modifycall') AS MODIFYCALL
, TO_CHAR(DATETIME,'YYYY-MM-DD HH24:MI:SS') AS DATETIME FROM TEMP_PROJECT_INFO INFO
, DECODE(REPORT_TYPE,'CH','map','') AS MAP WHERE NVL(USE_YN, ' ') != 'N' AND STATE = '6'
, PROJECT_MASTER_COMPANY_O_CODE ) T,
, DECODE(STATE,'6','insert') AS INS TEMP_MANAGE_STATE OB
, DECODE(STATE,'6','modifycall') AS MODIFYCALL WHERE T.PROJECT_CODE = OB.PROJECT_CODE(+)
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'"> <if test="searchProjectName != null and searchProjectName != '' and searchProjectName != 'null'">
AND T.PROJECT_NAME LIKE '%${searchProjectName}%' AND T.PROJECT_NAME LIKE '%${searchProjectName}%'
</if> </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 ) A
WHERE WHERE
<![CDATA[ A.RNK BETWEEN #{firstIndex} + 1 AND #{firstIndex} + #{recordCountPerPage}
A.RNK BETWEEN #{firstIndex} + 1
AND #{firstIndex} + #{recordCountPerPage}
]]>
</select> </select>
<select id="selectCompleteItemsCnt" parameterType="hashmap" resultType="long"> <select id="selectCompleteItemsCnt" parameterType="hashmap" resultType="long">

View File

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