새로만들기, ID/PASS/회원가입 기능추가

This commit is contained in:
nhj 2026-01-23 10:46:41 +09:00
parent 7334350e98
commit cbf698b4af
44 changed files with 6247 additions and 138 deletions

View File

@ -12,7 +12,11 @@
<attribute name="gradle_used_by_scope" value="main,test"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-16/"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/openJDK16">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer">
<attributes>

View File

@ -87,6 +87,38 @@ public class CommonService
return uniqId;
}
/**
* 기능에 대한 고유ID 획득(미인증)
* @author urp 인프라본부 나혁제
* 작성일 : 2025.01.17
*/
public String noAuthGetIdGen(String strIdName) throws Exception
{
log.info(">>>>>>>>>> noAuthGetIdGen <<<<<<<<<<");
log.info("strIdName [{}]", strIdName);
Map<String, Object> bodyMap = new LinkedHashMap();
Map<String, Object> returnMap = new LinkedHashMap();
// Body Setting Start ---------------------------------
bodyMap.put("IdName", strIdName);
// Body Setting End ---------------------------------
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCallNoAuth(bodyMap, "/main/noAuthGetIdGen.do");
// RestApi Call End ---------------------------------
// Return Data Setting Start --------------------------
String uniqId = (String)returnMap.get("strGenId");
// Return Data Setting End --------------------------
log.info("<<<<<<<<<< noAuthGetIdGen >>>>>>>>>>");
return uniqId;
}
/**
* 코드정보 추출
* @author urp 인프라본부 나혁제

View File

@ -55,6 +55,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
public void configure(HttpSecurity http) throws Exception
{
// 2026.01.14 나혁제 공통팝업 허용처리
// 2026.01.19 나혁제 id 체크 컨트롤러 추가
http.csrf().disable()
.authorizeRequests()
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
@ -62,9 +63,16 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
.antMatchers("/logout*.do" ).permitAll()
.antMatchers("/main/logout.do" ).permitAll()
.antMatchers("/common/PageRedirection.do" ).permitAll()
.antMatchers("/main/searchIdFind.do" ).permitAll()
.antMatchers("/main/UserPasswordResetExt.do" ).permitAll()
.antMatchers("/egov/js/**" ).permitAll()
.antMatchers("/egov/css/**" ).permitAll()
.antMatchers("/egov/images/**" ).permitAll()
.antMatchers("/EgovModal.do" ).permitAll()
.antMatchers("/main/noAuth*.do" ).permitAll()
.antMatchers("//validator*" ).permitAll()
// .antMatchers("/main/searchIdFind.do" ).permitAll()
// .antMatchers("/main/UserPasswordResetExt.do" ).permitAll()
.antMatchers("/").permitAll()
.and()
.headers().frameOptions().disable()

View File

@ -1,5 +1,6 @@
package com.urpsys.basefront.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
@ -12,26 +13,33 @@ import javax.servlet.http.HttpSession;
import org.egovframe.rte.fdl.property.EgovPropertyService;
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.urpsys.basefront.common.egov.util.EgovStringUtil;
import com.urpsys.basefront.common.service.CommonService;
import com.urpsys.basefront.common.util.CommonUtil;
import com.urpsys.basefront.common.util.ConvertUtils;
import com.urpsys.basefront.common.util.RestApiCallUtil;
import com.urpsys.basefront.domain.MemberVO;
import com.urpsys.basefront.domain.TokenInfo;
import com.urpsys.itmsfront.cmm.domain.ComDefaultCodeVO;
import com.urpsys.itmsfront.sys.domain.PrsnlPortletCreateVO;
import com.urpsys.itmsfront.sys.domain.PrsnlPortletManageVO;
import com.urpsys.itmsfront.sys.domain.UserDefaultVO;
import com.urpsys.itmsfront.sys.domain.UserManageVO;
import kong.unirest.HttpResponse;
@ -75,6 +83,9 @@ public class MainController
@Resource(name = "propertiesService")
protected EgovPropertyService propertyService;
@Autowired
private CommonService commonService;
// @Autowired
// HtmlEmailUtil htmlEmailUtil;
@ -425,11 +436,11 @@ public class MainController
* 작성일 : 2026.01.14
*/
@ResponseBody
@RequestMapping(value="/main/searchIdFind.do")
@RequestMapping(value="/main/noAuthSearchIdFind.do")
public LinkedHashMap<String, Object> searchIdFind( HttpServletRequest request
, HttpServletResponse response ) throws Exception
{
log.info(">>>>>>>>>>>>>>> /main/searchIdFind.do <<<<<<<<<<<<<<<");
log.info(">>>>>>>>>>>>>>> /main/noAuthSearchIdFind.do <<<<<<<<<<<<<<<");
LinkedHashMap<String, Object> resBody = new LinkedHashMap<String, Object>(); // Response Map
@ -441,14 +452,14 @@ public class MainController
bodyMap.put("userEmail" , CommonUtil.getData(request, "userEmail"));
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCallNoAuth(bodyMap, "/main/searchIdFind.do");
returnMap = restApiCallUtil.RestApiCallNoAuth(bodyMap, "/main/noAuthSearchIdFind.do");
// RestApi Call End ---------------------------------
String userId = (String)returnMap.get("userId");
resBody.put("userId", userId );
log.info("<<<<<<<<<<<<<<< /main/searchIdFind.do >>>>>>>>>>>>>>>");
log.info("<<<<<<<<<<<<<<< /main/noAuthSearchIdFind.do >>>>>>>>>>>>>>>");
return resBody;
}
@ -459,11 +470,11 @@ public class MainController
* 작성일 : 2026.01.14
*/
@ResponseBody
@RequestMapping(value="/main/UserPasswordResetExt.do")
@RequestMapping(value="/main/noAuthUserPasswordResetExt.do")
public LinkedHashMap<String, Object> UserPasswordResetExt( HttpServletRequest request
, HttpServletResponse response ) throws Exception
{
log.info(">>>>>>>>>>>>>>> /main/UserPasswordResetExt.do <<<<<<<<<<<<<<<");
log.info(">>>>>>>>>>>>>>> /main/noAuthUserPasswordResetExt.do <<<<<<<<<<<<<<<");
LinkedHashMap<String, Object> resBody = new LinkedHashMap<String, Object>(); // Response Map
@ -476,7 +487,7 @@ public class MainController
bodyMap.put("userEmail" , CommonUtil.getData(request, "userEmail"));
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCallNoAuth(bodyMap, "/main/UserPasswordResetExt.do");
returnMap = restApiCallUtil.RestApiCallNoAuth(bodyMap, "/main/noAuthUserPasswordResetExt.do");
// RestApi Call End ---------------------------------
int resultCd = (int)returnMap.get("resultCd");
@ -485,11 +496,178 @@ public class MainController
resBody.put("resultCd" , resultCd );
resBody.put("resultMsg" , resultMsg );
log.info("<<<<<<<<<<<<<<< /main/UserPasswordResetExt.do >>>>>>>>>>>>>>>");
log.info("<<<<<<<<<<<<<<< /main/noAuthUserPasswordResetExt.do >>>>>>>>>>>>>>>");
return resBody;
}
/**
* 사용자 등록 화면으로 이동한다.
* @author urp 인프라본부 나혁제
* 작성일 : 2026.01.20
*/
@RequestMapping("/main/noAuthUserInsertView.do")
public String noAuthUserInsertView( @ModelAttribute("userSearchVO" ) UserDefaultVO userSearchVO
, @ModelAttribute("userManageExtVO") UserManageVO userManageVO
, Model model) throws Exception
{
log.info(" >>>>>>>>>>>>>>> /main/noAuthUserInsertView.do <<<<<<<<<<<<<<< ");
Map<String, Object> bodyMap = new LinkedHashMap();
Map<String, Object> returnMap = new LinkedHashMap();
ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
List<Map<String, Object>> listComCode = new ArrayList();
List<?> chglistComCode = new ArrayList();
// 조직정보 추출
voComCode = new ComDefaultCodeVO();
voComCode.setTableNm("COMTNORGNZTINFO");
// Body Setting Start ---------------------------------
bodyMap = ConvertUtils.convertToMap(voComCode);
// Body Setting End ---------------------------------
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCallNoAuth(bodyMap, "/main/noAuthSelectOgrnztIdDetail.do");
// RestApi Call End ---------------------------------
listComCode = (List<Map<String, Object>>)returnMap.get("resultList");
chglistComCode = ConvertUtils.convertToValueObjects(listComCode, ComDefaultCodeVO.class);
model.addAttribute("orgnztId_result", chglistComCode);
// 그룹정보 추출
voComCode = new ComDefaultCodeVO();
voComCode.setTableNm("COMTNORGNZTINFO");
// Body Setting Start ---------------------------------
bodyMap = ConvertUtils.convertToMap(voComCode);
// Body Setting End ---------------------------------
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCallNoAuth(bodyMap, "/main/noAuthSelectGroupIdDetail.do");
// RestApi Call End ---------------------------------
listComCode = (List<Map<String, Object>>)returnMap.get("resultList");
chglistComCode = ConvertUtils.convertToValueObjects(listComCode, ComDefaultCodeVO.class);
model.addAttribute("groupId_result", chglistComCode); // 소속기관코드를 코드정보로부터 조회 - COM025
log.info(" <<<<<<<<<<<<<<< /main/noAuthUserInsertView.do >>>>>>>>>>>>>>> ");
return "uritms-base-popup1/main/PopUserRegist";
}
/**
* 입력한 사용자아이디의 중복여부를 체크하여 사용가능여부를 확인(미인증)
* @author urp 인프라본부 나혁제
* 작성일 : 2026.01.20
*/
@RequestMapping(value = "/main/noAuthIdDplctCnfirmAjax.do")
public ModelAndView noAuthIdDplctCnfirmAjax(@RequestParam Map<String, Object> commandMap) throws Exception
{
log.info(">>>>>>>>>>>>>>> /main/noAuthIdDplctCnfirmAjax.do <<<<<<<<<<<<<<<");
Map<String, Object> bodyMap = new LinkedHashMap();
Map<String, Object> returnMap = new LinkedHashMap();
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
String checkId = (String) commandMap.get("checkId");
// Body Setting Start ---------------------------------
// bodyMap = ConvertUtils.convertToMap(commandMap);
bodyMap.put("checkId", checkId);
// Body Setting End ---------------------------------
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCallNoAuth(bodyMap, "/main/noAuthIdDplctCnfirmAjax.do");
// RestApi Call End ---------------------------------
// Return Data Setting Start --------------------------
int usedCnt = (int)returnMap.get("usedCnt");
// Return Data Setting End --------------------------
modelAndView.addObject("usedCnt", usedCnt);
modelAndView.addObject("checkId", checkId);
log.info("<<<<<<<<<<<<<<< /main/noAuthIdDplctCnfirmAjax.do >>>>>>>>>>>>>>>");
return modelAndView;
}
/**
* 회원가입(미인증)
* @author urp 인프라본부 나혁제
* 작성일 : 2026.01.21
*/
@ResponseBody
@RequestMapping("/main/noAuthUserInsertExt.do")
public LinkedHashMap<String, Object> noAuthUserInsertExt( @ModelAttribute("userManageExtVO") UserManageVO userManageVO
, Model model) throws Exception
{
log.info(">>>>>>>>>>>>>>> /main/noAuthUserInsertExt.do <<<<<<<<<<<<<<<");
Map<String, Object> bodyMap = new LinkedHashMap();
Map<String, Object> returnMap = new LinkedHashMap();
LinkedHashMap<String, Object> resBody = new LinkedHashMap<String, Object>(); // Response Map
String strReturnUrl="";
String uniqId = commonService.noAuthGetIdGen("egovUsrCnfrmIdGnrService");
if(uniqId==null || uniqId.equals(""))
{
resBody.put("resultCd" , -1 );
resBody.put("resultMsg" , "사용자 고유번호 획득시 오류가 발생했습니다. " );
}
userManageVO.setUniqId(uniqId);
// KISA 보안약점 조치
if ("".equals(userManageVO.getOrgnztId()))
{
userManageVO.setOrgnztId(null);
}
//KISA 보안약점 조치
if ("".equals(userManageVO.getGroupId()))
{
userManageVO.setGroupId(null);
}
// 기본정보 세팅
userManageVO.setPasswordHint ("P01");
userManageVO.setPasswordCnsr ("없음");
userManageVO.setAreaNo ("0000");
userManageVO.setHomemiddleTelno("0000");
userManageVO.setHomeendTelno ("0000");
userManageVO.setHomeadres ("주소없음");
userManageVO.setZip ("");
userManageVO.setEmplyrSttusCode("A");
// Body Setting Start ---------------------------------
bodyMap = ConvertUtils.convertToMapAll(userManageVO);
// Body Setting End ---------------------------------
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCallNoAuth(bodyMap, "/main/noAuthUserInsertExt.do");
// RestApi Call End ---------------------------------
resBody = (LinkedHashMap<String, Object>)returnMap;
log.info(">>>>>>>>>>>>>>> /main/noAuthUserInsertExt.do <<<<<<<<<<<<<<<");
return resBody;
}

View File

@ -316,7 +316,7 @@ public class ReportCheckController
model.addAttribute("resultForm" , resultForm ); // 보고서 양식 정보
model.addAttribute("resultAsset" , resultAsset ); // 보고서 양식 정보
// 인스던트 정보가 없는경우 0 으로 세팅
// 인스던트 정보가 없는경우 0 으로 세팅
if(resultIncident.get("inIncidentSeq") == null)
{
model.addAttribute("inIncidentSeq", 0 );
@ -436,6 +436,108 @@ public class ReportCheckController
return "uritms-tiles2/srm/ReportCheckUpdate";
}
/**
* 보고서 새로만들기 화면으로 이동한다.
* @author urp 인프라본부 나혁제
* 작성일 : 2026.01.22
*/
@RequestMapping(value = "/srm/insertCopyViewReportCheck.do")
public String insertCopyViewReportCheck( @ModelAttribute("ReportCheckListVo") ReportCheckListVo reportCheckListVo
, @ModelAttribute("searchVO") ReportCheckListVo searchVO
, HttpServletRequest request
, HttpServletResponse response
, ModelMap model) throws Exception
{
log.info(">>>>>>>>>>>>>>> /srm/insertCopyViewReportCheck.do <<<<<<<<<<<<<<<");
// api in/out map 정의
Map<String, Object> bodyMap = new LinkedHashMap();
Map<String, Object> returnMap = new LinkedHashMap();
int inReportSeq = CommonUtil.zeroConvert(reportCheckListVo.getInReportSeq());
// Body Setting Start ---------------------------------
bodyMap.put("inReportSeq", inReportSeq);
// Body Setting End ---------------------------------
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCall(bodyMap, "/srm/getReportWithBodyCheck.do");
// RestApi Call End ---------------------------------
// 결과값 추출 Start ---------------------------------
Map<String, Object> resultReportCheck = (Map<String, Object>)returnMap.get("resultReportCheck");
List<Map<String, Object>> resultSharings = (List<Map<String, Object>>)returnMap.get("resultSharings");
List<Map<String, Object>> resultAssets = (List<Map<String, Object>>)returnMap.get("resultAssets");
List<Map<String, Object>> resultApprovals = (List<Map<String, Object>>)returnMap.get("resultApprovals");
String sharingTxt = (String)returnMap.get("sharingTxt");
String privType = (String)returnMap.get("privType");
String incidentId = (String)returnMap.get("incidentId");
int approvalReq = (int)returnMap.get("approvalReq");
log.info("sharingTxt [{}]", sharingTxt);
log.info("privType [{}]", privType);
log.info("approvalReq [{}]", approvalReq);
// 결과값 추출 End ---------------------------------
// 보고서 본문 복호화처리
String strReportBody = (String)resultReportCheck.get("txReportBody");
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
resultReportCheck.put("txReportBody", strReportBodyDec);
model.addAttribute("sharingTxt" , sharingTxt ); // String
model.addAttribute("privType" , privType ); // String
model.addAttribute("incidentId" , incidentId ); // String
model.addAttribute("approvalReq" , approvalReq ); // int
model.addAttribute("resultReport" , resultReportCheck ); // Map
model.addAttribute("resultSharings" , resultSharings ); // List
model.addAttribute("resultAssets" , resultAssets ); // List
model.addAttribute("resultApprovals" , resultApprovals ); // List
// 서비스 정보 추출
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCall(bodyMap, "/srm/getInitReportCheck.do");
// RestApi Call End ---------------------------------
List<Map<String, Object>> resultService = (List<Map<String, Object>>)returnMap.get("resultService");
List<Map<String, Object>> resultForm = (List<Map<String, Object>>)returnMap.get("resultForm");
model.addAttribute("resultService" , resultService ); // 서비스 정보
model.addAttribute("resultForm" , resultForm ); // 보고서 양식 정보
model.addAttribute("dtDownstartDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 시작일시
model.addAttribute("dtDownfinishDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 종료일시
model.addAttribute("dtStartDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 서비스다운시작일시
model.addAttribute("dtFinishDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 서비스다운종료일시
TokenInfo tokenInfo = CommonUtil.getTokenInfo();
model.addAttribute("inRegUser", tokenInfo.getUniqId ()); // 접속자ID
model.addAttribute("vcRegUser", tokenInfo.getUserName()); // 접속자명
// 2025.12.03 나혁제 파일체크 로직 추가
// 파일업로드 제한
String whiteListFileUploadExtensions = propertyService.getString("Globals.fileUpload.Extensions");
String fileUploadMaxSize = propertyService.getString("Globals.fileUpload.maxSize");
model.addAttribute("fileUploadExtensions", whiteListFileUploadExtensions);
model.addAttribute("fileUploadMaxSize" , fileUploadMaxSize);
model.addAttribute("inIncidentSeq", 0 );
log.info("<<<<<<<<<<<<<<< /srm/insertCopyViewReportCheck.do >>>>>>>>>>>>>>>");
return "uritms-tiles2/srm/ReportCheckCopyInsert";
}
/**
* 보고서 등록 처리를 한다.
* @author urp 인프라본부 나혁제

View File

@ -422,6 +422,101 @@ public class ReportErrorController
return "uritms-tiles2/srm/ReportErrorUpdate";
}
/**
* 보고서 새로만들기 화면으로 이동한다.
* @author urp 인프라본부 나혁제
* 작성일 : 2026.01.22
*/
@RequestMapping(value = "/srm/insertCopyViewReportError.do")
public String insertCopyViewReportError( @ModelAttribute("ReportErrorListVo") ReportErrorListVo reportErrorListVo
, @ModelAttribute("searchVO") ReportErrorListVo searchVO
, HttpServletRequest request
, HttpServletResponse response
, ModelMap model) throws Exception
{
log.info(">>>>>>>>>>>>>>> /srm/insertCopyViewReportError.do <<<<<<<<<<<<<<<");
// api in/out map 정의
Map<String, Object> bodyMap = new LinkedHashMap();
Map<String, Object> returnMap = new LinkedHashMap();
int inReportSeq = CommonUtil.zeroConvert(reportErrorListVo.getInReportSeq());
// Body Setting Start ---------------------------------
bodyMap.put("inReportSeq", inReportSeq);
// Body Setting End ---------------------------------
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCall(bodyMap, "/srm/getReportWithBodyError.do");
// RestApi Call End ---------------------------------
// 결과값 추출 Start ---------------------------------
Map<String, Object> resultReportError = (Map<String, Object>)returnMap.get("resultReportError");
List<Map<String, Object>> resultSharings = (List<Map<String, Object>>)returnMap.get("resultSharings");
List<Map<String, Object>> resultAssets = (List<Map<String, Object>>)returnMap.get("resultAssets");
List<Map<String, Object>> resultApprovals = (List<Map<String, Object>>)returnMap.get("resultApprovals");
String sharingTxt = (String)returnMap.get("sharingTxt");
String privType = (String)returnMap.get("privType");
String incidentId = (String)returnMap.get("incidentId");
int approvalReq = (int)returnMap.get("approvalReq");
log.info("sharingTxt [{}]", sharingTxt);
log.info("privType [{}]", privType);
log.info("approvalReq [{}]", approvalReq);
// 결과값 추출 End ---------------------------------
// 보고서 본문 복호화처리
String strReportBody = (String)resultReportError.get("txReportBody");
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
resultReportError.put("txReportBody", strReportBodyDec);
model.addAttribute("sharingTxt" , sharingTxt ); // String
model.addAttribute("privType" , privType ); // String
model.addAttribute("incidentId" , incidentId ); // String
model.addAttribute("approvalReq" , approvalReq ); // int
model.addAttribute("resultReport" , resultReportError ); // Map
model.addAttribute("resultSharings" , resultSharings ); // List
model.addAttribute("resultAssets" , resultAssets ); // List
model.addAttribute("resultApprovals" , resultApprovals ); // List
// 서비스 정보 추출
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCall(bodyMap, "/srm/getInitReportError.do");
// RestApi Call End ---------------------------------
List<Map<String, Object>> resultService = (List<Map<String, Object>>)returnMap.get("resultService");
List<Map<String, Object>> resultForm = (List<Map<String, Object>>)returnMap.get("resultForm");
model.addAttribute("resultService" , resultService ); // 서비스 정보
model.addAttribute("resultForm" , resultForm ); // 보고서 양식 정보
model.addAttribute("dtDownstartDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 시작일시
model.addAttribute("dtDownfinishDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 종료일시
model.addAttribute("dtStartDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 서비스다운시작일시
model.addAttribute("dtFinishDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 서비스다운종료일시
TokenInfo tokenInfo = CommonUtil.getTokenInfo();
model.addAttribute("inRegUser", tokenInfo.getUniqId ()); // 접속자ID
model.addAttribute("vcRegUser", tokenInfo.getUserName()); // 접속자명
// 2025.12.03 나혁제 파일체크 로직 추가
// 파일업로드 제한
String whiteListFileUploadExtensions = propertyService.getString("Globals.fileUpload.Extensions");
String fileUploadMaxSize = propertyService.getString("Globals.fileUpload.maxSize");
model.addAttribute("fileUploadExtensions", whiteListFileUploadExtensions);
model.addAttribute("fileUploadMaxSize" , fileUploadMaxSize);
model.addAttribute("inIncidentSeq", 0 );
log.info("<<<<<<<<<<<<<<< /srm/insertCopyViewReportError.do >>>>>>>>>>>>>>>");
return "uritms-tiles2/srm/ReportErrorCopyInsert";
}
/**
* 장애보고서 등록 처리를 한다.
* @author urp 인프라본부 나혁제

View File

@ -423,6 +423,106 @@ public class ReportIssueController
return "uritms-tiles2/srm/ReportIssueUpdate";
}
/**
* 보고서 새로만들기 화면으로 이동한다.
* @author urp 인프라본부 나혁제
* 작성일 : 2026.01.22
*/
@RequestMapping(value = "/srm/insertCopyViewReportIssue.do")
public String insertCopyViewReportIssue( @ModelAttribute("ReportIssueListVo") ReportIssueListVo reportIssueListVo
, @ModelAttribute("searchVO") ReportIssueListVo searchVO
, HttpServletRequest request
, HttpServletResponse response
, ModelMap model) throws Exception
{
log.info(">>>>>>>>>>>>>>> /srm/insertCopyViewReportIssue.do <<<<<<<<<<<<<<<");
// api in/out map 정의
Map<String, Object> bodyMap = new LinkedHashMap();
Map<String, Object> returnMap = new LinkedHashMap();
int inReportSeq = CommonUtil.zeroConvert(reportIssueListVo.getInReportSeq());
// Body Setting Start ---------------------------------
bodyMap.put("inReportSeq", inReportSeq);
// Body Setting End ---------------------------------
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCall(bodyMap, "/srm/getReportWithBodyIssue.do");
// RestApi Call End ---------------------------------
// 결과값 추출 Start ---------------------------------
Map<String, Object> resultReportIssue = (Map<String, Object>)returnMap.get("resultReportIssue");
List<Map<String, Object>> resultSharings = (List<Map<String, Object>>)returnMap.get("resultSharings");
List<Map<String, Object>> resultAssets = (List<Map<String, Object>>)returnMap.get("resultAssets");
List<Map<String, Object>> resultApprovals = (List<Map<String, Object>>)returnMap.get("resultApprovals");
String sharingTxt = (String)returnMap.get("sharingTxt");
String privType = (String)returnMap.get("privType");
String incidentId = (String)returnMap.get("incidentId");
int approvalReq = (int)returnMap.get("approvalReq");
log.info("sharingTxt [{}]", sharingTxt);
log.info("privType [{}]", privType);
log.info("approvalReq [{}]", approvalReq);
// 결과값 추출 End ---------------------------------
// 보고서 본문 복호화처리
String strReportBody = (String)resultReportIssue.get("txReportBody");
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
resultReportIssue.put("txReportBody", strReportBodyDec);
model.addAttribute("sharingTxt" , sharingTxt ); // String
model.addAttribute("privType" , privType ); // String
model.addAttribute("incidentId" , incidentId ); // String
model.addAttribute("approvalReq" , approvalReq ); // int
model.addAttribute("resultReport" , resultReportIssue ); // Map
model.addAttribute("resultSharings" , resultSharings ); // List
model.addAttribute("resultAssets" , resultAssets ); // List
model.addAttribute("resultApprovals" , resultApprovals ); // List
// 서비스 정보 추출
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCall(bodyMap, "/srm/getInitReportIssue.do");
// RestApi Call End ---------------------------------
List<Map<String, Object>> resultService = (List<Map<String, Object>>)returnMap.get("resultService");
List<Map<String, Object>> resultForm = (List<Map<String, Object>>)returnMap.get("resultForm");
model.addAttribute("resultService" , resultService ); // 서비스 정보
model.addAttribute("resultForm" , resultForm ); // 보고서 양식 정보
model.addAttribute("dtDownstartDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 시작일시
model.addAttribute("dtDownfinishDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 종료일시
model.addAttribute("dtStartDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 서비스다운시작일시
model.addAttribute("dtFinishDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 서비스다운종료일시
TokenInfo tokenInfo = CommonUtil.getTokenInfo();
model.addAttribute("inRegUser", tokenInfo.getUniqId ()); // 접속자ID
model.addAttribute("vcRegUser", tokenInfo.getUserName()); // 접속자명
// 2025.12.03 나혁제 파일체크 로직 추가
// 파일업로드 제한
String whiteListFileUploadExtensions = propertyService.getString("Globals.fileUpload.Extensions");
String fileUploadMaxSize = propertyService.getString("Globals.fileUpload.maxSize");
model.addAttribute("fileUploadExtensions", whiteListFileUploadExtensions);
model.addAttribute("fileUploadMaxSize" , fileUploadMaxSize);
model.addAttribute("inIncidentSeq", 0 );
log.info("<<<<<<<<<<<<<<< /srm/insertCopyViewReportIssue.do >>>>>>>>>>>>>>>");
return "uritms-tiles2/srm/ReportIssueCopyInsert";
}
/**
* 이슈보고서 등록 처리를 한다.
* @author urp 인프라본부 나혁제

View File

@ -430,6 +430,106 @@ public class ReportOtherController
return "uritms-tiles2/srm/ReportOtherUpdate";
}
/**
* 보고서 새로만들기 화면으로 이동한다.
* @author urp 인프라본부 나혁제
*Other : 2026.01.22
*/
@RequestMapping(value = "/srm/insertCopyViewReportOther.do")
public String insertCopyViewReportOther( @ModelAttribute("ReportOtherListVo") ReportOtherListVo reportOtherListVo
, @ModelAttribute("searchVO") ReportOtherListVo searchVO
, HttpServletRequest request
, HttpServletResponse response
, ModelMap model) throws Exception
{
log.info(">>>>>>>>>>>>>>> /srm/insertCopyViewReportOther.do <<<<<<<<<<<<<<<");
// api in/out map 정의
Map<String, Object> bodyMap = new LinkedHashMap();
Map<String, Object> returnMap = new LinkedHashMap();
int inReportSeq = CommonUtil.zeroConvert(reportOtherListVo.getInReportSeq());
// Body Setting Start ---------------------------------
bodyMap.put("inReportSeq", inReportSeq);
bodyMap.put("inTask", CommonUtil.getData(request, "inTask")); // 보고서 유형 추출
// Body Setting End ---------------------------------
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCall(bodyMap, "/srm/getReportWithBodyOther.do");
// RestApi Call End ---------------------------------
// 결과값 추출 Start ---------------------------------
Map<String, Object> resultReportOther = (Map<String, Object>)returnMap.get("resultReportOther");
List<Map<String, Object>> resultSharings = (List<Map<String, Object>>)returnMap.get("resultSharings");
List<Map<String, Object>> resultAssets = (List<Map<String, Object>>)returnMap.get("resultAssets");
List<Map<String, Object>> resultApprovals = (List<Map<String, Object>>)returnMap.get("resultApprovals");
String sharingTxt = (String)returnMap.get("sharingTxt");
String privType = (String)returnMap.get("privType");
String incidentId = (String)returnMap.get("incidentId");
int approvalReq = (int)returnMap.get("approvalReq");
log.info("sharingTxt [{}]", sharingTxt);
log.info("privType [{}]", privType);
log.info("approvalReq [{}]", approvalReq);
// 결과값 추출 End ---------------------------------
// 보고서 본문 복호화처리
String strReportBody = (String)resultReportOther.get("txReportBody");
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
resultReportOther.put("txReportBody", strReportBodyDec);
model.addAttribute("sharingTxt" , sharingTxt ); // String
model.addAttribute("privType" , privType ); // String
model.addAttribute("incidentId" , incidentId ); // String
model.addAttribute("approvalReq" , approvalReq ); // int
model.addAttribute("resultReport" , resultReportOther ); // Map
model.addAttribute("resultSharings" , resultSharings ); // List
model.addAttribute("resultAssets" , resultAssets ); // List
model.addAttribute("resultApprovals" , resultApprovals ); // List
// 서비스 정보 추출
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCall(bodyMap, "/srm/getInitReportOther.do");
// RestApi Call End ---------------------------------
List<Map<String, Object>> resultService = (List<Map<String, Object>>)returnMap.get("resultService");
List<Map<String, Object>> resultForm = (List<Map<String, Object>>)returnMap.get("resultForm");
model.addAttribute("resultService" , resultService ); // 서비스 정보
model.addAttribute("resultForm" , resultForm ); // 보고서 양식 정보
model.addAttribute("dtDownstartDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 시작일시
model.addAttribute("dtDownfinishDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 종료일시
model.addAttribute("dtStartDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 서비스다운시작일시
model.addAttribute("dtFinishDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 서비스다운종료일시
TokenInfo tokenInfo = CommonUtil.getTokenInfo();
model.addAttribute("inRegUser", tokenInfo.getUniqId ()); // 접속자ID
model.addAttribute("vcRegUser", tokenInfo.getUserName()); // 접속자명
// 2025.12.03 나혁제 파일체크 로직 추가
// 파일업로드 제한
String whiteListFileUploadExtensions = propertyService.getString("Globals.fileUpload.Extensions");
String fileUploadMaxSize = propertyService.getString("Globals.fileUpload.maxSize");
model.addAttribute("fileUploadExtensions", whiteListFileUploadExtensions);
model.addAttribute("fileUploadMaxSize" , fileUploadMaxSize);
model.addAttribute("inIncidentSeq", 0 );
log.info("<<<<<<<<<<<<<<< /srm/insertCopyViewReportOther.do >>>>>>>>>>>>>>>");
return "uritms-tiles2/srm/ReportOtherCopyInsert";
}
/**
* 기타보고서 등록 처리를 한다.
* @author urp 인프라본부 나혁제

View File

@ -334,7 +334,7 @@ public class SvcDeskController
// 조치예정일일
dtReqDatetime = CommonUtil.nvl(resultReqIncident.get("dtCompleteReqDateTime"));
// 조치예정일
// 첨부파
String strRegAtchFileId = CommonUtil.nvl(resultReqIncident.get("atchFileId"));
// 서비스코드
String strInServiceCode = CommonUtil.nvl(resultReqIncident.get("inServiceCode"));
@ -364,7 +364,6 @@ public class SvcDeskController
model.addAttribute("dtReqDatetime" , dtReqDatetime); // 완료요청일시는 7일 이후
model.addAttribute("vcReqIncidentNum" , strReqIncidentNum); // 신청번호
TokenInfo tokenInfo = CommonUtil.getTokenInfo();
model.addAttribute("inRegUser", tokenInfo.getUniqId()); // 접수자ID
@ -474,6 +473,106 @@ public class SvcDeskController
return "uritms-tiles2/srm/SvcDeskUpdate";
}
/**
* 서비스 데스크 인스던트 새로만들기 화면으로 이동한다.
* @author urp 인프라본부 나혁제
* 작성일 : 2026.01.21
*/
@PostMapping(value = "/srm/insertCopyViewIncident.do")
public String insertCopyViewIncident( @ModelAttribute("SvcDeskListVo") SvcDeskListVo svcDeskListVo
, @ModelAttribute("searchVO") SvcDeskListVo searchVO
, HttpServletRequest request
, HttpServletResponse response
, ModelMap model) throws Exception
{
log.info(">>>>>>>>>>>>>>> /srm/insertCopyViewIncident.do <<<<<<<<<<<<<<<");
// api in/out map 정의
Map<String, Object> bodyMap = new LinkedHashMap();
Map<String, Object> returnMap = new LinkedHashMap();
int inIncidentSeq = CommonUtil.zeroConvert(svcDeskListVo.getInIncidentSeq());
// Body Setting Start ---------------------------------
bodyMap.put("inIncidentSeq", inIncidentSeq);
// Body Setting End ---------------------------------
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCall(bodyMap, "/srm/getIncidentBySeq.do");
// RestApi Call End ---------------------------------
// 결과값 추출 Start ---------------------------------
Map<String, Object> resultIncident = (Map<String, Object>)returnMap.get("resultIncident");
List<Map<String, Object>> resultSharings = (List<Map<String, Object>>)returnMap.get("resultSharings");
List<Map<String, Object>> resultReports = (List<Map<String, Object>>)returnMap.get("resultReports");
List<Map<String, Object>> resultApprovals = (List<Map<String, Object>>)returnMap.get("resultApprovals");
List<Map<String, Object>> resultTransgers = (List<Map<String, Object>>)returnMap.get("resultTransgers");
String sharingTxt = (String)returnMap.get("sharingTxt");
String privType = (String)returnMap.get("privType");
int transfer_avail = (int)returnMap.get("transfer_avail");
int editDifficulty = (int)returnMap.get("editDifficulty");
int approvalReq = (int)returnMap.get("approvalReq");
log.info("sharingTxt [{}]", sharingTxt);
log.info("privType [{}]", privType);
log.info("transfer_avail [{}]", transfer_avail);
log.info("editDifficulty [{}]", editDifficulty);
log.info("approvalReq [{}]", approvalReq);
// RestApi Call End ---------------------------------
// 인스던트 본문 복호화처리
String strIncidentBody = (String)resultIncident.get("txIncidentBody");
String strIncidentBodyDec = CommonUtil.base64decode(strIncidentBody);
resultIncident.put("txIncidentBody", strIncidentBodyDec);
model.addAttribute("sharingTxt" , sharingTxt ); // String
model.addAttribute("transfer_avail" , transfer_avail ); // int
model.addAttribute("editDifficulty" , editDifficulty ); // int
model.addAttribute("approvalReq" , approvalReq ); // int
model.addAttribute("privType" , privType ); // String
model.addAttribute("resultIncident" , resultIncident ); // Map
model.addAttribute("resultSharings" , resultSharings ); // List
model.addAttribute("resultReports" , resultReports ); // List
model.addAttribute("resultApprovals" , resultApprovals ); // List
model.addAttribute("resultTransgers" , resultTransgers ); // List
// 서비스 정보 추출
// RestApi Call Start ---------------------------------
returnMap = restApiCallUtil.RestApiCall(bodyMap, "/srm/getServiceCombo.do");
// RestApi Call End ---------------------------------
List<Map<String, Object>> resultList = (List<Map<String, Object>>)returnMap.get("resultList");
model.addAttribute("serviceList", resultList); // 서비스 정보
String dtReqDatetime = CommonUtil.getDatewithSpan(CommonUtil.getKST("yyyyMMddHHmm"), 7, "D", "yyyy-MM-dd HH:mm");
model.addAttribute("dtReceiptDatetime" , CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 접수일시
model.addAttribute("dtReqDatetime" , dtReqDatetime); // 완료요청일시는 7일 이후
TokenInfo tokenInfo = CommonUtil.getTokenInfo();
model.addAttribute("inRegUser", tokenInfo.getUniqId()); // 접수자ID
model.addAttribute("vcRegUser", tokenInfo.getUserName()); // 접수자명
// 2025.12.03 나혁제 파일체크 로직 추가
// 파일업로드 제한
String whiteListFileUploadExtensions = propertyService.getString("Globals.fileUpload.Extensions");
String fileUploadMaxSize = propertyService.getString("Globals.fileUpload.maxSize");
model.addAttribute("fileUploadExtensions", whiteListFileUploadExtensions);
model.addAttribute("fileUploadMaxSize" , fileUploadMaxSize);
log.info("<<<<<<<<<<<<<<< /srm/insertCopyViewIncident.do >>>>>>>>>>>>>>>");
return "uritms-tiles2/srm/SvcDeskCopyInsert";
}

View File

@ -79,7 +79,7 @@ public class SvcDeskReqController
/**
* 서비스 데스크 인스던트 목록을 조회한다.
* @author urp 인프라본부 나혁제
* 작성일 : 2025.02.08
* 작성일 : 2025.12.15
*/
@RequestMapping("/srm/searchReqIncident.do")
public String searchReqIncident( @ModelAttribute("searchVO") SvcDeskReqListVo searchVO

View File

@ -51,6 +51,8 @@ public class ReportCheckVo
private String inPercallPrice ;
private String atchFileId ;
private String atchFileInUpGb ;
private String oldAtchFileId ; // 2026.01.22 나혁제 이전첨부파일
public String getInReportSeq() {
return inReportSeq;
@ -238,6 +240,12 @@ public class ReportCheckVo
public void setAtchFileInUpGb(String atchFileInUpGb) {
this.atchFileInUpGb = atchFileInUpGb;
}
public String getOldAtchFileId() {
return oldAtchFileId;
}
public void setOldAtchFileId(String oldAtchFileId) {
this.oldAtchFileId = oldAtchFileId;
}

View File

@ -51,6 +51,7 @@ public class ReportErrorVo
private String inPercallPrice ;
private String atchFileId ;
private String atchFileInUpGb ;
private String oldAtchFileId ; // 2026.01.22 나혁제 이전첨부파일
public String getInReportSeq() {
return inReportSeq;
@ -238,6 +239,12 @@ public class ReportErrorVo
public void setAtchFileInUpGb(String atchFileInUpGb) {
this.atchFileInUpGb = atchFileInUpGb;
}
public String getOldAtchFileId() {
return oldAtchFileId;
}
public void setOldAtchFileId(String oldAtchFileId) {
this.oldAtchFileId = oldAtchFileId;
}

View File

@ -51,6 +51,7 @@ public class ReportIssueVo
private String inPercallPrice ;
private String atchFileId ;
private String atchFileInUpGb ;
private String oldAtchFileId ; // 2026.01.22 나혁제 이전첨부파일
public String getInReportSeq() {
return inReportSeq;
@ -238,6 +239,12 @@ public class ReportIssueVo
public void setAtchFileInUpGb(String atchFileInUpGb) {
this.atchFileInUpGb = atchFileInUpGb;
}
public String getOldAtchFileId() {
return oldAtchFileId;
}
public void setOldAtchFileId(String oldAtchFileId) {
this.oldAtchFileId = oldAtchFileId;
}

View File

@ -50,6 +50,7 @@ public class ReportOtherVo
private String inPercallPrice ;
private String atchFileId ;
private String atchFileInUpGb ;
private String oldAtchFileId ; // 2026.01.22 나혁제 이전첨부파일
public String getInReportSeq() {
return inReportSeq;
@ -237,6 +238,12 @@ public class ReportOtherVo
public void setAtchFileInUpGb(String atchFileInUpGb) {
this.atchFileInUpGb = atchFileInUpGb;
}
public String getOldAtchFileId() {
return oldAtchFileId;
}
public void setOldAtchFileId(String oldAtchFileId) {
this.oldAtchFileId = oldAtchFileId;
}

View File

@ -537,12 +537,13 @@ public class UserManageController
userManageVO.setUniqId(uniqId);
{//KISA 보안약점 조치 (2018-10-29, 윤창원)
if ("".equals(userManageVO.getOrgnztId()))
// KISA 보안약점 조치
if ("".equals(userManageVO.getOrgnztId()))
{
userManageVO.setOrgnztId(null);
}
//KISA 보안약점 조치 (2018-10-29, 윤창원)
//KISA 보안약점 조치
if ("".equals(userManageVO.getGroupId()))
{
userManageVO.setGroupId(null);

View File

@ -50,6 +50,6 @@
senderName: 나혁제
socketFactory-class: javax.net.ssl.SSLSocketFactory
supplier: gmail.com
client : local
client : kic

View File

@ -677,7 +677,6 @@
for (x in oRequired)
{
var field = form[oRequired[x][0]];
if ((field.type == 'hidden' ||

View File

@ -4277,6 +4277,54 @@
</form>
<!-- 2026.01.20 나혁제 회원가입 신설 -->
<form name="userManageExtVO">
<field property="emplyrId" depends="required, maxlength">
<arg0 key="사용자아이디" resource="true"/>
<arg1 key="20" resource="true"/>
<var>
<var-name>maxlength</var-name>
<var-value>20</var-value>
</var>
</field>
<field property="emplyrNm" depends="required, maxlength">
<arg0 key="사용자이름" resource="true"/>
<arg1 key="50" resource="true"/>
<var>
<var-name>maxlength</var-name>
<var-value>50</var-value>
</var>
</field>
<field property="password" depends="required, password1, pwdCheckSeries, pwdCheckRepeat, pwdCheckComb3">
<arg0 key="비밀번호" resource="true"/>
</field>
<field property="moblphonNo" depends="maxlength">
<arg0 key="핸드폰번호" resource="true"/>
<arg1 key="15" resource="true"/>
<var>
<var-name>maxlength</var-name>
<var-value>15</var-value>
</var>
</field>
<field property="emailAdres" depends="required, email, maxlength">
<arg0 key="이메일주소" resource="true"/>
<arg1 key="50" resource="true"/>
<var>
<var-name>maxlength</var-name>
<var-value>50</var-value>
</var>
</field>
<field property="groupId" depends="required">
<arg0 key="그룹아이디" resource="true"/>
</field>
</form>
<form name="sysForm3">
<field property="memory" depends="required, integer">
<arg0 key="메모리" resource="true"/>

View File

@ -0,0 +1,965 @@
<!DOCTYPE html>
<%
/**
* @Class Name : ReportCheckCopyInsert.jsp
* @Description : 점검보고서 새로 만들기
* @Modification Information
* @
* @ 수정일 수정자 수정내용
* @ ------- -------- ---------------------------
* @ 2026.01.22 나혁제 최초 생성
*
* @author urp 인프라본부 나혁제
* @since 2026.01.22
* @version 1.0
* @see
*
* Copyright (C) 2009 by MOPAS All right reserved.
*/
%>
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<title> 점검보고서 수정 </title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<!-- 2025.11.19 나혁제 선택된 Row 처리 -->
<style>
.selected {background-color:#e8eff7;}
</style>
<script type="text/javascript" src="<c:url value="/validator.do"/>"></script>
<script type="text/javascript" src="<c:url value='/egov/js/showModalDialog.js'/>" ></script>
<!-- tinyMCE Editor -->
<script charset="utf-8" type="text/javascript" src="${pageContext.request.contextPath}/lib/oss/tinymce/tinymce.min.js?ver=1" ></script>
<!-- tinymce setting 2025.05.12 나혁제 tinymce_uritms_setting.js 이관 -->
<script charset="utf-8" type="text/javascript" src="<c:url value='/js/tinymce_uritms_setting.js?ver=1'/>" ></script>
<!-- validation 처리 -->
<validator:javascript formName="reportCheckManage" staticJavascript="false" xhtml="true" cdata="false"/>
<!-- 파일처리 -->
<script type="text/javascript" src="<c:url value='/egov/js/EgovMultiFiles.js'/>" ></script>
<!-- 시간처리 -->
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui-timepicker-addon.js"></script>
<link rel="stylesheet" type="text/css" href="${ctx}/css/jquery-ui-timepicker-addon.css">
<script type="text/javaScript" language="javascript">
//----------------------------------------
// 화면 초기화
// ----------------------------------------
$(document).ready(function()
{
// 결재라인 높이 조정
// $("#table_appr tbody td").css("height", "10px");
// 시작일시, 종료일시, 서비스다운시작일시, 서비스다운종료일시 시간까지 세팅
$("#dtDownstartDatetime, #dtDownfinishDatetime, #dtStartDatetime, #dtFinishDatetime").datetimepicker({
dateFormat:'yy-mm-dd',
monthNamesShort:[ '1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월' ],
dayNamesMin:[ '일', '월', '화', '수', '목', '금', '토' ],
changeMonth:true,
changeYear:true,
showMonthAfterYear:true,
// timepicker 설정
timeFormat:'HH:mm',
controlType:'select',
oneLine:true,
});
// 멀티파일 설정
var maxFileNum = 3;
var multi_selector = new MultiSelector( document.getElementById( 'egovComFileList' ), maxFileNum );
multi_selector.addElement( document.getElementById( 'egovComFileUploader' ) );
// drawEditor("");
drawEditor("serviceBody", "", false);
// 2025.11.18 나혁제 결재라인 클릭 자료 표시
$(document).on("click", "#table_appr tbody td", function(){
$("#table_appr tbody tr").removeClass('selected');
$(this).parent().addClass('selected');
});
});
//----------------------------------------
// 화면 초기화(Form 완전 로딩후 )
// ----------------------------------------
$(window).on("load", function()
{
var strForm = document.getElementById("serviceBody2").value;
// drawEditor(strForm);
drawEditor("serviceBody", strForm, false);
});
//----------------------------------------
// 목록 화면으로 이동처리
// ----------------------------------------
function fncReportCheckList()
{
var varFrom = document.getElementById("reportCheckManage");
varFrom.action = "<c:url value='/srm/searchReportCheck.do'/>";
varFrom.submit();
}
//----------------------------------------
// 자산 조회 팝업
// ----------------------------------------
function fn_Asset_Search()
{
var strUrl = "/rem/SelectResourcePopup.do";
var arrParam = new Array(6);
arrParam[0] = window;
window.showModalDialog("<c:url value='"+strUrl+"' />"
, arrParam
,"dialogWidth:950px;dialogHeight:850px;resizable:yes;center:yes");
}
//----------------------------------------
// 팝업창에서 결재자 선택 확인시
// ----------------------------------------
function fn_Asset_Multi_Selected(strReturnData)
{
var aReturnData = strReturnData.split(","); // split에 '-'를 넣었습니다.
console.log(aReturnData);
var inAssetSeq = $("input[name='inAssetSeq']").map(function () {
return $(this).val();
}).get();
console.log(inAssetSeq);
for(var i=0; i<aReturnData.length-1; i++)
{
var aOptData = aReturnData[i].split("|");
// 기존에 존재하는경우 skip
var iExistYn = inAssetSeq.indexOf(aOptData[0]);
if(iExistYn>-1) continue;
fn_table_asset_tr_add(aOptData[0], aOptData[1], aOptData[2]);
}
}
//----------------------------------------
// 자산정보 Row 추가 처리
// ----------------------------------------
function fn_table_asset_tr_add(inAssetSeq, vcAssetName, vcCate3)
{
var strTrTag = " <tr> "
+ " <td > "
+ " <label><input type='checkbox' style='display: inline-block;' name='chkAsset' /> </label> "
+ " </td> "
+ " <td >"+vcCate3+"</td> "
+ " <td >"+vcAssetName+"</td> "
+ " <td > "
+ " <input type='text' name='txCommentAsset' id='txCommentAsset' value='' style='width:80%;'/> "
+ " </td> "
+ " <input type='hidden' name='inAssetSeq' id='inAssetSeq' value='"+inAssetSeq+"' > "
+ " </tr> "
$("#table_asset tbody").append(strTrTag)
}
//----------------------------------------
// 자산정보 선택한 자산 삭제
// ----------------------------------------
function fn_Asset_Delete()
{
$("input:checkbox[name='chkAsset']:checked").each(function(k,kVal)
{
// 로우 삭제
let chkRow = kVal.parentElement.parentElement.parentElement;
$(chkRow).remove();
});
}
//----------------------------------------
// 서비스 정보 변경시
// ----------------------------------------
function selInServiceCode()
{
var inServiceCode = $('#inServiceCode option:selected').val() ;
var inData = {};
inData = {"inServiceCode":inServiceCode};
proc.fn_get_service_info(inData);
}
//----------------------------------------
// 보고양식 변경시
// ----------------------------------------
function selReportForm()
{
var inSeq = $('#reportForm option:selected').val() ;
var inData = {};
inData = {"seq":inSeq};
proc.fn_get_report_form_info(inData);
}
//----------------------------------------
// 점검보고서 등록처리
// ----------------------------------------
function fncReportCheckInsert()
{
var bYes = confirm("점검보고서 등록 처리를 하시겠습니까?");
if(bYes==false) return;
fncReportSaveSetting();
//input item Client-Side validate
if (!validateReportCheckManage(document.reportCheckManage))
{
return false;
}
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileCheck())
{
return false;
}
proc.fn_ReportCheck_save();
}
//----------------------------------------
// 점검보고서 등록/승인요청
// ----------------------------------------
function fncReportCheckInsertApp()
{
var bYes = confirm("점검보고서 등록/승인요청 처리를 하시겠습니까?");
if(bYes==false) return;
fncReportSaveSetting();
//input item Client-Side validate
if (!validateReportCheckManage(document.reportCheckManage))
{
return false;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileCheck())
{
return false;
}
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 승인요청 메세지 팝업 open
PopupOpen("/srm/PopReqApproval", 340, 450, '');
}
//----------------------------------------
// 보고서 변경/승인처리 처리(최종 저장 처리 )
// ----------------------------------------
function fncAppLast(strMsg)
{
$('#reqTxComment' ).val(strMsg) ;
$('#reqApprovalYn' ).val("Y" ) ;
proc.fn_ReportCheck_save();
}
//----------------------------------------
// 2025.12.02 나혁제 파일체크 로직 추가
// 첨부파일 체크
// ----------------------------------------
function fncAttachFileCheck()
{
// 결과가 false인경우 허용되지 않음
var resultExtension = EgovMultiFilesChecker.checkExtensions("egovComFileUploader", "<c:out value='${fileUploadExtensions}'/>");
if (!resultExtension)
{
return false;
}
// 파일당 1M까지 허용 (1K=1024), 결과가 false인경우 허용되지 않음
var resultSize = EgovMultiFilesChecker.checkFileSize("egovComFileUploader", <c:out value='${fileUploadMaxSize}'/>);
if (!resultSize)
{
return false;
}
return true;
}
//----------------------------------------
// 저장전 기본 세팅
// ----------------------------------------
function fncReportSaveSetting()
{
var form = document.reportCheckManage;
// 결재라인
var strExistUser = $("input[name='approvalUserId']").map(function () { return $(this).val();}).get();
var strExistUserText = $("input[name='approvalUserNm']").map(function () { return $(this).val();}).get();
strExistUser.join(',');
strExistUserText.join(',');
form.approvalsId .value = strExistUser;
form.approvalsName.value = strExistUserText;
// 보고서 자산 구조
var strAssetSeq = $("input[name='inAssetSeq']").map(function () { return $(this).val();}).get();
var strCommentAsset = $("input[name='txCommentAsset']").map(function () { return $(this).val();}).get();
strAssetSeq.join(',');
strCommentAsset.join(',');
form.assetSeqs .value = strAssetSeq;
form.assetCommnets.value = strCommentAsset;
form.txReportBody.value = tinyMCE.get("serviceBody").getContent(); // 평문
}
//----------------------------------------
// 사용자 검색 팝업
// ----------------------------------------
function fn_User_Search( strTitle
, frmUniqId
, frmEmplNo
, frmEmplyrNm
, frmOrgnztNm
, multiUserSelectYn
)
{
var arrParam = new Array(6);
arrParam[0] = window;
arrParam[1] = strTitle;
arrParam[2] = frmUniqId;
arrParam[3] = frmEmplNo;
arrParam[4] = frmEmplyrNm;
arrParam[5] = frmOrgnztNm;
var strUrl = "/cmm/selectUserListPopup.do?multiUserSelectYn="+multiUserSelectYn;
window.showModalDialog("<c:url value='"+strUrl+"' />"
, arrParam
,"dialogWidth:900px;dialogHeight:750px;resizable:yes;center:yes");
}
//----------------------------------------
// 팝업창에서 결재자 선택 확인시
// ----------------------------------------
function fn_User_Multi_Selected(strReturnData)
{
var aReturnData = strReturnData.split(","); // split에 '-'를 넣었습니다.
console.log(aReturnData);
var strExistUser = $("input[name='approvalUserId']").map(function () {
return $(this).val();
}).get();
console.log(strExistUser);
for(var i=0; i<aReturnData.length-1; i++)
{
var aOptData = aReturnData[i].split("|");
// 기존에 존재하는경우 skip
var iExistYn = strExistUser.indexOf(aOptData[0]);
if(iExistYn>-1) continue;
fn_table_appr_tr_add(aOptData[0], aOptData[1]);
}
}
//----------------------------------------
// 결재라인 Row 추가 처리
// ----------------------------------------
function fn_table_appr_tr_add(strId, strName)
{
// 2025.11.18 나혁제 결재순서 표시
var trApprCnt = $('#table_appr >tbody tr').length+1;
var strTrTag = " <tr> "
+" <td > "
+" <label><input type='checkbox' style='display: inline-block;' id='chkAppUser' name='chkAppUser' /> </label> "
+" </td> "
+" <td >"+trApprCnt+"</td> "
+" <td >"+strName+"</td> "
+" <td ></td> "
+" <td ></td> "
+" <input type='hidden' name='approvalUserId' id='approvalUserId' value='"+strId+"' > "
+" <input type='hidden' name='approvalUserNm' id='approvalUserNm' value='"+strName+"' > "
+" </tr> "
;
$("#table_appr tbody").append(strTrTag)
}
//----------------------------------------
// 결재라인 선택한 사용자 삭제
// ----------------------------------------
function fn_User_Delete()
{
$("input:checkbox[name='chkAppUser']:checked").each(function(k,kVal)
{
// 로우 삭제
let chkRow = kVal.parentElement.parentElement.parentElement;
$(chkRow).remove();
});
// 2025.10.20 나혁제 결재순서 재조정
reorderApprSeq();
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 위로 이동처리
// ----------------------------------------
function fnMoveUpTR()
{
var $selected = $("#table_appr tbody tr.selected");
if ($selected.length === 0)
{
alert("이동할 행을 선택하세요.");
return;
}
var $prev = $selected.prev();
if ($prev.length > 0)
{
$selected.insertBefore($prev);
reorderApprSeq();
}
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 아래로 이동처리
// ----------------------------------------
function fnMoveDownTR()
{
var $selected = $("#table_appr tbody tr.selected");
if ($selected.length === 0)
{
alert("이동할 행을 선택하세요.");
return;
}
let $next = $selected.next();
if ($next.length > 0)
{
$selected.insertAfter($next);
reorderApprSeq();
}
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 재설정
// ----------------------------------------
function reorderApprSeq()
{
$("#table_appr tbody tr").each(function(index){
// index는 0부터 시작하므로 1을 더해줌
$(this).find("td:eq(1)").text(index + 1);
});
}
//----------------------------------------
// 팝업 오픈
// ----------------------------------------
function PopupOpen(strUrl, hei, wid, pagetitle)
{
var page = "/common/PageRedirection.do?Page="+ strUrl
+ "&PopupYn=Y";
var $dialog = $('<div></div>')
.html('<iframe style="border: 0px; " src="' + page + '" width="100%" height="100%"></iframe>')
.dialog({
autoOpen: false
, modal: true
, height: hei
, width: wid
, title: pagetitle
, open: function (event, ui)
{
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
$('.ui-dialog-titlebar-close').css({
width: '30px' // 닫기 버튼 너비
// , height: '50px' // 닫기 버튼 높이
});
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
}
, closeText: '닫기'
});
$dialog.dialog('open');
// 팝업 화면 맨앞으로 배치
$(".ui-dialog").css("z-index", "99");
}
//----------------------------------------
// Ajax 서버 통신 모음
// ----------------------------------------
var proc =
{
// 점검보고서 등록
fn_ReportCheck_save : function ()
{
var form = $('#reportCheckManage')[0];
var formData = new FormData(form);
$.ajax({
url: '/srm/addReportCheck.do'
, type: 'post'
, enctype:'multipart/form-data'
, data: formData
, dataType: 'json'
, processData:false
, contentType:false
, cache:false
, success: function(data)
{
alert("등록 완료 되었습니다.");
fncReportCheckList();
},
error: function(errorThrown)
{
alert("보고서 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
,
// 서비스 결재라인 정보 추출
fn_get_service_info : function (inData)
{
$.ajax({
url: '/srm/getSvcApprovalListCheck.do'
, type: 'post'
, data: JSON.stringify(inData)
, dataType: 'json'
, contentType: 'application/json'
, async: false
, success: function(data)
{
console.log(JSON.stringify(data));
$('#table_appr tbody tr').remove();
// 결재라인 세팅
for(var i=0; i<data.resultApprovals.length; i++)
{
fn_table_appr_tr_add(data.resultApprovals[i].inUserSeq, data.resultApprovals[i].vcUserName);
}
},
error: function(errorThrown)
{
alert("서비스 정보 조회중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
,
// 보고양식 추출
fn_get_report_form_info : function (inData)
{
$.ajax({
url: '/srm/getReportFormCheck.do'
, type: 'post'
, data: JSON.stringify(inData)
, dataType: 'json'
, contentType: 'application/json'
, async: false
, success: function(data)
{
console.log(JSON.stringify(data));
// 본문세팅
// drawEditor(data.strTxDefaultFormDec);
drawEditor("serviceBody", data.strTxDefaultFormDec, false);
// 2025.05.21 나혁제 작업자정보 세팅
$('#vcTaskUser').val(data.strVcTaskUser);
$('#inTaskUser').val(data.strInTaskUser);
},
error: function(errorThrown)
{
alert("보고양식 조회중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
}
</script>
<!-- javascript warning tag -->
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
<form:form modelAttribute="reportCheckManage" name="reportCheckManage" method="post" enctype="multipart/form-data">
<!-- body_wrap :start -->
<div class="body_wrap">
<!-- main title -->
<div class="main_titWrap">
<h3>점검보고서 새로만들기</h3>
<!-- location :s -->
<div class="location">
<div class="location-cont">
<div>
<ul class="route_navi">
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
<li><a href="#" title="유지보수 관리" >유지보수 관리</a></li>
<li>점검보고서 등록</li>
</ul>
</div>
</div>
</div>
<!--//location :e -->
</div>
<!--//main title -->
<!-- Form 테이블 :start -->
<div class="bbs_view">
<!-- 등록폼 -->
<table class="tbl_form" summary="<spring:message code="common.summary.list" arguments="등록" />">
<caption>점검보고서 등록</caption>
<colgroup>
<col style="width: 12%;">
<col style="width: 20%">
<col style="width: 8%">
<col style="width: 22%;">
<col style="width: 10%">
<col style="width: 30%;">
</colgroup>
<tbody>
<tr>
<th> 보고서ID </th>
<td> </td>
<th> 서비스 </th>
<td>
<select name="inServiceCode" id="inServiceCode" onchange="selInServiceCode()" style="width: 90%;" >
<c:forEach items="${resultService}" var="result" varStatus="status">
<option value="${result.value}" <c:if test="${result.value == resultReport.inServiceCode}"> selected </c:if> > ${result.label} </option><!-- 분류코드명 -->
</c:forEach>
</select>
</td>
<th> 작성자 </th>
<td>
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" style="width: 90%;" readonly />
<input type="hidden" name="inRegUser" id="inRegUser" value="${inRegUser}" />
</td>
</tr>
<tr>
<th> 인스던트 접수번호 </th>
<td> </td>
<th> 작업분류 </th>
<td>
<input type="text" name="vcTask" id="vcTask" value="${resultReport.vcTask}" readonly style="width: 90%;" />
<input type="hidden" name="inTask" id="inTask" value="${resultReport.inTask}" >
</td>
<th> 작업자 </th>
<td>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${resultReport.vcTaskUser}" style="width: 90%;" readonly />
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inTaskUser', '', 'vcTaskUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="작업자 검색" title="작업자 검색">
</a>
<input type="hidden" name="inTaskUser" id="inTaskUser" value="${resultReport.inTaskUser}" >
</td>
</tr>
<tr>
<%-- 2025.09.01 나혁제 불필요한 항목 사젝 --%>
<th style="display:none" > 서비스다운 </th>
<td style="display:none" >
<input type="text" class="btn_calendar" name="dtDownstartDatetime" id="dtDownstartDatetime" value="${resultReport.dtDownstartDatetime}" readonly style="width:47%;"/>
~<input type="text" class="btn_calendar" name="dtDownfinishDatetime" id="dtDownfinishDatetime" value="${resultReport.dtDownstartDatetime}" readonly style="width:47%;"/>
</td>
<th> 보고서양식 </th>
<td >
<select name="reportForm" id="reportForm" onchange="selReportForm()" style="width: 90%;" >
<c:forEach items="${resultForm}" var="result" varStatus="status">
<option value="${result.inReportForm}" > ${result.vcFormName} </option><!-- 분류코드명 -->
</c:forEach>
</select>
</td>
<th> 시작일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtStartDatetime" id="dtStartDatetime" value="${dtStartDatetime}" readonly style="width:90%;"/>
</td>
<th> 종료일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtFinishDatetime" id="dtFinishDatetime" value="${dtFinishDatetime}" readonly style="width:90%;"/>
</td>
</tr>
<tr>
<th rowspan=2 > 제목 </th>
<td rowspan=2 colspan=3>
<input type="text" name="vcReportTitle" id="vcReportTitle" value="${resultReport.vcReportTitle}" style="width:90%;"/>
</td>
<th><spring:message code="cop.atchFile" /></th>
<td>
<!-- attached file Start -->
<div>
<input type="file" name="file_1" id="egovComFileUploader" onChange="fnImgChange(this)" multiple>
</div>
<div id="egovComFileList"></div>
</div>
<!-- attached file End -->
</td>
</tr>
<tr>
<th>기존첨부파일</th>
<td>
<c:import url="/cmm/selectFileInfs.do" charEncoding="utf-8">
<c:param name="param_atchFileId" value="${resultReport.atchFileId}" />
<c:param name="strItmsYn" value="Y" />
</c:import>
</td>
</tr>
<!-- 2025.11.20 나혁제 결재라인 레이아웃 변경 및 결재순서 추가 -->
<tr>
<th >서비스 결재 라인 </th>
<td colspan=5 style="vertical-align: top;">
<div class="btn_group" >
<button type="button" class="btn-function" onclick="fn_User_Search('조치예정', '', '', '', '', 'Y');return false;" style="margin-top: -30px;"> 조회 </button>
<button type="button" class="btn-function" onclick="fn_User_Delete(); return false;" style="margin-top: -30px;"> 삭제 </button>
</div>
<div style="display: flex;align-items: flex-start;">
<div class="tbl_list">
<!-- 목록영역 -->
<table class="table" summary="" id="table_appr" >
<caption>결재라인 <spring:message code="title.list" /></caption>
<colgroup>
<col style="width: 8%;">
<col style="width: 8%;">
<col style="width: 15%;">
<col style="width: 10%;">
<col style="width: *;">
</colgroup>
<thead>
<tr>
<th></th>
<th>결재순서</th>
<th>결재자</th>
<th>상태</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
<c:forEach var="approvals" items="${resultApprovals}" varStatus="status">
<tr>
<td >
<label><input type="checkbox" style="display: inline-block;" name="chkAppUser" /> </label>
</td>
<td ><c:out value="${approvals.inOrder+1}"/></td>
<td ><c:out value="${approvals.vcUserName}"/></td>
<td ></td>
<td ></td>
<input type='hidden' name="approvalUserId" id="approvalUserId" value="${approvals.inUserSeq}" >
<input type='hidden' name="approvalUserNm" id="approvalUserNm" value="${approvals.vcUserName}" >
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div style="width:3%;text-align:center;padding-left: 5px;align-self: center;">
<a href="#" onclick="fnMoveUpTR(this); return false;" style="font-size: x-large;" >▲</a>
<a href="#" onclick="fnMoveDownTR(this); return false;" style="font-size: x-large;" >▼</a>
</div>
</div>
</td>
</tr>
<tr>
<th> 자산</th>
<td colspan=5>
<div class="btn_group" >
<button type="button" class="btn-function" onclick="fn_Asset_Search();return false;" style="margin-top: -30px;"> 조회 </button>
<button type="button" class="btn-function" onclick="fn_Asset_Delete(); return false;" style="margin-top: -30px;"> 삭제 </button>
</div>
<div class="tbl_list">
<!-- 목록영역 -->
<table class="table" summary="" id="table_asset" >
<caption>연결자산정보 <spring:message code="title.list" /></caption>
<colgroup>
<col style="width: 10%;">
<col style="width: 25%;">
<col style="width: 20%;">
<col style="width: *;">
</colgroup>
<thead>
<tr>
<th></th>
<th>소분류</th>
<th>자산명</th>
<th>비고</th>
</tr>
</thead>
<tbody>
<c:forEach var="assets" items="${resultAssets}" varStatus="status">
<tr>
<td>
<label><input type='checkbox' style='display: inline-block;' name='chkAsset' /> </label>
</td>
<td ><c:out value="${assets.vcCate3}"/></td>
<td ><c:out value="${assets.vcAssetName}"/></td>
<td >
<input type="text" name="txCommentAsset" id="txCommentAsset" value="" style="width:90%;"/>
</td>
<input type="hidden" name="inAssetSeq" id="inAssetSeq" value="${assets.inAssetSeq}" >
</tr>
</c:forEach>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
<textarea id="serviceBody" name="serviceBody" ></textarea>
<textarea id="serviceBody2" name="serviceBody2" style="display:none;">${resultReport.txReportBody}</textarea>
</div>
<!-- main btn : start -->
<div class="btn_group">
<!-- 왼쪽영역-->
<div style="text-align: left;position: absolute;">
<!-- 목록 -->
<button type="button" class="btn-function" id="btnList" style="background: blue;" onclick="fncReportCheckList(); return false;" title="<spring:message code="button.list"/>">
<spring:message code="button.list"/>
</button>
</div>
<!--//왼쪽영역-->
<!-- 오른쪽영역-->
<div>
<button type="button" class="btn-etc" onclick="fncReportCheckInsertApp(); return false;" title="등록/승인요청" >
등록/승인요청
</button>
<button type="button" class="btn-etc" onclick="fncReportCheckInsert(); return false;" title="<spring:message code="button.create" />">
<spring:message code="button.create" />
</button>
</div>
<!-- // 오른쪽영역-->
</div>
<!-- main btn : end -->
</div>
<!-- body_wrap :end -->
<!-- 검색조건 유지 -->
<input type="hidden" name="orgnztId" value="" >
<input type="hidden" name="searchCondition" value="<c:out value='${searchVO.searchCondition}'/>" >
<input type="hidden" name="searchKeyword" value="<c:out value='${searchVO.searchKeyword}'/>" >
<input type="hidden" name="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>" >
<input type="hidden" name="multiUserSelectYn" value="" >
<!-- 입력정보 -->
<input type="hidden" id="txReportBody" name="txReportBody" value="" >
<input type="hidden" id="assetSeqs" name="assetSeqs" value="" >
<input type="hidden" id="assetCommnets" name="assetCommnets" value="" >
<input type="hidden" id="approvalsId" name="approvalsId" value="" >
<input type="hidden" id="approvalsName" name="approvalsName" value="" >
<input type="hidden" id="inIncidentSeq" name="inIncidentSeq" value="${inIncidentSeq}" >
<input type="hidden" id="inReportSeq" name="inReportSeq" value="0">
<input type="hidden" id="inReportStatus" name="inReportStatus" value="0">
<input type="hidden" id="inDowntime" name="inDowntime" value="0">
<input type="hidden" id="reqTxComment" name="reqTxComment" value=""/> <!-- 승인요청메세지 -->
<input type="hidden" id="reqApprovalYn" name="reqApprovalYn" value=""/> <!-- 승인요청여부 -->
<input type="hidden" id="oldAtchFileId" name="oldAtchFileId" value="${resultReport.atchFileId}">
</form:form>

View File

@ -84,6 +84,25 @@
varFrom.submit();
}
//----------------------------------------
// 2026.01.22 나혁제
// 새로만들기 기능확장
// ----------------------------------------
function fncReportCheckCopyInsert()
{
if($('#inReportStatus').val()!='2' && $('#inReportStatus').val()!='3' )
{
alert("[승인완료/반려]된 보고서을 이용하야 새로만들기가 가능합니다.");
return;
}
// 수정화면으로 이동처리
var varFrom = document.getElementById("reportCheckManage");
varFrom.action = "<c:url value='/srm/insertCopyViewReportCheck.do'/>";
varFrom.submit();
}
//----------------------------------------
// 보고서 수정 화면 이동처리
// ----------------------------------------
@ -105,7 +124,7 @@
{
// 2025.11.18 나혁제 승인완료된 자료 수정불가
// if(confirm("승인완료된 보고서입니다. \n수정하면 모든 승인 정보는 초기화 됩니다.\n수정하시겠습니까?") == false) return;
alert("승인완료된 보고입니다.\n 재작성하시길 바랍니다.");
alert("승인완료된 보고입니다.\n 재작성하시길 바랍니다.");
return;
}
@ -669,6 +688,10 @@
</c:if>
<c:if test="${(privType eq 'mine' && report.inReportStatus ne 3) || privType eq 'super'}">
<!-- 2026.01.22 나혁제 새로만들기 기능 추가 -->
<button type="button" class="btn-etc" title="새로만들기" onclick="fncReportCheckCopyInsert(); return false;">
새로만들기
</button>
<button type="button" class="btn-etc" title="수정" onclick="fncReportCheckUpdate(); return false;">
수정
</button>

View File

@ -256,6 +256,12 @@
return false;
}
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileCheck())
{
@ -290,7 +296,7 @@
if($("#approvalsId").val() == '')
{
alert("승인요청시에는 결재라인이 필요합니다.");
alert("결재라인을 입력해 주세요.");
return;
}
@ -800,9 +806,8 @@
</td>
<th> 작성자 </th>
<td>
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" readonly />
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" style="width: 90%;" readonly />
<input type="hidden" name="inRegUser" id="inRegUser" value="${inRegUser}" />
</td>
</tr>
<tr>
@ -816,7 +821,7 @@
</td>
<th> 작업자 </th>
<td>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${vcRegUser}" readonly />
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${vcRegUser}" style="width: 90%;" readonly />
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inTaskUser', '', 'vcTaskUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="작업자 검색" title="작업자 검색">
@ -991,6 +996,7 @@
<spring:message code="button.create" />
</button>
</div>
<!-- // 오른쪽영역-->
</div>
<!-- main btn : end -->

View File

@ -142,19 +142,19 @@
<tr>
<td colspan=2>
<label>문서번호:</label>
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.reportId}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>요청번호:</label>
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 170px;"
<label>인스던트 접수번호:</label>
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.incidentNum}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>작성자:</label>
<input class="s_input" id="regUser" name="regUser" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="regUser" name="regUser" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.regUser}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>제목:</label>
<input class="s_input" id="reportTitle" name="reportTitle" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="reportTitle" name="reportTitle" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.reportTitle}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
</td>
</tr>
@ -207,7 +207,7 @@
<thead>
<tr>
<th>문서번호</th>
<th>요청번호</th>
<th>인스던트 접수번호</th>
<th>서비스</th>
<th>승인상태</th>
<th>제목</th>

View File

@ -0,0 +1,968 @@
<!DOCTYPE html>
<%
/**
* @Class Name : ReportErrorCopyInsert.jsp
* @Description : 장애보고서 새로 만들기
* @Modification Information
* @
* @ 수정일 수정자 수정내용
* @ ------- -------- ---------------------------
* @ 2026.01.22 나혁제 최초 생성
*
* @author urp 인프라본부 나혁제
* @since 2026.01.22
* @version 1.0
* @see
*
* Copyright (C) 2009 by MOPAS All right reserved.
*/
%>
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<title> 장애보고서 수정 </title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<!-- 2025.11.19 나혁제 선택된 Row 처리 -->
<style>
.selected {background-color:#e8eff7;}
</style>
<script type="text/javascript" src="<c:url value="/validator.do"/>"></script>
<script type="text/javascript" src="<c:url value='/egov/js/showModalDialog.js'/>" ></script>
<!-- tinyMCE Editor -->
<script charset="utf-8" type="text/javascript" src="${pageContext.request.contextPath}/lib/oss/tinymce/tinymce.min.js?ver=1" ></script>
<!-- tinymce setting 2025.05.12 나혁제 tinymce_uritms_setting.js 이관 -->
<script charset="utf-8" type="text/javascript" src="<c:url value='/js/tinymce_uritms_setting.js?ver=1'/>" ></script>
<!-- validation 처리 -->
<validator:javascript formName="reportErrorManage" staticJavascript="false" xhtml="true" cdata="false"/>
<!-- 파일처리 -->
<script type="text/javascript" src="<c:url value='/egov/js/EgovMultiFiles.js'/>" ></script>
<!-- 시간처리 -->
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui-timepicker-addon.js"></script>
<link rel="stylesheet" type="text/css" href="${ctx}/css/jquery-ui-timepicker-addon.css">
<script type="text/javaScript" language="javascript">
//----------------------------------------
// 화면 초기화
// ----------------------------------------
$(document).ready(function()
{
// 결재라인 높이 조정
// $("#table_appr tbody td").css("height", "10px");
// 시작일시, 종료일시, 서비스다운시작일시, 서비스다운종료일시 시간까지 세팅
$("#dtDownstartDatetime, #dtDownfinishDatetime, #dtStartDatetime, #dtFinishDatetime").datetimepicker({
dateFormat:'yy-mm-dd',
monthNamesShort:[ '1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월' ],
dayNamesMin:[ '일', '월', '화', '수', '목', '금', '토' ],
changeMonth:true,
changeYear:true,
showMonthAfterYear:true,
// timepicker 설정
timeFormat:'HH:mm',
controlType:'select',
oneLine:true,
});
// 멀티파일 설정
var maxFileNum = 3;
var multi_selector = new MultiSelector( document.getElementById( 'egovComFileList' ), maxFileNum );
multi_selector.addElement( document.getElementById( 'egovComFileUploader' ) );
// drawEditor("");
drawEditor("serviceBody", "", false);
// 2025.11.18 나혁제 결재라인 클릭 자료 표시
$(document).on("click", "#table_appr tbody td", function(){
$("#table_appr tbody tr").removeClass('selected');
$(this).parent().addClass('selected');
});
});
//----------------------------------------
// 화면 초기화(Form 완전 로딩후 )
// ----------------------------------------
$(window).on("load", function()
{
var strForm = document.getElementById("serviceBody2").value;
// drawEditor(strForm);
drawEditor("serviceBody", strForm, false);
});
//----------------------------------------
// 목록 화면으로 이동처리
// ----------------------------------------
function fncReportErrorList()
{
var varFrom = document.getElementById("reportErrorManage");
varFrom.action = "<c:url value='/srm/searchReportError.do'/>";
varFrom.submit();
}
//----------------------------------------
// 자산 조회 팝업
// ----------------------------------------
function fn_Asset_Search()
{
var strUrl = "/rem/SelectResourcePopup.do";
var arrParam = new Array(6);
arrParam[0] = window;
window.showModalDialog("<c:url value='"+strUrl+"' />"
, arrParam
,"dialogWidth:950px;dialogHeight:850px;resizable:yes;center:yes");
}
//----------------------------------------
// 팝업창에서 결재자 선택 확인시
// ----------------------------------------
function fn_Asset_Multi_Selected(strReturnData)
{
var aReturnData = strReturnData.split(","); // split에 '-'를 넣었습니다.
console.log(aReturnData);
var inAssetSeq = $("input[name='inAssetSeq']").map(function () {
return $(this).val();
}).get();
console.log(inAssetSeq);
for(var i=0; i<aReturnData.length-1; i++)
{
var aOptData = aReturnData[i].split("|");
// 기존에 존재하는경우 skip
var iExistYn = inAssetSeq.indexOf(aOptData[0]);
if(iExistYn>-1) continue;
fn_table_asset_tr_add(aOptData[0], aOptData[1], aOptData[2]);
}
}
//----------------------------------------
// 자산정보 Row 추가 처리
// ----------------------------------------
function fn_table_asset_tr_add(inAssetSeq, vcAssetName, vcCate3)
{
var strTrTag = " <tr> "
+ " <td > "
+ " <label><input type='checkbox' style='display: inline-block;' name='chkAsset' /> </label> "
+ " </td> "
+ " <td >"+vcCate3+"</td> "
+ " <td >"+vcAssetName+"</td> "
+ " <td > "
+ " <input type='text' name='txCommentAsset' id='txCommentAsset' value='' style='width:80%;'/> "
+ " </td> "
+ " <input type='hidden' name='inAssetSeq' id='inAssetSeq' value='"+inAssetSeq+"' > "
+ " </tr> "
$("#table_asset tbody").append(strTrTag)
}
//----------------------------------------
// 자산정보 선택한 자산 삭제
// ----------------------------------------
function fn_Asset_Delete()
{
$("input:checkbox[name='chkAsset']:checked").each(function(k,kVal)
{
// 로우 삭제
let chkRow = kVal.parentElement.parentElement.parentElement;
$(chkRow).remove();
});
}
//----------------------------------------
// 서비스 정보 변경시
// ----------------------------------------
function selInServiceCode()
{
var inServiceCode = $('#inServiceCode option:selected').val() ;
var inData = {};
inData = {"inServiceCode":inServiceCode};
proc.fn_get_service_info(inData);
}
//----------------------------------------
// 보고양식 변경시
// ----------------------------------------
function selReportForm()
{
var inSeq = $('#reportForm option:selected').val() ;
var inData = {};
inData = {"seq":inSeq};
proc.fn_get_report_form_info(inData);
}
//----------------------------------------
// 장애보고서 등록처리
// ----------------------------------------
function fncReportErrorInsert()
{
var bYes = confirm("장애보고서 등록 처리를 하시겠습니까?");
if(bYes==false) return;
fncReportSaveSetting();
//input item Client-Side validate
if (!validateReportErrorManage(document.reportErrorManage))
{
return false;
}
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileError())
{
return false;
}
proc.fn_ReportError_save();
}
//----------------------------------------
// 장애보고서 등록/승인요청
// ----------------------------------------
function fncReportErrorInsertApp()
{
var bYes = confirm("장애보고서 등록/승인요청 처리를 하시겠습니까?");
if(bYes==false) return;
fncReportSaveSetting();
//input item Client-Side validate
if (!validateReportErrorManage(document.reportErrorManage))
{
return false;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileError())
{
return false;
}
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 승인요청 메세지 팝업 open
PopupOpen("/srm/PopReqApproval", 340, 450, '');
}
//----------------------------------------
// 보고서 변경/승인처리 처리(최종 저장 처리 )
// ----------------------------------------
function fncAppLast(strMsg)
{
$('#reqTxComment' ).val(strMsg) ;
$('#reqApprovalYn' ).val("Y" ) ;
proc.fn_ReportError_save();
}
//----------------------------------------
// 2025.12.02 나혁제 파일체크 로직 추가
// 첨부파일 체크
// ----------------------------------------
function fncAttachFileError()
{
// 결과가 false인경우 허용되지 않음
var resultExtension = EgovMultiFilesChecker.checkExtensions("egovComFileUploader", "<c:out value='${fileUploadExtensions}'/>");
if (!resultExtension)
{
return false;
}
// 파일당 1M까지 허용 (1K=1024), 결과가 false인경우 허용되지 않음
var resultSize = EgovMultiFilesChecker.checkFileSize("egovComFileUploader", <c:out value='${fileUploadMaxSize}'/>);
if (!resultSize)
{
return false;
}
return true;
}
//----------------------------------------
// 저장전 기본 세팅
// ----------------------------------------
function fncReportSaveSetting()
{
var form = document.reportErrorManage;
// 결재라인
var strExistUser = $("input[name='approvalUserId']").map(function () { return $(this).val();}).get();
var strExistUserText = $("input[name='approvalUserNm']").map(function () { return $(this).val();}).get();
strExistUser.join(',');
strExistUserText.join(',');
form.approvalsId .value = strExistUser;
form.approvalsName.value = strExistUserText;
// 보고서 자산 구조
var strAssetSeq = $("input[name='inAssetSeq']").map(function () { return $(this).val();}).get();
var strCommentAsset = $("input[name='txCommentAsset']").map(function () { return $(this).val();}).get();
strAssetSeq.join(',');
strCommentAsset.join(',');
form.assetSeqs .value = strAssetSeq;
form.assetCommnets.value = strCommentAsset;
form.txReportBody.value = tinyMCE.get("serviceBody").getContent(); // 평문
}
//----------------------------------------
// 사용자 검색 팝업
// ----------------------------------------
function fn_User_Search( strTitle
, frmUniqId
, frmEmplNo
, frmEmplyrNm
, frmOrgnztNm
, multiUserSelectYn
)
{
var arrParam = new Array(6);
arrParam[0] = window;
arrParam[1] = strTitle;
arrParam[2] = frmUniqId;
arrParam[3] = frmEmplNo;
arrParam[4] = frmEmplyrNm;
arrParam[5] = frmOrgnztNm;
var strUrl = "/cmm/selectUserListPopup.do?multiUserSelectYn="+multiUserSelectYn;
window.showModalDialog("<c:url value='"+strUrl+"' />"
, arrParam
,"dialogWidth:900px;dialogHeight:750px;resizable:yes;center:yes");
}
//----------------------------------------
// 팝업창에서 결재자 선택 확인시
// ----------------------------------------
function fn_User_Multi_Selected(strReturnData)
{
var aReturnData = strReturnData.split(","); // split에 '-'를 넣었습니다.
console.log(aReturnData);
var strExistUser = $("input[name='approvalUserId']").map(function () {
return $(this).val();
}).get();
console.log(strExistUser);
for(var i=0; i<aReturnData.length-1; i++)
{
var aOptData = aReturnData[i].split("|");
// 기존에 존재하는경우 skip
var iExistYn = strExistUser.indexOf(aOptData[0]);
if(iExistYn>-1) continue;
fn_table_appr_tr_add(aOptData[0], aOptData[1]);
}
}
//----------------------------------------
// 결재라인 Row 추가 처리
// ----------------------------------------
function fn_table_appr_tr_add(strId, strName)
{
// 2025.11.18 나혁제 결재순서 표시
var trApprCnt = $('#table_appr >tbody tr').length+1;
var strTrTag = " <tr> "
+" <td > "
+" <label><input type='checkbox' style='display: inline-block;' id='chkAppUser' name='chkAppUser' /> </label> "
+" </td> "
+" <td >"+trApprCnt+"</td> "
+" <td >"+strName+"</td> "
+" <td ></td> "
+" <td ></td> "
+" <input type='hidden' name='approvalUserId' id='approvalUserId' value='"+strId+"' > "
+" <input type='hidden' name='approvalUserNm' id='approvalUserNm' value='"+strName+"' > "
+" </tr> "
;
$("#table_appr tbody").append(strTrTag)
}
//----------------------------------------
// 결재라인 선택한 사용자 삭제
// ----------------------------------------
function fn_User_Delete()
{
$("input:checkbox[name='chkAppUser']:checked").each(function(k,kVal)
{
// 로우 삭제
let chkRow = kVal.parentElement.parentElement.parentElement;
$(chkRow).remove();
});
// 2025.10.20 나혁제 결재순서 재조정
reorderApprSeq();
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 위로 이동처리
// ----------------------------------------
function fnMoveUpTR()
{
var $selected = $("#table_appr tbody tr.selected");
if ($selected.length === 0)
{
alert("이동할 행을 선택하세요.");
return;
}
var $prev = $selected.prev();
if ($prev.length > 0)
{
$selected.insertBefore($prev);
reorderApprSeq();
}
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 아래로 이동처리
// ----------------------------------------
function fnMoveDownTR()
{
var $selected = $("#table_appr tbody tr.selected");
if ($selected.length === 0)
{
alert("이동할 행을 선택하세요.");
return;
}
let $next = $selected.next();
if ($next.length > 0)
{
$selected.insertAfter($next);
reorderApprSeq();
}
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 재설정
// ----------------------------------------
function reorderApprSeq()
{
$("#table_appr tbody tr").each(function(index){
// index는 0부터 시작하므로 1을 더해줌
$(this).find("td:eq(1)").text(index + 1);
});
}
//----------------------------------------
// 팝업 오픈
// ----------------------------------------
function PopupOpen(strUrl, hei, wid, pagetitle)
{
var page = "/common/PageRedirection.do?Page="+ strUrl
+ "&PopupYn=Y";
var $dialog = $('<div></div>')
.html('<iframe style="border: 0px; " src="' + page + '" width="100%" height="100%"></iframe>')
.dialog({
autoOpen: false
, modal: true
, height: hei
, width: wid
, title: pagetitle
, open: function (event, ui)
{
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
$('.ui-dialog-titlebar-close').css({
width: '30px' // 닫기 버튼 너비
// , height: '50px' // 닫기 버튼 높이
});
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
}
, closeText: '닫기'
});
$dialog.dialog('open');
// 팝업 화면 맨앞으로 배치
$(".ui-dialog").css("z-index", "99");
}
//----------------------------------------
// Ajax 서버 통신 모음
// ----------------------------------------
var proc =
{
// 장애보고서 등록
fn_ReportError_save : function ()
{
var form = $('#reportErrorManage')[0];
var formData = new FormData(form);
$.ajax({
url: '/srm/addReportError.do'
, type: 'post'
, enctype:'multipart/form-data'
, data: formData
, dataType: 'json'
, processData:false
, contentType:false
, cache:false
, success: function(data)
{
alert("등록 완료 되었습니다.");
fncReportErrorList();
},
error: function(errorThrown)
{
alert("보고서 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
,
// 서비스 결재라인 정보 추출
fn_get_service_info : function (inData)
{
$.ajax({
url: '/srm/getSvcApprovalListError.do'
, type: 'post'
, data: JSON.stringify(inData)
, dataType: 'json'
, contentType: 'application/json'
, async: false
, success: function(data)
{
console.log(JSON.stringify(data));
$('#table_appr tbody tr').remove();
// 결재라인 세팅
for(var i=0; i<data.resultApprovals.length; i++)
{
fn_table_appr_tr_add(data.resultApprovals[i].inUserSeq, data.resultApprovals[i].vcUserName);
}
},
error: function(errorThrown)
{
alert("서비스 정보 조회중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
,
// 보고양식 추출
fn_get_report_form_info : function (inData)
{
$.ajax({
url: '/srm/getReportFormError.do'
, type: 'post'
, data: JSON.stringify(inData)
, dataType: 'json'
, contentType: 'application/json'
, async: false
, success: function(data)
{
console.log(JSON.stringify(data));
// 본문세팅
// drawEditor(data.strTxDefaultFormDec);
drawEditor("serviceBody", data.strTxDefaultFormDec, false);
// 2025.05.21 나혁제 작업자정보 세팅
$('#vcTaskUser').val(data.strVcTaskUser);
$('#inTaskUser').val(data.strInTaskUser);
},
error: function(errorThrown)
{
alert("보고양식 조회중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
}
</script>
<!-- javascript warning tag -->
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
<form:form modelAttribute="reportErrorManage" name="reportErrorManage" method="post" enctype="multipart/form-data">
<!-- body_wrap :start -->
<div class="body_wrap">
<!-- main title -->
<div class="main_titWrap">
<h3>장애보고서 새로만들기</h3>
<!-- location :s -->
<div class="location">
<div class="location-cont">
<div>
<ul class="route_navi">
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
<li><a href="#" title="유지보수 관리" >유지보수 관리</a></li>
<li>장애보고서 등록</li>
</ul>
</div>
</div>
</div>
<!--//location :e -->
</div>
<!--//main title -->
<!-- Form 테이블 :start -->
<div class="bbs_view">
<!-- 등록폼 -->
<table class="tbl_form" summary="<spring:message code="common.summary.list" arguments="등록" />">
<caption>장애보고서 등록</caption>
<colgroup>
<col style="width: 12%;">
<col style="width: 32%">
<col style="width: 9%">
<col style="width: 19%;">
<col style="width: 9%">
<col style="width: 21%;">
</colgroup>
<tbody>
<tr>
<th> 보고서ID </th>
<td> </td>
<th> 서비스 </th>
<td>
<select name="inServiceCode" id="inServiceCode" onchange="selInServiceCode()" style="width: 90%;" >
<c:forEach items="${resultService}" var="result" varStatus="status">
<option value="${result.value}" <c:if test="${result.value == resultReport.inServiceCode}"> selected </c:if> > ${result.label} </option><!-- 분류코드명 -->
</c:forEach>
</select>
</td>
<th> 작성자 </th>
<td>
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" readonly style="width: 90%;" />
<input type="hidden" name="inRegUser" id="inRegUser" value="${inRegUser}" />
</td>
</tr>
<tr>
<th> 인스던트 접수번호 </th>
<td> </td>
<th> 작업분류 </th>
<td>
<input type="text" name="vcTask" id="vcTask" value="${resultReport.vcTask}" readonly style="width: 90%;" />
<input type="hidden" name="inTask" id="inTask" value="${resultReport.inTask}" >
</td>
<th> 작업자 </th>
<td>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${resultReport.vcTaskUser}" readonly style="width: 90%;" />
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inTaskUser', '', 'vcTaskUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="작업자 검색" title="작업자 검색">
</a>
<input type="hidden" name="inTaskUser" id="inTaskUser" value="${resultReport.inTaskUser}" >
</td>
</tr>
<tr>
<th> 서비스다운 </th>
<td >
<input type="text" class="btn_calendar" name="dtDownstartDatetime" id="dtDownstartDatetime" value="${dtDownstartDatetime}" readonly style="width:47%;"/>
~<input type="text" class="btn_calendar" name="dtDownfinishDatetime" id="dtDownfinishDatetime" value="${dtDownfinishDatetime}" readonly style="width:47%;"/>
</td>
<th> 시작일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtStartDatetime" id="dtStartDatetime" value="${dtStartDatetime}" readonly style="width:90%;"/>
</td>
<th> 종료일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtFinishDatetime" id="dtFinishDatetime" value="${dtFinishDatetime}" readonly style="width:90%;"/>
</td>
</tr>
<tr>
<th rowspan=2 > 보고서양식 </th>
<td rowspan=2 >
<select name="reportForm" id="reportForm" onchange="selReportForm()" style="width: 90%;" >
<c:forEach items="${resultForm}" var="result" varStatus="status">
<option value="${result.inReportForm}" > ${result.vcFormName} </option><!-- 분류코드명 -->
</c:forEach>
</select>
</td>
<th><spring:message code="cop.atchFile" /></th>
<td colspan=3>
<!-- attached file Start -->
<div>
<input type="file" name="file_1" id="egovComFileUploader" onChange="fnImgChange(this)" multiple>
</div>
<div id="egovComFileList"></div>
</div>
<!-- attached file End -->
</td>
</tr>
<tr>
<th>기존첨부파일</th>
<td colspan=3>
<c:import url="/cmm/selectFileInfs.do" charEncoding="utf-8">
<c:param name="param_atchFileId" value="${resultReport.atchFileId}" />
<c:param name="strItmsYn" value="Y" />
</c:import>
</td>
</tr>
<tr>
<th> 제목 </th>
<td colspan=5>
<input type="text" name="vcReportTitle" id="vcReportTitle" value="${resultReport.vcReportTitle}" style="width:90%;"/>
</td>
</tr>
<!-- 2025.11.20 나혁제 결재라인 레이아웃 변경 및 결재순서 추가 -->
<tr>
<th >서비스 결재 라인 </th>
<td colspan=5 style="vertical-align: top;">
<div class="btn_group" >
<button type="button" class="btn-function" onclick="fn_User_Search('조치예정', '', '', '', '', 'Y');return false;" style="margin-top: -30px;"> 조회 </button>
<button type="button" class="btn-function" onclick="fn_User_Delete(); return false;" style="margin-top: -30px;"> 삭제 </button>
</div>
<div style="display: flex;align-items: flex-start;">
<div class="tbl_list">
<!-- 목록영역 -->
<table class="table" summary="" id="table_appr" >
<caption>결재라인 <spring:message code="title.list" /></caption>
<colgroup>
<col style="width: 8%;">
<col style="width: 8%;">
<col style="width: 15%;">
<col style="width: 10%;">
<col style="width: *;">
</colgroup>
<thead>
<tr>
<th></th>
<th>결재순서</th>
<th>결재자</th>
<th>상태</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
<c:forEach var="approvals" items="${resultApprovals}" varStatus="status">
<tr>
<td >
<label><input type="checkbox" style="display: inline-block;" name="chkAppUser" /> </label>
</td>
<td ><c:out value="${approvals.inOrder+1}"/></td>
<td ><c:out value="${approvals.vcUserName}"/></td>
<td ></td>
<td ></td>
<input type='hidden' name="approvalUserId" id="approvalUserId" value="${approvals.inUserSeq}" >
<input type='hidden' name="approvalUserNm" id="approvalUserNm" value="${approvals.vcUserName}" >
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div style="width:3%;text-align:center;padding-left: 5px;align-self: center;">
<a href="#" onclick="fnMoveUpTR(this); return false;" style="font-size: x-large;" >▲</a>
<a href="#" onclick="fnMoveDownTR(this); return false;" style="font-size: x-large;" >▼</a>
</div>
</div>
</td>
</tr>
<tr>
<th> 자산</th>
<td colspan=5>
<div class="btn_group" >
<button type="button" class="btn-function" onclick="fn_Asset_Search();return false;" style="margin-top: -30px;"> 조회 </button>
<button type="button" class="btn-function" onclick="fn_Asset_Delete(); return false;" style="margin-top: -30px;"> 삭제 </button>
</div>
<div class="tbl_list">
<!-- 목록영역 -->
<table class="table" summary="" id="table_asset" >
<caption>연결자산정보 <spring:message code="title.list" /></caption>
<colgroup>
<col style="width: 10%;">
<col style="width: 25%;">
<col style="width: 20%;">
<col style="width: *;">
</colgroup>
<thead>
<tr>
<th></th>
<th>소분류</th>
<th>자산명</th>
<th>비고</th>
</tr>
</thead>
<tbody>
<c:forEach var="assets" items="${resultAssets}" varStatus="status">
<tr>
<td>
<label><input type='checkbox' style='display: inline-block;' name='chkAsset' /> </label>
</td>
<td ><c:out value="${assets.vcCate3}"/></td>
<td ><c:out value="${assets.vcAssetName}"/></td>
<td >
<input type="text" name="txCommentAsset" id="txCommentAsset" value="${assets.txComment}" style="width:80%;"/>
</td>
<input type="hidden" name="inAssetSeq" id="inAssetSeq" value="${assets.inAssetSeq}" >
</tr>
</c:forEach>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
<textarea id="serviceBody" name="serviceBody" ></textarea>
<textarea id="serviceBody2" name="serviceBody2" style="display:none;">${resultReport.txReportBody}</textarea>
</div>
<!-- main btn : start -->
<div class="btn_group">
<!-- 왼쪽영역-->
<div style="text-align: left;position: absolute;">
<!-- 목록 -->
<button type="button" class="btn-function" id="btnList" style="background: blue;" onclick="fncReportErrorList(); return false;" title="<spring:message code="button.list"/>">
<spring:message code="button.list"/>
</button>
</div>
<!--//왼쪽영역-->
<!-- 오른쪽영역-->
<div>
<button type="button" class="btn-etc" onclick="fncReportErrorInsertApp(); return false;" title="등록/승인요청" >
등록/승인요청
</button>
<button type="button" class="btn-etc" onclick="fncReportErrorInsert(); return false;" title="<spring:message code="button.create" />">
<spring:message code="button.create" />
</button>
</div>
<!-- // 오른쪽영역-->
</div>
<!-- main btn : end -->
</div>
<!-- body_wrap :end -->
<!-- 검색조건 유지 -->
<input type="hidden" name="orgnztId" value="" >
<input type="hidden" name="searchCondition" value="<c:out value='${searchVO.searchCondition}'/>" >
<input type="hidden" name="searchKeyword" value="<c:out value='${searchVO.searchKeyword}'/>" >
<input type="hidden" name="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>" >
<input type="hidden" name="multiUserSelectYn" value="" >
<!-- 입력정보 -->
<input type="hidden" id="txReportBody" name="txReportBody" value="" >
<input type="hidden" id="assetSeqs" name="assetSeqs" value="" >
<input type="hidden" id="assetCommnets" name="assetCommnets" value="" >
<input type="hidden" id="approvalsId" name="approvalsId" value="" >
<input type="hidden" id="approvalsName" name="approvalsName" value="" >
<input type="hidden" id="inIncidentSeq" name="inIncidentSeq" value="${inIncidentSeq}" >
<input type="hidden" id="inReportSeq" name="inReportSeq" value="0">
<input type="hidden" id="inReportStatus" name="inReportStatus" value="0">
<input type="hidden" id="inDowntime" name="inDowntime" value="0">
<input type="hidden" id="reqTxComment" name="reqTxComment" value=""/> <!-- 승인요청메세지 -->
<input type="hidden" id="reqApprovalYn" name="reqApprovalYn" value=""/> <!-- 승인요청여부 -->
<input type="hidden" id="oldAtchFileId" name="oldAtchFileId" value="${resultReport.atchFileId}">
</form:form>

View File

@ -84,6 +84,25 @@
varFrom.submit();
}
//----------------------------------------
// 2026.01.22 나혁제
// 새로만들기 기능확장
// ----------------------------------------
function fncReportErrorCopyInsert()
{
if($('#inReportStatus').val()!='2' && $('#inReportStatus').val()!='3' )
{
alert("[승인완료/반려]된 보고서을 이용하야 새로만들기가 가능합니다.");
return;
}
// 수정화면으로 이동처리
var varFrom = document.getElementById("reportErrorManage");
varFrom.action = "<c:url value='/srm/insertCopyViewReportError.do'/>";
varFrom.submit();
}
//----------------------------------------
// 보고서 수정 화면 이동처리
// ----------------------------------------
@ -105,7 +124,7 @@
{
// 2025.11.18 나혁제 승인완료된 자료 수정불가
// if(confirm("승인완료된 보고서입니다. \n수정하면 모든 승인 정보는 초기화 됩니다.\n수정하시겠습니까?") == false) return;
alert("승인완료된 보고입니다.\n 신규 재작성하시길 바랍니다.");
alert("승인완료된 보고입니다.\n 신규 재작성하시길 바랍니다.");
return;
}
@ -642,6 +661,10 @@
</c:if>
<c:if test="${(privType eq 'mine' && report.inReportStatus ne 3) || privType eq 'super'}">
<!-- 2026.01.22 나혁제 새로만들기 기능 추가 -->
<button type="button" class="btn-etc" title="새로만들기" onclick="fncReportErrorCopyInsert(); return false;">
새로만들기
</button>
<button type="button" class="btn-etc" title="수정" onclick="fncReportErrorUpdate(); return false;">
수정
</button>

View File

@ -251,6 +251,13 @@
return false;
}
// 2026.01.23 나혁제 결재라인 체크 추가
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileCheck())
{
@ -279,7 +286,7 @@
if($("#approvalsId").val() == '')
{
alert("승인요청시에는 결재라인이 필요합니다.");
alert("결재라인을 입력해 주세요.");
return;
}
@ -811,7 +818,7 @@
</td>
<th> 작업자 </th>
<td>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${vcRegUser}"/>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${vcRegUser}" readonly/>
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inTaskUser', '', 'vcTaskUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="작업자 검색" title="작업자 검색">

View File

@ -52,23 +52,6 @@
function fncSearchReportErrorList()
{
linkPage(1);
/*
var arStatus = []; // 승인상태
if($("#chk1_1").is(":checked")) arStatus.push("0");
if($("#chk1_2").is(":checked")) arStatus.push("1");
if($("#chk1_3").is(":checked")) arStatus.push("2");
if($("#chk1_4").is(":checked")) arStatus.push("3");
$("#status" ).val(arStatus.join(","));
alert($("#status").val());
document.listForm.pageIndex.value = "1";
document.listForm.action = "<c:url value='/srm/searchReportError.do'/>";
document.listForm.submit();
*/
}
//----------------------------------------
@ -112,9 +95,6 @@
document.listForm.submit();
}
</script>
@ -162,19 +142,19 @@
<tr>
<td colspan=2>
<label>문서번호:</label>
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.reportId}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>요청번호:</label>
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 170px;"
<label>인스던트 접수번호:</label>
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.incidentNum}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>작성자:</label>
<input class="s_input" id="regUser" name="regUser" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="regUser" name="regUser" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.regUser}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>제목:</label>
<input class="s_input" id="reportTitle" name="reportTitle" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="reportTitle" name="reportTitle" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.reportTitle}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
</td>
</tr>
@ -227,7 +207,7 @@
<thead>
<tr>
<th>문서번호</th>
<th>요청번호</th>
<th>인스던트 접수번호</th>
<th>서비스</th>
<th>승인상태</th>
<th>제목</th>

View File

@ -0,0 +1,963 @@
<!DOCTYPE html>
<%
/**
* @Class Name : ReportIssueCopyInsert.jsp
* @Description : 이슈보고서 새로 만들기
* @Modification Information
* @
* @ 수정일 수정자 수정내용
* @ ------- -------- ---------------------------
* @ 2026.01.22 나혁제 최초 생성
*
* @author urp 인프라본부 나혁제
* @since 2026.01.22
* @version 1.0
* @see
*
* Copyright (C) 2009 by MOPAS All right reserved.
*/
%>
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<title> 이슈보고서 수정 </title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<!-- 2025.11.19 나혁제 선택된 Row 처리 -->
<style>
.selected {background-color:#e8eff7;}
</style>
<script type="text/javascript" src="<c:url value="/validator.do"/>"></script>
<script type="text/javascript" src="<c:url value='/egov/js/showModalDialog.js'/>" ></script>
<!-- tinyMCE Editor -->
<script charset="utf-8" type="text/javascript" src="${pageContext.request.contextPath}/lib/oss/tinymce/tinymce.min.js?ver=1" ></script>
<!-- tinymce setting 2025.05.12 나혁제 tinymce_uritms_setting.js 이관 -->
<script charset="utf-8" type="text/javascript" src="<c:url value='/js/tinymce_uritms_setting.js?ver=1'/>" ></script>
<!-- validation 처리 -->
<validator:javascript formName="reportIssueManage" staticJavascript="false" xhtml="true" cdata="false"/>
<!-- 파일처리 -->
<script type="text/javascript" src="<c:url value='/egov/js/EgovMultiFiles.js'/>" ></script>
<!-- 시간처리 -->
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui-timepicker-addon.js"></script>
<link rel="stylesheet" type="text/css" href="${ctx}/css/jquery-ui-timepicker-addon.css">
<script type="text/javaScript" language="javascript">
//----------------------------------------
// 화면 초기화
// ----------------------------------------
$(document).ready(function()
{
// 결재라인 높이 조정
// $("#table_appr tbody td").css("height", "10px");
// 시작일시, 종료일시, 서비스다운시작일시, 서비스다운종료일시 시간까지 세팅
$("#dtDownstartDatetime, #dtDownfinishDatetime, #dtStartDatetime, #dtFinishDatetime").datetimepicker({
dateFormat:'yy-mm-dd',
monthNamesShort:[ '1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월' ],
dayNamesMin:[ '일', '월', '화', '수', '목', '금', '토' ],
changeMonth:true,
changeYear:true,
showMonthAfterYear:true,
// timepicker 설정
timeFormat:'HH:mm',
controlType:'select',
oneLine:true,
});
// 멀티파일 설정
var maxFileNum = 3;
var multi_selector = new MultiSelector( document.getElementById( 'egovComFileList' ), maxFileNum );
multi_selector.addElement( document.getElementById( 'egovComFileUploader' ) );
// drawEditor("");
drawEditor("serviceBody", "", false);
// 2025.11.18 나혁제 결재라인 클릭 자료 표시
$(document).on("click", "#table_appr tbody td", function(){
$("#table_appr tbody tr").removeClass('selected');
$(this).parent().addClass('selected');
});
});
//----------------------------------------
// 화면 초기화(Form 완전 로딩후 )
// ----------------------------------------
$(window).on("load", function()
{
var strForm = document.getElementById("serviceBody2").value;
// drawEditor(strForm);
drawEditor("serviceBody", strForm, false);
});
//----------------------------------------
// 목록 화면으로 이동처리
// ----------------------------------------
function fncReportIssueList()
{
var varFrom = document.getElementById("reportIssueManage");
varFrom.action = "<c:url value='/srm/searchReportIssue.do'/>";
varFrom.submit();
}
//----------------------------------------
// 자산 조회 팝업
// ----------------------------------------
function fn_Asset_Search()
{
var strUrl = "/rem/SelectResourcePopup.do";
var arrParam = new Array(6);
arrParam[0] = window;
window.showModalDialog("<c:url value='"+strUrl+"' />"
, arrParam
,"dialogWidth:950px;dialogHeight:850px;resizable:yes;center:yes");
}
//----------------------------------------
// 팝업창에서 결재자 선택 확인시
// ----------------------------------------
function fn_Asset_Multi_Selected(strReturnData)
{
var aReturnData = strReturnData.split(","); // split에 '-'를 넣었습니다.
console.log(aReturnData);
var inAssetSeq = $("input[name='inAssetSeq']").map(function () {
return $(this).val();
}).get();
console.log(inAssetSeq);
for(var i=0; i<aReturnData.length-1; i++)
{
var aOptData = aReturnData[i].split("|");
// 기존에 존재하는경우 skip
var iExistYn = inAssetSeq.indexOf(aOptData[0]);
if(iExistYn>-1) continue;
fn_table_asset_tr_add(aOptData[0], aOptData[1], aOptData[2]);
}
}
//----------------------------------------
// 자산정보 Row 추가 처리
// ----------------------------------------
function fn_table_asset_tr_add(inAssetSeq, vcAssetName, vcCate3)
{
var strTrTag = " <tr> "
+ " <td > "
+ " <label><input type='checkbox' style='display: inline-block;' name='chkAsset' /> </label> "
+ " </td> "
+ " <td >"+vcCate3+"</td> "
+ " <td >"+vcAssetName+"</td> "
+ " <td > "
+ " <input type='text' name='txCommentAsset' id='txCommentAsset' value='' style='width:80%;'/> "
+ " </td> "
+ " <input type='hidden' name='inAssetSeq' id='inAssetSeq' value='"+inAssetSeq+"' > "
+ " </tr> "
$("#table_asset tbody").append(strTrTag)
}
//----------------------------------------
// 자산정보 선택한 자산 삭제
// ----------------------------------------
function fn_Asset_Delete()
{
$("input:checkbox[name='chkAsset']:checked").each(function(k,kVal)
{
// 로우 삭제
let chkRow = kVal.parentElement.parentElement.parentElement;
$(chkRow).remove();
});
}
//----------------------------------------
// 서비스 정보 변경시
// ----------------------------------------
function selInServiceCode()
{
var inServiceCode = $('#inServiceCode option:selected').val() ;
var inData = {};
inData = {"inServiceCode":inServiceCode};
proc.fn_get_service_info(inData);
}
//----------------------------------------
// 보고양식 변경시
// ----------------------------------------
function selReportForm()
{
var inSeq = $('#reportForm option:selected').val() ;
var inData = {};
inData = {"seq":inSeq};
proc.fn_get_report_form_info(inData);
}
//----------------------------------------
// 아슈보고서 등록처리
// ----------------------------------------
function fncReportIssueInsert()
{
var bYes = confirm("아슈보고서 등록 처리를 하시겠습니까?");
if(bYes==false) return;
fncReportSaveSetting();
//input item Client-Side validate
if (!validateReportIssueManage(document.reportIssueManage))
{
return false;
}
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileIssue())
{
return false;
}
proc.fn_ReportIssue_save();
}
//----------------------------------------
// 아슈보고서 등록/승인요청
// ----------------------------------------
function fncReportIssueInsertApp()
{
var bYes = confirm("아슈보고서 등록/승인요청 처리를 하시겠습니까?");
if(bYes==false) return;
fncReportSaveSetting();
//input item Client-Side validate
if (!validateReportIssueManage(document.reportIssueManage))
{
return false;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileIssue())
{
return false;
}
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 승인요청 메세지 팝업 open
PopupOpen("/srm/PopReqApproval", 340, 450, '');
}
//----------------------------------------
// 보고서 변경/승인처리 처리(최종 저장 처리 )
// ----------------------------------------
function fncAppLast(strMsg)
{
$('#reqTxComment' ).val(strMsg) ;
$('#reqApprovalYn' ).val("Y" ) ;
proc.fn_ReportIssue_save();
}
//----------------------------------------
// 2025.12.02 나혁제 파일체크 로직 추가
// 첨부파일 체크
// ----------------------------------------
function fncAttachFileIssue()
{
// 결과가 false인경우 허용되지 않음
var resultExtension = EgovMultiFilesChecker.checkExtensions("egovComFileUploader", "<c:out value='${fileUploadExtensions}'/>");
if (!resultExtension)
{
return false;
}
// 파일당 1M까지 허용 (1K=1024), 결과가 false인경우 허용되지 않음
var resultSize = EgovMultiFilesChecker.checkFileSize("egovComFileUploader", <c:out value='${fileUploadMaxSize}'/>);
if (!resultSize)
{
return false;
}
return true;
}
//----------------------------------------
// 저장전 기본 세팅
// ----------------------------------------
function fncReportSaveSetting()
{
var form = document.reportIssueManage;
// 결재라인
var strExistUser = $("input[name='approvalUserId']").map(function () { return $(this).val();}).get();
var strExistUserText = $("input[name='approvalUserNm']").map(function () { return $(this).val();}).get();
strExistUser.join(',');
strExistUserText.join(',');
form.approvalsId .value = strExistUser;
form.approvalsName.value = strExistUserText;
// 보고서 자산 구조
var strAssetSeq = $("input[name='inAssetSeq']").map(function () { return $(this).val();}).get();
var strCommentAsset = $("input[name='txCommentAsset']").map(function () { return $(this).val();}).get();
strAssetSeq.join(',');
strCommentAsset.join(',');
form.assetSeqs .value = strAssetSeq;
form.assetCommnets.value = strCommentAsset;
form.txReportBody.value = tinyMCE.get("serviceBody").getContent(); // 평문
}
//----------------------------------------
// 사용자 검색 팝업
// ----------------------------------------
function fn_User_Search( strTitle
, frmUniqId
, frmEmplNo
, frmEmplyrNm
, frmOrgnztNm
, multiUserSelectYn
)
{
var arrParam = new Array(6);
arrParam[0] = window;
arrParam[1] = strTitle;
arrParam[2] = frmUniqId;
arrParam[3] = frmEmplNo;
arrParam[4] = frmEmplyrNm;
arrParam[5] = frmOrgnztNm;
var strUrl = "/cmm/selectUserListPopup.do?multiUserSelectYn="+multiUserSelectYn;
window.showModalDialog("<c:url value='"+strUrl+"' />"
, arrParam
,"dialogWidth:900px;dialogHeight:750px;resizable:yes;center:yes");
}
//----------------------------------------
// 팝업창에서 결재자 선택 확인시
// ----------------------------------------
function fn_User_Multi_Selected(strReturnData)
{
var aReturnData = strReturnData.split(","); // split에 '-'를 넣었습니다.
console.log(aReturnData);
var strExistUser = $("input[name='approvalUserId']").map(function () {
return $(this).val();
}).get();
console.log(strExistUser);
for(var i=0; i<aReturnData.length-1; i++)
{
var aOptData = aReturnData[i].split("|");
// 기존에 존재하는경우 skip
var iExistYn = strExistUser.indexOf(aOptData[0]);
if(iExistYn>-1) continue;
fn_table_appr_tr_add(aOptData[0], aOptData[1]);
}
}
//----------------------------------------
// 결재라인 Row 추가 처리
// ----------------------------------------
function fn_table_appr_tr_add(strId, strName)
{
// 2025.11.18 나혁제 결재순서 표시
var trApprCnt = $('#table_appr >tbody tr').length+1;
var strTrTag = " <tr> "
+" <td > "
+" <label><input type='checkbox' style='display: inline-block;' id='chkAppUser' name='chkAppUser' /> </label> "
+" </td> "
+" <td >"+trApprCnt+"</td> "
+" <td >"+strName+"</td> "
+" <td ></td> "
+" <td ></td> "
+" <input type='hidden' name='approvalUserId' id='approvalUserId' value='"+strId+"' > "
+" <input type='hidden' name='approvalUserNm' id='approvalUserNm' value='"+strName+"' > "
+" </tr> "
;
$("#table_appr tbody").append(strTrTag)
}
//----------------------------------------
// 결재라인 선택한 사용자 삭제
// ----------------------------------------
function fn_User_Delete()
{
$("input:checkbox[name='chkAppUser']:checked").each(function(k,kVal)
{
// 로우 삭제
let chkRow = kVal.parentElement.parentElement.parentElement;
$(chkRow).remove();
});
// 2025.10.20 나혁제 결재순서 재조정
reorderApprSeq();
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 위로 이동처리
// ----------------------------------------
function fnMoveUpTR()
{
var $selected = $("#table_appr tbody tr.selected");
if ($selected.length === 0)
{
alert("이동할 행을 선택하세요.");
return;
}
var $prev = $selected.prev();
if ($prev.length > 0)
{
$selected.insertBefore($prev);
reorderApprSeq();
}
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 아래로 이동처리
// ----------------------------------------
function fnMoveDownTR()
{
var $selected = $("#table_appr tbody tr.selected");
if ($selected.length === 0)
{
alert("이동할 행을 선택하세요.");
return;
}
let $next = $selected.next();
if ($next.length > 0)
{
$selected.insertAfter($next);
reorderApprSeq();
}
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 재설정
// ----------------------------------------
function reorderApprSeq()
{
$("#table_appr tbody tr").each(function(index){
// index는 0부터 시작하므로 1을 더해줌
$(this).find("td:eq(1)").text(index + 1);
});
}
//----------------------------------------
// 팝업 오픈
// ----------------------------------------
function PopupOpen(strUrl, hei, wid, pagetitle)
{
var page = "/common/PageRedirection.do?Page="+ strUrl
+ "&PopupYn=Y";
var $dialog = $('<div></div>')
.html('<iframe style="border: 0px; " src="' + page + '" width="100%" height="100%"></iframe>')
.dialog({
autoOpen: false
, modal: true
, height: hei
, width: wid
, title: pagetitle
, open: function (event, ui)
{
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
$('.ui-dialog-titlebar-close').css({
width: '30px' // 닫기 버튼 너비
// , height: '50px' // 닫기 버튼 높이
});
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
}
, closeText: '닫기'
});
$dialog.dialog('open');
// 팝업 화면 맨앞으로 배치
$(".ui-dialog").css("z-index", "99");
}
//----------------------------------------
// Ajax 서버 통신 모음
// ----------------------------------------
var proc =
{
// 아슈보고서 등록
fn_ReportIssue_save : function ()
{
var form = $('#reportIssueManage')[0];
var formData = new FormData(form);
$.ajax({
url: '/srm/addReportIssue.do'
, type: 'post'
, enctype:'multipart/form-data'
, data: formData
, dataType: 'json'
, processData:false
, contentType:false
, cache:false
, success: function(data)
{
alert("등록 완료 되었습니다.");
fncReportIssueList();
},
error: function(errorThrown)
{
alert("보고서 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
,
// 서비스 결재라인 정보 추출
fn_get_service_info : function (inData)
{
$.ajax({
url: '/srm/getSvcApprovalListIssue.do'
, type: 'post'
, data: JSON.stringify(inData)
, dataType: 'json'
, contentType: 'application/json'
, async: false
, success: function(data)
{
console.log(JSON.stringify(data));
$('#table_appr tbody tr').remove();
// 결재라인 세팅
for(var i=0; i<data.resultApprovals.length; i++)
{
fn_table_appr_tr_add(data.resultApprovals[i].inUserSeq, data.resultApprovals[i].vcUserName);
}
},
error: function(errorThrown)
{
alert("서비스 정보 조회중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
,
// 보고양식 추출
fn_get_report_form_info : function (inData)
{
$.ajax({
url: '/srm/getReportFormIssue.do'
, type: 'post'
, data: JSON.stringify(inData)
, dataType: 'json'
, contentType: 'application/json'
, async: false
, success: function(data)
{
console.log(JSON.stringify(data));
// 본문세팅
// drawEditor(data.strTxDefaultFormDec);
drawEditor("serviceBody", data.strTxDefaultFormDec, false);
// 2025.05.21 나혁제 작업자정보 세팅
$('#vcTaskUser').val(data.strVcTaskUser);
$('#inTaskUser').val(data.strInTaskUser);
},
error: function(errorThrown)
{
alert("보고양식 조회중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
}
</script>
<!-- javascript warning tag -->
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
<form:form modelAttribute="reportIssueManage" name="reportIssueManage" method="post" enctype="multipart/form-data">
<!-- body_wrap :start -->
<div class="body_wrap">
<!-- main title -->
<div class="main_titWrap">
<h3>이슈보고서 새로만들기</h3>
<!-- location :s -->
<div class="location">
<div class="location-cont">
<div>
<ul class="route_navi">
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
<li><a href="#" title="유지보수 관리" >유지보수 관리</a></li>
<li>아슈보고서 등록</li>
</ul>
</div>
</div>
</div>
<!--//location :e -->
</div>
<!--//main title -->
<!-- Form 테이블 :start -->
<div class="bbs_view">
<!-- 등록폼 -->
<table class="tbl_form" summary="<spring:message code="common.summary.list" arguments="등록" />">
<caption>아슈보고서 등록</caption>
<colgroup>
<col style="width: 12%;">
<col style="width: 32%">
<col style="width: 9%">
<col style="width: 19%;">
<col style="width: 9%">
<col style="width: 21%;">
</colgroup>
<tbody>
<tr>
<th> 보고서ID </th>
<td> </td>
<th> 서비스 </th>
<td>
<select name="inServiceCode" id="inServiceCode" onchange="selInServiceCode()" style="width: 90%;" >
<c:forEach items="${resultService}" var="result" varStatus="status">
<option value="${result.value}" <c:if test="${result.value == resultReport.inServiceCode}"> selected </c:if> > ${result.label} </option><!-- 분류코드명 -->
</c:forEach>
</select>
</td>
<th> 작성자 </th>
<td>
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" readonly style="width: 90%;" />
<input type="hidden" name="inRegUser" id="inRegUser" value="${inRegUser}" />
</td>
</tr>
<tr>
<th> 인스던트 접수번호 </th>
<td> </td>
<th> 작업분류 </th>
<td>
<input type="text" name="vcTask" id="vcTask" value="${resultReport.vcTask}" readonly style="width: 90%;" />
<input type="hidden" name="inTask" id="inTask" value="${resultReport.inTask}" >
</td>
<th> 작업자 </th>
<td>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${resultReport.vcTaskUser}" style="width: 90%;" readonly />
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inTaskUser', '', 'vcTaskUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="작업자 검색" title="작업자 검색">
</a>
<input type="hidden" name="inTaskUser" id="inTaskUser" value="${resultReport.inTaskUser}" >
</td>
</tr>
<tr>
<th> 서비스다운 </th>
<td >
<input type="text" class="btn_calendar" name="dtDownstartDatetime" id="dtDownstartDatetime" value="${dtDownstartDatetime}" readonly style="width:47%;"/>
~<input type="text" class="btn_calendar" name="dtDownfinishDatetime" id="dtDownfinishDatetime" value="${dtDownfinishDatetime}" readonly style="width:47%;"/>
</td>
<th> 시작일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtStartDatetime" id="dtStartDatetime" value="${dtStartDatetime}" readonly style="width:90%;"/>
</td>
<th> 종료일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtFinishDatetime" id="dtFinishDatetime" value="${dtFinishDatetime}" readonly style="width:90%;"/>
</td>
</tr>
<tr>
<th rowspan=2 > 보고서양식 </th>
<td rowspan=2 >
<select name="reportForm" id="reportForm" onchange="selReportForm()" style="width: 90%;" >
<c:forEach items="${resultForm}" var="result" varStatus="status">
<option value="${result.inReportForm}" > ${result.vcFormName} </option><!-- 분류코드명 -->
</c:forEach>
</select>
</td>
<th><spring:message code="cop.atchFile" /></th>
<td colspan=3>
<!-- attached file Start -->
<div>
<input type="file" name="file_1" id="egovComFileUploader" onChange="fnImgChange(this)" multiple>
</div>
<div id="egovComFileList"></div>
</div>
<!-- attached file End -->
</td>
</tr>
<tr>
<th>기존첨부파일</th>
<td colspan=3>
<c:import url="/cmm/selectFileInfs.do" charEncoding="utf-8">
<c:param name="param_atchFileId" value="${resultReport.atchFileId}" />
<c:param name="strItmsYn" value="Y" />
</c:import>
</td>
</tr>
<tr>
<th> 제목 </th>
<td colspan=5>
<input type="text" name="vcReportTitle" id="vcReportTitle" value="${resultReport.vcReportTitle}" style="width:90%;"/>
</td>
</tr>
<!-- 2025.11.20 나혁제 결재라인 레이아웃 변경 및 결재순서 추가 -->
<tr>
<th >서비스 결재 라인 </th>
<td colspan=5 style="vertical-align: top;">
<div class="btn_group" >
<button type="button" class="btn-function" onclick="fn_User_Search('조치예정', '', '', '', '', 'Y');return false;" style="margin-top: -30px;"> 조회 </button>
<button type="button" class="btn-function" onclick="fn_User_Delete(); return false;" style="margin-top: -30px;"> 삭제 </button>
</div>
<div style="display: flex;align-items: flex-start;">
<div class="tbl_list">
<!-- 목록영역 -->
<table class="table" summary="" id="table_appr" >
<caption>결재라인 <spring:message code="title.list" /></caption>
<colgroup>
<col style="width: 8%;">
<col style="width: 8%;">
<col style="width: 15%;">
<col style="width: 10%;">
<col style="width: *;">
</colgroup>
<thead>
<tr>
<th></th>
<th>결재순서</th>
<th>결재자</th>
<th>상태</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
<c:forEach var="approvals" items="${resultApprovals}" varStatus="status">
<tr>
<td >
<label><input type="checkbox" style="display: inline-block;" name="chkAppUser" /> </label>
</td>
<td ><c:out value="${approvals.inOrder+1}"/></td>
<td ><c:out value="${approvals.vcUserName}"/></td>
<td ></td>
<td ></td>
<input type='hidden' name="approvalUserId" id="approvalUserId" value="${approvals.inUserSeq}" >
<input type='hidden' name="approvalUserNm" id="approvalUserNm" value="${approvals.vcUserName}" >
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div style="width:3%;text-align:center;padding-left: 5px;align-self: center;">
<a href="#" onclick="fnMoveUpTR(this); return false;" style="font-size: x-large;" >▲</a>
<a href="#" onclick="fnMoveDownTR(this); return false;" style="font-size: x-large;" >▼</a>
</div>
</div>
</td>
</tr>
<tr>
<th> 자산</th>
<td colspan=5>
<div class="btn_group" >
<button type="button" class="btn-function" onclick="fn_Asset_Search();return false;" style="margin-top: -30px;"> 조회 </button>
<button type="button" class="btn-function" onclick="fn_Asset_Delete(); return false;" style="margin-top: -30px;"> 삭제 </button>
</div>
<div class="tbl_list">
<!-- 목록영역 -->
<table class="table" summary="" id="table_asset" >
<caption>연결자산정보 <spring:message code="title.list" /></caption>
<colgroup>
<col style="width: 10%;">
<col style="width: 25%;">
<col style="width: 20%;">
<col style="width: *;">
</colgroup>
<thead>
<tr>
<th></th>
<th>소분류</th>
<th>자산명</th>
<th>비고</th>
</tr>
</thead>
<tbody>
<c:forEach var="assets" items="${resultAssets}" varStatus="status">
<tr>
<td>
<label><input type='checkbox' style='display: inline-block;' name='chkAsset' /> </label>
</td>
<td ><c:out value="${assets.vcCate3}"/></td>
<td ><c:out value="${assets.vcAssetName}"/></td>
<td >
<input type="text" name="txCommentAsset" id="txCommentAsset" value="${assets.txComment}" style="width:90%;"/>
</td>
<input type="hidden" name="inAssetSeq" id="inAssetSeq" value="${assets.inAssetSeq}" >
</tr>
</c:forEach>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
<textarea id="serviceBody" name="serviceBody" ></textarea>
<textarea id="serviceBody2" name="serviceBody2" style="display:none;">${resultReport.txReportBody}</textarea>
</div>
<!-- main btn : start -->
<div class="btn_group">
<!-- 왼쪽영역-->
<div style="text-align: left;position: absolute;">
<!-- 목록 -->
<button type="button" class="btn-function" id="btnList" style="background: blue;" onclick="fncReportIssueList(); return false;" title="<spring:message code="button.list"/>">
<spring:message code="button.list"/>
</button>
</div>
<!--//왼쪽영역-->
<!-- 오른쪽영역-->
<div>
<button type="button" class="btn-etc" onclick="fncReportIssueInsertApp(); return false;" title="등록/승인요청" >
등록/승인요청
</button>
<button type="button" class="btn-etc" onclick="fncReportIssueInsert(); return false;" title="<spring:message code="button.create" />">
<spring:message code="button.create" />
</button>
</div>
<!-- // 오른쪽영역-->
</div>
<!-- main btn : end -->
</div>
<!-- body_wrap :end -->
<!-- 검색조건 유지 -->
<input type="hidden" name="orgnztId" value="" >
<input type="hidden" name="searchCondition" value="<c:out value='${searchVO.searchCondition}'/>" >
<input type="hidden" name="searchKeyword" value="<c:out value='${searchVO.searchKeyword}'/>" >
<input type="hidden" name="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>" >
<input type="hidden" name="multiUserSelectYn" value="" >
<!-- 입력정보 -->
<input type="hidden" id="txReportBody" name="txReportBody" value="" >
<input type="hidden" id="assetSeqs" name="assetSeqs" value="" >
<input type="hidden" id="assetCommnets" name="assetCommnets" value="" >
<input type="hidden" id="approvalsId" name="approvalsId" value="" >
<input type="hidden" id="approvalsName" name="approvalsName" value="" >
<input type="hidden" id="inIncidentSeq" name="inIncidentSeq" value="${inIncidentSeq}" >
<input type="hidden" id="inReportSeq" name="inReportSeq" value="0">
<input type="hidden" id="inReportStatus" name="inReportStatus" value="0">
<input type="hidden" id="inDowntime" name="inDowntime" value="0">
<input type="hidden" id="reqTxComment" name="reqTxComment" value=""/> <!-- 승인요청메세지 -->
<input type="hidden" id="reqApprovalYn" name="reqApprovalYn" value=""/> <!-- 승인요청여부 -->
<input type="hidden" id="oldAtchFileId" name="oldAtchFileId" value="${resultReport.atchFileId}">
</form:form>

View File

@ -84,6 +84,25 @@
varFrom.submit();
}
//----------------------------------------
// 2026.01.22 나혁제
// 새로만들기 기능확장
// ----------------------------------------
function fncReportIssueCopyInsert()
{
if($('#inReportStatus').val()!='2' && $('#inReportStatus').val()!='3' )
{
alert("[승인완료/반려]된 보고서을 이용하야 새로만들기가 가능합니다.");
return;
}
// 수정화면으로 이동처리
var varFrom = document.getElementById("reportIssueManage");
varFrom.action = "<c:url value='/srm/insertCopyViewReportIssue.do'/>";
varFrom.submit();
}
//----------------------------------------
// 보고서 수정 화면 이동처리
// ----------------------------------------
@ -105,7 +124,7 @@
{
// 2025.11.20 나혁제 승인완료된 자료 수정불가
// if(confirm("승인완료된 보고서입니다. \n수정하면 모든 승인 정보는 초기화 됩니다.\n수정하시겠습니까?") == false) return;
alert("승인완료된 보고입니다.\n 신규 재작성하시길 바랍니다.");
alert("승인완료된 보고입니다.\n 신규 재작성하시길 바랍니다.");
return;
}
@ -124,6 +143,25 @@
varFrom.submit();
}
//----------------------------------------
// 2026.01.22 나혁제
// 새로만들기 기능확장
// ----------------------------------------
function fncReportIssueCopyInsert()
{
if($('#inReportStatus').val()!='2' && $('#inReportStatus').val()!='3' )
{
alert("[승인완료/반려]된 보고서을 이용하야 새로만들기가 가능합니다.");
return;
}
// 수정화면으로 이동처리
var varFrom = document.getElementById("reportIssueManage");
varFrom.action = "<c:url value='/srm/insertCopyViewReportIssue.do'/>";
varFrom.submit();
}
//----------------------------------------
// 보고서 삭제처리
// ----------------------------------------
@ -629,12 +667,20 @@
</c:if>
<c:if test="${(privType eq 'mine' || privType eq 'super') && resultReport.inReportStatus eq 0 && !empty resultApprovals}">
<!-- 2026.01.22 나혁제 새로만들기 기능 추가 -->
<button type="button" class="btn-etc" title="새로만들기" onclick="fncReportIssueCopyInsert(); return false;">
새로만들기
</button>
<button type="button" class="btn-etc" title="승인요청" onclick="fncReportIssueReqApp(); return false;">
승인요청
</button>
</c:if>
<c:if test="${(privType eq 'mine' && report.inReportStatus ne 3) || privType eq 'super'}">
<!-- 2026.01.22 나혁제 새로만들기 기능 추가 -->
<button type="button" class="btn-etc" title="새로만들기" onclick="fncReportIssueCopyInsert(); return false;">
새로만들기
</button>
<button type="button" class="btn-etc" title="수정" onclick="fncReportIssueUpdate(); return false;">
수정
</button>

View File

@ -251,6 +251,13 @@
return false;
}
// 2026.01.23 나혁제 결재라인 체크 추가
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileCheck())
{
@ -279,7 +286,7 @@
if($("#approvalsId").val() == '')
{
alert("승인요청시에는 결재라인이 필요합니다.");
alert("결재라인을 입력해 주세요.");
return;
}
@ -797,7 +804,7 @@
</td>
<th> 작성자 </th>
<td>
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" readonly />
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" style="width: 90%;" readonly />
<input type="hidden" name="inRegUser" id="inRegUser" value="${inRegUser}" />
</td>
@ -807,13 +814,13 @@
<td>${resultIncident.vcIncidentNum} </td>
<th> 작업분류 </th>
<td>
<input type="text" name="vcTask" id="vcTask" value="${resultTaskMap.label}" readonly />
<input type="text" name="vcTask" id="vcTask" value="${resultTaskMap.label}" style="width: 90%;" readonly />
<input type="hidden" name="inTask" id="inTask" value="${resultTaskMap.value}" >
</td>
<th> 작업자 </th>
<td>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${vcRegUser}"/>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${vcRegUser}" style="width: 90%;" readonly />
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inTaskUser', '', 'vcTaskUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="작업자 검색" title="작업자 검색">

View File

@ -52,21 +52,6 @@
function fncSearchReportIssueList()
{
linkPage(1);
/*
var arStatus = []; // 승인상태
if($("#chk1_1").is(":checked")) arStatus.push("0");
if($("#chk1_2").is(":checked")) arStatus.push("1");
if($("#chk1_3").is(":checked")) arStatus.push("2");
if($("#chk1_4").is(":checked")) arStatus.push("3");
$("#status" ).val(arStatus.join(","));
document.listForm.pageIndex.value = "1";
document.listForm.action = "<c:url value='/srm/searchReportIssue.do'/>";
document.listForm.submit();
*/
}
//----------------------------------------
@ -158,19 +143,19 @@
<tr>
<td colspan=2>
<label>문서번호:</label>
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.reportId}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>요청번호:</label>
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 170px;"
<label>인스던트 접수번호:</label>
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.incidentNum}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>작성자:</label>
<input class="s_input" id="regUser" name="regUser" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="regUser" name="regUser" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.regUser}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>제목:</label>
<input class="s_input" id="reportTitle" name="reportTitle" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="reportTitle" name="reportTitle" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.reportTitle}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
</td>
</tr>
@ -223,7 +208,7 @@
<thead>
<tr>
<th>문서번호</th>
<th>요청번호</th>
<th>인스던트 접수번호</th>
<th>서비스</th>
<th>승인상태</th>
<th>제목</th>

View File

@ -786,7 +786,7 @@
</td>
<th> 작성자 </th>
<td>
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" readonly />
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" readonly style="width: 90%;" />
<input type="hidden" name="inRegUser" id="inRegUser" value="${inRegUser}" />
</td>
@ -802,7 +802,7 @@
</td>
<th> 작업자 </th>
<td>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${resultReport.vcTaskUser}"/>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${resultReport.vcTaskUser}" style="width: 90%;" readonly />
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inTaskUser', '', 'vcTaskUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="작업자 검색" title="작업자 검색">

View File

@ -0,0 +1,965 @@
<!DOCTYPE html>
<%
/**
* @Class Name : ReportOtherCopyInsert.jsp
* @Description : 기타보고서 새로 만들기
* @Modification Information
* @
* @ 수정일 수정자 수정내용
* @ ------- -------- ---------------------------
* @ 2026.01.22 나혁제 최초 생성
*
* @author urp 인프라본부 나혁제
* @since 2026.01.22
* @version 1.0
* @see
*
* Copyright (C) 2009 by MOPAS All right reserved.
*/
%>
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<title> 기타보고서 수정 </title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<!-- 2025.11.19 나혁제 선택된 Row 처리 -->
<style>
.selected {background-color:#e8eff7;}
</style>
<script type="text/javascript" src="<c:url value="/validator.do"/>"></script>
<script type="text/javascript" src="<c:url value='/egov/js/showModalDialog.js'/>" ></script>
<!-- tinyMCE Editor -->
<script charset="utf-8" type="text/javascript" src="${pageContext.request.contextPath}/lib/oss/tinymce/tinymce.min.js?ver=1" ></script>
<!-- tinymce setting 2025.05.12 나혁제 tinymce_uritms_setting.js 이관 -->
<script charset="utf-8" type="text/javascript" src="<c:url value='/js/tinymce_uritms_setting.js?ver=1'/>" ></script>
<!-- validation 처리 -->
<validator:javascript formName="reportOtherManage" staticJavascript="false" xhtml="true" cdata="false"/>
<!-- 파일처리 -->
<script type="text/javascript" src="<c:url value='/egov/js/EgovMultiFiles.js'/>" ></script>
<!-- 시간처리 -->
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui-timepicker-addon.js"></script>
<link rel="stylesheet" type="text/css" href="${ctx}/css/jquery-ui-timepicker-addon.css">
<script type="text/javaScript" language="javascript">
//----------------------------------------
// 화면 초기화
// ----------------------------------------
$(document).ready(function()
{
// 결재라인 높이 조정
// $("#table_appr tbody td").css("height", "10px");
// 시작일시, 종료일시, 서비스다운시작일시, 서비스다운종료일시 시간까지 세팅
$("#dtDownstartDatetime, #dtDownfinishDatetime, #dtStartDatetime, #dtFinishDatetime").datetimepicker({
dateFormat:'yy-mm-dd',
monthNamesShort:[ '1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월' ],
dayNamesMin:[ '일', '월', '화', '수', '목', '금', '토' ],
changeMonth:true,
changeYear:true,
showMonthAfterYear:true,
// timepicker 설정
timeFormat:'HH:mm',
controlType:'select',
oneLine:true,
});
// 멀티파일 설정
var maxFileNum = 3;
var multi_selector = new MultiSelector( document.getElementById( 'egovComFileList' ), maxFileNum );
multi_selector.addElement( document.getElementById( 'egovComFileUploader' ) );
// drawEditor("");
drawEditor("serviceBody", "", false);
// 2025.11.18 나혁제 결재라인 클릭 자료 표시
$(document).on("click", "#table_appr tbody td", function(){
$("#table_appr tbody tr").removeClass('selected');
$(this).parent().addClass('selected');
});
});
//----------------------------------------
// 화면 초기화(Form 완전 로딩후 )
// ----------------------------------------
$(window).on("load", function()
{
var strForm = document.getElementById("serviceBody2").value;
// drawEditor(strForm);
drawEditor("serviceBody", strForm, false);
});
//----------------------------------------
// 목록 화면으로 이동처리
// ----------------------------------------
function fncReportOtherList()
{
var varFrom = document.getElementById("reportOtherManage");
varFrom.action = "<c:url value='/srm/searchReportOther.do'/>";
varFrom.submit();
}
//----------------------------------------
// 자산 조회 팝업
// ----------------------------------------
function fn_Asset_Search()
{
var strUrl = "/rem/SelectResourcePopup.do";
var arrParam = new Array(6);
arrParam[0] = window;
window.showModalDialog("<c:url value='"+strUrl+"' />"
, arrParam
,"dialogWidth:950px;dialogHeight:850px;resizable:yes;center:yes");
}
//----------------------------------------
// 팝업창에서 결재자 선택 확인시
// ----------------------------------------
function fn_Asset_Multi_Selected(strReturnData)
{
var aReturnData = strReturnData.split(","); // split에 '-'를 넣었습니다.
console.log(aReturnData);
var inAssetSeq = $("input[name='inAssetSeq']").map(function () {
return $(this).val();
}).get();
console.log(inAssetSeq);
for(var i=0; i<aReturnData.length-1; i++)
{
var aOptData = aReturnData[i].split("|");
// 기존에 존재하는경우 skip
var iExistYn = inAssetSeq.indexOf(aOptData[0]);
if(iExistYn>-1) continue;
fn_table_asset_tr_add(aOptData[0], aOptData[1], aOptData[2]);
}
}
//----------------------------------------
// 자산정보 Row 추가 처리
// ----------------------------------------
function fn_table_asset_tr_add(inAssetSeq, vcAssetName, vcCate3)
{
var strTrTag = " <tr> "
+ " <td > "
+ " <label><input type='checkbox' style='display: inline-block;' name='chkAsset' /> </label> "
+ " </td> "
+ " <td >"+vcCate3+"</td> "
+ " <td >"+vcAssetName+"</td> "
+ " <td > "
+ " <input type='text' name='txCommentAsset' id='txCommentAsset' value='' style='width:80%;'/> "
+ " </td> "
+ " <input type='hidden' name='inAssetSeq' id='inAssetSeq' value='"+inAssetSeq+"' > "
+ " </tr> "
$("#table_asset tbody").append(strTrTag)
}
//----------------------------------------
// 자산정보 선택한 자산 삭제
// ----------------------------------------
function fn_Asset_Delete()
{
$("input:checkbox[name='chkAsset']:checked").each(function(k,kVal)
{
// 로우 삭제
let chkRow = kVal.parentElement.parentElement.parentElement;
$(chkRow).remove();
});
}
//----------------------------------------
// 서비스 정보 변경시
// ----------------------------------------
function selInServiceCode()
{
var inServiceCode = $('#inServiceCode option:selected').val() ;
var inData = {};
inData = {"inServiceCode":inServiceCode};
proc.fn_get_service_info(inData);
}
//----------------------------------------
// 보고양식 변경시
// ----------------------------------------
function selReportForm()
{
var inSeq = $('#reportForm option:selected').val() ;
var inData = {};
inData = {"seq":inSeq};
proc.fn_get_report_form_info(inData);
}
//----------------------------------------
// 기타보고서 등록처리
// ----------------------------------------
function fncReportOtherInsert()
{
var bYes = confirm("기타보고서 등록 처리를 하시겠습니까?");
if(bYes==false) return;
fncReportSaveSetting();
//input item Client-Side validate
if (!validateReportOtherManage(document.reportOtherManage))
{
return false;
}
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileOther())
{
return false;
}
proc.fn_ReportOther_save();
}
//----------------------------------------
// 기타보고서 등록/승인요청
// ----------------------------------------
function fncReportOtherInsertApp()
{
var bYes = confirm("기타보고서 등록/승인요청 처리를 하시겠습니까?");
if(bYes==false) return;
fncReportSaveSetting();
//input item Client-Side validate
if (!validateReportOtherManage(document.reportOtherManage))
{
return false;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileOther())
{
return false;
}
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 승인요청 메세지 팝업 open
PopupOpen("/srm/PopReqApproval", 340, 450, '');
}
//----------------------------------------
// 보고서 변경/승인처리 처리(최종 저장 처리 )
// ----------------------------------------
function fncAppLast(strMsg)
{
$('#reqTxComment' ).val(strMsg) ;
$('#reqApprovalYn' ).val("Y" ) ;
proc.fn_ReportOther_save();
}
//----------------------------------------
// 2025.12.02 나혁제 파일체크 로직 추가
// 첨부파일 체크
// ----------------------------------------
function fncAttachFileOther()
{
// 결과가 false인경우 허용되지 않음
var resultExtension = EgovMultiFilesChecker.checkExtensions("egovComFileUploader", "<c:out value='${fileUploadExtensions}'/>");
if (!resultExtension)
{
return false;
}
// 파일당 1M까지 허용 (1K=1024), 결과가 false인경우 허용되지 않음
var resultSize = EgovMultiFilesChecker.checkFileSize("egovComFileUploader", <c:out value='${fileUploadMaxSize}'/>);
if (!resultSize)
{
return false;
}
return true;
}
//----------------------------------------
// 저장전 기본 세팅
// ----------------------------------------
function fncReportSaveSetting()
{
var form = document.reportOtherManage;
// 결재라인
var strExistUser = $("input[name='approvalUserId']").map(function () { return $(this).val();}).get();
var strExistUserText = $("input[name='approvalUserNm']").map(function () { return $(this).val();}).get();
strExistUser.join(',');
strExistUserText.join(',');
form.approvalsId .value = strExistUser;
form.approvalsName.value = strExistUserText;
// 보고서 자산 구조
var strAssetSeq = $("input[name='inAssetSeq']").map(function () { return $(this).val();}).get();
var strCommentAsset = $("input[name='txCommentAsset']").map(function () { return $(this).val();}).get();
strAssetSeq.join(',');
strCommentAsset.join(',');
form.assetSeqs .value = strAssetSeq;
form.assetCommnets.value = strCommentAsset;
form.txReportBody.value = tinyMCE.get("serviceBody").getContent(); // 평문
}
//----------------------------------------
// 사용자 검색 팝업
// ----------------------------------------
function fn_User_Search( strTitle
, frmUniqId
, frmEmplNo
, frmEmplyrNm
, frmOrgnztNm
, multiUserSelectYn
)
{
var arrParam = new Array(6);
arrParam[0] = window;
arrParam[1] = strTitle;
arrParam[2] = frmUniqId;
arrParam[3] = frmEmplNo;
arrParam[4] = frmEmplyrNm;
arrParam[5] = frmOrgnztNm;
var strUrl = "/cmm/selectUserListPopup.do?multiUserSelectYn="+multiUserSelectYn;
window.showModalDialog("<c:url value='"+strUrl+"' />"
, arrParam
,"dialogWidth:900px;dialogHeight:750px;resizable:yes;center:yes");
}
//----------------------------------------
// 팝업창에서 결재자 선택 확인시
// ----------------------------------------
function fn_User_Multi_Selected(strReturnData)
{
var aReturnData = strReturnData.split(","); // split에 '-'를 넣었습니다.
console.log(aReturnData);
var strExistUser = $("input[name='approvalUserId']").map(function () {
return $(this).val();
}).get();
console.log(strExistUser);
for(var i=0; i<aReturnData.length-1; i++)
{
var aOptData = aReturnData[i].split("|");
// 기존에 존재하는경우 skip
var iExistYn = strExistUser.indexOf(aOptData[0]);
if(iExistYn>-1) continue;
fn_table_appr_tr_add(aOptData[0], aOptData[1]);
}
}
//----------------------------------------
// 결재라인 Row 추가 처리
// ----------------------------------------
function fn_table_appr_tr_add(strId, strName)
{
// 2025.11.18 나혁제 결재순서 표시
var trApprCnt = $('#table_appr >tbody tr').length+1;
var strTrTag = " <tr> "
+" <td > "
+" <label><input type='checkbox' style='display: inline-block;' id='chkAppUser' name='chkAppUser' /> </label> "
+" </td> "
+" <td >"+trApprCnt+"</td> "
+" <td >"+strName+"</td> "
+" <td ></td> "
+" <td ></td> "
+" <input type='hidden' name='approvalUserId' id='approvalUserId' value='"+strId+"' > "
+" <input type='hidden' name='approvalUserNm' id='approvalUserNm' value='"+strName+"' > "
+" </tr> "
;
$("#table_appr tbody").append(strTrTag)
}
//----------------------------------------
// 결재라인 선택한 사용자 삭제
// ----------------------------------------
function fn_User_Delete()
{
$("input:checkbox[name='chkAppUser']:checked").each(function(k,kVal)
{
// 로우 삭제
let chkRow = kVal.parentElement.parentElement.parentElement;
$(chkRow).remove();
});
// 2025.10.20 나혁제 결재순서 재조정
reorderApprSeq();
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 위로 이동처리
// ----------------------------------------
function fnMoveUpTR()
{
var $selected = $("#table_appr tbody tr.selected");
if ($selected.length === 0)
{
alert("이동할 행을 선택하세요.");
return;
}
var $prev = $selected.prev();
if ($prev.length > 0)
{
$selected.insertBefore($prev);
reorderApprSeq();
}
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 아래로 이동처리
// ----------------------------------------
function fnMoveDownTR()
{
var $selected = $("#table_appr tbody tr.selected");
if ($selected.length === 0)
{
alert("이동할 행을 선택하세요.");
return;
}
let $next = $selected.next();
if ($next.length > 0)
{
$selected.insertAfter($next);
reorderApprSeq();
}
}
//----------------------------------------
// 2025.11.19 나혁제
// 결재순서 재설정
// ----------------------------------------
function reorderApprSeq()
{
$("#table_appr tbody tr").each(function(index){
// index는 0부터 시작하므로 1을 더해줌
$(this).find("td:eq(1)").text(index + 1);
});
}
//----------------------------------------
// 팝업 오픈
// ----------------------------------------
function PopupOpen(strUrl, hei, wid, pagetitle)
{
var page = "/common/PageRedirection.do?Page="+ strUrl
+ "&PopupYn=Y";
var $dialog = $('<div></div>')
.html('<iframe style="border: 0px; " src="' + page + '" width="100%" height="100%"></iframe>')
.dialog({
autoOpen: false
, modal: true
, height: hei
, width: wid
, title: pagetitle
, open: function (event, ui)
{
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
$('.ui-dialog-titlebar-close').css({
width: '30px' // 닫기 버튼 너비
// , height: '50px' // 닫기 버튼 높이
});
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
}
, closeText: '닫기'
});
$dialog.dialog('open');
// 팝업 화면 맨앞으로 배치
$(".ui-dialog").css("z-index", "99");
}
//----------------------------------------
// Ajax 서버 통신 모음
// ----------------------------------------
var proc =
{
// 기타보고서 등록
fn_ReportOther_save : function ()
{
var form = $('#reportOtherManage')[0];
var formData = new FormData(form);
$.ajax({
url: '/srm/addReportOther.do'
, type: 'post'
, enctype:'multipart/form-data'
, data: formData
, dataType: 'json'
, processData:false
, contentType:false
, cache:false
, success: function(data)
{
alert("등록 완료 되었습니다.");
fncReportOtherList();
},
error: function(errorThrown)
{
alert("보고서 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
,
// 서비스 결재라인 정보 추출
fn_get_service_info : function (inData)
{
$.ajax({
url: '/srm/getSvcApprovalListOther.do'
, type: 'post'
, data: JSON.stringify(inData)
, dataType: 'json'
, contentType: 'application/json'
, async: false
, success: function(data)
{
console.log(JSON.stringify(data));
$('#table_appr tbody tr').remove();
// 결재라인 세팅
for(var i=0; i<data.resultApprovals.length; i++)
{
fn_table_appr_tr_add(data.resultApprovals[i].inUserSeq, data.resultApprovals[i].vcUserName);
}
},
error: function(errorThrown)
{
alert("서비스 정보 조회중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
,
// 보고양식 추출
fn_get_report_form_info : function (inData)
{
$.ajax({
url: '/srm/getReportFormOther.do'
, type: 'post'
, data: JSON.stringify(inData)
, dataType: 'json'
, contentType: 'application/json'
, async: false
, success: function(data)
{
console.log(JSON.stringify(data));
// 본문세팅
// drawEditor(data.strTxDefaultFormDec);
drawEditor("serviceBody", data.strTxDefaultFormDec, false);
// 2025.05.21 나혁제 작업자정보 세팅
$('#vcTaskUser').val(data.strVcTaskUser);
$('#inTaskUser').val(data.strInTaskUser);
},
error: function(errorThrown)
{
alert("보고양식 조회중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
}
</script>
<!-- javascript warning tag -->
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
<form:form modelAttribute="reportOtherManage" name="reportOtherManage" method="post" enctype="multipart/form-data">
<!-- body_wrap :start -->
<div class="body_wrap">
<!-- main title -->
<div class="main_titWrap">
<h3>${resultReport.vcTask} 새로만들기</h3>
<!-- location :s -->
<div class="location">
<div class="location-cont">
<div>
<ul class="route_navi">
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
<li><a href="#" title="유지보수 관리" >유지보수 관리</a></li>
<li>기타보고서 등록</li>
</ul>
</div>
</div>
</div>
<!--//location :e -->
</div>
<!--//main title -->
<!-- Form 테이블 :start -->
<div class="bbs_view">
<!-- 등록폼 -->
<table class="tbl_form" summary="<spring:message code="common.summary.list" arguments="등록" />">
<caption>기타보고서 등록</caption>
<colgroup>
<col style="width: 12%;">
<col style="width: 20%">
<col style="width: 8%">
<col style="width: 22%;">
<col style="width: 10%">
<col style="width: 30%;">
</colgroup>
<tbody>
<tr>
<th> 보고서ID </th>
<td> </td>
<th> 서비스 </th>
<td>
<select name="inServiceCode" id="inServiceCode" onchange="selInServiceCode()" style="width: 90%;" >
<c:forEach items="${resultService}" var="result" varStatus="status">
<option value="${result.value}" <c:if test="${result.value == resultReport.inServiceCode}"> selected </c:if> > ${result.label} </option><!-- 분류코드명 -->
</c:forEach>
</select>
</td>
<th> 작성자 </th>
<td>
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" style="width: 90%;" readonly />
<input type="hidden" name="inRegUser" id="inRegUser" value="${inRegUser}" />
</td>
</tr>
<tr>
<th> 인스던트 접수번호 </th>
<td> </td>
<th> 작업분류 </th>
<td>
<input type="text" name="vcTask" id="vcTask" value="${resultReport.vcTask}" readonly style="width: 90%;" />
<input type="hidden" name="inTask" id="inTask" value="${resultReport.inTask}" >
</td>
<th> 작업자 </th>
<td>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${resultReport.vcTaskUser}" style="width: 90%;" readonly />
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inTaskUser', '', 'vcTaskUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="작업자 검색" title="작업자 검색">
</a>
<input type="hidden" name="inTaskUser" id="inTaskUser" value="${resultReport.inTaskUser}" >
</td>
</tr>
<tr>
<%-- 2025.09.01 나혁제 불필요한 항목 사젝 --%>
<th style="display:none" > 서비스다운 </th>
<td style="display:none" >
<input type="text" class="btn_calendar" name="dtDownstartDatetime" id="dtDownstartDatetime" value="${resultReport.dtDownstartDatetime}" readonly style="width:47%;"/>
~<input type="text" class="btn_calendar" name="dtDownfinishDatetime" id="dtDownfinishDatetime" value="${resultReport.dtDownstartDatetime}" readonly style="width:47%;"/>
</td>
<th> 보고서양식 </th>
<td >
<select name="reportForm" id="reportForm" onchange="selReportForm()" style="width: 90%;" >
<c:forEach items="${resultForm}" var="result" varStatus="status">
<option value="${result.inReportForm}" > ${result.vcFormName} </option><!-- 분류코드명 -->
</c:forEach>
</select>
</td>
<th> 시작일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtStartDatetime" id="dtStartDatetime" value="${dtStartDatetime}" readonly style="width:90%;"/>
</td>
<th> 종료일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtFinishDatetime" id="dtFinishDatetime" value="${dtFinishDatetime}" readonly style="width:90%;"/>
</td>
</tr>
<tr>
<th rowspan=2 > 제목 </th>
<td rowspan=2 colspan=3>
<input type="text" name="vcReportTitle" id="vcReportTitle" value="${resultReport.vcReportTitle}" style="width:90%;"/>
</td>
<th><spring:message code="cop.atchFile" /></th>
<td>
<!-- attached file Start -->
<div>
<input type="file" name="file_1" id="egovComFileUploader" onChange="fnImgChange(this)" multiple>
</div>
<div id="egovComFileList"></div>
</div>
<!-- attached file End -->
</td>
</tr>
<tr>
<th>기존첨부파일</th>
<td>
<c:import url="/cmm/selectFileInfs.do" charEncoding="utf-8">
<c:param name="param_atchFileId" value="${resultReport.atchFileId}" />
<c:param name="strItmsYn" value="Y" />
</c:import>
</td>
</tr>
<!-- 2025.11.20 나혁제 결재라인 레이아웃 변경 및 결재순서 추가 -->
<tr>
<th >서비스 결재 라인 </th>
<td colspan=5 style="vertical-align: top;">
<div class="btn_group" >
<button type="button" class="btn-function" onclick="fn_User_Search('조치예정', '', '', '', '', 'Y');return false;" style="margin-top: -30px;"> 조회 </button>
<button type="button" class="btn-function" onclick="fn_User_Delete(); return false;" style="margin-top: -30px;"> 삭제 </button>
</div>
<div style="display: flex;align-items: flex-start;">
<div class="tbl_list">
<!-- 목록영역 -->
<table class="table" summary="" id="table_appr" >
<caption>결재라인 <spring:message code="title.list" /></caption>
<colgroup>
<col style="width: 8%;">
<col style="width: 8%;">
<col style="width: 15%;">
<col style="width: 10%;">
<col style="width: *;">
</colgroup>
<thead>
<tr>
<th></th>
<th>결재순서</th>
<th>결재자</th>
<th>상태</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
<c:forEach var="approvals" items="${resultApprovals}" varStatus="status">
<tr>
<td >
<label><input type="checkbox" style="display: inline-block;" name="chkAppUser" /> </label>
</td>
<td ><c:out value="${approvals.inOrder+1}"/></td>
<td ><c:out value="${approvals.vcUserName}"/></td>
<td ></td>
<td ></td>
<input type='hidden' name="approvalUserId" id="approvalUserId" value="${approvals.inUserSeq}" >
<input type='hidden' name="approvalUserNm" id="approvalUserNm" value="${approvals.vcUserName}" >
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div style="width:3%;text-align:center;padding-left: 5px;align-self: center;">
<a href="#" onclick="fnMoveUpTR(this); return false;" style="font-size: x-large;" >▲</a>
<a href="#" onclick="fnMoveDownTR(this); return false;" style="font-size: x-large;" >▼</a>
</div>
</div>
</td>
</tr>
<tr>
<th> 자산</th>
<td colspan=5>
<div class="btn_group" >
<button type="button" class="btn-function" onclick="fn_Asset_Search();return false;" style="margin-top: -30px;"> 조회 </button>
<button type="button" class="btn-function" onclick="fn_Asset_Delete(); return false;" style="margin-top: -30px;"> 삭제 </button>
</div>
<div class="tbl_list">
<!-- 목록영역 -->
<table class="table" summary="" id="table_asset" >
<caption>연결자산정보 <spring:message code="title.list" /></caption>
<colgroup>
<col style="width: 10%;">
<col style="width: 25%;">
<col style="width: 20%;">
<col style="width: *;">
</colgroup>
<thead>
<tr>
<th></th>
<th>소분류</th>
<th>자산명</th>
<th>비고</th>
</tr>
</thead>
<tbody>
<c:forEach var="assets" items="${resultAssets}" varStatus="status">
<tr>
<td>
<label><input type='checkbox' style='display: inline-block;' name='chkAsset' /> </label>
</td>
<td ><c:out value="${assets.vcCate3}"/></td>
<td ><c:out value="${assets.vcAssetName}"/></td>
<td >
<input type="text" name="txCommentAsset" id="txCommentAsset" value="" style="width:90%;"/>
</td>
<input type="hidden" name="inAssetSeq" id="inAssetSeq" value="${assets.inAssetSeq}" >
</tr>
</c:forEach>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
<textarea id="serviceBody" name="serviceBody" ></textarea>
<textarea id="serviceBody2" name="serviceBody2" style="display:none;">${resultReport.txReportBody}</textarea>
</div>
<!-- main btn : start -->
<div class="btn_group">
<!-- 왼쪽영역-->
<div style="text-align: left;position: absolute;">
<!-- 목록 -->
<button type="button" class="btn-function" id="btnList" style="background: blue;" onclick="fncReportOtherList(); return false;" title="<spring:message code="button.list"/>">
<spring:message code="button.list"/>
</button>
</div>
<!--//왼쪽영역-->
<!-- 오른쪽영역-->
<div>
<button type="button" class="btn-etc" onclick="fncReportOtherInsertApp(); return false;" title="등록/승인요청" >
등록/승인요청
</button>
<button type="button" class="btn-etc" onclick="fncReportOtherInsert(); return false;" title="<spring:message code="button.create" />">
<spring:message code="button.create" />
</button>
</div>
<!-- // 오른쪽영역-->
</div>
<!-- main btn : end -->
</div>
<!-- body_wrap :end -->
<!-- 검색조건 유지 -->
<input type="hidden" name="orgnztId" value="" >
<input type="hidden" name="searchCondition" value="<c:out value='${searchVO.searchCondition}'/>" >
<input type="hidden" name="searchKeyword" value="<c:out value='${searchVO.searchKeyword}'/>" >
<input type="hidden" name="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>" >
<input type="hidden" name="multiUserSelectYn" value="" >
<!-- 입력정보 -->
<input type="hidden" id="txReportBody" name="txReportBody" value="" >
<input type="hidden" id="assetSeqs" name="assetSeqs" value="" >
<input type="hidden" id="assetCommnets" name="assetCommnets" value="" >
<input type="hidden" id="approvalsId" name="approvalsId" value="" >
<input type="hidden" id="approvalsName" name="approvalsName" value="" >
<input type="hidden" id="inIncidentSeq" name="inIncidentSeq" value="${inIncidentSeq}" >
<input type="hidden" id="inReportSeq" name="inReportSeq" value="0">
<input type="hidden" id="inReportStatus" name="inReportStatus" value="0">
<input type="hidden" id="inDowntime" name="inDowntime" value="0">
<input type="hidden" id="reqTxComment" name="reqTxComment" value=""/> <!-- 승인요청메세지 -->
<input type="hidden" id="reqApprovalYn" name="reqApprovalYn" value=""/> <!-- 승인요청여부 -->
<input type="hidden" id="oldAtchFileId" name="oldAtchFileId" value="${resultReport.atchFileId}">
</form:form>

View File

@ -84,6 +84,43 @@
varFrom.submit();
}
//----------------------------------------
// 2026.01.22 나혁제
// 새로만들기 기능확장
// ----------------------------------------
function fncReportIssueCopyInsert()
{
if($('#inReportStatus').val()!='2' && $('#inReportStatus').val()!='3' )
{
alert("[승인완료/반려]된 보고서을 이용하야 새로만들기가 가능합니다.");
return;
}
// 수정화면으로 이동처리
var varFrom = document.getElementById("reportOtherManage");
varFrom.action = "<c:url value='/srm/insertCopyViewReportOther.do'/>";
varFrom.submit();
}
//----------------------------------------
// 2026.01.22 나혁제
// 새로만들기 기능확장
// ----------------------------------------
function fncReportOtherCopyInsert()
{
if($('#inReportStatus').val()!='2' && $('#inReportStatus').val()!='3' )
{
alert("[승인완료/반려]된 보고서을 이용하야 새로만들기가 가능합니다.");
return;
}
// 수정화면으로 이동처리
var varFrom = document.getElementById("reportOtherManage");
varFrom.action = "<c:url value='/srm/insertCopyViewReportOther.do'/>";
varFrom.submit();
}
//----------------------------------------
// 보고서 수정 화면 이동처리
// ----------------------------------------
@ -104,7 +141,7 @@
{
// 2025.11.20 나혁제 승인완료된 자료 수정불가
// if(confirm("승인완료된 보고서입니다. \n수정하면 모든 승인 정보는 초기화 됩니다.\n수정하시겠습니까?") == false) return;
alert("승인완료된 보고입니다.\n 재작성하시길 바랍니다.");
alert("승인완료된 보고입니다.\n 재작성하시길 바랍니다.");
return;
}
@ -663,6 +700,10 @@
</c:if>
<c:if test="${(privType eq 'mine' && report.inReportStatus ne 3) || privType eq 'super'}">
<!-- 2026.01.22 나혁제 새로만들기 기능 추가 -->
<button type="button" class="btn-etc" title="새로만들기" onclick="fncReportOtherCopyInsert(); return false;">
새로만들기
</button>
<button type="button" class="btn-etc" title="수정" onclick="fncReportOtherUpdate(); return false;">
수정
</button>

View File

@ -261,6 +261,13 @@
return false;
}
// 2026.01.23 나혁제 결재라인 체크 추가
if($("#approvalsId").val() == '')
{
alert("결재라인을 입력해 주세요.");
return;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileCheck())
{
@ -815,7 +822,7 @@
</td>
<th> 작성자 </th>
<td>
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" readonly />
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}" readonly style="width: 90%;" />
<input type="hidden" name="inRegUser" id="inRegUser" value="${inRegUser}" />
</td>
@ -831,7 +838,7 @@
</td>
<th> 작업자 </th>
<td>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${vcRegUser}"/>
<input type="text" name="vcTaskUser" id="vcTaskUser" value="${vcRegUser}" style="width: 90%;" readonly />
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inTaskUser', '', 'vcTaskUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="작업자 검색" title="작업자 검색">

View File

@ -149,19 +149,19 @@
<tr>
<td colspan=2>
<label>문서번호:</label>
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.reportId}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>요청번호:</label>
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 170px;"
<label>인스던트 접수번호:</label>
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.incidentNum}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>작성자:</label>
<input class="s_input" id="regUser" name="regUser" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="regUser" name="regUser" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.regUser}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label>제목:</label>
<input class="s_input" id="reportTitle" name="reportTitle" type="text" size="35" maxlength="155" style="width: 170px;"
<input class="s_input" id="reportTitle" name="reportTitle" type="text" size="35" maxlength="155" style="width: 155px;"
value='<c:out value="${searchVO.reportTitle}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
</td>
</tr>
@ -214,7 +214,7 @@
<thead>
<tr>
<th>문서번호</th>
<th>요청번호</th>
<th>인스던트 접수번호</th>
<th>서비스</th>
<th>승인상태</th>
<th>제목</th>

View File

@ -0,0 +1,786 @@
<!DOCTYPE html>
<%
/**
* @Class Name : SvcDeskCopyInsert.jsp
* @Description : 서비스데스크 인스턴스 새로만들기 화면
* @Modification Information
* @
* @ 수정일 수정자 수정내용
* @ ------- -------- ---------------------------
* @ 2026.01.21 나혁제 최초 생성
*
* @author urp 인프라본부 나혁제
* @since 2026.01.21
* @version 1.0
* @see
*
* Copyright (C) 2009 by MOPAS All right reserved.
*/
%>
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<title> 인스던트 수정 </title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<!-- 2025.11.18 나혁제 선택된 Row 처리 -->
<style>
.selected {background-color:#e8eff7;}
</style>
<script type="text/javascript" src="<c:url value="/validator.do"/>"></script>
<script type="text/javascript" src="<c:url value='/egov/js/showModalDialog.js'/>" ></script>
<!-- tinyMCE Editor -->
<script charset="utf-8" type="text/javascript" src="${pageContext.request.contextPath}/lib/oss/tinymce/tinymce.min.js"></script>
<!-- tinymce setting 2025.05.12 나혁제 tinymce_uritms_setting.js 이관 -->
<script charset="utf-8" type="text/javascript" src="<c:url value='/js/tinymce_uritms_setting.js?ver=1'/>" ></script>
<!-- validation 처리 -->
<validator:javascript formName="svcDeskManage" staticJavascript="false" xhtml="true" cdata="false"/>
<!-- 파일처리 -->
<script type="text/javascript" src="<c:url value='/egov/js/EgovMultiFiles.js'/>" ></script>
<!-- 시간처리 -->
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui-timepicker-addon.js"></script>
<link rel="stylesheet" type="text/css" href="${ctx}/css/jquery-ui-timepicker-addon.css">
<script type="text/javaScript" language="javascript">
//----------------------------------------
// 화면 초기화
// ----------------------------------------
$(document).ready(function()
{
// 결재라인 높이 조정
// $("#table_appr tbody td").css("height", "10px");
// 접수일시, 완료요청일시 시간까지 세팅
$("#dtReceiptDatetime, #dtReqDatetime").datetimepicker({
dateFormat:'yy-mm-dd',
monthNamesShort:[ '1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월' ],
dayNamesMin:[ '일', '월', '화', '수', '목', '금', '토' ],
changeMonth:true,
changeYear:true,
showMonthAfterYear:true,
// timepicker 설정
timeFormat:'HH:mm',
controlType:'select',
oneLine:true,
});
// 멀티파일 설정
var maxFileNum = 3;
var multi_selector = new MultiSelector( document.getElementById( 'egovComFileList' ), maxFileNum );
multi_selector.addElement( document.getElementById( 'egovComFileUploader' ) );
// drawEditor("");
drawEditor("serviceBody", "", false);
// 2025.11.18 나혁제 결재라인 클릭 자료 표시
$(document).on("click", "#table_appr tbody td", function(){
$("#table_appr tbody tr").removeClass('selected');
$(this).parent().addClass('selected');
});
});
//----------------------------------------
// 화면 초기화(Form 완전 로딩후 )
// ----------------------------------------
$(window).on("load", function()
{
var strForm = document.getElementById("serviceBody2").value;
drawEditor("serviceBody", strForm, false);
});
//----------------------------------------
// 목록 화면으로 이동처리
// ----------------------------------------
function fncSvcDeskList()
{
var varFrom = document.getElementById("svcDeskManage");
varFrom.action = "<c:url value='/srm/searchIncident.do'/>";
varFrom.submit();
}
//----------------------------------------
// 사용자 검색 팝업
// ----------------------------------------
function fn_User_Search( strTitle
, frmUniqId
, frmEmplNo
, frmEmplyrNm
, frmOrgnztNm
, multiUserSelectYn
)
{
var arrParam = new Array(6);
arrParam[0] = window;
arrParam[1] = strTitle;
arrParam[2] = frmUniqId;
arrParam[3] = frmEmplNo;
arrParam[4] = frmEmplyrNm;
arrParam[5] = frmOrgnztNm;
var strUrl = "/cmm/selectUserListPopup.do?multiUserSelectYn="+multiUserSelectYn;
window.showModalDialog("<c:url value='"+strUrl+"' />"
, arrParam
,"dialogWidth:900px;dialogHeight:750px;resizable:yes;center:yes");
}
//----------------------------------------
// 팝업창에서 결재자 선택 확인시
// ----------------------------------------
function fn_User_Multi_Selected(strReturnData)
{
var aReturnData = strReturnData.split(","); // split에 '-'를 넣었습니다.
var strExistUser = $("input[name='approvalUserId']").map(function () {
return $(this).val();
}).get();
for(var i=0; i<aReturnData.length-1; i++)
{
var aOptData = aReturnData[i].split("|");
// 기존에 존재하는경우 skip
var iExistYn = strExistUser.indexOf(aOptData[0]);
if(iExistYn>-1) continue;
fn_table_appr_tr_add(aOptData[0], aOptData[1]);
}
}
//----------------------------------------
// 결재라인 Row 추가 처리
// ----------------------------------------
function fn_table_appr_tr_add(strId, strName)
{
// 2025.11.18 나혁제 결재순서 표시
var trApprCnt = $('#table_appr >tbody tr').length+1;
var strTrTag = " <tr> "
+" <td > "
+" <label><input type='checkbox' style='display: inline-block;' id='chkAppUser' name='chkAppUser' /> </label> "
+" </td> "
+" <td >"+trApprCnt+"</td> "
+" <td >"+strName+"</td> "
+" <td ></td> "
+" <td ></td> "
+" <input type='hidden' name='approvalUserId' id='approvalUserId' value='"+strId+"' > "
+" <input type='hidden' name='approvalUserNm' id='approvalUserNm' value='"+strName+"' > "
+" </tr> "
;
$("#table_appr tbody").append(strTrTag)
}
//----------------------------------------
// 결재라인 선택한 사용자 삭제
// ----------------------------------------
function fn_User_Delete()
{
$("input:checkbox[name='chkAppUser']:checked").each(function(k,kVal)
{
// 로우 삭제
let chkRow = kVal.parentElement.parentElement.parentElement;
$(chkRow).remove();
});
// 2025.11.24 나혁제 삭제이후 결재순서 재정리
reorderApprSeq();
}
//----------------------------------------
// 서비스 정보 변경시
// ----------------------------------------
function selInServiceCode()
{
var inServiceCode = $('#inServiceCode option:selected').val() ;
var inData = {};
inData = {"inServiceCode":inServiceCode};
proc.fn_get_service_info(inData);
}
//----------------------------------------
// 서비스 등록처리
// ----------------------------------------
function fncSvcDeskIncidentInsert()
{
var bYes = confirm("인스던트 접수 처리를 하시겠습니까?");
if(bYes==false) return;
var form = document.svcDeskManage;
var strExistUser = $("input[name='approvalUserId']").map(function () { return $(this).val();}).get();
var strExistUserText = $("input[name='approvalUserNm']").map(function () { return $(this).val();}).get();
strExistUser.join(',');
strExistUserText.join(',');
form.approvalsId .value = strExistUser;
form.approvalsName.value = strExistUserText;
form.txIncidentBody.value = tinyMCE.get("serviceBody").getContent(); // 평문
//input item Client-Side validate
if (!validateSvcDeskManage(form))
{
return false;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileCheck())
{
return false;
}
proc.fn_incident_save();
}
//----------------------------------------
// 서비스 등록/승인요청 처리 (button)
// ----------------------------------------
function fncSvcDeskIncidentInsertReqApp()
{
var bYes = confirm("인스던트 등록/승인요청 처리를 하시겠습니까?");
if(bYes==false) return;
var form = document.svcDeskManage;
var strExistUser = $("input[name='approvalUserId']").map(function () { return $(this).val();}).get();
var strExistUserText = $("input[name='approvalUserNm']").map(function () { return $(this).val();}).get();
strExistUser.join(',');
strExistUserText.join(',');
form.approvalsId .value = strExistUser;
form.approvalsName.value = strExistUserText;
form.txIncidentBody.value = tinyMCE.get("serviceBody").getContent(); // 평문
//input item Client-Side validate
if (!validateSvcDeskManage(form))
{
return false;
}
// 2025.12.02 나혁제 파일체크 로직 추가
if (!fncAttachFileCheck())
{
return false;
}
// 승인요청 메세지 팝업 open
PopupOpen("/srm/PopReqApproval", 340, 450, '');
}
//----------------------------------------
// 인스던트 변경/승인처리 처리(최종 저장 처리 )
// ----------------------------------------
function fncAppLast(strMsg)
{
$('#txComment' ).val(strMsg) ;
$('#reqApprovalYn' ).val("Y" ) ;
proc.fn_incident_save();
}
//----------------------------------------
// 2025.12.02 나혁제 파일체크 로직 추가
// 첨부파일 체크
// ----------------------------------------
function fncAttachFileCheck()
{
// 결과가 false인경우 허용되지 않음
var resultExtension = EgovMultiFilesChecker.checkExtensions("egovComFileUploader", "<c:out value='${fileUploadExtensions}'/>");
if (!resultExtension)
{
return false;
}
// 파일당 1M까지 허용 (1K=1024), 결과가 false인경우 허용되지 않음
var resultSize = EgovMultiFilesChecker.checkFileSize("egovComFileUploader", <c:out value='${fileUploadMaxSize}'/>);
if (!resultSize)
{
return false;
}
return true;
}
//----------------------------------------
// 2025.11.18 나혁제
// 결재순서 위로 이동처리
// ----------------------------------------
function fnMoveUpTR()
{
var $selected = $("#table_appr tbody tr.selected");
if ($selected.length === 0)
{
alert("이동할 행을 선택하세요.");
return;
}
var $prev = $selected.prev();
if ($prev.length > 0)
{
$selected.insertBefore($prev);
reorderApprSeq();
}
}
//----------------------------------------
// 2025.11.18 나혁제
// 결재순서 아래로 이동처리
// ----------------------------------------
function fnMoveDownTR()
{
var $selected = $("#table_appr tbody tr.selected");
if ($selected.length === 0)
{
alert("이동할 행을 선택하세요.");
return;
}
let $next = $selected.next();
if ($next.length > 0)
{
$selected.insertAfter($next);
reorderApprSeq();
}
}
//----------------------------------------
// 2025.11.18 나혁제
// 결재순서 재설정
// ----------------------------------------
function reorderApprSeq()
{
$("#table_appr tbody tr").each(function(index){
// index는 0부터 시작하므로 1을 더해줌
$(this).find("td:eq(1)").text(index + 1);
});
}
//----------------------------------------
// 팝업 오픈
// ----------------------------------------
function PopupOpen(strUrl, hei, wid, pagetitle)
{
var page = "/common/PageRedirection.do?Page="+ strUrl
+ "&PopupYn=Y";
var $dialog = $('<div></div>')
.html('<iframe style="border: 0px; " src="' + page + '" width="100%" height="100%"></iframe>')
.dialog({
autoOpen: false
, modal: true
, height: hei
, width: wid
, title: pagetitle
, open: function (event, ui)
{
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
$('.ui-dialog-titlebar-close').css({
width: '30px' // 닫기 버튼 너비
// , height: '50px' // 닫기 버튼 높이
});
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
}
, closeText: '닫기'
});
$dialog.dialog('open');
// 팝업 화면 맨앞으로 배치
$(".ui-dialog").css("z-index", "99");
}
//----------------------------------------
// Ajax 통신처리
// ----------------------------------------
var proc =
{
// 인스던트 접수
fn_incident_save : function ()
{
var form = $('#svcDeskManage')[0];
var formData = new FormData(form);
$.ajax({
url: '/srm/addIncident.do'
, type: 'post'
, enctype:'multipart/form-data'
, data: formData
, dataType: 'json'
, processData:false
, contentType:false
, cache:false
, success: function(data)
{
alert("등록 완료 되었습니다.");
fncSvcDeskList();
},
error: function(errorThrown)
{
alert("인스던트 접수 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
,
// 서비스정보 추출
fn_get_service_info : function (inData)
{
$.ajax({
url: '/srm/getIncidentForm.do'
, type: 'post'
, data: JSON.stringify(inData)
, dataType: 'json'
, contentType: 'application/json'
, async: false
, success: function(data)
{
console.log(JSON.stringify(data));
// 제목세팅
$('#vcIncidentTitle').val(data.resultService.vcServiceName);
// 조치예정자 고유번호
$('#inChargeUser').val(data.resultService.inChargeUser);
// 조치예정자명
$('#vcChargeUser').val(data.resultService.vcChargeUser);
// 본문세팅
// drawEditor(data.resultService.txDefaultForm);
drawEditor("serviceBody", data.resultService.txDefaultForm, false);
$('#table_appr tbody tr').remove();
// 결재라인 세팅
for(var i=0; i<data.resultApprovals.length; i++)
{
fn_table_appr_tr_add(data.resultApprovals[i].inUserSeq, data.resultApprovals[i].vcUserName);
}
},
error: function(errorThrown)
{
alert("자산 중분류 조회중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
}
</script>
<!-- javascript warning tag -->
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
<form:form modelAttribute="svcDeskManage" name="svcDeskManage" method="post" enctype="multipart/form-data">
<!-- body_wrap :start -->
<div class="body_wrap">
<!-- main title -->
<div class="main_titWrap">
<h3>서비스 등록</h3>
<!-- location :s -->
<div class="location">
<div class="location-cont">
<div>
<ul class="route_navi">
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
<li><a href="#" title="SR관리">SR관리</a></li>
<li>인스던트 수정</li>
</ul>
</div>
</div>
</div>
<!--//location :e -->
</div>
<!--//main title -->
<!-- Form 테이블 :start -->
<div class="bbs_view">
<!-- 등록폼 -->
<table class="tbl_form" summary="<spring:message code="common.summary.list" arguments="등록" />">
<caption>서비스 등록</caption>
<colgroup>
<col style="width: 10%;">
<col style="width: 30%">
<col style="width: 10%">
<col style="width: 20%;">
<col style="width: 10%">
<col style="width: 20%;">
</colgroup>
<tbody>
<tr>
<th> 접수번호 </th>
<td></td>
<th> 접수자 </th>
<td>
<input type="text" name="vcRegUser" id="vcRegUser" value="${vcRegUser}"/>
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inRegUser', '', 'vcRegUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="조치예정자 검색" title="조치예정자 검색">
</a>
<input type="hidden" name="inRegUser" id="inRegUser" value="${inRegUser}" >
</td>
<th> 접수일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtReceiptDatetime" id="dtReceiptDatetime" value="${dtReceiptDatetime}" readonly style="width:90%;"/>
</td>
</tr>
<tr>
<th> 서비스 </th>
<td>
<select name="inServiceCode" id="inServiceCode" onchange="selInServiceCode()" style="width: 80%;" >
<c:forEach items="${serviceList}" var="result" varStatus="status">
<option value="${result.value}" <c:if test="${result.value == resultIncident.inServiceCode}">selected</c:if> > ${result.label} </option><!-- 분류코드명 -->
</c:forEach>
</select>
</td>
<th> 조치예정자 </th>
<td>
<input type="text" name="vcChargeUser" id="vcChargeUser" value="${resultIncident.vcChargeUser}" readonly/>
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inChargeUser', '', 'vcChargeUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="조치예정자 검색" title="조치예정자 검색">
</a>
<input type="hidden" name="inChargeUser" id="inChargeUser" value="${resultIncident.inChargeUser}" >
</td>
<th> 완료요청일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtReqDatetime" id="dtReqDatetime" value="${dtReqDatetime}" readonly style="width:90%;"/>
</td>
</tr>
<tr>
<th> 제목 </th>
<td colspan=3>
<input type="text" name="vcIncidentTitle" id="vcIncidentTitle" value="${resultIncident.vcIncidentTitle}" style="width:90%;"/>
</td>
<th> 조치자 </th>
<td>${resultIncident.vcDevUser}</td>
<td colspan=2>
</td>
</tr>
<tr>
<th><spring:message code="cop.atchFile" /></th>
<td colspan=3>
<!-- attached file Start -->
<div>
<input type="file" name="file_1" id="egovComFileUploader" onChange="fnImgChange(this)" multiple>
</div>
<div id="egovComFileList"></div>
</div>
<!-- attached file End -->
</td>
<th rowspan=2>서비스 진행사항</th>
<td rowspan=2></td>
</tr>
<tr>
<th>기존첨부파일</th>
<td colspan=3>
<c:import url="/cmm/selectFileInfs.do" charEncoding="utf-8">
<c:param name="param_atchFileId" value="${resultIncident.atchFileId}" />
<c:param name="strItmsYn" value="Y" />
</c:import>
</td>
</tr>
<tr>
<th >서비스 결재 라인 </th>
<td colspan=5 style="vertical-align: top;">
<div class="btn_group" >
<button type="button" class="btn-function" onclick="fn_User_Search('조치예정', '', '', '', '', 'Y');return false;" style="margin-top: -30px;"> 조회 </button>
<button type="button" class="btn-function" onclick="fn_User_Delete(); return false;" style="margin-top: -30px;"> 삭제 </button>
</div>
<!-- 2025.11.18 나혁제 결재순서 추가 -->
<!-- flex 시작 -->
<div style="display: flex;align-items: flex-start;">
<div class="tbl_list">
<!-- 목록영역 -->
<table class="table" summary="" id="table_appr" >
<caption>결재라인 <spring:message code="title.list" /></caption>
<colgroup>
<col style="width: 8%;">
<col style="width: 8%;">
<col style="width: 15%;">
<col style="width: 10%;">
<col style="width: *;">
</colgroup>
<thead>
<tr>
<th></th>
<th>결재순서</th>
<th>결재자</th>
<th>상태</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
<c:forEach var="approvals" items="${resultApprovals}" varStatus="status">
<tr>
<td>
<label>
<input type="checkbox" style="display: inline-block;" name="chkAppUser" />
</label>
</td>
<td ><c:out value="${approvals.inOrder+1}"/></td>
<td ><c:out value="${approvals.vcUserName}"/></td>
<td ></td>
<td ></td>
<input type="hidden" name="approvalUserId" id="approvalUserId" value="${approvals.inUserSeq}" >
<input type="hidden" name="approvalUserNm" id="approvalUserNm" value="${approvals.vcUserName}" >
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div style="width:3%;text-align:center;padding-left:5px;align-self: center;">
<a href="#" onclick="fnMoveUpTR(this); return false;" style="font-size: x-large;" >▲</a>
<a href="#" onclick="fnMoveDownTR(this); return false;" style="font-size: x-large;" >▼</a>
</div>
</div>
</td>
</tr>
</tbody>
</table>
<textarea id="serviceBody" name="serviceBody" ></textarea>
<textarea id="serviceBody2" name="serviceBody2" style="display:none;">${resultIncident.txIncidentBody}</textarea>
</div>
<!-- main btn : start -->
<div class="btn_group">
<!-- 왼쪽영역-->
<div style="text-align: left;position: absolute;">
<!-- 목록 -->
<button type="button" class="btn-function" id="btnList" style="background: blue;" onclick="fncSvcDeskList(); return false;" title="<spring:message code="button.list"/>">
<spring:message code="button.list"/>
</button>
</div>
<!--//왼쪽영역-->
<!-- 오른쪽영역-->
<div>
<button type="button" class="btn-etc" title="등록/승인요청" onclick="fncSvcDeskIncidentInsertReqApp(); return false;">
등록/승인요청
</button>
<button type="button" class="btn-etc" title="<spring:message code="button.create" />" onclick="fncSvcDeskIncidentInsert(); return false;">
<spring:message code="button.create" />
</button>
</div>
</div>
<!-- main btn : end -->
<%--
<div class="btn_group">
<!-- 왼쪽영역-->
<div style="text-align: left;position: absolute;">
<!-- 목록 -->
<button type="button" class="btn-function" id="btnList" style="background: blue;" onclick="fncSvcDeskList(); return false;" title="<spring:message code="button.list"/>">
<spring:message code="button.list"/>
</button>
</div>
<!--//왼쪽영역-->
<!-- 오른쪽영역-->
<div>
<c:if test="${resultIncident.inIncidentStatus eq 0}">
<button type="button" class="btn-etc" title="<spring:message code="저장/승인요청 " />" onclick="fncSvcDeskIncidentUpdateApp(); return false;">
저장/승인요청
</button>
</c:if>
<button type="button" class="btn-etc" title="<spring:message code="수정" />" onclick="fncSvcDeskIncidentUpdate(); return false;">
수정
</button>
</div>
</div>
--%>
<!-- main btn : end -->
</div>
<!-- body_wrap :end -->
<!-- 검색조건 유지 -->
<input type="hidden" name="orgnztId" value="" >
<input type="hidden" name="searchCondition" value="<c:out value='${searchVO.searchCondition}'/>" >
<input type="hidden" name="searchKeyword" value="<c:out value='${searchVO.searchKeyword}'/>" >
<input type="hidden" name="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>" >
<input type="hidden" name="multiUserSelectYn" value="" >
<!-- 입력정보 -->
<input type="hidden" id="txIncidentBody" name="txIncidentBody" value="" >
<input type="hidden" id="approvalsId" name="approvalsId" value="" >
<input type="hidden" id="approvalsName" name="approvalsName" value="" >
<input type="hidden" id="txComment" name="txComment" value=""/> <!-- 승인요청메세지 -->
<input type="hidden" id="reqApprovalYn" name="reqApprovalYn" value=""/> <!-- 승인요청여부 -->
<!-- 신청정보 -->
<input type="hidden" id="vcReqIncidentNum" name="vcReqIncidentNum" value="">
<input type="hidden" id="reqAtchFileId" name="reqAtchFileId" value="${resultIncident.atchFileId}">
<input type="hidden" id="reqRptRejTxComment" name="reqRptRejTxComment" value="">
</form:form>

View File

@ -128,6 +128,25 @@
varFrom.submit();
}
//----------------------------------------
// 2025.01.21 나혁제 새로만들 기능확장
// 인스던트 새로만들기 화면 이동처리
// ----------------------------------------
function fncSvcDeskIncidentCopyInsert()
{
if($('#inIncidentStatus').val() != '2' && $('#inIncidentStatus').val() != '3' )
{
alert("[승인완료/반려]된 인시던트에서만 새로만들기가 가능합니다.");
return;
}
// 새로만들기 화면으로 이동처리
var varFrom = document.getElementById("svcDeskManage");
varFrom.action = "<c:url value='/srm/insertCopyViewIncident.do'/>";
varFrom.submit();
}
//----------------------------------------
// 인스던트 삭제 처리
// ----------------------------------------
@ -857,6 +876,12 @@
</c:if>
<c:if test="${ (privType eq 'mine' && (resultIncident.inIncidentStatus eq 2 || resultIncident.inIncidentStatus eq 3) ) || privType eq 'super' }" >
<button type="button" class="btn-etc" title="수정" onclick="fncSvcDeskIncidentCopyInsert(); return false;">
새로만들기
</button>
</c:if>
<c:if test="${(privType eq 'mine' && resultIncident.inIncidentStatus ne 3) || privType eq 'super' || privType eq 'incharge' || privType eq 'developer'}">
<button type="button" class="btn-etc" title="수정" onclick="fncSvcDeskIncidentUpdate(); return false;">
수정

View File

@ -651,14 +651,11 @@ ${uploadMax }
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inRegUser', '', 'vcRegUser', '', '');return false;">
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="조치예정자 검색" title="조치예정자 검색">
</a>
<input type="hidden" name="inRegUser" id="inRegUser" value="${inRegUser}" >
</td>
<th> 접수일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtReceiptDatetime" id="dtReceiptDatetime" value="${dtReceiptDatetime}" readonly style="width:80%;"/>
<input type="text" class="btn_calendar" name="dtReceiptDatetime" id="dtReceiptDatetime" value="${dtReceiptDatetime}" readonly style="width:90%;"/>
</td>
</tr>
<tr>
@ -683,7 +680,7 @@ ${uploadMax }
</td>
<th> 완료요청일시 </th>
<td>
<input type="text" class="btn_calendar" name="dtReqDatetime" id="dtReqDatetime" value="${dtReqDatetime}" readonly style="width:80%;"/>
<input type="text" class="btn_calendar" name="dtReqDatetime" id="dtReqDatetime" value="${dtReqDatetime}" readonly style="width:90%;"/>
</td>
</tr>

View File

@ -136,7 +136,7 @@
// 접수처리
if(strGubun=='0')
{
// 수정화면으로 이동처리
// 인스던트 접수 화면으로 이동처리
var varFrom = document.getElementById("svcDeskReqManage");
varFrom.action = "<c:url value='/srm/insertViewIncident.do'/>";
varFrom.submit();

View File

@ -43,10 +43,6 @@
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui.js"></script>
<script type="text/javascript" src="${ctx}/js/js-calendar/calendar.js"></script>
<!-- 2026.01.14 나혁제 공통팝업처리 -->
<script type="text/javascript" src="${ctx}/egov/js/showModalDialog.js"></script>
</head>
@ -112,8 +108,9 @@
}
}
// 쿠키 조회
// name : 쿠키값
//----------------------------------------
// 쿠키 조회
// ----------------------------------------
function getCookie(name)
{
const cookie = document.cookie;
@ -133,10 +130,9 @@
return "" ;
}
// 쿠키 설정
// name : 쿠키명
// value : 쿠키값
// expiredays : 쿠키 만료일
//----------------------------------------
// 쿠키 설정
// ----------------------------------------
function setCookie(name,value,expiredays)
{
const date = new Date();
@ -144,8 +140,9 @@
document.cookie = escape(name) + "=" + escape(value) + "; path=/; expires=" + date.toUTCString();
}
// 쿠키 삭제
// name : 쿠키명
//----------------------------------------
// 쿠키 삭제
// ----------------------------------------
function deleteCookie(name)
{
const expireDate = new Date();
@ -171,6 +168,41 @@
PopupOpen("/main/PopPasswordReset", 380, 450, '');
}
//----------------------------------------
// 2026.01.19 나혁제 추가
// 패스워드 초기화
// ----------------------------------------
function fncPopUserRegistOpen()
{
// PopupOpen("/main/PopUserRegist", 380, 800, '');
var $dialog = $('<div></div>')
.html('<iframe style="border: 0px; " src="/main/noAuthUserInsertView.do" width="100%" height="100%"></iframe>')
.dialog({
autoOpen: false
, modal: true
, height: 600
, width: 800
, title: '회원가입'
, open: function (event, ui)
{
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
$('.ui-dialog-titlebar-close').css({
width: '30px' // 닫기 버튼 너비
// , height: '50px' // 닫기 버튼 높이
});
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
}
, closeText: '닫기'
});
$dialog.dialog('open');
// 팝업 화면 맨앞으로 배치
$(".ui-dialog").css("z-index", "99");
}
//----------------------------------------
// 팝업 오픈
@ -270,11 +302,10 @@
<button type="button" class="btn-function" title="ID 찾기" onclick="fncIdFindOpen(); return false;" style="background: cadetblue;" >ID 찾기</button>
<button type="button" class="btn-function" title="패스워드초기화" onclick="fncPopPassworkdResetOpen(); return false;" style="background: cadetblue;" >PASSWORD 초기화</button>
&nbsp;&nbsp;&nbsp;&nbsp;
<button type="button" class="btn-function" title="자산등록" onclick="fncMultiResourceInsert(); return false;" style="background: blue;" >회원가입</button>
<button type="button" class="btn-function" title="회원가입" onclick="fncPopUserRegistOpen(); return false;" style="background: blue;" >회원가입</button>
</div>
</div>
</div>
</div>
<!--//loginWrap :e -->

View File

@ -1,14 +1,14 @@
<%--
Class Name : LoginUsr.jsp
Class Name : LoginUsr_kic.jsp
Description : 로그인화면
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2025.01.03 나혁제 최초생성
2025.12.01 나혁제 최초생성
author : 인프라본부 나혁제
since : 2025.01.02
since : 2025.12.01
--%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
@ -115,6 +115,9 @@
});
//----------------------------------------
// 로그인 처리
// ----------------------------------------
function actionLogin()
{
if (document.loginForm.userId.value =="")
@ -146,8 +149,9 @@
}
}
// 쿠키 조회
// name : 쿠키값
//----------------------------------------
// 쿠키 조회
// ----------------------------------------
function getCookie(name)
{
const cookie = document.cookie;
@ -167,10 +171,9 @@
return "" ;
}
// 쿠키 설정
// name : 쿠키명
// value : 쿠키값
// expiredays : 쿠키 만료일
//----------------------------------------
// 쿠키 설정
// ----------------------------------------
function setCookie(name,value,expiredays)
{
const date = new Date();
@ -178,15 +181,104 @@
document.cookie = escape(name) + "=" + escape(value) + "; path=/; expires=" + date.toUTCString();
}
// 쿠키 삭제
// name : 쿠키명
//----------------------------------------
// 쿠키 삭제
// ----------------------------------------
function deleteCookie(name)
{
const expireDate = new Date();
expireDate.setDate(expireDate.getDate() - 1);
document.cookie = name + "= " + "; expires=" + expireDate.toGMTString();
}
//----------------------------------------
// 2026.01.22 나혁제 추가
// ID 찾기
// ----------------------------------------
function fncIdFindOpen()
{
PopupOpen("/main/PopIdFind", 470, 450, '');
}
//----------------------------------------
// 2026.01.22 나혁제 추가
// 패스워드 초기화
// ----------------------------------------
function fncPopPassworkdResetOpen()
{
PopupOpen("/main/PopPasswordReset", 380, 450, '');
}
//----------------------------------------
// 2026.01.22 나혁제 추가
// 패스워드 초기화
// ----------------------------------------
function fncPopUserRegistOpen()
{
// PopupOpen("/main/PopUserRegist", 380, 800, '');
var $dialog = $('<div></div>')
.html('<iframe style="border: 0px; " src="/main/noAuthUserInsertView.do" width="100%" height="100%"></iframe>')
.dialog({
autoOpen: false
, modal: true
, height: 600
, width: 800
, title: '회원가입'
, open: function (event, ui)
{
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
$('.ui-dialog-titlebar-close').css({
width: '30px' // 닫기 버튼 너비
// , height: '50px' // 닫기 버튼 높이
});
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
}
, closeText: '닫기'
});
$dialog.dialog('open');
// 팝업 화면 맨앞으로 배치
$(".ui-dialog").css("z-index", "99");
}
//----------------------------------------
// 팝업 오픈
// ----------------------------------------
function PopupOpen(strUrl, hei, wid, pagetitle)
{
var page = "/common/PageRedirection.do?Page="+ strUrl
+ "&PopupYn=B";
var $dialog = $('<div></div>')
.html('<iframe style="border: 0px; " src="' + page + '" width="100%" height="100%"></iframe>')
.dialog({
autoOpen: false
, modal: true
, height: hei
, width: wid
, title: pagetitle
, open: function (event, ui)
{
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
$('.ui-dialog-titlebar-close').css({
width: '30px' // 닫기 버튼 너비
// , height: '50px' // 닫기 버튼 높이
});
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
}
, closeText: '닫기'
});
$dialog.dialog('open');
// 팝업 화면 맨앞으로 배치
$(".ui-dialog").css("z-index", "99");
}
/*
@ -228,6 +320,7 @@
<!-- Right: 로그인 박스 -->
<div class="login-right">
<h1><img src="${ctx}/images/main/logo.png" alt="uWorks Portal logo"></h1>
</br>
<h3>urITSM 에 오신것을 환영합니다.</h3>
<div class="login_box">
@ -250,6 +343,13 @@
<button type="button" class="btn_login" onclick="javascript:actionLogin()" >로그인</button>
</form:form>
<div class="btn_group" style="width:400px;text-align: left;" >
<button type="button" class="btn-function" title="ID 찾기" onclick="fncIdFindOpen(); return false;" style="background: cadetblue;" >ID찾기</button>
<button type="button" class="btn-function" title="패스워드초기화" onclick="fncPopPassworkdResetOpen(); return false;" style="background: cadetblue;" >패스워드초기화</button>
<button type="button" class="btn-function" title="회원가입" onclick="fncPopUserRegistOpen(); return false;" style="background: blue;" >회원가입</button>
</div>
</div>
</div>

View File

@ -81,7 +81,7 @@
var formData = new FormData(form);
$.ajax({
url: '/main/searchIdFind.do'
url: '/main/noAuthSearchIdFind.do'
, type: 'post'
, enctype:'multipart/form-data'
, data: formData
@ -91,6 +91,11 @@
, cache:false
, success: function(data)
{
if(data.userId==null || data.userId =='')
{
alert("사용자 정보를 찾을수가 없습니다.");
}
$('#userId').val(data.userId);
},
error: function(errorThrown)

View File

@ -48,17 +48,17 @@
{
if ($('#userId').val()=='')
{
alert("성명을 입력하세요");
alert("아이디을 입력하세요");
return false;
}
if ($('#userNm').val()=='')
{
alert("명을 입력하세요");
alert("사용자명을 입력하세요");
return false;
}
else if ($('#userEmail').val()=='')
{
alert("Email 입력하세요");
alert("Email 입력하세요");
return false;
}
else
@ -79,14 +79,14 @@
// 서블릿 통신
var proc =
{
// 인스던트 처리완료
// 비밀번호 초기화
fn_password_reset : function ()
{
var form = $('#PopPasswordReset')[0];
var formData = new FormData(form);
$.ajax({
url: '/main/UserPasswordResetExt.do'
url: '/main/noAuthUserPasswordResetExt.do'
, type: 'post'
, enctype:'multipart/form-data'
, data: formData
@ -96,12 +96,21 @@
, cache:false
, success: function(data)
{
alert(JSON.stringify(data));
if(data.resultCd == 0)
{
alert("새로운 비밀번호가 정상적으로 보내졌습니다. \n E-mail을 확인하시기 바랍니다.");
fncClose();
}
else
{
alert("비밀번호 초기화에 실패하였습니다. \n사용자정보을 확인해주시길 바랍니다.");
}
// alert(JSON.stringify(data));
// $('#userId').val(data.userId);
},
error: function(errorThrown)
{
alert("ID 찾기 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
alert("Password 초기화중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
@ -137,7 +146,7 @@
<tbody>
<tr>
<th>
성명
아이디
</th>
<td>
<input type="text" name="userId" id="userId" class="txt_id" >

View File

@ -0,0 +1,375 @@
<!DOCTYPE html>
<%--
/**
* @Class Name : PopUserRegist.jsp
* @Description : 회원가입 팝엄 화면
* @Modification Information
* @
* @ 수정일 수정자 수정내용
* @ ---------- -------- ---------------------------
* @ 2026.01.19 나혁제 최초 생성
*
* @author urp 인프라본부 나혁제
* @since 2026.01.19
* @version 1.0
* @see
*
*/
--%>
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<title>ID 찾기</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link type="text/css" rel="stylesheet" href="<c:url value='/egov/css/com/com_urp.css'/>">
<script type="text/javascript" src="<c:url value="/validator.do"/>"></script>
<validator:javascript formName="userManageExtVO" staticJavascript="false" xhtml="true" cdata="false"/>
<script type="text/javaScript" language="javascript" defer="defer">
//----------------------------------------
// 화면 초기화
// ----------------------------------------
$(document).ready(function()
{
// alert("한번봅시다.");
// fn_modal_setting();
});
//----------------------------------------
// 초기화
// ----------------------------------------
function fn_egov_init()
{
fn_modal_setting();
// 팝업 화면 맨앞으로 배치
$(".modal-content").css("width", "35%");
}
//----------------------------------------
// 모달셋팅
// ----------------------------------------
function fn_modal_setting()
{
//버튼에 모달 연결
$("#btnEmplyrId").egovModal( "egovModal" );
//타이틀 설졍
$("#egovModal").setEgovModalTitle("<spring:message code="comUssUmt.userManageRegistModal.title" />"); //아이디 중복 확인
var content = "";
content = content + "<div class='modal-alignL' style='margin:5px 0 0 0'>"+"<spring:message code="comUssUmt.userManageRegistModal.userIsId" /> :"+"</div>"; //사용할아이디
content = content + "<div class='modal-alignL'>"+"<input type='text' id='checkIdModal' name='checkIdModal' value='' size='20' maxlength='20' />"+"</div>";
content += "<div style='clear:both;'></div>";
content += "<div id='divModalResult' style='margin:10px 0 0 0'><spring:message code="comUssUmt.userManageRegistModal.initStatus" /></div>"; //결과 : 중복확인을 실행하십시오.
//모달 body 설정
$("#egovModal").setEgovModalBody(content);
var footer = "";
footer += "<span class='btn_style1 blue' id='btnModalOk' onclick='fn_id_checkOk()'><a href='#'>확인</a></span>&nbsp;";
footer += "<span class='btn_style1 blue' id='btnModalSelect' onclick='fn_id_check()'><a href='#'>조회</a></span>&nbsp;";
//모달 footer 설정
$("#egovModal").setEgovModalfooter(footer);
//엔터이벤트처리
$("input[name=checkIdModal]").keydown(function (key) {
if(key.keyCode == 13){
fn_id_check();
}
});
footer = null;
content = null;
}
//----------------------------------------
// 아이디 체크 AJAX
// ----------------------------------------
function fn_id_check()
{
$.ajax({
type:"POST",
url:"<c:url value='/main/noAuthIdDplctCnfirmAjax.do' />",
data:{
"checkId": $("#checkIdModal").val()
},
dataType:'json',
timeout:(1000*30),
success:function(returnData, status){
if(status == "success") {
if(returnData.usedCnt > 0 ){
//사용할수 없는 아이디입니다.
$("#divModalResult").html("<font color='red'><spring:message code="comUssUmt.userManageRegistModal.result" /> : ["+returnData.checkId+"]<spring:message code="comUssUmt.userManageRegistModal.useMsg" /></font>");
}else{
//사용가능한 아이디입니다.
$("#divModalResult").html("<font color='blue'><spring:message code="comUssUmt.userManageRegistModal.result" /> : ["+returnData.checkId+"]<spring:message code="comUssUmt.userManageRegistModal.notUseMsg" /></font>");
}
}else{ alert("ERROR!");return;}
}
});
}
//----------------------------------------
// 아이디 체크 확인
// ----------------------------------------
function fn_id_checkOk()
{
$.ajax({
type:"POST",
url:"<c:url value='/main/noAuthIdDplctCnfirmAjax.do' />",
data:{
"checkId": $("#checkIdModal").val()
},
dataType:'json',
timeout:(1000*30),
success:function(returnData, status){
if(status == "success") {
if(returnData.usedCnt > 0 ){
alert("<spring:message code="comUssUmt.userManageRegistModal.noIdMsg" />"); //사용이 불가능한 아이디 입니다.
return;
}else{
$("input[name=emplyrId]").val(returnData.checkId);
$("#egovModal").setEgovModalClose();
}
}else{ alert("ERROR!");return;}
}
});
}
//----------------------------------------
// 등록
// ----------------------------------------
function fnInsert(form)
{
if(confirm("<spring:message code="common.regist.msg" />"))
{
if(validateUserManageExtVO(form))
{
if(form.password.value != form.password2.value)
{
alert("<spring:message code="fail.user.passwordUpdate2" />");
return false;
}
proc.fn_user_save();
}
}
}
//----------------------------------------
// 닫기
// ----------------------------------------
function fncClose()
{
parent.$('.ui-dialog-content').dialog('close');
}
//----------------------------------------
// 서블릿 통신
// ----------------------------------------
var proc =
{
// 사용자 정보 입력
fn_user_save : function ()
{
var form = $('#userManageExtVO')[0];
var formData = new FormData(form);
$.ajax({
url: '/main/noAuthUserInsertExt.do'
, type: 'post'
, enctype:'multipart/form-data'
, data: formData
, dataType: 'json'
, processData:false
, contentType:false
, cache:false
, success: function(data)
{
alert(data.resultMsg);
if(data.resultCd == 0)
{
fncClose();
}
},
error: function(errorThrown)
{
alert("사용자정보 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
console.log(JSON.stringify(errorThrown));
}
});
}
}
</script>
<!-- javascript warning tag -->
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
<body onload="fn_egov_init()">
<form:form modelAttribute="userManageExtVO" name="userManageExtVO" action="" method="post">
<!-- main title -->
<div class="main_titWrap">
<h3>회원가입</h3>
</div>
<!-- Form 테이블 :start -->
<div class="bbs_view">
<!--등록폼 -->
<table class="tbl_form" summary="<spring:message code="common.summary.list" arguments="등록" />">
<caption>회원가입</caption>
<colgroup>
<col style="width: 20%;">
<col style="width: 30%;">
<col style="width: 20%;">
<col style="width: 30%;">
</colgroup>
<tbody>
<tr>
<!-- 일반회원아이디 -->
<c:set var="title"><spring:message code="comUssUmt.deptUserManageRegist.id"/></c:set>
<th><label for="emplyrId">${title}</label> <span class="pilsu">*</span></th>
<td class="left">
<form:input path="emplyrId" id="emplyrId" title="${title} ${inputTxt}" size="20" readonly="true" maxlength="20" style="width:95%;font-weight: bold;" />
<br>
<button id="btnEmplyrId" type="button" class="btn-primary" style="margin-top:5px;" title="<spring:message code="comUssUmt.deptUserManageRegistBtn.idSearch" />" onclick="return false;" ><spring:message code="comUssUmt.deptUserManageRegistBtn.idSearch" /></button>
<div><form:errors path="emplyrId" cssClass="error" /></div>
</td>
<!-- 일반회원이름 -->
<c:set var="title"><spring:message code="comUssUmt.deptUserManageRegist.name"/></c:set>
<th><label for="emplyrNm">${title}</label> <span class="pilsu">*</span></th>
<td class="left">
<form:input path="emplyrNm" title="${title} ${inputTxt}" size="50" maxlength="60" style="width:95%;" />
<div><form:errors path="emplyrNm" cssClass="error" /></div>
</td>
</tr>
<tr>
<c:set var="title"><spring:message code="comUssUmt.deptUserManageRegist.pass"/></c:set>
<th><label for="password">${title}</label> <span class="pilsu">*</span></th>
<td class="left">
<div>
<form:password path="password" title="${title} ${inputTxt}" size="50" maxlength="20" style="width:95%;" />
<div><form:errors path="password" cssClass="error" /></div>
</div>
</td>
<!-- 비밀번호확인 -->
<c:set var="title"><spring:message code="comUssUmt.deptUserManageRegist.passConfirm"/></c:set>
<th><label for="password2">${title}</label> <span class="pilsu">*</span></th>
<td class="left">
<input name="password2" id="password2" title="${title} ${inputTxt}" type="password" size="50" maxlength="20" style="width:95%;" />
</td>
</tr>
<tr>
<th></th>
<td colspan=3 class="left">
<div>
<div><spring:message code="info.password.rule.password1" /></div>
<div><spring:message code="info.password.rule.pwdcheckcomb3" /></div>
<div><spring:message code="info.password.rule.pwdcheckseries" /></div>
</div>
</td>
</tr>
<tr>
<!-- 헨드폰번호 -->
<c:set var="title"><spring:message code="comUssUmt.deptUserManageRegist.phone"/></c:set>
<th><label for="moblphonNo">${title}</label> <span class="pilsu">*</span></th>
<td class="left">
<form:input path="moblphonNo" id="moblphonNo" title="${title} ${inputTxt}" cssClass="txaIpUmt" size="20" maxlength="15" style="width:95%;" />
<div><form:errors path="moblphonNo" cssClass="error" /></div>
</td>
<!-- 이메일주소 -->
<c:set var="title"><spring:message code="comUssUmt.deptUserManageRegist.email"/></c:set>
<th><label for="emailAdres">${title}</label> <span class="pilsu">*</span></th>
<td class="left">
<form:input path="emailAdres" id="mberEmailAdres" title="${title} ${inputTxt}" cssClass="txaIpUmt" size="30" maxlength="50" style="width:95%;" />
<div><form:errors path="emailAdres" cssClass="error" /></div>
</td>
</tr>
<!-- 조직아이디 -->
<tr>
<c:set var="title"><spring:message code="comUssUmt.deptUserManageRegist.orgnztId"/></c:set>
<th><label for="orgnztId">${title}</label></th>
<td colspan=3 class="left">
<form:select path="orgnztId" id="orgnztId" title="${title} ${inputSelect}">
<form:option value="" label="${inputSelect}"/>
<form:options items="${orgnztId_result}" itemValue="code" itemLabel="codeNm"/>
</form:select>
<div><form:errors path="orgnztId" cssClass="error"/></div>
</td>
</tr>
<!-- 그룹아이디 -->
<tr>
<c:set var="title"><spring:message code="comUssUmt.deptUserManageRegist.groupId"/></c:set>
<th><label for="groupId">${title}</label> <span class="pilsu">*</span></th>
<td colspan=3 class="left">
<form:select path="groupId" id="groupId" title="${title} ${inputSelect}">
<form:option value="" label="${inputSelect}"/>
<form:options items="${groupId_result}" itemValue="code" itemLabel="codeNm"/>
</form:select>
<div><form:errors path="groupId" cssClass="error"/></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="btn_group">
<button type="button" class="btn-function" id="btnConfirm" onclick="fnInsert(document.userManageExtVO); return false;" title="등록">등록</button>
<button type="button" class="btn-cancel" id="btnCancel" onclick="fncClose(); return false;" title="닫기">닫기</button>
</div>
<!-- 검색조건 유지 -->
<input type="hidden" name="searchCondition" value="<c:out value='${userSearchVO.searchCondition}'/>"/>
<input type="hidden" name="searchKeyword" value="<c:out value='${userSearchVO.searchKeyword}'/>"/>
<input type="hidden" name="sbscrbSttus" value="<c:out value='${userSearchVO.sbscrbSttus}'/>"/>
<input type="hidden" name="pageIndex" value="<c:out value='${userSearchVO.pageIndex}'/>"/>
<!-- 우편번호검색 -->
<input type="hidden" name="zip_url" value="<c:url value='/sym/ccm/zip/EgovCcmZipSearchPopup.do'/>" />
</form:form>
</body>
<!-- Egov Modal include -->
<c:import url="/EgovModal.do" charEncoding="utf-8">
<c:param name="scriptYn" value="Y" />
<c:param name="modalName" value="egovModal" />
</c:import>