국제범죄검거현황 중간 커밋

jiHyung 2022-10-17 14:23:16 +09:00
parent c2ccfed074
commit 3ca5daeff7
11 changed files with 1245 additions and 0 deletions

View File

@ -0,0 +1,114 @@
package com.dbnt.faisp.faStatistics.internationalCrimeArrest;
import com.dbnt.faisp.authMgt.service.AuthMgtService;
import com.dbnt.faisp.codeMgt.model.CodeMgt;
import com.dbnt.faisp.codeMgt.service.CodeMgtService;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.model.InternationalCrimeArrest;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.model.SuspectPersonInfo;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.repository.SuspectPersonInfoRepository;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.service.InternationalCrimeArrestService;
import com.dbnt.faisp.ivsgtMgt.boardInvestigation.model.ArrestType;
import com.dbnt.faisp.ivsgtMgt.boardInvestigation.model.BoardInvestigation;
import com.dbnt.faisp.ivsgtMgt.boardInvestigation.model.RelatedReports;
import com.dbnt.faisp.ivsgtMgt.boardInvestigation.service.BoardInvestigationService;
import com.dbnt.faisp.organMgt.model.OrganConfig;
import com.dbnt.faisp.organMgt.service.OrganConfigService;
import com.dbnt.faisp.userInfo.model.UserInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import java.time.LocalDateTime;
import java.util.List;
@RestController
@RequiredArgsConstructor
@RequestMapping("/faStatistics")
public class InternationalCrimeArrestController {
private final AuthMgtService authMgtService;
private final InternationalCrimeArrestService internationalCrimeArrestService;
private final CodeMgtService codeMgtService;
private final OrganConfigService organConfigService;
private final SuspectPersonInfoRepository suspectPersonInfoRepository;
@GetMapping("/internationalCrimeArrest")
public ModelAndView arrest(@AuthenticationPrincipal UserInfo loginUser,InternationalCrimeArrest internationalCrimeArrest) {
ModelAndView mav = new ModelAndView("faStatistics/internationalCrimeArrest/internationalCrimeArrest");
//메뉴권한 확인
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/faStatistics/internationalCrimeArrest").get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth);
mav.addObject("mgtOrganList", loginUser.getDownOrganCdList());
internationalCrimeArrest.setQueryInfo();
mav.addObject("internationalCrimeArrestList", internationalCrimeArrestService.selectInternationalCrimeArrestList(internationalCrimeArrest));
internationalCrimeArrest.setContentCnt(internationalCrimeArrestService.selectInternationalCrimeArrestListCnt(internationalCrimeArrest));
internationalCrimeArrest.setPaginationInfo();
mav.addObject("searchParams", internationalCrimeArrest);
return mav;
}
@GetMapping("/internationalCrimeArrest/internationalCrimeArrestEditModal")
public ModelAndView ivsgtEditModal(@AuthenticationPrincipal UserInfo loginUser, InternationalCrimeArrest internationalCrimeArrest){
ModelAndView mav = new ModelAndView("faStatistics/internationalCrimeArrest/internationalCrimeArrestEditModal");
if(internationalCrimeArrest.getIcaKey()!=null){
internationalCrimeArrest = internationalCrimeArrestService.selectInternationalCrimeArrest(internationalCrimeArrest.getIcaKey());
}else{
internationalCrimeArrest.setWrtOrgan(loginUser.getOgCd());
internationalCrimeArrest.setWrtNm(loginUser.getUserNm());
internationalCrimeArrest.setWrtDt(LocalDateTime.now());
internationalCrimeArrest.setSuspectPersonInfoList(suspectPersonInfoRepository.findByIcaKey(internationalCrimeArrest.getIcaKey()));
}
mav.addObject("organConfigList", selectOrganList());
mav.addObject("internationalCrimeArrest", internationalCrimeArrest);
return mav;
}
@GetMapping("/internationalCrimeArrest/internationalCrimeArrestViewModal")
public ModelAndView ivsgtViewModal(@AuthenticationPrincipal UserInfo loginUser, InternationalCrimeArrest internationalCrimeArrest){
ModelAndView mav = new ModelAndView("faStatistics/internationalCrimeArrest/internationalCrimeArrestViewModal");
internationalCrimeArrest = internationalCrimeArrestService.selectInternationalCrimeArrest(internationalCrimeArrest.getIcaKey());
mav.addObject("internationalCrimeArrest", internationalCrimeArrest);
mav.addObject("userSeq",loginUser.getUserSeq());
//메뉴권한 확인
mav.addObject("accessAuth", authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/faStatistics/internationalCrimeArrest").get(0).getAccessAuth());
return mav;
}
@PostMapping("/internationalCrimeArrest/saveInternationalCrimeArrest")
public Integer saveInternationalCrimeArrest(@AuthenticationPrincipal UserInfo loginUser,
InternationalCrimeArrest internationalCrimeArrest){
internationalCrimeArrest.setWrtUserSeq(loginUser.getUserSeq());
return internationalCrimeArrestService.savedInternationalCrimeArrest(internationalCrimeArrest);
}
public List<OrganConfig> selectOrganList(){
List<CodeMgt> organCdList = codeMgtService.selectCodeMgtList("OG");
List<OrganConfig> organConfigList = organConfigService.selectSavedOrganList();
for(CodeMgt organCode: organCdList){
if(!organCode.getItemCd().equals("OG001")){
boolean usedFlag = false;
for(OrganConfig organConfig: organConfigList){
if(organCode.getItemCd().equals(organConfig.getOrganCd())){
usedFlag = true;
organConfig.setOrganNm(organCode.getItemValue());
organConfig.setUseState("T");
break;
}
}
if(!usedFlag){
OrganConfig organConfig = new OrganConfig();
organConfig.setOrganCd(organCode.getItemCd());
organConfig.setOrganNm(organCode.getItemValue());
organConfig.setUseState("F");
organConfigList.add(organConfig);
}
}
}
return organConfigList;
}
}

View File

@ -0,0 +1,14 @@
package com.dbnt.faisp.faStatistics.internationalCrimeArrest.mapper;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.model.InternationalCrimeArrest;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.model.SuspectPersonInfo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface InternationalCrimeArrestMapper{
List<InternationalCrimeArrest> selectInternationalCrimeArrestList(InternationalCrimeArrest internationalCrimeArrest);
Integer selectInternationalCrimeArrestListCnt(InternationalCrimeArrest internationalCrimeArrest);
List<SuspectPersonInfo> selectSuspectPersonInfoList(Integer icaKey);
}

View File

@ -0,0 +1,93 @@
package com.dbnt.faisp.faStatistics.internationalCrimeArrest.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 org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestParam;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Getter
@Setter
@Entity
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "international_crime_arrest")
public class InternationalCrimeArrest extends BaseModel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ica_key")
private Integer icaKey;
@Column(name = "organ")
private String organ;
@Column(name = "department")
private String department;
@Column(name = "crime_type")
private String crimeType;
@Column(name = "violation_type")
private String violationType;
@Column(name = "crime_name")
private String crimeName;
@Column(name = "smuggling_amount")
private String smugglingAmount;
@Column(name = "occur_table")
private String occurTable;
@Column(name = "arrest_table")
private String arrestTable;
@Column(name = "suspect_table")
private String suspectTable;
@Column(name = "crime_awareness_dt")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate crimeAwarenessDt;
@Column(name = "case_sent_dt")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate caseSentDt;
@Column(name = "process_result")
private String processResult;
@Column(name = "other_crime")
private String otherCrime;
@Column(name = "case_num")
private String caseNum;
@Column(name = "case_overview")
private String caseOverview;
@Column(name = "sea_area")
private String seaArea;
@Column(name = "arrest_area")
private String arrestArea;
@Column(name = "means")
private String means;
@Column(name = "purpose")
private String purpose;
@Column(name = "smuggled_goods")
private String smuggledGoods;
@Column(name = "crackdown_personel")
private Integer crackdownPersonel;
@Column(name = "violation_amount")
private String violationAmount;
@Column(name = "destination")
private String destination;
@Column(name = "content_status")
private String contentStatus;
@Column(name = "wrt_organ")
private String wrtOrgan;
@Column(name = "wrt_user_seq")
private Integer wrtUserSeq;
@Column(name = "wrt_nm")
private String wrtNm;
@Column(name = "wrt_dt")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private LocalDateTime wrtDt;
@Transient
private List<SuspectPersonInfo> suspectPersonInfoList;
@Transient
private List<Integer> deleteSpikeyList;
}

View File

@ -0,0 +1,49 @@
package com.dbnt.faisp.faStatistics.internationalCrimeArrest.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 org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.List;
@Getter
@Setter
@Entity
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "suspect_person_info")
public class SuspectPersonInfo extends BaseModel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "spi_key")
private Integer spiKey;
@Column(name = "ica_key")
private Integer icaKey;
@Column(name = "sex")
private String sex;
@Column(name = "age")
private String age;
@Column(name = "country")
private String country;
@Column(name = "stay_qualification")
private String stayQualification;
@Column(name = "stay_period_expired_dt")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDateTime stayPeriodExpiredDt;
@Column(name = "entry_visa")
private String entryVisa;
@Column(name = "crime_form")
private String crimeForm;
@Transient
private List<Integer> icaKeyList;
@Transient
private List<Integer> spiKeyList;
}

View File

@ -0,0 +1,19 @@
package com.dbnt.faisp.faStatistics.internationalCrimeArrest.repository;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.model.InternationalCrimeArrest;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
public interface InternationalCrimeArrestRepository extends JpaRepository<InternationalCrimeArrest, Integer> {
@Transactional
@Modifying
@Query("delete from SuspectPersonInfo s where s.spiKey in :idList")
void deleteAllByIdInQuery(@Param("idList") List<Integer> deleteSpikeyList);
}

View File

@ -0,0 +1,12 @@
package com.dbnt.faisp.faStatistics.internationalCrimeArrest.repository;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.model.SuspectPersonInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface SuspectPersonInfoRepository extends JpaRepository<SuspectPersonInfo, Integer> {
List<SuspectPersonInfo> findByIcaKey(Integer icaKey);
}

View File

@ -0,0 +1,63 @@
package com.dbnt.faisp.faStatistics.internationalCrimeArrest.service;
import com.dbnt.faisp.config.BaseService;
import com.dbnt.faisp.config.FileInfo;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.mapper.InternationalCrimeArrestMapper;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.model.InternationalCrimeArrest;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.model.SuspectPersonInfo;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.repository.InternationalCrimeArrestRepository;
import com.dbnt.faisp.faStatistics.internationalCrimeArrest.repository.SuspectPersonInfoRepository;
import com.dbnt.faisp.fpiMgt.affair.model.HashTag;
import com.dbnt.faisp.fpiMgt.affair.repository.HashTagRepository;
import com.dbnt.faisp.ivsgtMgt.boardInvestigation.mapper.BoardInvestigationMapper;
import com.dbnt.faisp.ivsgtMgt.boardInvestigation.model.*;
import com.dbnt.faisp.ivsgtMgt.boardInvestigation.repository.*;
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.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Service
@RequiredArgsConstructor
public class InternationalCrimeArrestService extends BaseService {
private final InternationalCrimeArrestRepository internationalCrimeArrestRepository;
private final InternationalCrimeArrestMapper internationalCrimeArrestMapper;
private final SuspectPersonInfoRepository suspectPersonInfoRepository;
public List<InternationalCrimeArrest> selectInternationalCrimeArrestList(InternationalCrimeArrest InternationalCrimeArrest) {
return internationalCrimeArrestMapper.selectInternationalCrimeArrestList(InternationalCrimeArrest);
}
public Integer selectInternationalCrimeArrestListCnt(InternationalCrimeArrest internationalCrimeArrest) {
return internationalCrimeArrestMapper.selectInternationalCrimeArrestListCnt(internationalCrimeArrest);
}
public InternationalCrimeArrest selectInternationalCrimeArrest(Integer icaKey) {
InternationalCrimeArrest savedInternationalCrimeArrest = internationalCrimeArrestRepository.findById(icaKey).orElse(null);
if (savedInternationalCrimeArrest != null) {
savedInternationalCrimeArrest.setSuspectPersonInfoList(suspectPersonInfoRepository.findByIcaKey(icaKey));
}
return savedInternationalCrimeArrest;
}
@Transactional
public Integer savedInternationalCrimeArrest(InternationalCrimeArrest internationalCrimeArrest) {
Integer icaKey = internationalCrimeArrestRepository.save(internationalCrimeArrest).getIcaKey();
if (internationalCrimeArrest.getDeleteSpikeyList() != null) {
internationalCrimeArrestRepository.deleteAllByIdInQuery(internationalCrimeArrest.getDeleteSpikeyList());
}
if (internationalCrimeArrest.getSuspectPersonInfoList() != null) {
suspectPersonInfoRepository.saveAll(internationalCrimeArrest.getSuspectPersonInfoList());
}
return icaKey;
}
}

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dbnt.faisp.faStatistics.internationalCrimeArrest.mapper.InternationalCrimeArrestMapper">
<sql id="selectInternationalCrimeArrestListWhere">
<where>
<if test='wrtOrgan != null and wrtOrgan != ""'>
AND a.wrt_organ = #{wrtOrgan}
</if>
<if test='dateSelector == "wrtDt"'>
<if test='startDate != null and startDate != ""'>
And a.wrt_dt >= #{startDate}::DATE
</if>
<if test='endDate != null and endDate != ""'>
AND a.wrt_dt &lt;= #{endDate}::DATE+1
</if>
</if>
</where>
</sql>
<select id="selectInternationalCrimeArrestList" resultType="InternationalCrimeArrest" parameterType="InternationalCrimeArrest">
SELECT
i.ica_key,
i.organ,
i.department,
i.crime_type,
i.violation_type,
i.crime_name,
i.smuggling_amount,
i.occur_table,
i.arrest_table,
i.suspect_table,
i.crime_awareness_dt,
i.case_sent_dt,
i.process_result,
i.other_crime,
i.case_num,
i.case_overview,
i.arrest_area,
i.means,
i.purpose,
i.smuggled_goods,
i.crackdown_personel,
i.violation_amount,
i.destination,
i.content_status,
i.wrt_organ,
i.wrt_user_seq,
i.wrt_nm,
i.wrt_dt
FROM international_crime_arrest i
<include refid="selectInternationalCrimeArrestListWhere"></include>
ORDER BY i.ica_key DESC
LIMIT #{rowCnt} OFFSET #{firstIndex}
</select>
<select id="selectInternationalCrimeArrestListCnt" resultType="int" parameterType="InternationalCrimeArrest">
SELECT count(*)
FROM international_crime_arrest
<include refid="selectInternationalCrimeArrestListWhere"></include>
</select>
<select id="selectSuspectPersonInfoList" resultType="SuspectPersonInfo" parameterType="int">
SELECT
s.spi_key,
s.ica_key,
s.sex,
s.age,
s.country,
s.stay_qualification,
s.stay_period_expired_dt,
s.entry_visa,
s.crime_form
FROM suspect_person_info s
INNER JOIN international_crime_arrest i
ON s.ica_key = i.ica_key
WHERE s.ica_key = #{icaKey}
</select>
</mapper>

View File

@ -0,0 +1,473 @@
$(document).on('click', '#icaAddBtn', function () {
getIcaEditModal(null);
});
$(document).on('click', '#saveIcaBtn', function (){
saveInternationalCrimeArrest('N')
});
$(document).on('click', '#saveTempBtn', function (){
saveInternationalCrimeArrest('Y')
});
$(document).on('change', '#crimeForm', function (){
$('#crimeFormDiv').next().remove();
if ($(this).val() != 'CMF001') {
$('#crimeFormDiv').after('<button type="button" class="col-sm-1 btn btn-sm btn-primary" id="spiAddBtn">+</button>');
} else {
$("#spiDiv").children('.dynamic').remove();
}
});
$(document).on('click', '#spiAddBtn', function (){
let sex = '';
commonCode.SEX.forEach(function (item){
sex += '<option value="'+ item.itemCd +'">' + item.itemValue +'</option>';
});
let age = '';
commonCode.AGE.forEach(function (item){
age += '<option value="'+ item.itemCd +'">' + item.itemValue +'</option>';
})
let country = '';
commonCode.NNY.forEach(function (item){
country += '<option value="'+ item.itemCd +'">' + item.itemValue +'</option>';
})
$("#spiDiv").append(
'<div class="row dynamic spi-list">'
+ '<label class="col-sm-1 col-form-label text-center">성별</label>'
+ '<div class="col-sm-2" id="sexFormDiv">'
+ '<select class="form-select form-select-sm" name="sex">'
+ sex
+ '</select>'
+ '</div>'
+ '<label class="col-sm-1 col-form-label text-center">나이</label>'
+ '<div class="col-sm-2" id="ageFormDiv">'
+ '<select class="form-select form-select-sm" name="age">'
+ age
+ '</select>'
+ '</div>'
+ '<label class="col-sm-1 col-form-label text-center">국적</label>'
+ '<div class="col-sm-2" id="countryFormDiv">'
+ '<select class="form-select form-select-sm country" name="country">'
+ country
+ '<option value="etc">기타</option>'
+ '</select>'
+ '</div>'
+ '<button type="button" class="col-sm-1 btn btn-sm btn-primary" id="spiCancelBtn">-</button>'
+ '</div>'
);
});
$(document).on('change', '.country', function (){
if ($(this).val() == 'etc') {
$(this).parent().after(
'<div class="col-sm-2">'
+ '<input type="text" class="form-control" name="countryEtc">'
+ '</div>'
);
} else {
$(this).parent().next().remove();
}
});
$(document).on('change', '#processResult', function (){
if ($(this).val() == 'etc') {
$(this).parent().after(
'<div class="col-sm-2">'
+ '<input type="text" class="form-control" name="processResultEtc">'
+ '</div>'
);
} else {
$(this).parent().next().remove();
}
});
$(document).on('click', '#spiCancelBtn', function (){
$(this).parent().remove();
});
$(document).on('change', '#crimeType', function (){
$('#smugglingAmountDiv').children().remove();
$('#crimeNameDiv').children().remove();
$('#arrestAreaDiv').remove();
let smugglingAmount = '';
commonCode.SG.forEach(function (item){
smugglingAmount += '<option value="'+ item.itemCd +'">' + item.itemValue +'</option>';
})
if ($(this).val() == 'CTH002') {
makeArrestAreaDiv('장소');
$('#smugglingAmountDiv').append(
'<label class="col-sm-2 col-form-label text-center">밀수입출 품목</label>'
+ '<div class="col-sm-2">'
+ '<select class="form-select form-select-sm" name="smuggledGoods" id="smugglingAmount">'
+ '<option value=""></option>'
+ smugglingAmount
+ '<option value="etc">기타</option>'
+ '</select>'
+ '</div>'
+ '<label class="col-sm-2 col-form-label text-center">밀수가액</label>'
+ '<div class="col-sm-2">'
+ '<input type="number" min="0" name="smugglingAmount">'
+ '</div>'
+ '<label class="col-sm-2 col-form-label text-center">단속 인원(경찰관)</label>'
+ '<div class="col-sm-2">'
+ '<input type="number" min="0" name="caseNum">'
+ '</div>'
);
} else {
$("#crimeNameDiv").append(
'<label class="col-sm-2 col-form-label text-center">죄명</label>'
+ '<div class="col-sm-10 input-daterange">'
+ '<input type="text" class="form-control" name="crimeName">'
+ '</div>'
);
}
});
$(document).on('change', '#violationType', function (){
$('#spiInfoDiv').remove();
$('#arrestAreaDiv').remove();
$('#meansDiv').remove();
$('.entryVisa').remove();
$('#violationAmountDiv').remove();
if ($(this).val() == 'VLT001') {
makeSpiInfoDiv('피의자 정보');
makeArrestAreaDiv('지역');
makeSeaAreaDiv('밀입국');
makeMeansDiv('밀입국');
makePurposeDiv('밀입국');
makeDestinationDiv('밀입국 출발지(국가)');
}
if ($(this).val() == 'VLT002') {
makeSpiInfoDiv('피의자 정보');
makeArrestAreaDiv('지역');
makeSeaAreaDiv('도외이탈');
makeMeansDiv('도외이탈');
makePurposeDiv('도외이탈');
}
if ($(this).val() == 'VLT003') {
makeSpiInfoDiv('피의자 정보');
makeArrestAreaDiv('지역');
makeSeaAreaDiv('밀출국');
makeMeansDiv('밀출국');
makePurposeDiv('밀출국');
makeDestinationDiv('밀출국 행선지(도착예정지)');
}
if ($(this).val() == 'VLT004') {
makeSpiInfoDiv('피의자 정보');
makeArrestAreaDiv('지역');
makeSeaAreaDiv('밀항');
makeMeansDiv('밀항');
makePurposeDiv('밀항');
makeDestinationDiv('밀항 행선지(도착예정지)');
}
if ($(this).val() == 'VLT005') {
makeSpiInfoDiv('불법체류 및 취업');
makeEntryVisaDiv();
}
if ($(this).val() == 'VLT301') {
makeViolationAmountDiv();
}
});
$(document).on('change', '#smugglingAmount', function (){
if ($(this).val() == 'etc') {
$(this).parent().append(
'<div class="col-auto">'
+ '<input type="text" class="form-control" name="smugglingAmountEtc">'
+ '</div>'
);
} else {
$(this).next().remove();
}
});
$(document).on('change', '#means', function (){
if ($(this).val() == 'etc') {
$(this).parent().append(
'<div class="col-auto">'
+ '<input type="text" class="form-control" name="meansEtc">'
+ '</div>'
);
} else {
$(this).next().remove();
}
});
$(document).on('change', '#purpose', function (){
if ($(this).val() == 'etc') {
$(this).parent().append(
'<div class="col-auto">'
+ '<input type="text" class="form-control" name="purposesEtc">'
+ '</div>'
);
} else {
$(this).next().remove();
}
});
$(function(){
$("#datePickerDiv").datepicker({
format: "yyyy-mm-dd",
language: "ko"
});
});
function makeEntryVisaDiv() {
$('#spiWrapper').prepend(
'<label class="col-sm-2 col-form-label text-center entryVisa">입국비자</label>'
+ '<div class="col-sm-2 entryVisa">'
+ '<input type="text" class="form-control" name="entryVisa">'
+ '</div>'
);
}
function makeSpiInfoDiv(name) {
$('#spiParentDiv').after(
'<div class="mb-3 row" id="spiInfoDiv">'
+ '<label class="col-sm-2 col-form-label text-center">' + name + '</label>'
+ '<div class="col-sm-10">'
+ '<div class="row" id="spiWrapper">'
+ '<label class="col-sm-2 col-form-label text-center">체류 자격</label>'
+ '<div class="col-sm-2">'
+ '<input type="text" class="form-control" name="stayQualification">'
+ '</div>'
+ '<label class="col-sm-2 col-form-label text-center">체류기간 만료일</label>'
+ '<div class="col-sm-2 input-daterange" id="stayQualificationDiv">'
+ '<input type="text" class="form-control" name="stayPeriodExpiredDt" id="stayPeriodExpiredDt" readonly>'
+ '</div>'
+ '</div>'
+ '</div>'
+ '</div>'
);
$("#stayQualificationDiv").datepicker({
format: "yyyy-mm-dd",
language: "ko"
});
}
function makeSeaAreaDiv(name) {
let seaArea = '';
commonCode.SAA.forEach(function (item){
seaArea += '<option value="'+ item.itemCd +'">' + item.itemValue +'</option>';
})
$('#arrestAreaDiv').append(
'<label class="col-sm-2 col-form-label text-center">' + name + '시도 해역(해안)</label>'
+ '<div class="col-sm-3">'
+ '<select class="form-select form-select-sm" name="smugglingAmount">'
+ '<option value=""></option>'
+ seaArea
+ '</select>'
+ '</div>'
);
}
function makeArrestAreaDiv(name) {
let arrestArea = '';
commonCode.SAA.forEach(function (item){
arrestArea += '<option value="'+ item.itemCd +'">' + item.itemValue +'</option>';
})
$('#spiParentDiv').after(
'<div class="mb-3 row" id="arrestAreaDiv">'
+ '<label class="col-sm-2 col-form-label text-center">검거' + name + '</label>'
+ '<div class="col-sm-2">'
+ '<input type="text" class="form-control" name="arrestArea">'
+ '</div>'
+ '</div>'
);
}
function makeMeansDiv(name, code) {
let means = '';
if (code == 'VLT001') {
commonCode.MS1.forEach(function (item){
means += '<option value="'+ item.itemCd +'">' + item.itemValue +'</option>';
})
} else {
commonCode.MS2.forEach(function (item){
means += '<option value="'+ item.itemCd +'">' + item.itemValue +'</option>';
})
}
$('#spiParentDiv').after(
'<div class="mb-3 row" id="meansDiv">'
+ '<label class="col-sm-2 col-form-label text-center">' + name + ' 수단(방법)</label>'
+ '<div class="col-sm-2">'
+ '<select class="form-select form-select-sm" name="means" id="means">'
+ '<option value=""></option>'
+ means
+ '<option value="etc">기타</option>'
+ '</select>'
+ '</div>'
+ '</div>'
);
}
function makePurposeDiv(name) {
let purpose = "";
commonCode.PPS.forEach(function (item){
purpose += '<option value="'+ item.itemCd +'">' + item.itemValue +'</option>';
})
$('#meansDiv').append(
'<label class="col-sm-2 col-form-label text-center">' + name + ' 목적(사유)</label>'
+ '<div class="col-sm-2">'
+ '<select class="form-select form-select-sm" name="purpose" id="purpose">'
+ '<option value=""></option>'
+ purpose
+ '<option value="etc">기타</option>'
+ '</select>'
+ '</div>'
);
}
function makeDestinationDiv(name) {
$('#meansDiv').append(
'<label class="col-sm-2 col-form-label text-center">' + name + '</label>'
+ '<div class="col-sm-2">'
+ '<input type="text" class="form-control" name="destination">'
+ '</div>'
);
}
function makeViolationAmountDiv() {
$('#spiParentDiv').after(
'<div class="mb-3 row" id="violationAmountDiv">'
+ '<label class="col-sm-2 col-form-label text-center">표시위반 금액(만원)</label>'
+ '<div class="col-sm-2">'
+ '<input type="number" min="0" class="form-control" name="violationAmount">'
+ '</div>'
+ '</div>'
);
}
function getIcaViewModal(ivsgtKey){
$.ajax({
url: '/faStatistics/internationalCrimeArrest/internationalCrimeArrestViewModal',
data: {ivsgtKey: ivsgtKey},
type: 'GET',
dataType:"html",
success: function(html){
$("#ivsgtViewBody").empty().append(html)
$("#ivsgtViewModal").modal('show');
},
error:function(){
}
});
}
function getIcaEditModal(icaKey){
$.ajax({
url: '/faStatistics/internationalCrimeArrest/internationalCrimeArrestEditModal',
data: {
icaKey: icaKey
},
type: 'GET',
dataType:"html",
success: function(html){
$("#icaEditModalContent").empty().append(html)
$("#icaEditModal").modal('show');
$("#crimeAwarenessDtDiv").datepicker({
format: "yyyy-mm-dd",
language: "ko"
});
$("#caseSentDtDiv").datepicker({
format: "yyyy-mm-dd",
language: "ko"
});
$("[name='caseOverview']").summernote({
lang:'ko-KR',
height: 120,
disableDragAndDrop: true,
toolbar: [
['style', ['style']],
['font', ['bold', 'underline', 'clear']],
['color', ['color']],
['para', ['ul', 'ol', 'paragraph']],
['table', ['table']]
]
});
},
error:function(){
}
});
}
function saveInternationalCrimeArrest(contentState){
if(contentCheck()){
if(confirm("저장하시겠습니까?")){
$("#contentStatus").val(contentState);
contentFade("in");
const formData = new FormData($("#icaEditForm")[0]);
let spiList = [];
$(".spi-list").each(function (){
spiList.push({
sex: $(this).find('select[name="sex"]').val(),
age: $(this).find('select[name="age"]').val(),
country: $(this).find('select[name="country"]').val()
});
});
for (let i=0; i < spiList.length; i++) {
formData.append(`suspectPersonInfoList[${i}].sex`, spiList[i].sex);
formData.append(`suspectPersonInfoList[${i}].age`, spiList[i].age);
formData.append(`suspectPersonInfoList[${i}].country`, spiList[i].country);
}
/*
// formData 출력
for (const [key,value] of formData.entries()) {
console.log(`${key}: ${value}`);
}
*/
$.ajax({
type : 'POST',
data : formData,
url : "/faStatistics/internationalCrimeArrest/saveInternationalCrimeArrest",
processData: false,
contentType: false,
success : function(result) {
alert("저장되었습니다.");
contentFade("out");
$("#icaEditModal").modal('hide');
// getIcaViewModal(result);
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")
contentFade("out");
}
})
}
}
}
function contentCheck(){
let flag = true;
if(!$('select[name="organ"]').val()){
alert("지방청을 선택해주세요.")
flag = false;
}
return flag;
}

View File

@ -0,0 +1,122 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/layout}">
<th:block layout:fragment="script">
<script th:inline="javascript">
const internationalCrimeArrest = [[${internationalCrimeArrest}]];
const commonCode = [[${session.commonCode}]];
</script>
<script type="text/javascript" th:src="@{/js/faStatistics/internationalCrimeArrest.js}"></script>
</th:block>
<div layout:fragment="content">
<main class="pt-3">
<h4>국제범죄검거 현황</h4>
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<div class="row mx-0">
<div class="col-12 card">
<div class="card-body">
<div class="tab-pane fade show active" id="ica" role="tabpanel"
aria-labelledby="arrest-tab">
<table class="table table-striped">
<thead>
<tr>
<th>지방청</th>
<th>경찰서</th>
<th>
<div>범죄테마</div>
<div>(대분류)</div>
</th>
<th>
<div>위반유형</div>
<div>(중분류)</div>
</th>
<th>
<div>죄명</div>
<div>(소분류)</div>
</th>
<th>발생원표</th>
<th>검거원표</th>
<th>피의자원표</th>
<th>피의자 인적사항</th>
<th>범죄인지</th>
<th>사건송치</th>
<th>신병처리</th>
</tr>
</thead>
<tbody>
<tr class="tr" th:each="internationalCrimeArrest:${internationalCrimeArrestList}" th:data-key="${internationalCrimeArrest.icaKey}">
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<td th:if="${internationalCrimeArrest.organ eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<td th:if="${internationalCrimeArrest.department eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<td th:text="${internationalCrimeArrest.crimeType}"></td>
<td th:text="${internationalCrimeArrest.violationType}"></td>
<td th:text="${internationalCrimeArrest.crimeName}"></td>
<td th:text="${internationalCrimeArrest.occurTable}"></td>
<td th:text="${internationalCrimeArrest.arrestTable}"></td>
<td th:text="${internationalCrimeArrest.suspectTable}"></td>
<td th:text="${internationalCrimeArrest.suspectTable}"></td>
<td th:text="${#temporals.format(internationalCrimeArrest.crimeAwarenessDt, 'yyyy-MM-dd')}"></td>
<td th:text="${#temporals.format(internationalCrimeArrest.caseSentDt, 'yyyy-MM-dd')}"></td>
<td th:text="${internationalCrimeArrest.processResult}"></td>
</tr>
</tbody>
</table>
<button id="ivsgtAddBtn">관리자마감</button>
<button id="ivsgtAddBtn">엑셀 다운로드</button>
<button id="icaAddBtn">등록</button>
</div>
<!-- 페이징 -->
<div class="row justify-content-center">
<div class="col-auto">
<nav aria-label="Page navigation">
<ul class="pagination">
<th:block th:if="${searchParams.pageIndex>3}">
<li class="page-item" th:data-pageindex="${(searchParams.pageIndex)-3}">
<a class="page-link" href="#" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
</th:block>
<th:block th:each="num : ${#numbers.sequence(searchParams.startNum, searchParams.endNum)}">
<li class="page-item" th:data-pageindex="${num}" th:classappend="${searchParams.pageIndex eq num?'active':''}">
<a class="page-link" href="#" th:text="${num}"></a>
</li>
</th:block>
<th:block th:if="${searchParams.maxNum>searchParams.endNum+2}">
<li class="page-item" th:data-pageindex="${(searchParams.pageIndex)+3}">
<a class="page-link" href="#" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
</th:block>
</ul>
</nav>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="icaEditModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="icaEditModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content" id="icaEditModalContent">
</div>
</div>
</div>
<div class="modal fade" id="icaViewModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="icaViewModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content" id="icaViewBody">
</div>
</div>
</div>
</main>
</div>
</html>

View File

@ -0,0 +1,205 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header">
<h5 class="modal-title" id="planEditModalLabel">국제범죄검거 현황 등록</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body" id="icaEditBody">
<form action="#" method="post" id="icaEditForm">
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<input type="hidden" name="icaKey" th:value="${internationalCrimeArrest.icaKey}">
<input type="hidden" name="wrtOrgan" th:value="${internationalCrimeArrest.wrtOrgan}">
<input type="hidden" name="wrtNm" th:value="${internationalCrimeArrest.wrtNm}">
<input type="hidden" name="wrtDt" th:value="${#temporals.format(internationalCrimeArrest.wrtDt, 'yyyy-MM-dd HH:mm')}">
<input type="hidden" id="contentStatus" name="contentStatus">
<div class="mb-3 row">
<label class="col-sm-2 col-form-label text-center">지방청w</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" name="organ">
<option value="">지방청</option>
<th:block th:each="organConfig:${organConfigList}">
<th:block th:if="${organConfig.parentOrgan eq 'OG001' && organConfig.organType ne 'OGC001'}">
<option th:value="${organConfig.organCd}" th:text="${organConfig.organNm}"></option>
</th:block>
</th:block>
</select>
</div>
<label class="col-sm-2 col-form-label text-center">관할서</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" name="department">
<option value="">관할서</option>
<th:block th:each="organConfig:${organConfigList}">
<th:block th:if="${organConfig.parentOrgan ne null && organConfig.organType ne 'OGC002'}">
<option th:value="${organConfig.organCd}" th:text="${organConfig.organNm}"></option>
</th:block>
</th:block>
</select>
</div>
<div class="col-sm-4 row" id="crimeNameDiv">
<label class="col-sm-2 col-form-label text-center">죄명</label>
<div class="col-sm-10 input-daterange">
<input type="text" class="form-control" name="crimeName" th:value="${internationalCrimeArrest.crimeName}">
</div>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2 col-form-label text-center">범죄테마</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" name="crimeType" id="crimeType">
<option value="">범죄테마</option>
<th:block th:each="commonCode:${session.commonCode.get('CTH')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"
th:selected="${commonCode.itemCd eq internationalCrimeArrest.crimeType}"></option>
</th:block>
</select>
</div>
<label class="col-sm-2 col-form-label text-center">위반유형</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" name="violationType" id="violationType">
<option value="">위반유형</option>
<th:block th:each="commonCode:${session.commonCode.get('VLT')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"
th:selected="${commonCode.itemCd eq internationalCrimeArrest.violationType}"></option>
</th:block>
</select>
</div>
</div>
<div class="mb-3 row" id="smugglingAmountDiv">
</div>
<div class="mb-3 row">
<label class="col-sm-2 col-form-label text-center">발생원표</label>
<div class="col-sm-2">
<input type="text" name="occurTable" th:value="${internationalCrimeArrest.occurTable}">
</div>
<label class="col-sm-2 col-form-label text-center">검거원표</label>
<div class="col-sm-2">
<input type="text" name="arrestTable" th:value="${internationalCrimeArrest.arrestTable}">
</div>
<label class="col-sm-2 col-form-label text-center">피의자원표</label>
<div class="col-sm-2">
<input type="text" name="suspectTable" th:value="${internationalCrimeArrest.suspectTable}">
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2 col-form-label text-center">범행형태</label>
<div class="col-sm-2" id="crimeFormDiv">
<select class="form-select form-select-sm" name="crimeForm" id="crimeForm">
<th:block th:each="commonCode:${session.commonCode.get('CMF')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"
th:selected="${!#lists.isEmpty(internationalCrimeArrest.suspectPersonInfoList) && commonCode.itemCd eq internationalCrimeArrest.suspectPersonInfoList.crimeForm}"></option>
</th:block>
</select>
</div>
</div>
<div class="mb-3 row" id="spiParentDiv">
<label class="col-sm-2 col-form-label text-center">피의자 인적사항</label>
<div class="col-sm-10" id="spiDiv">
<div class="row spi-list">
<th:block th:if="${#lists.isEmpty(internationalCrimeArrest.suspectPersonInfoList)}">
<label class="col-sm-1 col-form-label text-center">성별</label>
<div class="col-sm-2" id="sexFormDiv">
<select class="form-select form-select-sm" name="sex">
<th:block th:each="commonCode:${session.commonCode.get('SEX')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"
th:selected="${!#lists.isEmpty(internationalCrimeArrest.suspectPersonInfoList) && commonCode.itemCd eq internationalCrimeArrest.suspectPersonInfoList.sex}"></option>
</th:block>
</select>
</div>
<label class="col-sm-1 col-form-label text-center">나이</label>
<div class="col-sm-2" id="ageFormDiv">
<select class="form-select form-select-sm" name="age">
<th:block th:each="commonCode:${session.commonCode.get('AGE')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"
th:selected="${!#lists.isEmpty(internationalCrimeArrest.suspectPersonInfoList) && commonCode.itemCd eq internationalCrimeArrest.suspectPersonInfoList.age}"></option>
</th:block>
</select>
</div>
<label class="col-sm-1 col-form-label text-center">국적</label>
<div class="col-sm-2" id="countryFormDiv">
<select class="form-select form-select-sm country" name="country">
<th:block th:each="commonCode:${session.commonCode.get('NNY')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"
th:selected="${!#lists.isEmpty(internationalCrimeArrest.suspectPersonInfoList) && commonCode.itemCd eq internationalCrimeArrest.suspectPersonInfoList.conutry}"></option>
</th:block>
<option value="etc">기타</option>
</select>
</div>
</th:block>
<th:block th:if="${!#lists.isEmpty(internationalCrimeArrest.suspectPersonInfoList)}">
<th:block th:each="suspectPersonInfo:${internationalCrimeArrest.suspectPersonInfoList}">
<label class="col-sm-1 col-form-label text-center">성별</label>
<th:block th:each="commonCode:${session.commonCode.get('SEX')}">
<th:block th:if="${commonCode.itemCd eq suspectPersonInfo.sex}">
<select class="form-select form-select-sm" name="sex">
<th:block th:each="commonCode:${session.commonCode.get('SEX')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"
th:selected="${!#lists.isEmpty(internationalCrimeArrest.suspectPersonInfoList) && commonCode.itemCd eq internationalCrimeArrest.suspectPersonInfoList.sex}"></option>
</th:block>
</select>
</th:block>
</th:block>
<label class="col-sm-1 col-form-label text-center">나이</label>
<th:block th:each="commonCode:${session.commonCode.get('AGE')}">
<th:block th:if="${commonCode.itemCd eq suspectPersonInfo.age}">
<select class="form-select form-select-sm" name="age">
<th:block th:each="commonCode:${session.commonCode.get('AGE')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"
th:selected="${!#lists.isEmpty(internationalCrimeArrest.suspectPersonInfoList) && commonCode.itemCd eq internationalCrimeArrest.suspectPersonInfoList.age}"></option>
</th:block>
</select>
</th:block>
</th:block>
<label class="col-sm-1 col-form-label text-center">국적</label>
<th:block th:each="commonCode:${session.commonCode.get('NNY')}">
<th:block th:if="${commonCode.itemCd eq suspectPersonInfo.country}">
<select class="form-select form-select-sm country" name="country" id="country">
<th:block th:each="commonCode:${session.commonCode.get('NNY')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"
th:selected="${!#lists.isEmpty(internationalCrimeArrest.suspectPersonInfoList) && commonCode.itemCd eq internationalCrimeArrest.suspectPersonInfoList.conutry}"></option>
</th:block>
<option value="etc">기타</option>
</select>
</th:block>
</th:block>
</th:block>
</th:block>
</div>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2 col-form-label text-center">범죄인지</label>
<div class="col-sm-1 input-daterange" id="crimeAwarenessDtDiv">
<input type="text" class="form-control" name="crimeAwarenessDt" id="crimeAwarenessDt" th:value="${#temporals.format(internationalCrimeArrest.crimeAwarenessDt, 'yyyy-MM-dd HH:mm')}" readonly>
</div>
<label class="col-sm-2 col-form-label text-center">사건송치</label>
<div class="col-sm-1 input-daterange" id="caseSentDtDiv">
<input type="text" class="form-control" name="caseSentDt" id="caseSentDt" th:value="${#temporals.format(internationalCrimeArrest.caseSentDt, 'yyyy-MM-dd HH:mm')}" readonly>
</div>
<label class="col-sm-2 col-form-label text-center">신병처리</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" name="processResult" id="processResult">
<th:block th:each="commonCode:${session.commonCode.get('PCR')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"
th:selected="${commonCode.itemCd eq internationalCrimeArrest.processResult}"></option>
</th:block>
<option value="etc">기타</option>
</select>
</div>
</div>
<div class="mb-3 row justify-content-center">
<label for="caseOverviewDiv" class="col-sm-2 col-form-label text-center">범죄사실(사건개요)</label>
<div class="col-sm-10" id="caseOverviewDiv">
<textarea type='text' name='caseOverview' th:utext="${internationalCrimeArrest.caseOverview}"></textarea>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
<button type="button" class="btn btn-warning" id="saveTempBtn">임시저장</button>
<button type="button" class="btn btn-primary" id="saveIcaBtn">저장</button>
</div>
</html>