외사활동 작업중.

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"); userInfo.setUserStatus("USC003");
} }
mav.addObject("pageName", pageName); mav.addObject("pageName", pageName);
mav.addObject("OgList", codeMgtService.selectCodeMgtList("OG"));
mav.addObject("OfcList", codeMgtService.selectCodeMgtList("OFC"));
mav.addObject("userInfoList", userInfoService.selectUserInfoList(userInfo)); mav.addObject("userInfoList", userInfoService.selectUserInfoList(userInfo));
userInfo.setContentCnt(userInfoService.selectUserInfoListCnt(userInfo)); userInfo.setContentCnt(userInfoService.selectUserInfoListCnt(userInfo));
userInfo.setPaginationInfo(); 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.authMgt.service.AuthMgtService;
import com.dbnt.faisp.main.codeMgt.service.CodeMgtService; 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.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.model.ActivityCaseInfo;
import com.dbnt.faisp.main.counterIntelligence.activityCase.service.ActivityCaseService; import com.dbnt.faisp.main.counterIntelligence.activityCase.service.ActivityCaseService;
import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceWork; import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceWork;
@ -27,7 +29,7 @@ public class ActivityCaseController {
private final CodeMgtService codeMgtService; private final CodeMgtService codeMgtService;
@GetMapping("/activityCaseList") @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"); ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/activityCaseBoard");
mav.addObject("searchUrl", "/counterIntelligence/activityCaseList"); mav.addObject("searchUrl", "/counterIntelligence/activityCaseList");
String accessAuth = authMgtService.selectAccessConfigList String accessAuth = authMgtService.selectAccessConfigList
@ -64,7 +66,6 @@ public class ActivityCaseController {
activityCase.setWrtUserSeq(loginUser.getUserSeq()); activityCase.setWrtUserSeq(loginUser.getUserSeq());
activityCase.setWrtUserGrd(loginUser.getTitleCd()); activityCase.setWrtUserGrd(loginUser.getTitleCd());
activityCase.setWrtUserNm(loginUser.getUserNm()); activityCase.setWrtUserNm(loginUser.getUserNm());
activityCaseInfo.setWrtDt(LocalDateTime.now());
}else{ }else{
activityCase = activityCaseService.selectActivityCase(activityCase.getReceiptKey()); activityCase = activityCaseService.selectActivityCase(activityCase.getReceiptKey());
activityCaseInfo = activityCaseService.selectActivityCaseInfo(activityCaseInfo.getCaseKey()); activityCaseInfo = activityCaseService.selectActivityCaseInfo(activityCaseInfo.getCaseKey());
@ -80,30 +81,48 @@ public class ActivityCaseController {
@GetMapping("/getSuspectDiv") @GetMapping("/getSuspectDiv")
public ModelAndView suspectDiv(){ public ModelAndView suspectDiv(){
ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/suspectDiv"); ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/suspectDiv");
mav.addObject("acsList", codeMgtService.selectCodeMgtList("ACS"));
return mav; return mav;
} }
@PostMapping("/getApprvDiv")
@ResponseBody @ResponseBody
@PostMapping("/getOfficerDiv") public ModelAndView apprvDiv(@RequestBody List<ActivityCaseApprv> apprvList){
public ModelAndView officerDiv(@RequestBody List<UserInfo> userList){ ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/apprvDiv");
ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/officerDiv"); mav.addObject("userList", apprvList);
mav.addObject("officerList", userList); return mav;
mav.addObject("acoList", codeMgtService.selectCodeMgtList("ACO")); }
@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; return mav;
} }
@GetMapping("/activityCaseViewModal") @GetMapping("/activityCaseViewModal")
public ModelAndView activityCaseViewModal(@AuthenticationPrincipal UserInfo loginUser, ActivityCase activityCase){ public ModelAndView activityCaseViewModal(@AuthenticationPrincipal UserInfo loginUser, ActivityCaseBoard activityCase){
ModelAndView mav = new ModelAndView("counterIntelligence/activityCase/activityCaseViewModal"); ModelAndView mav = null;
mav.addObject("lineSeparator", '\n'); 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()); mav.addObject("viewUserSeq", loginUser.getUserSeq());
String accessAuth = authMgtService.selectAccessConfigList String accessAuth = authMgtService.selectAccessConfigList
(loginUser.getUserSeq(), "/counterIntelligence/activityCaseList").get(0).getAccessAuth(); (loginUser.getUserSeq(), "/counterIntelligence/activityCaseList").get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth); mav.addObject("accessAuth", accessAuth);
mav.addObject("activityCase", activityCaseService.selectActivityCase(activityCase.getReceiptKey())); mav.addObject("activityCaseInfo", activityCaseInfo);
mav.addObject("activityCase", activityCaseService.selectActivityCase(activityCaseInfo.getReceiptKey()));
return mav; return mav;
} }
@PostMapping("/saveActivityCase") @PostMapping("/saveActivityCase")
public Integer saveActivityCase(ActivityCase activityCase, public Integer saveActivityCase(ActivityCase activityCase,
ActivityCaseInfo activityCaseInfo, ActivityCaseInfo activityCaseInfo,

View File

@ -1,19 +1,23 @@
package com.dbnt.faisp.main.counterIntelligence.activityCase.mapper; 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.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.CiWorkStatistics;
import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceActivity; import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceActivity;
import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceWork; import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceWork;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
import java.util.Map;
@Mapper @Mapper
public interface ActivityCaseMapper { 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; private Integer userSeq;
@Column(name = "apprv_path") @Column(name = "apprv_path")
private String apprvPath; private String apprvPath;
@Column(name = "apprv_type")
private String apprvType;
@Column(name = "og_cd") @Column(name = "og_cd")
private String ogCd; private String ogCd;
@Column(name = "ofc_cd") @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 org.springframework.web.multipart.MultipartFile;
import javax.persistence.*; import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@ -29,6 +30,9 @@ public class ActivityCaseInfo extends BaseModel {
private Integer receiptKey; private Integer receiptKey;
@Column(name = "case_num") @Column(name = "case_num")
private String caseNum; private String caseNum;
@Column(name = "report_date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate reportDate;
@Column(name = "case_type") @Column(name = "case_type")
private String caseType; private String caseType;
@Column(name = "title") @Column(name = "title")

View File

@ -10,4 +10,6 @@ import java.util.Optional;
public interface ActivityCaseApprvRepository extends JpaRepository<ActivityCaseApprv, ActivityCaseApprv.ActivityCaseApprvId> { 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); List<ActivityCaseFile> findByCaseKey(Integer caseKey);
Optional<ActivityCaseFile> findTopByCaseKeyOrderByFileSeqDesc(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> { 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.mapper.ActivityCaseMapper;
import com.dbnt.faisp.main.counterIntelligence.activityCase.model.*; import com.dbnt.faisp.main.counterIntelligence.activityCase.model.*;
import com.dbnt.faisp.main.counterIntelligence.activityCase.repository.*; import com.dbnt.faisp.main.counterIntelligence.activityCase.repository.*;
import com.dbnt.faisp.util.Utils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.File;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
@Service @Service
@ -24,36 +29,56 @@ public class ActivityCaseService extends BaseService {
private final ActivityCaseApprvRepository acaRepository; private final ActivityCaseApprvRepository acaRepository;
private final ActivityCaseMapper acMapper; private final ActivityCaseMapper acMapper;
public List<ActivityCase> selectActivityCaseList(ActivityCase activityCase){ public List<ActivityCase> selectActivityCaseList(ActivityCaseBoard activityCase){
return acMapper.selectActivityCaseList(activityCase); return acMapper.selectActivityCaseList(activityCase);
} }
public Integer selectActivityCaseCnt(ActivityCase activityCase){ public Integer selectActivityCaseCnt(ActivityCaseBoard activityCase){
return acMapper.selectActivityCaseCnt(activityCase); return acMapper.selectActivityCaseCnt(activityCase);
} }
public ActivityCase selectActivityCase(Integer receiptKey) { public ActivityCase selectActivityCase(Integer receiptKey) {
ActivityCase activityCase = acRepository.findById(receiptKey).orElse(null); ActivityCase activityCase = acRepository.findById(receiptKey).orElse(null);
activityCase.setSuspectList(acsRepository.findByReceiptKeyOrderBySuspectSeqDesc(receiptKey));
return activityCase; return activityCase;
} }
public ActivityCaseInfo selectActivityCaseInfo(Integer caseKey) { public ActivityCaseInfo selectActivityCaseInfo(Integer caseKey) {
ActivityCaseInfo activityCaseInfo = aciRepository.findById(caseKey).orElse(null); ActivityCaseInfo activityCaseInfo = aciRepository.findById(caseKey).orElse(null);
activityCaseInfo.setApprvList(acaRepository.findByCaseKey(caseKey));
activityCaseInfo.setFileList(acfRepository.findByCaseKeyOrderByFileSeqAsc(caseKey));
return activityCaseInfo; return activityCaseInfo;
} }
@Transactional @Transactional
public Integer saveActivityCase(ActivityCase activityCase, ActivityCaseInfo activityCaseInfo, List<Integer> deleteFileSeq) { public Integer saveActivityCase(ActivityCase activityCase, ActivityCaseInfo activityCaseInfo, List<Integer> deleteFileSeq) {
Integer receiptKey = acRepository.save(activityCase).getReceiptKey(); Integer receiptKey = null;
if(Utils.isEmpty(activityCase.getReceiptKey())){
return receiptKey; if(Utils.isEmpty(activityCase.getReceiptNum())){
activityCase.setReceiptNum(makeReceiptNum(LocalDate.now().getYear()));
} }
receiptKey = acRepository.save(activityCase).getReceiptKey();
private void saveActivityCaseSuspect(Integer caseKey, List<ActivityCaseSuspect> suspectList) {
if(suspectList==null){
}else{ }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) { private void deleteActivityCaseFile(Integer caseKey, List<Integer> deleteFileSeq) {
@ -98,4 +123,22 @@ public class ActivityCaseService extends BaseService {
return receiptKey; 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"> <mapper namespace="com.dbnt.faisp.main.counterIntelligence.activityCase.mapper.ActivityCaseMapper">
<sql id="selectActivityCaseListWhere"> <sql id="selectActivityCaseListWhere">
<where> <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 != ""'> <if test='wrtUserNm != null and wrtUserNm != ""'>
and a.wrt_user_nm like '%'||#{wrtUserNm}||'%' and a.wrt_user_nm like '%'||#{wrtUserNm}||'%'
</if> </if>
<if test='wrtOrgan != null and wrtOrgan != ""'> <if test='wrtOrgan != null and wrtOrgan != ""'>
and a.wrt_organ = #{wrtOrgan} and a.wrt_organ = #{wrtOrgan}
</if> </if>
<if test='dateSelector == "receiptDt"'> <if test='dateSelector == "reportDate"'>
<if test='startDate != null and startDate != ""'> <if test='startDate != null and startDate != ""'>
and a.receipt_dt >= #{startDate}::date and b.report_date >= #{startDate}::date
</if> </if>
<if test='endDate != null and endDate != ""'> <if test='endDate != null and endDate != ""'>
and a.receipt_dt &lt;= #{endDate}::date+1 and b.report_date &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
</if> </if>
</if> </if>
<if test='dateSelector == "wrtDt"'> <if test='dateSelector == "wrtDt"'>
<if test='startDate != null and startDate != ""'> <if test='startDate != null and startDate != ""'>
and a.wrt_dt >= #{startDate}::date and b.wrt_dt >= #{startDate}::date
</if> </if>
<if test='endDate != null and endDate != ""'> <if test='endDate != null and endDate != ""'>
and a.wrt_dt &lt;= #{endDate}::date+1 and b.wrt_dt &lt;= #{endDate}::date+1
</if> </if>
</if> </if>
</where> </where>
</sql> </sql>
<select id="selectActivityCaseList" parameterType="ActivityCase" resultType="ActivityCase"> <select id="selectActivityCaseList" parameterType="ActivityCaseBoard" resultType="ActivityCaseBoard">
select a.ciw_key, select a.receipt_key,
a.status, a.receipt_num ,
a.work_rating, a.wrt_organ ,
a.work_start_date, a.wrt_part ,
a.work_end_date, a.wrt_user_seq ,
a.re_rating_date1, a.wrt_user_grd ,
a.re_rating_date2, a.wrt_user_nm ,
a.title, b.case_key ,
a.wrt_organ, b.case_num ,
a.wrt_part, b.report_date ,
a.wrt_user_seq, b.case_type ,
a.wrt_user_grd, b.title,
a.wrt_user_nm, b.wrt_dt,
a.wrt_dt, c.apprvCnt,
b.fileCnt c.allCnt,
from counter_intelligence_work a d.fileCnt
left outer join (select ciw_key, count(*) as fileCnt from ciw_file group by ciw_key) b from activity_case a
on a.ciw_key = b.ciw_key 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> <include refid="selectActivityCaseListWhere"></include>
ORDER BY a.ciw_key DESC ORDER BY b.wrt_dt DESC
LIMIT #{rowCnt} OFFSET #{firstIndex} LIMIT #{rowCnt} OFFSET #{firstIndex}
</select> </select>
<select id="selectActivityCaseCnt" parameterType="ActivityCase" resultType="int"> <select id="selectActivityCaseCnt" parameterType="ActivityCaseBoard" resultType="int">
select count(*) select count(*)
from counter_intelligence_work a from activity_case a
left outer join (select ciw_key, count(*) as fileCnt from ciw_file group by ciw_key) b inner join activity_case_info b
on a.ciw_key = b.ciw_key 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> <include refid="selectActivityCaseListWhere"></include>
</select> </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> </mapper>

View File

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

View File

@ -8,25 +8,46 @@ $(document).on('click', '#suspectAddBtn', function (){
getSuspectDiv() 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 (){ $(document).on('click', '.rowDeleteBtn', function (){
$(this).parents(".suspectDiv").remove(); $(this).parents(".suspectDiv").remove();
$(this).parents(".apprvDiv").remove();
}) })
$(document).on('click', '.saveBtn', function(){ $(document).on('click', '.saveBtn', function(){
saveActivityCase($(this).attr("data-status")); saveActivityCase($(this).attr("data-status"));
}) })
$(document).on('click', '.activityCaseTr', function (){
getActivityCaseViewModal($(this).find(".ciwKey").val());
})
$(document).on('click', '#editActivityCaseBtn', function (){ $(document).on('click', '#editActivityCaseBtn', function (){
$("#activityCaseViewModal").modal('hide'); $("#activityCaseViewModal").modal('hide');
getActivityCaseEditModal($(this).attr("data-casekey")); getActivityCaseEditModal($(this).attr("data-casekey"));
}) })
$(document).on('click', '#deleteActivityCaseBtn', function (){ $(document).on('click', '.activityCaseTr', function (){
deleteActivityCase($(this).attr("data-casekey")); getActivityCaseSummaryModal($(this).find(".receiptKey").val());
})
$(document).on('click', '.summaryTr', function (){
getActivityCaseViewModal($(this).find(".caseKey").val());
}) })
function getActivityCaseEditModal(caseKey, caseType){ function getActivityCaseEditModal(caseKey, caseType){
@ -58,6 +79,47 @@ function getSuspectDiv(){
dataType:"html", dataType:"html",
success: function(html){ success: function(html){
$("#suspectHome").append(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){ error:function(e){
ajaxErrorAction(e); ajaxErrorAction(e);
@ -110,13 +172,14 @@ function saveActivityCase(status){
formData.append('suspectList['+idx+'].area', $(el).find(".suspectArea").val()); formData.append('suspectList['+idx+'].area', $(el).find(".suspectArea").val());
formData.append('suspectList['+idx+'].etc', $(el).find(".suspectEtc").val()); formData.append('suspectList['+idx+'].etc', $(el).find(".suspectEtc").val());
}) })
$(".officerRow").each(function (idx, el){ $(".apprvDiv").each(function (idx, el){
formData.append('officerList['+idx+'].type', $(el).find(".officerType").val()); formData.append('apprvList['+idx+'].userSeq', $(el).find(".userSeq").val());
formData.append('officerList['+idx+'].userSeq', $(el).find(".userSeq").val()); formData.append('apprvList['+idx+'].apprvPath', $(el).find(".apprvPath").val());
formData.append('officerList['+idx+'].ogCd', $(el).find(".ogCd").val()); formData.append('apprvList['+idx+'].apprvType', $(el).find(".apprvType").val());
formData.append('officerList['+idx+'].ofcCd', $(el).find(".ofcCd").val()); formData.append('apprvList['+idx+'].ogCd', $(el).find(".ogCd").val());
formData.append('officerList['+idx+'].titleCd', $(el).find(".titleCd").val()); formData.append('apprvList['+idx+'].ofcCd', $(el).find(".ofcCd").val());
formData.append('officerList['+idx+'].userNm', $(el).find(".userNm").val()); formData.append('apprvList['+idx+'].titleCd', $(el).find(".titleCd").val());
formData.append('apprvList['+idx+'].userNm', $(el).find(".userNm").val());
}) })
$.ajax({ $.ajax({
type : 'POST', type : 'POST',
@ -127,8 +190,7 @@ function saveActivityCase(status){
success : function(result) { success : function(result) {
alert("저장되었습니다."); alert("저장되었습니다.");
contentFade("out"); contentFade("out");
$("#activityCaseEditModal").modal('hide'); location.reload();
getActivityCaseViewModal(result);
}, },
error : function(xhr, status) { error : function(xhr, status) {
alert("저장에 실패하였습니다.") alert("저장에 실패하였습니다.")
@ -167,21 +229,58 @@ function deleteActivityCase(caseKey){
} }
function contentCheck(){ function contentCheck(){
if(!$("#receiptNum").val()){ if(!$("#title").val()){
alert("접수번호을 입력해주세요.") alert("제목을 입력해주세요.")
return false; return false;
} }
if(!$("#receiptDt").val()){ if(!$("#reportDt").val()){
alert("접수일을 입력해주세요.") alert("보고일자를 입력해주세요.")
return false; return false;
} }
if(!$("#receiptClue").val()){ switch ($("#caseType").val()) {
alert("접수단서를 입력해주세요.") case "ACT001":
if(!$("#caseProgress").val()){
alert("외사활동 사항을 입력해주세요.")
return false; return false;
} }
if(!$("#caseInfo").val()){ if(!$("#description").val()){
alert("첩보개요를 입력해주세요.") alert("외사활동이 필요한 이유를 입력해주세요.")
return false; 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; return true;
} }

View File

@ -13,16 +13,16 @@
<div class="col-auto" th:classappend="${pageName eq 'activityCase'?'d-none':''}"> <div class="col-auto" th:classappend="${pageName eq 'activityCase'?'d-none':''}">
<select class="form-select form-select-sm" name="ogCd"> <select class="form-select form-select-sm" name="ogCd">
<option value="">관서 선택</option> <option value="">관서 선택</option>
<th:block th:each="commonCode:${OgList}"> <th:block th:each="code:${session.commonCode.get('OG')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${searchParams.ogCd==commonCode.itemCd}"></option> <option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${searchParams.ogCd eq code.itemCd}"></option>
</th:block> </th:block>
</select> </select>
</div> </div>
<div class="col-auto"> <div class="col-auto">
<select class="form-select form-select-sm" name="ofcCd"> <select class="form-select form-select-sm" name="ofcCd">
<option value="">부서 선택</option> <option value="">부서 선택</option>
<th:block th:each="commonCode:${OfcList}"> <th:block th:each="code:${session.commonCode.get(searchParams.ogCd)}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${searchParams.ofcCd==commonCode.itemCd}"></option> <option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${searchParams.ofcCd eq code.itemCd}"></option>
</th:block> </th:block>
</select> </select>
</div> </div>
@ -67,16 +67,20 @@
<input type="checkbox" name="userChk" class="userInfoCheckBox" th:value="${userInfo.userSeq}"> <input type="checkbox" name="userChk" class="userInfoCheckBox" th:value="${userInfo.userSeq}">
</td> </td>
<td> <td>
<th:block th:each="commonCode:${session.commonCode.get('OG')}"> <th:block th:each="code:${session.commonCode.get('OG')}">
<th:block th:if="${commonCode.itemCd eq userInfo.ogCd}" th:text="${commonCode.itemValue}"></th:block> <th:block th:if="${code.itemCd eq userInfo.ogCd}" th:text="${code.itemValue}"></th:block>
</th:block> </th:block>
</td> </td>
<td> <td>
<th:block th:each="commonCode:${session.commonCode.get(userInfo.ogCd)}"> <th:block th:each="code:${session.commonCode.get(userInfo.ogCd)}">
<th:block th:if="${commonCode.itemCd eq userInfo.ofcCd}" th:text="${commonCode.itemValue}"></th:block> <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> </th:block>
</td> </td>
<td></td>
<td th:text="${userInfo.userNm}"></td> <td th:text="${userInfo.userNm}"></td>
<td th:text="${userInfo.userId}"></td> <td th:text="${userInfo.userId}"></td>
<td th:text="${#temporals.format(userInfo.wrtDt, 'yyyy-MM-dd HH:mm:ss')}"></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="wrtUserGrd" th:value="${activityCase.wrtUserGrd}">
<input type="hidden" name="wrtUserNm" th:value="${activityCase.wrtUserNm}"> <input type="hidden" name="wrtUserNm" th:value="${activityCase.wrtUserNm}">
<input type="hidden" name="caseKey" th:value="${activityCaseInfo.caseKey}"> <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"> <div class="row mb-1">
<label for="receiptNum" class="col-sm-1 col-form-label col-form-label-sm text-center">접수번호</label> <label for="receiptNum" class="col-sm-1 col-form-label col-form-label-sm text-center">접수번호</label>
<div class="col-sm-2"> <div class="col-sm-2">
@ -27,29 +27,33 @@
<div class="col-sm-2"> <div class="col-sm-2">
<input type="text" class="form-control form-control-sm" id="caseNum" name="caseNum" th:value="${activityCaseInfo.caseNum}" placeholder="저장시 생성" readonly> <input type="text" class="form-control form-control-sm" id="caseNum" name="caseNum" th:value="${activityCaseInfo.caseNum}" placeholder="저장시 생성" readonly>
</div> </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"> <div class="col-sm-2">
<th:block th:if="${activityCase.wrtUserGrd eq null}"> <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:block th:unless="${activityCase.wrtUserGrd eq null}"> <th:block th:unless="${activityCase.wrtUserGrd eq null}">
<th:block th:each="code:${session.commonCode.get('JT')}"> <th:block th:each="code:${session.commonCode.get('JT')}">
<th:block th:if="${code.itemCd eq activityCase.wrtUserGrd}"> <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> </th:block>
</th:block> </th:block>
</div> </div>
<label for="wrtDt" class="col-sm-1 col-form-label col-form-label-sm text-center">작성일시</label> <label for="wrtDt" class="col-sm-1 col-form-label col-form-label-sm text-center">작성일시</label>
<div class="col-sm-2"> <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> </div>
<div class="row mb-1"> <div class="row mb-1">
<label for="title" class="col-sm-1 col-form-label col-form-label-sm text-center">제목</label> <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}"> <input type="text" class="form-control form-control-sm" id="title" name="title" th:value="${activityCaseInfo.title}">
</div> </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>
<div class="row mb-1"> <div class="row mb-1">
<label for="suspectAddBtn" class="col-sm-1 col-form-label col-form-label-sm text-center"> <label for="suspectAddBtn" class="col-sm-1 col-form-label col-form-label-sm text-center">
@ -73,11 +77,26 @@
</div> </div>
</div> </div>
<div class="row mb-1"> <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"> <div class="col-sm-11">
<textarea class="form-control form-control-sm" id="description" name="description" th:value="${activityCaseInfo.description}"></textarea> <textarea class="form-control form-control-sm" id="description" name="description" th:value="${activityCaseInfo.description}"></textarea>
</div> </div>
</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"> <div class="row mb-3">
<label for="fileInputer" class="col-sm-1 col-form-label col-form-label-sm text-center">첨부파일</label> <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;"> <div class="col-sm-11" style="min-height: 70px;">

View File

@ -1,76 +1,48 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"> <html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header bg-dark"> <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> <button type="button" class="btn-close f-invert" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body" id="ciWorkViewBody"> <div class="modal-body" id="activityCaseViewModalBody">
<input type="hidden" id="ciwKey" th:value="${ciWork.ciwKey}"> <input type="hidden" id="caseKey" th:value="${activityCaseInfo.caseKey}">
<ul class="nav nav-tabs" id="userTab" role="tablist"> <ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation"> <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> <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>
<li class="nav-item" role="presentation" th:if="${#lists.size(ciWork.fileList)>0}"> <li class="nav-item" role="presentation">
<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> <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> </li>
</ul> </ul>
<div class="tab-content bg-white border border-top-0 p-2"> <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="tab-pane fade p-2 show active" id="boardTabPanel" role="tabpanel" tabindex="0">
<div class="row mb-1"> <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-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-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-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-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-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> </div>
<hr class="my-1"> <hr class="my-1">
<div class="row mb-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-1 col-form-label col-form-label-sm text-center fw-bold">외사활동<br>대상자</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>
</div> </div>
<div class="row mb-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-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>
</div> </div>
<hr class="my-1">
<div class="row mb-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-1 col-form-label col-form-label-sm text-center fw-bold">외사활동이<br>필요한 이유</label>
<div class="col-sm-11 form-control-sm" th:utext="${#strings.replace(ciWork.summaryInfo, lineSeparator, '<br>')}"></div>
</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>
</div> </div>
<div class="tab-pane fade p-2" id="apprvTabPanel" role="tabpanel" tabindex="0">
</div> </div>
<div class="tab-pane fade p-2" id="fileTabPanel" role="tabpanel" tabindex="0"> <div class="tab-pane fade p-2" id="fileTabPanel" role="tabpanel" tabindex="0">
<div class="row mb-3"> <div class="row mb-3">
@ -83,17 +55,17 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<th:block th:if="${#lists.isEmpty(ciWork.fileList)}"> <th:block th:if="${#lists.isEmpty(activityCaseInfo.fileList)}">
<tr> <tr>
<td colspan="2">파일이 없습니다.</td> <td colspan="2">파일이 없습니다.</td>
</tr> </tr>
</th:block> </th:block>
<th:block th:unless="${#lists.isEmpty(ciWork.fileList)}"> <th:block th:unless="${#lists.isEmpty(activityCaseInfo.fileList)}">
<th:block th:each="file:${ciWork.fileList}"> <th:block th:each="file:${activityCaseInfo.fileList}">
<tr class="fileInfoTr"> <tr class="fileInfoTr">
<td> <td>
<a href="#" class="fileDownLink" data-board="ciWork" <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> th:text="|${file.origNm}.${file.fileExtn}|"></a>
</td> </td>
<td th:text="${file.fileSize}"></td> <td th:text="${file.fileSize}"></td>
@ -108,11 +80,7 @@
</div> </div>
</div> </div>
<div class="modal-footer bg-light"> <div class="modal-footer bg-light">
<th:block th:if="${accessAuth eq 'ACC003'}"> <button type="button" class="btn btn-danger" id="deleteCiWorkBtn">삭제</button>
<button type="button" class="btn btn-danger" id="deleteCiWorkBtn" th:data-ciwkey="${ciWork.ciwKey}">삭제</button> <button type="button" class="btn btn-warning" id="editCiWorkBtn">수정</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-secondary" data-bs-dismiss="modal">닫기</button>--> <!-- <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>-->
</div> </div>

View File

@ -107,60 +107,39 @@
<thead> <thead>
<tr class="table-secondary"> <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>
<th>결재상태</th>
<th>첨부파일</th> <th>첨부파일</th>
</tr> </tr>
</thead> </thead>
<tbody class="table-group-divider"> <tbody class="table-group-divider">
<!--<tr class="activityCaseTr" th:each="ciWork:${activityCaseList}"> <tr class="activityCaseTr" th:each="case,cnt:${activityCaseList}">
<input type="hidden" class="ciwKey" th:value="${ciWork.ciwKey}"> <input type="hidden" class="receiptKey" th:value="${case.receiptKey}">
<td th:text="${cnt.count+(searchParams.pageIndex-1)*searchParams.rowCnt}"></td>
<td> <td>
<th:block th:each="code:${session.commonCode.get('CIWR')}"> <th:block th:each="code:${session.commonCode.get('ACT')}">
<th:block th:if="${code.itemCd eq ciWork.workRating}" th:text="${code.itemValue}"></th:block> <th:block th:if="${code.itemCd eq case.caseType}" th:text="${code.itemValue}"></th:block>
</th:block> </th:block>
</td> </td>
<td> <td th:text="${case.receiptNum}"></td>
<th:block th:each="code:${session.commonCode.get('AT')}"> <td th:text="${case.caseNum}"></td>
<th:block th:if="${code.itemCd eq ciWork.arrestType1}" th:text="${code.itemValue}"></th:block> <td th:text="${case.title}"></td>
</th:block> <td th:text="${#temporals.format(case.reportDate, 'yyyy-MM-dd')}"></td>
</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> <td>
<th:block th:each="code:${session.commonCode.get('JT')}"> <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> </th:block>
</td> </td>
<td th:text="${#temporals.format(ciWork.wrtDt, 'yyyy-MM-dd HH:mm')}"></td> <td th:text="${#temporals.format(case.wrtDt, 'yyyy-MM-dd')}"></td>
<td th:text="${ciWork.fileCnt eq null?'파일 없음':#strings.concat(ciWork.fileCnt,' 건')}"></td> <td th:text="${#strings.concat(case.apprvCnt, '/', case.allCnt)}"></td>
<td> <td th:text="${case.fileCnt}"></td>
<div th:text="|1차: ${ciWork.reRatingDate1}|"></div> </tr>
<div th:text="|2차: ${ciWork.reRatingDate2}|"></div>
</td>
</tr>-->
</tbody> </tbody>
</table> </table>
</div> </div>
@ -210,6 +189,13 @@
</div> </div>
</div> </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 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-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content" id="activityCaseViewModalBody"> <div class="modal-content" id="activityCaseViewModalBody">
@ -221,7 +207,7 @@
<div class="modal-dialog modal-xl modal-dialog-scrollable"> <div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header bg-dark"> <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"> <input type="hidden" id="modalUrl" value="/modal/userModal">
<button type="button" class="btn-close f-invert" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close f-invert" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </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"> <div class="col-sm-2">
<select class="form-select form-select-sm suspectType"> <select class="form-select form-select-sm suspectType">
<option value="">선택</option> <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> <option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block> </th:block>
</select> </select>
@ -19,11 +19,16 @@
</div> </div>
<label 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"> <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> </div>
<label 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"> <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> </div>
</div> </div>