외사활동 작업중.

master
강석 최 2023-03-06 19:15:03 +09:00
parent 600f154f80
commit 2d79466c8c
20 changed files with 530 additions and 214 deletions

View File

@ -56,8 +56,6 @@ public class ModalController {
userInfo.setUserStatus("USC003");
}
mav.addObject("pageName", pageName);
mav.addObject("OgList", codeMgtService.selectCodeMgtList("OG"));
mav.addObject("OfcList", codeMgtService.selectCodeMgtList("OFC"));
mav.addObject("userInfoList", userInfoService.selectUserInfoList(userInfo));
userInfo.setContentCnt(userInfoService.selectUserInfoListCnt(userInfo));
userInfo.setPaginationInfo();

View File

@ -3,6 +3,8 @@ package com.dbnt.faisp.main.counterIntelligence.activityCase;
import com.dbnt.faisp.main.authMgt.service.AuthMgtService;
import com.dbnt.faisp.main.codeMgt.service.CodeMgtService;
import com.dbnt.faisp.main.counterIntelligence.activityCase.model.ActivityCase;
import com.dbnt.faisp.main.counterIntelligence.activityCase.model.ActivityCaseApprv;
import com.dbnt.faisp.main.counterIntelligence.activityCase.model.ActivityCaseBoard;
import com.dbnt.faisp.main.counterIntelligence.activityCase.model.ActivityCaseInfo;
import com.dbnt.faisp.main.counterIntelligence.activityCase.service.ActivityCaseService;
import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceWork;
@ -27,7 +29,7 @@ public class ActivityCaseController {
private final CodeMgtService codeMgtService;
@GetMapping("/activityCaseList")
public ModelAndView activityCaseListPage(@AuthenticationPrincipal UserInfo loginUser, ActivityCase activityCase){
public ModelAndView activityCaseListPage(@AuthenticationPrincipal UserInfo loginUser, ActivityCaseBoard activityCase){
ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/activityCaseBoard");
mav.addObject("searchUrl", "/counterIntelligence/activityCaseList");
String accessAuth = authMgtService.selectAccessConfigList
@ -64,7 +66,6 @@ public class ActivityCaseController {
activityCase.setWrtUserSeq(loginUser.getUserSeq());
activityCase.setWrtUserGrd(loginUser.getTitleCd());
activityCase.setWrtUserNm(loginUser.getUserNm());
activityCaseInfo.setWrtDt(LocalDateTime.now());
}else{
activityCase = activityCaseService.selectActivityCase(activityCase.getReceiptKey());
activityCaseInfo = activityCaseService.selectActivityCaseInfo(activityCaseInfo.getCaseKey());
@ -80,30 +81,48 @@ public class ActivityCaseController {
@GetMapping("/getSuspectDiv")
public ModelAndView suspectDiv(){
ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/suspectDiv");
mav.addObject("acsList", codeMgtService.selectCodeMgtList("ACS"));
return mav;
}
@PostMapping("/getApprvDiv")
@ResponseBody
@PostMapping("/getOfficerDiv")
public ModelAndView officerDiv(@RequestBody List<UserInfo> userList){
ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/officerDiv");
mav.addObject("officerList", userList);
mav.addObject("acoList", codeMgtService.selectCodeMgtList("ACO"));
public ModelAndView apprvDiv(@RequestBody List<ActivityCaseApprv> apprvList){
ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/apprvDiv");
mav.addObject("userList", apprvList);
return mav;
}
@GetMapping("/activityCaseSummaryModal")
public ModelAndView activityCaseSummaryModal(@AuthenticationPrincipal UserInfo loginUser, ActivityCaseBoard activityCase){
ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/activityCaseSummaryModal");
mav.addObject("activityCaseList", activityCaseService.selectActivityCaseList(activityCase));
return mav;
}
@GetMapping("/activityCaseViewModal")
public ModelAndView activityCaseViewModal(@AuthenticationPrincipal UserInfo loginUser, ActivityCase activityCase){
ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/activityCaseViewModal");
mav.addObject("lineSeparator", '\n');
public ModelAndView activityCaseViewModal(@AuthenticationPrincipal UserInfo loginUser, ActivityCaseBoard activityCase){
ModelAndView mav = null;
ActivityCaseInfo activityCaseInfo = activityCaseService.selectActivityCaseInfo(activityCase.getCaseKey());
switch (activityCaseInfo.getCaseType()){
case "ACT001":
mav = new ModelAndView("counterIntelligence/activityCase/activityCase1ViewModal");
break;
case "ACT002":
mav = new ModelAndView("counterIntelligence/activityCase/activityCase2ViewModal");
break;
case "ACT003":
mav = new ModelAndView("counterIntelligence/activityCase/activityCase3ViewModal");
break;
}
mav.addObject("viewUserSeq", loginUser.getUserSeq());
String accessAuth = authMgtService.selectAccessConfigList
(loginUser.getUserSeq(), "/counterIntelligence/activityCaseList").get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth);
mav.addObject("activityCase", activityCaseService.selectActivityCase(activityCase.getReceiptKey()));
mav.addObject("activityCaseInfo", activityCaseInfo);
mav.addObject("activityCase", activityCaseService.selectActivityCase(activityCaseInfo.getReceiptKey()));
return mav;
}
@PostMapping("/saveActivityCase")
public Integer saveActivityCase(ActivityCase activityCase,
ActivityCaseInfo activityCaseInfo,

View File

@ -1,19 +1,23 @@
package com.dbnt.faisp.main.counterIntelligence.activityCase.mapper;
import com.dbnt.faisp.main.counterIntelligence.activityCase.model.ActivityCase;
import com.dbnt.faisp.main.counterIntelligence.activityCase.model.ActivityCaseBoard;
import com.dbnt.faisp.main.counterIntelligence.model.CiWorkStatistics;
import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceActivity;
import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceWork;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
@Mapper
public interface ActivityCaseMapper {
List<ActivityCase> selectActivityCaseList(ActivityCase activityCase);
List<ActivityCase> selectActivityCaseList(ActivityCaseBoard activityCase);
Integer selectActivityCaseCnt(ActivityCase activityCase);
Integer selectActivityCaseCnt(ActivityCaseBoard activityCase);
Integer selectReceiptNum(int year);
Integer selectCaseNum(Map<String, Object> map);
}

View File

@ -27,6 +27,8 @@ public class ActivityCaseApprv {
private Integer userSeq;
@Column(name = "apprv_path")
private String apprvPath;
@Column(name = "apprv_type")
private String apprvType;
@Column(name = "og_cd")
private String ogCd;
@Column(name = "ofc_cd")

View File

@ -0,0 +1,35 @@
package com.dbnt.faisp.main.counterIntelligence.activityCase.model;
import com.dbnt.faisp.config.BaseModel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Getter
@Setter
@NoArgsConstructor
public class ActivityCaseBoard extends BaseModel {
private Integer receiptKey;
private String receiptNum;
private String wrtOrgan;
private String wrtPart;
private Integer wrtUserSeq;
private String wrtUserGrd;
private String wrtUserNm;
private Integer caseKey;
private String caseNum;
private LocalDate reportDate;
private String caseType;
private String title;
private LocalDateTime wrtDt;
private Integer apprvCnt;
private Integer allCnt;
private Integer fileCnt;
}

View File

@ -10,6 +10,7 @@ import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.multipart.MultipartFile;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@ -29,6 +30,9 @@ public class ActivityCaseInfo extends BaseModel {
private Integer receiptKey;
@Column(name = "case_num")
private String caseNum;
@Column(name = "report_date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate reportDate;
@Column(name = "case_type")
private String caseType;
@Column(name = "title")

View File

@ -10,4 +10,6 @@ import java.util.Optional;
public interface ActivityCaseApprvRepository extends JpaRepository<ActivityCaseApprv, ActivityCaseApprv.ActivityCaseApprvId> {
List<ActivityCaseApprv> findByCaseKey(Integer caseKey);
}

View File

@ -12,4 +12,5 @@ public interface ActivityCaseFileRepository extends JpaRepository<ActivityCaseFi
List<ActivityCaseFile> findByCaseKey(Integer caseKey);
Optional<ActivityCaseFile> findTopByCaseKeyOrderByFileSeqDesc(Integer caseKey);
List<ActivityCaseFile> findByCaseKeyOrderByFileSeqAsc(Integer caseKey);
}

View File

@ -9,4 +9,5 @@ import java.util.Optional;
public interface ActivityCaseSuspectRepository extends JpaRepository<ActivityCaseSuspect, ActivityCaseSuspect.ActivityCaseSuspectId> {
List<ActivityCaseSuspect> findByReceiptKeyOrderBySuspectSeqDesc(Integer receiptKey);
}

View File

@ -5,13 +5,18 @@ import com.dbnt.faisp.config.FileInfo;
import com.dbnt.faisp.main.counterIntelligence.activityCase.mapper.ActivityCaseMapper;
import com.dbnt.faisp.main.counterIntelligence.activityCase.model.*;
import com.dbnt.faisp.main.counterIntelligence.activityCase.repository.*;
import com.dbnt.faisp.util.Utils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Service
@ -24,36 +29,56 @@ public class ActivityCaseService extends BaseService {
private final ActivityCaseApprvRepository acaRepository;
private final ActivityCaseMapper acMapper;
public List<ActivityCase> selectActivityCaseList(ActivityCase activityCase){
public List<ActivityCase> selectActivityCaseList(ActivityCaseBoard activityCase){
return acMapper.selectActivityCaseList(activityCase);
}
public Integer selectActivityCaseCnt(ActivityCase activityCase){
public Integer selectActivityCaseCnt(ActivityCaseBoard activityCase){
return acMapper.selectActivityCaseCnt(activityCase);
}
public ActivityCase selectActivityCase(Integer receiptKey) {
ActivityCase activityCase = acRepository.findById(receiptKey).orElse(null);
activityCase.setSuspectList(acsRepository.findByReceiptKeyOrderBySuspectSeqDesc(receiptKey));
return activityCase;
}
public ActivityCaseInfo selectActivityCaseInfo(Integer caseKey) {
ActivityCaseInfo activityCaseInfo = aciRepository.findById(caseKey).orElse(null);
activityCaseInfo.setApprvList(acaRepository.findByCaseKey(caseKey));
activityCaseInfo.setFileList(acfRepository.findByCaseKeyOrderByFileSeqAsc(caseKey));
return activityCaseInfo;
}
@Transactional
public Integer saveActivityCase(ActivityCase activityCase, ActivityCaseInfo activityCaseInfo, List<Integer> deleteFileSeq) {
Integer receiptKey = acRepository.save(activityCase).getReceiptKey();
return receiptKey;
}
private void saveActivityCaseSuspect(Integer caseKey, List<ActivityCaseSuspect> suspectList) {
if(suspectList==null){
Integer receiptKey = null;
if(Utils.isEmpty(activityCase.getReceiptKey())){
if(Utils.isEmpty(activityCase.getReceiptNum())){
activityCase.setReceiptNum(makeReceiptNum(LocalDate.now().getYear()));
}
receiptKey = acRepository.save(activityCase).getReceiptKey();
}else{
receiptKey = activityCase.getReceiptKey();
}
int suspectSeq = 1;
for(ActivityCaseSuspect suspect: activityCase.getSuspectList()){
suspect.setSuspectSeq(suspectSeq++);
suspect.setReceiptKey(receiptKey);
}
acsRepository.saveAll(activityCase.getSuspectList());
if(Utils.isEmpty(activityCaseInfo.getCaseNum())){
activityCaseInfo.setCaseNum(makeCaseNum(LocalDate.now().getYear(), activityCase.getReceiptNum()));
}
activityCaseInfo.setReceiptKey(receiptKey);
activityCaseInfo.setWrtDt(LocalDateTime.now());
Integer caseKey = aciRepository.save(activityCaseInfo).getCaseKey();
deleteActivityCaseFile(caseKey, deleteFileSeq);
saveUploadFiles(caseKey, activityCaseInfo.getMultipartFileList());
for(ActivityCaseApprv apprv: activityCaseInfo.getApprvList()){
apprv.setCaseKey(caseKey);
}
acaRepository.saveAll(activityCaseInfo.getApprvList());
return caseKey;
}
private void deleteActivityCaseFile(Integer caseKey, List<Integer> deleteFileSeq) {
@ -98,4 +123,22 @@ public class ActivityCaseService extends BaseService {
return receiptKey;
}
@Transactional
public Integer deleteActivityCaseInfo(Integer caseKey) {
ActivityCaseInfo activityCaseInfo = aciRepository.findById(caseKey).orElse(null);
return caseKey;
}
private String makeReceiptNum(int year){
String receiptNum = "00"+acMapper.selectReceiptNum(year);
return year+"-"+receiptNum.substring(receiptNum.length()-3);
}
private String makeCaseNum(int year, String receiptNum){
Map<String, Object> params = new HashMap<>();
params.put("receiptNum", receiptNum);
params.put("year", year);
String caseNum = "00"+acMapper.selectCaseNum(params);
return year+"-"+caseNum.substring(caseNum.length()-3);
}
}

View File

@ -6,67 +6,103 @@
<mapper namespace="com.dbnt.faisp.main.counterIntelligence.activityCase.mapper.ActivityCaseMapper">
<sql id="selectActivityCaseListWhere">
<where>
<if test='receiptKey != null and receiptKey != ""'>
and a.receipt_key = #{receiptKey}
</if>
<if test='receiptNum != null and receiptNum != ""'>
and a.receipt_num like '%'||#{receiptNum}||'%'
</if>
<if test='wrtUserNm != null and wrtUserNm != ""'>
and a.wrt_user_nm like '%'||#{wrtUserNm}||'%'
</if>
<if test='wrtOrgan != null and wrtOrgan != ""'>
and a.wrt_organ = #{wrtOrgan}
</if>
<if test='dateSelector == "receiptDt"'>
<if test='dateSelector == "reportDate"'>
<if test='startDate != null and startDate != ""'>
and a.receipt_dt >= #{startDate}::date
and b.report_date >= #{startDate}::date
</if>
<if test='endDate != null and endDate != ""'>
and a.receipt_dt &lt;= #{endDate}::date+1
</if>
</if>
<if test='dateSelector == "resultDt"'>
<if test='startDate != null and startDate != ""'>
and a.result_dt >= #{startDate}::date
</if>
<if test='endDate != null and endDate != ""'>
and a.result_dt &lt;= #{endDate}::date+1
and b.report_date &lt;= #{endDate}::date+1
</if>
</if>
<if test='dateSelector == "wrtDt"'>
<if test='startDate != null and startDate != ""'>
and a.wrt_dt >= #{startDate}::date
and b.wrt_dt >= #{startDate}::date
</if>
<if test='endDate != null and endDate != ""'>
and a.wrt_dt &lt;= #{endDate}::date+1
and b.wrt_dt &lt;= #{endDate}::date+1
</if>
</if>
</where>
</sql>
<select id="selectActivityCaseList" parameterType="ActivityCase" resultType="ActivityCase">
select a.ciw_key,
a.status,
a.work_rating,
a.work_start_date,
a.work_end_date,
a.re_rating_date1,
a.re_rating_date2,
a.title,
a.wrt_organ,
a.wrt_part,
a.wrt_user_seq,
a.wrt_user_grd,
a.wrt_user_nm,
a.wrt_dt,
b.fileCnt
from counter_intelligence_work a
left outer join (select ciw_key, count(*) as fileCnt from ciw_file group by ciw_key) b
on a.ciw_key = b.ciw_key
<select id="selectActivityCaseList" parameterType="ActivityCaseBoard" resultType="ActivityCaseBoard">
select a.receipt_key,
a.receipt_num ,
a.wrt_organ ,
a.wrt_part ,
a.wrt_user_seq ,
a.wrt_user_grd ,
a.wrt_user_nm ,
b.case_key ,
b.case_num ,
b.report_date ,
b.case_type ,
b.title,
b.wrt_dt,
c.apprvCnt,
c.allCnt,
d.fileCnt
from activity_case a
inner join activity_case_info b
on a.receipt_key = b.receipt_key
inner join (
select case_key,
count(apprv_yn = 'Y' or apprv_yn = 'N') as apprvCnt,
count(*) as allCnt
from activity_case_apprv
group by case_key
) c on b.case_key = c.case_key
inner join (
select case_key, count(*) as fileCnt
from activity_case_file
group by case_key
) d on b.case_key = d.case_key
<include refid="selectActivityCaseListWhere"></include>
ORDER BY a.ciw_key DESC
ORDER BY b.wrt_dt DESC
LIMIT #{rowCnt} OFFSET #{firstIndex}
</select>
<select id="selectActivityCaseCnt" parameterType="ActivityCase" resultType="int">
<select id="selectActivityCaseCnt" parameterType="ActivityCaseBoard" resultType="int">
select count(*)
from counter_intelligence_work a
left outer join (select ciw_key, count(*) as fileCnt from ciw_file group by ciw_key) b
on a.ciw_key = b.ciw_key
from activity_case a
inner join activity_case_info b
on a.receipt_key = b.receipt_key
inner join (
select case_key,
count(apprv_yn = 'Y' or apprv_yn = 'N') as apprvCnt,
count(*) as allCnt
from activity_case_apprv
group by case_key
) c on b.case_key = c.case_key
inner join (
select case_key, count(*) as fileCnt
from activity_case_file
group by case_key
) d on b.case_key = d.case_key
<include refid="selectActivityCaseListWhere"></include>
</select>
<select id="selectReceiptNum" resultType="int" parameterType="int">
select count(*)+1
from activity_case
where receipt_num like #{year}||'%'
</select>
<select id="selectCaseNum" resultType="int" parameterType="hashMap">
select count(*)+1
from activity_case a
inner join activity_case_info b
on a.receipt_key = b.receipt_key
where a.receipt_num = #{receiptNum}
and b.case_num like #{year}||'%'
</select>
</mapper>

View File

@ -349,7 +349,6 @@ function ajaxErrorAction(e){
}else if(e.responseText.includes("접근이 거부되었습니다.")){
alert("접근이 거부되었습니다.")
location.href="/";
}
}
}

View File

@ -8,25 +8,46 @@ $(document).on('click', '#suspectAddBtn', function (){
getSuspectDiv()
})
$(document).on('click', '#apprvAddBtn', function (){
searchModalSubmit(1);
$("#userModal").modal('show');
})
$(document).on('click', '#getUserBtn', function (){
const selectedUser = $(".userInfoCheckBox:checked").parents(".userInfoTr")
const userList = [];
$.each(selectedUser, function (idx, tr){
const row = $(tr);
userList.push({
userSeq: row.find('.userSeq').val(),
ogCd: row.find('.ogCd').val(),
ofcCd: row.find('.ofcCd').val(),
titleCd: row.find('.titleCd').val(),
userNm: row.find('.userNm').val()
})
})
getApprvDiv(userList);
})
$(document).on('click', '.rowDeleteBtn', function (){
$(this).parents(".suspectDiv").remove();
$(this).parents(".apprvDiv").remove();
})
$(document).on('click', '.saveBtn', function(){
saveActivityCase($(this).attr("data-status"));
})
$(document).on('click', '.activityCaseTr', function (){
getActivityCaseViewModal($(this).find(".ciwKey").val());
})
$(document).on('click', '#editActivityCaseBtn', function (){
$("#activityCaseViewModal").modal('hide');
getActivityCaseEditModal($(this).attr("data-casekey"));
})
$(document).on('click', '#deleteActivityCaseBtn', function (){
deleteActivityCase($(this).attr("data-casekey"));
$(document).on('click', '.activityCaseTr', function (){
getActivityCaseSummaryModal($(this).find(".receiptKey").val());
})
$(document).on('click', '.summaryTr', function (){
getActivityCaseViewModal($(this).find(".caseKey").val());
})
function getActivityCaseEditModal(caseKey, caseType){
@ -58,6 +79,47 @@ function getSuspectDiv(){
dataType:"html",
success: function(html){
$("#suspectHome").append(html)
$(".suspectBirthDate").datepicker({
format: "yyyy-mm-dd",
language: "ko",
autoclose: true
});
},
error:function(e){
ajaxErrorAction(e);
}
});
}
function getApprvDiv(apprvList){
$.ajax({
type: 'POST',
url: '/counterIntelligence/getApprvDiv',
data: JSON.stringify(apprvList),
contentType: 'application/json',
dataType:"html",
beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
},
success: function(html){
$("#apprvHome").empty().append(html)
$("#userModal").modal('hide');
},
error:function(e){
ajaxErrorAction(e);
}
});
}
function getActivityCaseSummaryModal(receiptKey){
$.ajax({
url: '/counterIntelligence/activityCaseSummaryModal',
data: {receiptKey: receiptKey},
type: 'GET',
dataType:"html",
success: function(html){
$("#activityCaseSummaryModalBody").empty().append(html)
$("#activityCaseSummaryModal").modal('show');
},
error:function(e){
ajaxErrorAction(e);
@ -110,13 +172,14 @@ function saveActivityCase(status){
formData.append('suspectList['+idx+'].area', $(el).find(".suspectArea").val());
formData.append('suspectList['+idx+'].etc', $(el).find(".suspectEtc").val());
})
$(".officerRow").each(function (idx, el){
formData.append('officerList['+idx+'].type', $(el).find(".officerType").val());
formData.append('officerList['+idx+'].userSeq', $(el).find(".userSeq").val());
formData.append('officerList['+idx+'].ogCd', $(el).find(".ogCd").val());
formData.append('officerList['+idx+'].ofcCd', $(el).find(".ofcCd").val());
formData.append('officerList['+idx+'].titleCd', $(el).find(".titleCd").val());
formData.append('officerList['+idx+'].userNm', $(el).find(".userNm").val());
$(".apprvDiv").each(function (idx, el){
formData.append('apprvList['+idx+'].userSeq', $(el).find(".userSeq").val());
formData.append('apprvList['+idx+'].apprvPath', $(el).find(".apprvPath").val());
formData.append('apprvList['+idx+'].apprvType', $(el).find(".apprvType").val());
formData.append('apprvList['+idx+'].ogCd', $(el).find(".ogCd").val());
formData.append('apprvList['+idx+'].ofcCd', $(el).find(".ofcCd").val());
formData.append('apprvList['+idx+'].titleCd', $(el).find(".titleCd").val());
formData.append('apprvList['+idx+'].userNm', $(el).find(".userNm").val());
})
$.ajax({
type : 'POST',
@ -127,8 +190,7 @@ function saveActivityCase(status){
success : function(result) {
alert("저장되었습니다.");
contentFade("out");
$("#activityCaseEditModal").modal('hide');
getActivityCaseViewModal(result);
location.reload();
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")
@ -167,21 +229,58 @@ function deleteActivityCase(caseKey){
}
function contentCheck(){
if(!$("#receiptNum").val()){
alert("접수번호을 입력해주세요.")
if(!$("#title").val()){
alert("제목을 입력해주세요.")
return false;
}
if(!$("#receiptDt").val()){
alert("접수일을 입력해주세요.")
if(!$("#reportDt").val()){
alert("보고일자를 입력해주세요.")
return false;
}
if(!$("#receiptClue").val()){
alert("접수단서를 입력해주세요.")
return false;
}
if(!$("#caseInfo").val()){
alert("첩보개요를 입력해주세요.")
return false;
switch ($("#caseType").val()) {
case "ACT001":
if(!$("#caseProgress").val()){
alert("외사활동 사항을 입력해주세요.")
return false;
}
if(!$("#description").val()){
alert("외사활동이 필요한 이유를 입력해주세요.")
return false;
}
break;
case "ACT002":
if(!$("#caseProgress").val()){
alert("외사활동 사항을 입력해주세요.")
return false;
}
if(!$("#description").val()){
alert("조치 및 건의를 입력해주세요.")
return false;
}
break;
case "ACT003":
if(!$("#allegations").val()){
alert("혐의요지를 입력해주세요.")
return false;
}
if(!$("#applicableLaw").val()){
alert("적용법조를 입력해주세요.")
return false;
}
if(!$("#caseProgress").val()){
alert("내사진행상황을 입력해주세요.")
return false;
}
if(!$("#description").val()){
alert("조치 및 건의를 입력해주세요.")
return false;
}
if(!$("#activityResult").val()){
alert("결과를 선택해주세요.")
return false;
}
break;
}
return true;
}

View File

@ -13,16 +13,16 @@
<div class="col-auto" th:classappend="${pageName eq 'activityCase'?'d-none':''}">
<select class="form-select form-select-sm" name="ogCd">
<option value="">관서 선택</option>
<th:block th:each="commonCode:${OgList}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${searchParams.ogCd==commonCode.itemCd}"></option>
<th:block th:each="code:${session.commonCode.get('OG')}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${searchParams.ogCd eq code.itemCd}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<select class="form-select form-select-sm" name="ofcCd">
<option value="">부서 선택</option>
<th:block th:each="commonCode:${OfcList}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${searchParams.ofcCd==commonCode.itemCd}"></option>
<th:block th:each="code:${session.commonCode.get(searchParams.ogCd)}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${searchParams.ofcCd eq code.itemCd}"></option>
</th:block>
</select>
</div>
@ -67,16 +67,20 @@
<input type="checkbox" name="userChk" class="userInfoCheckBox" th:value="${userInfo.userSeq}">
</td>
<td>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<th:block th:if="${commonCode.itemCd eq userInfo.ogCd}" th:text="${commonCode.itemValue}"></th:block>
<th:block th:each="code:${session.commonCode.get('OG')}">
<th:block th:if="${code.itemCd eq userInfo.ogCd}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<td>
<th:block th:each="commonCode:${session.commonCode.get(userInfo.ogCd)}">
<th:block th:if="${commonCode.itemCd eq userInfo.ofcCd}" th:text="${commonCode.itemValue}"></th:block>
<th:block th:each="code:${session.commonCode.get(userInfo.ogCd)}">
<th:block th:if="${code.itemCd eq userInfo.ofcCd}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<td>
<th:block th:each="code:${session.commonCode.get('JT')}">
<th:block th:if="${code.itemCd eq userInfo.titleCd}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<td></td>
<td th:text="${userInfo.userNm}"></td>
<td th:text="${userInfo.userId}"></td>
<td th:text="${#temporals.format(userInfo.wrtDt, 'yyyy-MM-dd HH:mm:ss')}"></td>

View File

@ -17,7 +17,7 @@
<input type="hidden" name="wrtUserGrd" th:value="${activityCase.wrtUserGrd}">
<input type="hidden" name="wrtUserNm" th:value="${activityCase.wrtUserNm}">
<input type="hidden" name="caseKey" th:value="${activityCaseInfo.caseKey}">
<input type="hidden" name="wrtDt" th:value="${activityCaseInfo.wrtDt}">
<input type="hidden" id="caseType" name="caseType" th:value="${activityCaseInfo.caseType}">
<div class="row mb-1">
<label for="receiptNum" class="col-sm-1 col-form-label col-form-label-sm text-center">접수번호</label>
<div class="col-sm-2">
@ -27,29 +27,33 @@
<div class="col-sm-2">
<input type="text" class="form-control form-control-sm" id="caseNum" name="caseNum" th:value="${activityCaseInfo.caseNum}" placeholder="저장시 생성" readonly>
</div>
<label for="wrtUserNm" class="col-sm-1 col-form-label col-form-label-sm text-center">작성자</label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">작성자</label>
<div class="col-sm-2">
<th:block th:if="${activityCase.wrtUserGrd eq null}">
<input type="text" class="form-control form-control-sm" id="wrtUserNm" th:value="${activityCase.wrtUserNm}" readonly>
<input type="text" class="form-control form-control-sm" th:value="${activityCase.wrtUserNm}" readonly>
</th:block>
<th:block th:unless="${activityCase.wrtUserGrd eq null}">
<th:block th:each="code:${session.commonCode.get('JT')}">
<th:block th:if="${code.itemCd eq activityCase.wrtUserGrd}">
<input type="text" class="form-control form-control-sm" id="wrtUserNm" th:value="|${code.itemValue} ${activityCase.wrtUserNm}|" readonly>
<input type="text" class="form-control form-control-sm" th:value="|${code.itemValue} ${activityCase.wrtUserNm}|" readonly>
</th:block>
</th:block>
</th:block>
</div>
<label for="wrtDt" class="col-sm-1 col-form-label col-form-label-sm text-center">작성일시</label>
<div class="col-sm-2">
<input type="text" class="form-control form-control-sm" id="wrtDt" name="wrtDt" th:value="${#temporals.format(activityCaseInfo.wrtDt, 'yyyy-MM-dd HH:mm')}" readonly>
<input type="text" class="form-control form-control-sm" id="wrtDt" name="wrtDt" th:value="${#temporals.format(activityCaseInfo.wrtDt, 'yyyy-MM-dd HH:mm')}" placeholder="저장시 생성" readonly>
</div>
</div>
<div class="row mb-1">
<label for="title" class="col-sm-1 col-form-label col-form-label-sm text-center">제목</label>
<div class="col-sm-11">
<div class="col-sm-8">
<input type="text" class="form-control form-control-sm" id="title" name="title" th:value="${activityCaseInfo.title}">
</div>
<label for="reportDate" class="col-sm-1 col-form-label col-form-label-sm text-center">보고일자</label>
<div class="col-sm-2">
<input type="text" class="form-control form-control-sm dateSelector" id="reportDate" name="reportDate" th:value="${#temporals.format(activityCaseInfo.reportDate, 'yyyy-MM-dd')}">
</div>
</div>
<div class="row mb-1">
<label for="suspectAddBtn" class="col-sm-1 col-form-label col-form-label-sm text-center">
@ -73,11 +77,26 @@
</div>
</div>
<div class="row mb-1">
<label for="description" class="col-sm-1 col-form-label col-form-label-sm text-center">외사활동이 필요한 이유</label>
<label for="description" class="col-sm-1 col-form-label col-form-label-sm text-center">외사활동이<br>필요한 이유</label>
<div class="col-sm-11">
<textarea class="form-control form-control-sm" id="description" name="description" th:value="${activityCaseInfo.description}"></textarea>
</div>
</div>
<div class="row mb-1">
<label for="suspectAddBtn" class="col-sm-1 col-form-label col-form-label-sm text-center">
결재자
<button type="button" class="border-0 bg-white" id="apprvAddBtn">
<i class="bi bi-plus-square text-primary"></i>
</button>
</label>
<div class="col-sm-11">
<div class="border h-100">
<div class="row" id="apprvHome">
</div>
</div>
</div>
</div>
<div class="row mb-3">
<label for="fileInputer" class="col-sm-1 col-form-label col-form-label-sm text-center">첨부파일</label>
<div class="col-sm-11" style="min-height: 70px;">

View File

@ -1,77 +1,49 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header bg-dark">
<h5 class="modal-title text-white" id="ciWorkViewModalLabel">방첩공작 열람</h5>
<h5 class="modal-title text-white" id="activityCaseViewModalLabel">착수보고서 열람</h5>
<button type="button" class="btn-close f-invert" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body" id="ciWorkViewBody">
<input type="hidden" id="ciwKey" th:value="${ciWork.ciwKey}">
<div class="modal-body" id="activityCaseViewModalBody">
<input type="hidden" id="caseKey" th:value="${activityCaseInfo.caseKey}">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="boardTab" data-bs-toggle="tab" data-bs-target="#boardTabPanel" type="button" role="tab" aria-controls="boardTabPanel" aria-selected="true">본문</button>
</li>
<li class="nav-item" role="presentation" th:if="${#lists.size(ciWork.fileList)>0}">
<button class="nav-link" id="fileTab" data-bs-toggle="tab" data-bs-target="#fileTabPanel" type="button" role="tab" aria-controls="fileTabPanel" aria-selected="false" th:text="${#strings.concat('첨부파일(', #lists.size(ciWork.fileList), ')')}"></button>
<li class="nav-item" role="presentation">
<button class="nav-link" id="apprvTab" data-bs-toggle="tab" data-bs-target="#apprvTabPanel" type="button" role="tab" aria-controls="apprvTabPanel" aria-selected="false">결재</button>
</li>
<li class="nav-item" role="presentation" th:if="${#lists.size(activityCaseInfo.fileList)>0}">
<button class="nav-link" id="fileTab" data-bs-toggle="tab" data-bs-target="#fileTabPanel" type="button" role="tab" aria-controls="fileTabPanel" aria-selected="false" th:text="${#strings.concat('첨부파일(', #lists.size(activityCaseInfo.fileList), ')')}"></button>
</li>
</ul>
<div class="tab-content bg-white border border-top-0 p-2">
<div class="tab-pane fade p-2 show active" id="boardTabPanel" role="tabpanel" tabindex="0">
<div class="row mb-1">
<div class="col-sm-9"></div>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">작성일시</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(ciWork.wrtDt, 'yyyy-MM-dd HH:mm')}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">공작명</label>
<label class="col-sm-8 col-form-label col-form-label-sm text-start" th:text="|${ciWork.status eq 'DST001'?'[임시] ':''}${ciWork.title}|"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">접수번호</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${activityCase.receiptNum}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">사건번호</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${activityCaseInfo.caseNum}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">작성자</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${ciWork.wrtUserNm}"></label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${activityCase.wrtUserNm}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">작성일시</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(activityCaseInfo.wrtDt, 'yyyy-MM-dd HH:mm')}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">제목</label>
<label class="col-sm-11 col-form-label col-form-label-sm text-start" th:text="${activityCaseInfo.title}"></label>
</div>
<hr class="my-1">
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">착수일</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(ciWork.workStartDate, 'yyyy-MM-dd')}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">종결일(예정)</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(ciWork.workEndDate, 'yyyy-MM-dd')}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">1차재평가</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(ciWork.reRatingDate1, 'yyyy-MM-dd')}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">2차재평가</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(ciWork.reRatingDate2, 'yyyy-MM-dd')}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">외사활동<br>대상자</label>
</div>
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">등급</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start">
<th:block th:each="code:${session.commonCode.get('CIWR')}">
<th:block th:if="${code.itemCd eq ciWork.workRating}" th:text="${code.itemValue}"></th:block>
</th:block>
</label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">범죄테마</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start">
<th:block th:each="code:${session.commonCode.get('AT')}">
<th:block th:if="${code.itemCd eq ciWork.arrestType1}" th:text="${code.itemValue}"></th:block>
</th:block>
</label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">위반유형</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start">
<th:block th:each="code:${session.commonCode.get(ciWork.arrestType1)}">
<th:block th:if="${code.itemCd eq ciWork.arrestType2}" th:text="${code.itemValue}"></th:block>
</th:block>
</label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">외사활동 사항</label>
</div>
<hr class="my-1">
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">사건개요</label>
<div class="col-sm-11 form-control-sm" th:utext="${#strings.replace(ciWork.summaryInfo, lineSeparator, '<br>')}"></div>
</div>
<hr class="my-1">
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">내용</label>
<div class="col-sm-11 form-control-sm" th:utext="${ciWork.content}"></div>
</div>
<hr class="my-1">
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">해시태그</label>
<label class="col-sm-11 col-form-label col-form-label-sm text-start" th:text="${ciWork.hashTags}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">외사활동이<br>필요한 이유</label>
</div>
</div>
<div class="tab-pane fade p-2" id="apprvTabPanel" role="tabpanel" tabindex="0">
</div>
<div class="tab-pane fade p-2" id="fileTabPanel" role="tabpanel" tabindex="0">
<div class="row mb-3">
<div class="col-sm-12">
@ -83,17 +55,17 @@
</tr>
</thead>
<tbody>
<th:block th:if="${#lists.isEmpty(ciWork.fileList)}">
<th:block th:if="${#lists.isEmpty(activityCaseInfo.fileList)}">
<tr>
<td colspan="2">파일이 없습니다.</td>
</tr>
</th:block>
<th:block th:unless="${#lists.isEmpty(ciWork.fileList)}">
<th:block th:each="file:${ciWork.fileList}">
<th:block th:unless="${#lists.isEmpty(activityCaseInfo.fileList)}">
<th:block th:each="file:${activityCaseInfo.fileList}">
<tr class="fileInfoTr">
<td>
<a href="#" class="fileDownLink" data-board="ciWork"
th:data-parentkey="${file.ciwKey}" th:data-fileseq="${file.fileSeq}"
th:data-parentkey="${file.caseKey}" th:data-fileseq="${file.fileSeq}"
th:text="|${file.origNm}.${file.fileExtn}|"></a>
</td>
<td th:text="${file.fileSize}"></td>
@ -108,11 +80,7 @@
</div>
</div>
<div class="modal-footer bg-light">
<th:block th:if="${accessAuth eq 'ACC003'}">
<button type="button" class="btn btn-danger" id="deleteCiWorkBtn" th:data-ciwkey="${ciWork.ciwKey}">삭제</button>
</th:block>
<th:block th:if="${viewUserSeq eq ciWork.wrtUserSeq}">
<button type="button" class="btn btn-warning" id="editCiWorkBtn" th:data-ciwkey="${ciWork.ciwKey}">수정</button>
</th:block>
<button type="button" class="btn btn-danger" id="deleteCiWorkBtn">삭제</button>
<button type="button" class="btn btn-warning" id="editCiWorkBtn">수정</button>
<!-- <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>-->
</div>

View File

@ -107,60 +107,39 @@
<thead>
<tr class="table-secondary">
<th>순번</th>
<th>진행상태</th>
<th>구분</th>
<th>접수번호</th>
<th>접수일</th>
<th>접수단서</th>
<th>혐의자</th>
<th>담당관</th>
<th>비고</th>
<th>사건번호</th>
<th>제목</th>
<th>보고일</th>
<th>작성자</th>
<th>작성일</th>
<th>결재상태</th>
<th>첨부파일</th>
</tr>
</thead>
<tbody class="table-group-divider">
<!--<tr class="activityCaseTr" th:each="ciWork:${activityCaseList}">
<input type="hidden" class="ciwKey" th:value="${ciWork.ciwKey}">
<tr class="activityCaseTr" th:each="case,cnt:${activityCaseList}">
<input type="hidden" class="receiptKey" th:value="${case.receiptKey}">
<td th:text="${cnt.count+(searchParams.pageIndex-1)*searchParams.rowCnt}"></td>
<td>
<th:block th:each="code:${session.commonCode.get('CIWR')}">
<th:block th:if="${code.itemCd eq ciWork.workRating}" th:text="${code.itemValue}"></th:block>
<th:block th:each="code:${session.commonCode.get('ACT')}">
<th:block th:if="${code.itemCd eq case.caseType}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<td>
<th:block th:each="code:${session.commonCode.get('AT')}">
<th:block th:if="${code.itemCd eq ciWork.arrestType1}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<td>
<th:block th:each="code:${session.commonCode.get(ciWork.arrestType1)}">
<th:block th:if="${code.itemCd eq ciWork.arrestType2}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<td>
<th:block th:if="${ciWork.status eq 'DST002'}">[임시]</th:block>
<th:block th:text="${ciWork.title}"></th:block>
</td>
<td>
<div th:text="${ciWork.workStartDate}"></div>
<div th:text="${#strings.concat('~ ', ciWork.workEndDate)}"></div>
</td>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<td th:if="${ciWork.wrtOrgan eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<th:block th:each="commonCode:${session.commonCode.get('OFC')}">
<td th:if="${ciWork.wrtPart eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<td th:text="${case.receiptNum}"></td>
<td th:text="${case.caseNum}"></td>
<td th:text="${case.title}"></td>
<td th:text="${#temporals.format(case.reportDate, 'yyyy-MM-dd')}"></td>
<td>
<th:block th:each="code:${session.commonCode.get('JT')}">
<th:block th:if="${code.itemCd eq ciWork.wrtUserGrd}" th:text="|${code.itemValue} ${ciWork.wrtUserNm}|"></th:block>
<th:block th:if="${code.itemCd eq case.wrtUserGrd}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<td th:text="${#temporals.format(ciWork.wrtDt, 'yyyy-MM-dd HH:mm')}"></td>
<td th:text="${ciWork.fileCnt eq null?'파일 없음':#strings.concat(ciWork.fileCnt,' 건')}"></td>
<td>
<div th:text="|1차: ${ciWork.reRatingDate1}|"></div>
<div th:text="|2차: ${ciWork.reRatingDate2}|"></div>
</td>
</tr>-->
<td th:text="${#temporals.format(case.wrtDt, 'yyyy-MM-dd')}"></td>
<td th:text="${#strings.concat(case.apprvCnt, '/', case.allCnt)}"></td>
<td th:text="${case.fileCnt}"></td>
</tr>
</tbody>
</table>
</div>
@ -210,6 +189,13 @@
</div>
</div>
</div>
<div class="modal fade" id="activityCaseSummaryModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="activityCaseModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content" id="activityCaseSummaryModalBody">
</div>
</div>
</div>
<div class="modal fade" id="activityCaseViewModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="activityCaseModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content" id="activityCaseViewModalBody">
@ -221,7 +207,7 @@
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header bg-dark">
<h5 class="modal-title text-white" id="menuModalLabel">담당관 검색</h5>
<h5 class="modal-title text-white" id="menuModalLabel">결재자 검색</h5>
<input type="hidden" id="modalUrl" value="/modal/userModal">
<button type="button" class="btn-close f-invert" data-bs-dismiss="modal" aria-label="Close"></button>
</div>

View File

@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header bg-dark">
<h5 class="modal-title text-white" id="activityCaseSummaryModalLabel">보고서 목록</h5>
<button type="button" class="btn-close f-invert" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body" id="activityCaseSummaryBody">
<table class="table table-sm table-bordered table-hover">
<thead>
<tr class="table-secondary">
<th>구분</th>
<th>접수번호</th>
<th>사건번호</th>
<th>제목</th>
<th>보고일</th>
<th>작성자</th>
<th>작성일</th>
<th>결재상태</th>
<th>첨부파일</th>
</tr>
</thead>
<tbody class="table-group-divider">
<tr class="summaryTr" th:each="case,cnt:${activityCaseList}">
<input type="hidden" class="caseKey" th:value="${case.caseKey}">
<td>
<th:block th:each="code:${session.commonCode.get('ACT')}">
<th:block th:if="${code.itemCd eq case.caseType}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<td th:text="${case.receiptNum}"></td>
<td th:text="${case.caseNum}"></td>
<td th:text="${case.title}"></td>
<td th:text="${#temporals.format(case.reportDate, 'yyyy-MM-dd')}"></td>
<td>
<th:block th:each="code:${session.commonCode.get('JT')}">
<th:block th:if="${code.itemCd eq case.wrtUserGrd}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<td th:text="${#temporals.format(case.wrtDt, 'yyyy-MM-dd')}"></td>
<td th:text="${#strings.concat(case.apprvCnt, '/', case.allCnt)}"></td>
<td th:text="${case.fileCnt}"></td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer bg-light">
<button type="button" class="btn btn-outline-dark">진행보고서 작성</button>
<button type="button" class="btn btn-outline-dark">결과보고서 작성</button>
</div>

View File

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<th:block th:each="user:${userList}">
<div class="col-sm-12 apprvDiv">
<input type="hidden" class="userSeq" th:value="${user.userSeq}">
<input type="hidden" class="ogCd" th:value="${user.ogCd}">
<input type="hidden" class="ofcCd" th:value="${user.ofcCd}">
<input type="hidden" class="titleCd" th:value="${user.titleCd}">
<input type="hidden" class="userNm" th:value="${user.userNm}">
<div class="row mx-2 my-1">
<div class="col-12 mb-1">
<div class="row">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">경로</label>
<div class="col-2">
<input type="text" class="form-control form-control-sm apprvPath">
</div>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">구분</label>
<div class="col-2">
<input type="text" class="form-control form-control-sm apprvType">
</div>
<label class="col-sm-3 col-form-label col-form-label-sm text-start">
<th:block th:each="code:${session.commonCode.get('OG')}">
<th:block th:if="${code.itemCd eq user.ogCd}" th:text="${code.itemValue}"></th:block>
</th:block>
<th:block th:each="code:${session.commonCode.get(user.ogCd)}">
<th:block th:if="${code.itemCd eq user.ofcCd}" th:text="${code.itemValue}"></th:block>
</th:block>
<th:block th:each="code:${session.commonCode.get('JT')}">
<th:block th:if="${code.itemCd eq user.titleCd}" th:text="${code.itemValue}"></th:block>
</th:block>
<th:block th:text="${user.userNm}"></th:block>
</label>
<div class="col-1">
<button type="button" class="btn btn-sm btn-outline-danger rowDeleteBtn"><i class="bi bi-x"></i></button>
</div>
</div>
</div>
</div>
<hr class="my-1 mx-2">
</div>
</th:block>
</html>

View File

@ -8,7 +8,7 @@
<div class="col-sm-2">
<select class="form-select form-select-sm suspectType">
<option value="">선택</option>
<th:block th:each="code:${acsList}">
<th:block th:each="code:${session.commonCode.get('ACS')}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
@ -19,11 +19,16 @@
</div>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">성별</label>
<div class="col-sm-2">
<input type="text" class="form-control form-control-sm suspectSex">
<select class="form-select form-select-sm suspectSex">
<option value="">선택</option>
<th:block th:each="code:${session.commonCode.get('SEX')}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
</div>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">생년월일</label>
<div class="col-sm-2">
<input type="text" class="form-control form-control-sm suspectBirthDate">
<input type="text" class="form-control form-control-sm suspectBirthDate" placeholder="0000-00-00">
</div>
</div>
</div>