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("searchCreateName", searchCreateName);
/*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 ) {

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

@ -14,97 +14,87 @@
</select> </select>
<select id="selectCompleteItems" parameterType="map" resultType="egovMap"> <select id="selectCompleteItems" parameterType="map" resultType="egovMap">
SELECT SELECT
* *
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
FROM <choose>
( <when test="sortField == 'projectName'"> T.PROJECT_NAME ${sortDir} </when>
SELECT <when test="sortField == 'userName'"> T.USER_NAME ${sortDir} </when>
CLASS_CODE
, PROJECT_CODE <when test="sortField == 'datetime'">
, REPORT_TYPE T.DATETIME ${sortDir} <if test='sortDir == "desc"'> NULLS LAST </if>
, FUNC_COMM_NAME('CM016',REPORT_TYPE ) REPORT_TYPE_NAME </when>
, PROJECT_NAME <when test="sortField == 'createdate'">
, USERID OB.CREATEDATE ${sortDir} <if test='sortDir == "desc"'> NULLS LAST </if>
, (SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = INFO.USERID) AS USER_NAME </when>
, STATE <when test="sortField == 'modifycalldate'">
, FUNC_COMM_NAME('CM001',STATE ) STATE_NAME OB.MODIFY_CALL_DATE ${sortDir} <if test='sortDir == "desc"'> NULLS LAST </if>
, ( </when>
SELECT <when test="sortField == 'stateName'"> T.STATE_NAME ${sortDir} </when>
(SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = M.USERID) <when test="sortField == 'createName'"> T.CREATE_NAME ${sortDir} </when>
FROM <when test="sortField == 'histSeq'">
TEMP_MANAGE_STATE M OB.HIST_SEQ ${sortDir} <if test='sortDir == "desc"'> NULLS LAST </if>
WHERE </when>
M.PROJECT_CODE = INFO.PROJECT_CODE
) AS CREATE_NAME <otherwise> T.DATETIME DESC NULLS LAST </otherwise>
, (SELECT M.USERID FROM TEMP_MANAGE_STATE M WHERE M.PROJECT_CODE = INFO.PROJECT_CODE) AS CREATE_USERID </choose>
, TO_CHAR(DATETIME,'YYYY-MM-DD HH24:MI:SS') AS DATETIME ) AS RNK
, DECODE(REPORT_TYPE,'CH','map','') AS MAP FROM
, PROJECT_MASTER_COMPANY_O_CODE (
, DECODE(STATE,'6','insert') AS INS SELECT
, DECODE(STATE,'6','modifycall') AS MODIFYCALL CLASS_CODE,
FROM PROJECT_CODE,
TEMP_PROJECT_INFO INFO REPORT_TYPE,
<![CDATA[ FUNC_COMM_NAME('CM016', REPORT_TYPE) REPORT_TYPE_NAME,
WHERE NVL(USE_YN,' ') <> 'N' AND STATE = '6' PROJECT_NAME,
]]> USERID,
) T (SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = INFO.USERID) AS USER_NAME,
, TEMP_MANAGE_STATE OB STATE,
WHERE FUNC_COMM_NAME('CM001', STATE) STATE_NAME,
T.PROJECT_CODE = OB.PROJECT_CODE(+) (SELECT (SELECT USER_NAME FROM WEB_MEMBER_IN WHERE USERID = M.USERID)
FROM TEMP_MANAGE_STATE M
<if test="srchReportType != null and srchReportType != '' and srchReportType != 'null'"> WHERE M.PROJECT_CODE = INFO.PROJECT_CODE) AS CREATE_NAME,
AND T.REPORT_TYPE = #{srchReportType} (SELECT M.USERID FROM TEMP_MANAGE_STATE M WHERE M.PROJECT_CODE = INFO.PROJECT_CODE) AS CREATE_USERID,
</if> TO_CHAR(DATETIME, 'YYYY-MM-DD HH24:MI:SS') AS DATETIME,
<if test="searchProjectName != null and searchProjectName != '' and searchProjectName != 'null'"> DECODE(REPORT_TYPE, 'CH', 'map', '') AS MAP,
AND T.PROJECT_NAME LIKE '%${searchProjectName}%' PROJECT_MASTER_COMPANY_O_CODE,
</if> DECODE(STATE, '6', 'insert') AS INS,
<if test="searchProjectCode != null and searchProjectCode != '' and searchProjectCode != 'null'"> DECODE(STATE, '6', 'modifycall') AS MODIFYCALL
AND T.PROJECT_CODE LIKE '%${searchProjectCode}%' FROM TEMP_PROJECT_INFO INFO
</if> WHERE NVL(USE_YN, ' ') != 'N' AND STATE = '6'
<if test="searchUserName != null and searchUserName != '' and searchUserName != 'null'"> ) T,
AND T.USER_NAME = #{searchUserName} TEMP_MANAGE_STATE OB
</if> WHERE T.PROJECT_CODE = OB.PROJECT_CODE(+)
<if test="searchCreateName != null and searchCreateName != '' and searchCreateName != 'null'">
AND T.CREATE_NAME = #{searchCreateName} <if test="searchProjectName != null and searchProjectName != '' and searchProjectName != 'null'">
</if> AND T.PROJECT_NAME LIKE '%${searchProjectName}%'
<if test="searchHistSeq != null and searchHistSeq != '' and searchHistSeq != 'null'"> </if>
AND OB.HIST_SEQ = #{searchHistSeq} ) A
</if> WHERE
<if test="LoginUserId != 'admin_user' and LoginUserId != null and LoginUserId != '' and cls != 65535 "> A.RNK BETWEEN #{firstIndex} + 1 AND #{firstIndex} + #{recordCountPerPage}
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> </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;
} }
// 정렬 파라미터를 담을 변수 추가
$.ajax({ var sortParams = "";
url: "/manage/complete/list.do?pageIndex=" + currentPage if (options.data.sort && options.data.sort.length > 0) {
+ "&" + "searchProjectName=" + searchProjectName for (var i = 0; i < options.data.sort.length; i++) {
+ "&" + "searchProjectCode=" + searchProjectCode sortParams += "&sort[" + i + "][field]=" + options.data.sort[i].field;
+ "&" + "searchHistSeq=" + searchHistSeq sortParams += "&sort[" + i + "][dir]=" + options.data.sort[i].dir;
+ "&" + "searchUserName=" + searchUserName }
+ "&" + "searchCreateName=" + searchCreateName }
,
contentType: 'application/json', $.ajax({
dataType: "json",               url: "/manage/complete/list.do", // URL은 순수 경로만 지정
type: 'GET', data: { // 파라미터는 data 객체로 전달
success: function(result) { pageIndex: currentPage,
options.success(result); searchProjectName: searchProjectName,
}, searchProjectCode: searchProjectCode,
error: function(result) { searchHistSeq: searchHistSeq,
options.error(result); 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: { 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({