강석 최 2023-01-18 18:35:56 +09:00
commit 1aa45812f4
13 changed files with 724 additions and 86 deletions

View File

@ -182,8 +182,12 @@ public class ResultController { // 첩보수집활동 > 외사경찰 견문관
@GetMapping("/affairListModal")
public ModelAndView affairListModal(@AuthenticationPrincipal UserInfo loginUser, AffairBoard affair){
ModelAndView mav = new ModelAndView("igActivities/fpiMgt/affairResult/affairListModal");
affair.setWrtUserSeq(loginUser.getUserSeq());
affair.setRatingOrgan(loginUser.getOgCd());
if(affair.getWrtUserSeq() == null) {
affair.setWrtUserSeq(loginUser.getUserSeq());
}
if(affair.getWrtOrgan() == null) {
affair.setWrtOrgan(loginUser.getOgCd());
}
affair.setFirstIndex(0);
affair.setRowCnt(9999);
mav.addObject("affairList", affairService.selectAffairBoardList(affair));

View File

@ -2,6 +2,7 @@ package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork;
import com.dbnt.faisp.main.authMgt.service.AuthMgtService;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.IntelligenceAnalyze;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.IntelligenceAnalyzeApprv;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlan;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlanApprv;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.service.IntelligenceNetworkService;
@ -154,7 +155,7 @@ public class IntelligenceNetworkController { // 첩보수집활동 > 해양외
}
@GetMapping("/intelligenceAnalyzeList/{type}")
public ModelAndView intelligenceAnalyzeList(@AuthenticationPrincipal UserInfo loginUser,@PathVariable("type") String type, OperationPlan op){
public ModelAndView intelligenceAnalyzeList(@AuthenticationPrincipal UserInfo loginUser,@PathVariable("type") String type, IntelligenceAnalyze ia){
ModelAndView mav = new ModelAndView("igActivities/fpiMgt/intelligenceNetwork/intelligenceAnalyzeList");
//메뉴권한 확인
@ -163,10 +164,10 @@ public class IntelligenceNetworkController { // 첩보수집활동 > 해양외
switch (accessAuth){
case "ACC001": // 조회
case "ACC002": // 작성 // 자신이 작성한 문서만 열람가능
op.setWrtUserSeq(loginUser.getUserSeq());
ia.setWrtUserSeq(loginUser.getUserSeq());
break;
case "ACC003": // 관리 // 자신 외 하위 기관에서 작성한 문서 열람가능
op.setDownOrganCdList(loginUser.getDownOrganCdList());
ia.setDownOrganCdList(loginUser.getDownOrganCdList());
mav.addObject("mgtOrganList", loginUser.getDownOrganCdList());
break;
}
@ -174,10 +175,10 @@ public class IntelligenceNetworkController { // 첩보수집활동 > 해양외
switch (accessAuth){
case "ACC001": // 조회
case "ACC002": // 작성 // 자신의 관서 내에서 작성한 문서만 열람가능
op.setWrtOrgan(loginUser.getOgCd());
ia.setWrtOrgan(loginUser.getOgCd());
break;
case "ACC003": // 관리 // 자신 외 하위 기관에서 작성한 문서 열람가능
op.setDownOrganCdList(loginUser.getDownOrganCdList());
ia.setDownOrganCdList(loginUser.getDownOrganCdList());
mav.addObject("mgtOrganList", loginUser.getDownOrganCdList());
break;
}
@ -187,10 +188,10 @@ public class IntelligenceNetworkController { // 첩보수집활동 > 해양외
if(type.equals("stay")) {
if(apprvAuth==null) {
if(!accessAuth.equals("ACC003")){
op.setWrtUserSeq(loginUser.getUserSeq());
op.setUserType("normalStayList");
ia.setWrtUserSeq(loginUser.getUserSeq());
ia.setUserType("normalStayList");
}else{
op.setUserType("managerStayList");
ia.setUserType("managerStayList");
}
}else{
mav.addObject("userNm", loginUser.getUserNm());
@ -199,17 +200,17 @@ public class IntelligenceNetworkController { // 첩보수집활동 > 해양외
case "APC003": // 계장 // 결재대기 문서 조회
case "APC002": // 부장대행
case "APC001": // 부장 // 결재대기 문서 조회
op.setOpState("DST002");
ia.setIaState("DST002");
break;
}
}
}else if(type.equals("commit")){
if(apprvAuth==null) {
if(!accessAuth.equals("ACC003")){
op.setWrtUserSeq(loginUser.getUserSeq());
op.setUserType("normalCommitList");
ia.setWrtUserSeq(loginUser.getUserSeq());
ia.setUserType("normalCommitList");
}else{
op.setUserType("managerCommitList");
ia.setUserType("managerCommitList");
}
}else{
switch (apprvAuth) {
@ -217,7 +218,7 @@ public class IntelligenceNetworkController { // 첩보수집활동 > 해양외
case "APC003": // 계장 //
case "APC002": // 부장대행
case "APC001": // 부장 //
op.setUserType("sectionCommitList");
ia.setUserType("sectionCommitList");
break;
}
}
@ -225,14 +226,14 @@ public class IntelligenceNetworkController { // 첩보수집활동 > 해양외
mav.addObject("accessAuth", accessAuth);
mav.addObject("apprvAuth", apprvAuth);
op.setQueryInfo();
mav.addObject("opList", intelligenceNetworkService.selectOperationPlanList(op));
op.setContentCnt(intelligenceNetworkService.selectOperationPlanListCnt(op));
op.setPaginationInfo();
ia.setQueryInfo();
mav.addObject("iaList", intelligenceNetworkService.selectIntelligenceAnalyzeList(ia));
ia.setContentCnt(intelligenceNetworkService.selectIntelligenceAnalyzeListCnt(ia));
ia.setPaginationInfo();
mav.addObject("type", type);
mav.addObject("searchUrl", "/intelligenceNetwork/intelligenceAnalyzeList/"+type);
mav.addObject("searchParams", op);
mav.addObject("searchParams", ia);
return mav;
}
@ -240,7 +241,11 @@ public class IntelligenceNetworkController { // 첩보수집활동 > 해양외
public ModelAndView intelligenceAnalyzeEditModal(@AuthenticationPrincipal UserInfo loginUser, IntelligenceAnalyze ia){
ModelAndView mav = new ModelAndView("igActivities/fpiMgt/intelligenceNetwork/intelligenceAnalyzeEditModal");
if(ia.getIaKey()!=null){
ia = intelligenceNetworkService.selectIntelligenceAnalyze(ia);
ia.setAffairList(intelligenceNetworkService.selectIntelligenceAnalyzeAffairKey(ia));
}else {
ia.setWrtOrgan(loginUser.getOgCd());
ia.setWrtUserSeq(loginUser.getUserSeq());
}
mav.addObject("ia", ia);
@ -271,5 +276,27 @@ public class IntelligenceNetworkController { // 첩보수집활동 > 해양외
return intelligenceNetworkService.saveIntelligenceAnalyze(ia);
}
@GetMapping("/intelligenceAnalyzeViewModal")
public ModelAndView intelligenceAnalyzeViewModal(@AuthenticationPrincipal UserInfo loginUser, IntelligenceAnalyze ia){
ModelAndView mav = new ModelAndView("igActivities/fpiMgt/intelligenceNetwork/intelligenceAnalyzeViewModal");
ia = intelligenceNetworkService.selectIntelligenceAnalyze(ia);
ia.setApprvList(intelligenceNetworkService.selectIntelligenceAnalyzeApprv(ia));
mav.addObject("ia", ia);
mav.addObject("userSeq",loginUser.getUserSeq());
//메뉴권한 확인
mav.addObject("accessAuth", authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/intelligenceNetwork/intelligenceAnalyzeList/all").get(0).getAccessAuth());
mav.addObject("apprvAuth", authMgtService.selectApprovalConfigList(loginUser.getUserSeq(), "/intelligenceNetwork/intelligenceAnalyzeList/all").get(0).getApprovalAuth());
return mav;
}
@PostMapping("/intelligenceAnalyzeChange")
public Integer intelligenceAnalyzeChange(@AuthenticationPrincipal UserInfo loginUser, IntelligenceAnalyzeApprv apprv){
apprv.setUserSeq(loginUser.getUserSeq());
apprv.setUserGrd(loginUser.getTitleCd());
apprv.setUserNm(loginUser.getUserNm());
apprv.setSaveDt(LocalDateTime.now());
return intelligenceNetworkService.intelligenceAnalyzeChange(apprv);
}
}

View File

@ -16,6 +16,14 @@ public interface IntelligenceNetworkMapper {
IntelligenceAnalyze selectAffairCnt(IntelligenceAnalyze ia);
List<IntelligenceAnalyze> selectIntelligenceAnalyzeList(IntelligenceAnalyze ia);
Integer selectIntelligenceAnalyzeListCnt(IntelligenceAnalyze ia);
IntelligenceAnalyze selectIntelligenceAnalyze(IntelligenceAnalyze ia);
List<Integer> selectIntelligenceAnalyzeAffairKey(IntelligenceAnalyze ia);
}

View File

@ -34,13 +34,13 @@ public class IntelligenceAnalyze extends BaseModel {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate iaEdate;
@Column(name = "fi_cnt")
private Integer fiCnt;
private Integer fiCnt=0;
@Column(name = "fa_cnt")
private Integer faCnt;
private Integer faCnt=0;
@Column(name = "work_cnt")
private Integer workCnt;
private Integer workCnt=0;
@Column(name = "arrest_cnt")
private Integer arrestCnt;
private Integer arrestCnt=0;
@Column(name = "foreign_affairs")
private String foreignAffairs;
@Column(name = "work")
@ -71,6 +71,8 @@ public class IntelligenceAnalyze extends BaseModel {
@Transient
private String userType;
@Transient
private List<IntelligenceAnalyzeApprv> apprvList;
@Transient
private List<Integer> affairList;
@Transient
private Integer totalCnt;
@ -84,5 +86,7 @@ public class IntelligenceAnalyze extends BaseModel {
private Integer joCnt;
@Transient
private Integer muCnt;
@Transient
private Integer iaTotal;
}

View File

@ -0,0 +1,49 @@
package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime;
@Getter
@Setter
@Entity
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "intelligence_analyze_apprv")
@IdClass(IntelligenceAnalyzeApprv.IntelligenceAnalyzeApprvId.class)
public class IntelligenceAnalyzeApprv {
@Id
@Column(name = "ia_key")
private Integer iaKey;
@Id
@Column(name = "apprv_seq")
private Integer apprvSeq;
@Column(name = "state")
private String state;
@Column(name = "user_seq")
private Integer userSeq;
@Column(name = "user_grd")
private String userGrd;
@Column(name = "user_nm")
private String userNm;
@Column(name = "opinion")
private String opinion;
@Column(name = "Instruction")
private String Instruction;
@Column(name = "save_dt")
private LocalDateTime saveDt;
@Embeddable
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class IntelligenceAnalyzeApprvId implements Serializable {
private Integer iaKey;
private Integer apprvSeq;
}
}

View File

@ -0,0 +1,18 @@
package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.repository;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.IntelligenceAnalyzeApprv;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
public interface IntelligenceAnalyzeApprvRepository extends JpaRepository<IntelligenceAnalyzeApprv, IntelligenceAnalyzeApprv.IntelligenceAnalyzeApprvId> {
List<IntelligenceAnalyzeApprv> findByIaKey(Integer iaKey);
Optional<IntelligenceAnalyzeApprv> findTopByIaKeyOrderByApprvSeqDesc(Integer iaKey);
}

View File

@ -5,11 +5,13 @@ import com.dbnt.faisp.config.BaseService;
import com.dbnt.faisp.config.FileInfo;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.mapper.IntelligenceNetworkMapper;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.IntelligenceAnalyze;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.IntelligenceAnalyzeApprv;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.IntelligenceAnalyzeToAffair;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlan;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlanApprv;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlanFile;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlanFile.OperationPlanFileId;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.repository.IntelligenceAnalyzeApprvRepository;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.repository.IntelligenceAnalyzeRepository;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.repository.IntelligenceAnalyzeToAffairRepository;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.repository.OperationPlanApprvRepository;
@ -34,6 +36,7 @@ public class IntelligenceNetworkService extends BaseService {
private final OperationPlanRepository operationPlanRepository;
private final IntelligenceAnalyzeRepository intelligenceAnalyzeRepository;
private final IntelligenceAnalyzeToAffairRepository intelligenceAnalyzeToAffairRepository;
private final IntelligenceAnalyzeApprvRepository intelligenceAnalyzeApprvRepository;
private final IntelligenceNetworkMapper intelligenceNetworkMapper;
@Transactional
@ -154,6 +157,49 @@ public class IntelligenceNetworkService extends BaseService {
return iaKey;
}
public List<IntelligenceAnalyze> selectIntelligenceAnalyzeList(IntelligenceAnalyze ia) {
return intelligenceNetworkMapper.selectIntelligenceAnalyzeList(ia);
}
public Integer selectIntelligenceAnalyzeListCnt(IntelligenceAnalyze ia) {
return intelligenceNetworkMapper.selectIntelligenceAnalyzeListCnt(ia);
}
public IntelligenceAnalyze selectIntelligenceAnalyze(IntelligenceAnalyze ia) {
return intelligenceNetworkMapper.selectIntelligenceAnalyze(ia);
}
public List<Integer> selectIntelligenceAnalyzeAffairKey(IntelligenceAnalyze ia) {
return intelligenceNetworkMapper.selectIntelligenceAnalyzeAffairKey(ia);
}
public List<IntelligenceAnalyzeApprv> selectIntelligenceAnalyzeApprv(IntelligenceAnalyze ia) {
return intelligenceAnalyzeApprvRepository.findByIaKey(ia.getIaKey());
}
@Transactional
public Integer intelligenceAnalyzeChange(IntelligenceAnalyzeApprv apprv) {
IntelligenceAnalyze saveIntelligenceAnalyze = intelligenceAnalyzeRepository.findById(apprv.getIaKey()).orElse(null);
saveIntelligenceAnalyze.setIaState(apprv.getState());
IntelligenceAnalyzeApprv lastApprv = intelligenceAnalyzeApprvRepository.findTopByIaKeyOrderByApprvSeqDesc(apprv.getIaKey()).orElse(null);
apprv.setApprvSeq(lastApprv==null?1:lastApprv.getApprvSeq()+1);
intelligenceAnalyzeApprvRepository.save(apprv);
switch (apprv.getState()){
case "DST003":
case "DST005":
// 반려시 작성자에게 반려 알림 발송
userAlarmService.sendAlarmToWrtUser(saveIntelligenceAnalyze.getIaKey(), saveIntelligenceAnalyze.getWrtUserSeq(), 34,"외사첩보망 견문관리 운영실적에 문서가 반려되었습니다.");
break;
case "DST004":
case "DST006":
// 부장승인시 작성자에게 승인 알림 발송
userAlarmService.sendAlarmToWrtUser(saveIntelligenceAnalyze.getIaKey(), saveIntelligenceAnalyze.getWrtUserSeq(), 34,"외사첩보망 견문관리 운영실적에 문서가 승인되었습니다.");
break;
}
return apprv.getIaKey();
}

View File

@ -42,9 +42,14 @@
<if test='endDate != null and endDate != ""'>
and a.wrt_dt &lt;= #{endDate}::date+1
</if>
<if test='ratingOrgan != null and ratingOrgan != ""'>
and c.rating_organ = #{ratingOrgan}
</if>
<choose>
<when test='ratingOrgan != null and ratingOrgan != ""'>
and c.rating_organ = #{ratingOrgan}
</when>
<otherwise>
and (c.organ_up != 'T' or c.organ_up is null)
</otherwise>
</choose>
<if test="downOrganCdList != null">
and a.wrt_organ in
<foreach collection="downOrganCdList" item="organCd" separator="," open="(" close=")">

View File

@ -123,4 +123,281 @@
</select>
<sql id="selectIntelligenceAnalyzeListWhere">
<where>
<if test='wrtUserSeq != null and wrtUserSeq != ""'>
and wrt_user_seq = #{wrtUserSeq}
</if>
<if test='wrtOrgan != null and wrtOrgan != ""'>
and wrt_organ = #{wrtOrgan}
</if>
<if test='iaState != null and iaState != ""'>
and ia_state = #{iaState}
</if>
<if test='startDate != null and startDate != ""'>
and wrt_dt >= #{startDate}::date
</if>
<if test='endDate != null and endDate != ""'>
and wrt_dt &lt;= #{endDate}::date+1
</if>
<if test="downOrganCdList != null">
and wrt_organ in
<foreach collection="downOrganCdList" item="organCd" separator="," open="(" close=")">
#{organCd}
</foreach>
</if>
<if test='userType != null and userType != ""'>
<if test='userType == "normalStayList"'>
and ia_state in ('DST002')
</if>
<if test='userType == "normalCommitList"'>
and ia_state in ('DST003', 'DST004', 'DST005', 'DST006')
</if>
<if test='userType == "sectionCommitList"'>
and ia_state in ('DST003', 'DST004', 'DST005', 'DST006')
</if>
<if test='userType == "managerStayList"'>
and ia_state in ('DST002')
</if>
<if test='userType == "managerCommitList"'>
and ia_state in ('DST003', 'DST004', 'DST005', 'DST006')
</if>
</if>
</where>
</sql>
<select id="selectIntelligenceAnalyzeList" resultType="IntelligenceAnalyze" parameterType="IntelligenceAnalyze">
select ia_key,
ia_sdate,
ia_edate,
sum("AAR001"+"AAR003"+"AAR004"+"AAR006"+"AAR008") as total_cnt,
sum("AAR001") as special_cnt,
sum("AAR003") as middle_cnt,
sum("AAR004") as tong_cnt,
sum("AAR006") as jo_cnt,
sum("AAR008") as mu_cnt,
fi_cnt,
(fa_cnt+work_cnt+arrest_cnt) as ia_total,
fa_cnt,
work_cnt,
arrest_cnt,
wrt_dt,
(select item_value from code_mgt where item_cd = ia_state) as ia_state,
wrt_organ,
wrt_user_seq,
(select item_value from code_mgt where item_cd = wrt_user_grd) as wrt_user_grd,
wrt_user_nm
from(
(select ia.ia_key,
iata.affair_key,
ia_sdate,
ia_edate,
fi_cnt,
fa_cnt,
work_cnt,
arrest_cnt,
wrt_dt,
ia_state,
wrt_organ,
wrt_user_seq,
wrt_user_grd,
wrt_user_nm
from intelligence_analyze ia,
intelligence_analyze_to_affair iata
where ia.ia_key = iata.ia_key) a left join
(select ab.affair_key,
case
when ar.affair_rate = 'AAR001' then 1
else 0
end as "AAR001",
case
when ar.affair_rate = 'AAR003' then 1
else 0
end as "AAR003",
case
when ar.affair_rate = 'AAR004' then 1
else 0
end as "AAR004",
case
when ar.affair_rate = 'AAR006' then 1
else 0
end as "AAR006",
case
when ar.affair_rate = 'AAR008' then 1
else 0
end as "AAR008"
from affair_board ab,
affair_rating ar
where ab.affair_key = ar.affair_key
and ab.affair_category = 'CAT216'
and (ar.organ_up != 'T' or ar.organ_up is null))b
on a.affair_key = b.affair_key
)
<include refid="selectIntelligenceAnalyzeListWhere"></include>
group by ia_key,ia_sdate,ia_edate,fi_cnt,fa_cnt,work_cnt,arrest_cnt,wrt_dt,ia_state,wrt_organ,wrt_user_seq, wrt_user_grd,wrt_user_nm
order by ia_key desc
</select>
<select id="selectIntelligenceAnalyzeListCnt" resultType="Integer" parameterType="IntelligenceAnalyze">
select count(*)
from(
select ia_key,
ia_sdate,
ia_edate,
sum("AAR001"+"AAR003"+"AAR004"+"AAR006"+"AAR008") as total_cnt,
sum("AAR001") as special_cnt,
sum("AAR003") as middle_cnt,
sum("AAR004") as tong_cnt,
sum("AAR006") as jo_cnt,
sum("AAR008") as mu_cnt,
fi_cnt,
(fa_cnt+work_cnt+arrest_cnt) as ia_total,
fa_cnt,
work_cnt,
arrest_cnt,
wrt_dt,
ia_state,
wrt_organ,
wrt_user_seq,
wrt_user_grd,
wrt_user_nm
from(
(select ia.ia_key,
iata.affair_key,
ia_sdate,
ia_edate,
fi_cnt,
fa_cnt,
work_cnt,
arrest_cnt,
wrt_dt,
ia_state,
wrt_organ,
wrt_user_seq,
wrt_user_grd,
wrt_user_nm
from intelligence_analyze ia,
intelligence_analyze_to_affair iata
where ia.ia_key = iata.ia_key) a left join
(select ab.affair_key,
case
when ar.affair_rate = 'AAR001' then 1
else 0
end as "AAR001",
case
when ar.affair_rate = 'AAR003' then 1
else 0
end as "AAR003",
case
when ar.affair_rate = 'AAR004' then 1
else 0
end as "AAR004",
case
when ar.affair_rate = 'AAR006' then 1
else 0
end as "AAR006",
case
when ar.affair_rate = 'AAR008' then 1
else 0
end as "AAR008"
from affair_board ab,
affair_rating ar
where ab.affair_key = ar.affair_key
and ab.affair_category = 'CAT216'
and (ar.organ_up != 'T' or ar.organ_up is null))b
on a.affair_key = b.affair_key
)
<include refid="selectIntelligenceAnalyzeListWhere"></include>
group by ia_key,ia_sdate,ia_edate,fi_cnt,fa_cnt,work_cnt,arrest_cnt,wrt_dt,ia_state,wrt_organ,wrt_user_seq, wrt_user_grd,wrt_user_nm
order by ia_key desc
)a
</select>
<select id="selectIntelligenceAnalyze" resultType="IntelligenceAnalyze" parameterType="IntelligenceAnalyze">
select ia_key,
ia_sdate,
ia_edate,
sum("AAR001"+"AAR003"+"AAR004"+"AAR006"+"AAR008") as total_cnt,
sum("AAR001") as special_cnt,
sum("AAR003") as middle_cnt,
sum("AAR004") as tong_cnt,
sum("AAR006") as jo_cnt,
sum("AAR008") as mu_cnt,
fi_cnt,
(fa_cnt+work_cnt+arrest_cnt) as ia_total,
fa_cnt,
work_cnt,
arrest_cnt,
foreign_affairs,
"work",
arrest_offenders,
analysis_evaluation,
measures,
wrt_dt,
ia_state,
wrt_organ,
wrt_user_seq,
(select item_value from code_mgt where item_cd = wrt_user_grd) as wrt_user_grd,
wrt_user_nm
from(
(select ia.ia_key,
iata.affair_key,
ia_sdate,
ia_edate,
fi_cnt,
fa_cnt,
work_cnt,
arrest_cnt,
foreign_affairs,
"work",
arrest_offenders,
analysis_evaluation,
measures,
wrt_dt,
ia_state,
wrt_organ,
wrt_user_seq,
wrt_user_grd,
wrt_user_nm
from intelligence_analyze ia,
intelligence_analyze_to_affair iata
where ia.ia_key = iata.ia_key) a left join
(select ab.affair_key,
case
when ar.affair_rate = 'AAR001' then 1
else 0
end as "AAR001",
case
when ar.affair_rate = 'AAR003' then 1
else 0
end as "AAR003",
case
when ar.affair_rate = 'AAR004' then 1
else 0
end as "AAR004",
case
when ar.affair_rate = 'AAR006' then 1
else 0
end as "AAR006",
case
when ar.affair_rate = 'AAR008' then 1
else 0
end as "AAR008"
from affair_board ab,
affair_rating ar
where ab.affair_key = ar.affair_key
and ab.affair_category = 'CAT216'
and (ar.organ_up != 'T' or ar.organ_up is null))b
on a.affair_key = b.affair_key
)
where ia_key = #{iaKey}
group by ia_key,ia_sdate,ia_edate,fi_cnt,fa_cnt,work_cnt,arrest_cnt, foreign_affairs,"work",arrest_offenders,analysis_evaluation,measures,wrt_dt,ia_state,wrt_organ,wrt_user_seq, wrt_user_grd,wrt_user_nm
</select>
<select id="selectIntelligenceAnalyzeAffairKey" resultType="Integer" parameterType="IntelligenceAnalyze">
select affair_key
from intelligence_analyze_to_affair
where ia_key = #{iaKey}
</select>
</mapper>

View File

@ -7,23 +7,23 @@ $(function(){
})
$(document).on('click', '#allTab', function (){
location.href = "/intelligenceNetwork/operationPlanList/all";
location.href = "/intelligenceNetwork/intelligenceAnalyzeList/all";
})
$(document).on('click', '#stayTab', function (){
location.href = "/intelligenceNetwork/operationPlanList/stay";
location.href = "/intelligenceNetwork/intelligenceAnalyzeList/stay";
})
$(document).on('click', '#commitTab', function (){
location.href = "/intelligenceNetwork/operationPlanList/commit";
location.href = "/intelligenceNetwork/intelligenceAnalyzeList/commit";
})
$(document).on('click', '#addBtn', function (){
getIntelligenceAnalyzeEditModal(null);
})
function getIntelligenceAnalyzeEditModal(opKey){
function getIntelligenceAnalyzeEditModal(iaKey){
$.ajax({
url: '/intelligenceNetwork/intelligenceAnalyzeEditModal',
data: {opKey: opKey},
data: {iaKey: iaKey},
type: 'GET',
dataType:"html",
success: function(html){
@ -43,8 +43,11 @@ function getIntelligenceAnalyzeEditModal(opKey){
}
$(document).on('click', '#affairModalBtn', function (){
const workStartDt = $("#iaSdate").val()
const workEndDt = $("#iaEdate").val()
const affairKey = $("input[name=affairList]");
console.log(affairKey);
console.log(affairKey.val());
const workStartDt = $("#iaSdate").val();
const workEndDt = $("#iaEdate").val();
if(!workStartDt||!workEndDt){
alert("실적기간을 입력해주세요.");
}else{
@ -54,12 +57,19 @@ $(document).on('click', '#affairModalBtn', function (){
startDate: workStartDt,
endDate: workEndDt,
affairCategory:"CAT216",
wrtUserSeq:$("input[name=wrtUserSeq]").val(),
wrtOrgan:$("input[name=wrtOrgan]").val(),
affairStatus:"DST006"
},
type: 'GET',
dataType:"html",
success: function(html){
$("#affairListModalContent").empty().append(html)
$("#affairListModalContent").empty().append(html);
if(affairKey.val() != ""){
for(var i=0; i<affairKey.length;i++){
$(".rowChkBox[value="+affairKey.eq(i).val()+"]").prop("checked", true);
}
}
$("#affairListModal").modal('show');
},
error:function(e){
@ -76,6 +86,10 @@ $(document).on('keyup', '.cntInput', function (){
$(document).on('click', '#getAffairBtn', function (){
const affairList=[];
if($(".rowChkBox:checked").length < 1){
alert("견문을 선택해주세요");
return false;
}
$.each($(".rowChkBox:checked"), function (idx, chkBox){
const affairTr = $(chkBox).parents(".affairTr");
affairList.push(affairTr.find(".rowChkBox").val());
@ -95,13 +109,8 @@ $(document).on('click', '#getAffairBtn', function (){
$("#tongCnt").val(data.tongCnt);
$("#joCnt").val(data.joCnt);
$("#muCnt").val(data.muCnt);
$("#affairList").val(data.affairList);
//$.each(data.affairList, function(affair, idx){
//$("#ddd").val($("#ddd").val()+","+affair);
//})
$("input[name=affairList]").val(data.affairList);
contentFade("out");
//trCarrerList.length = 0;
},
error : function(xhr, status) {
contentFade("out");
@ -111,8 +120,8 @@ $(document).on('click', '#getAffairBtn', function (){
})
$(document).on('click', '#editBtn', function (){
$("#operationPlanViewModal").modal('hide');
getoOerationPlanEditModal($(this).attr("data-opkey"));
$("#intelligenceAnalyzeViewModal").modal('hide');
getIntelligenceAnalyzeEditModal($(this).attr("data-iakey"));
})
$(document).on('click', '#saveBtn', function (){
@ -163,19 +172,19 @@ function saveIntelligenceAnalyze(iaState){
})
}
$(document).on('click', '.operationPlanTr', function (){
getOperationPlanViewModal(Number($(this).find(".opKey").val()));
$(document).on('click', '.intelligenceAnalyzeTr', function (){
getIntelligenceAnalyzeViewModal(Number($(this).find(".iaKey").val()));
})
function getOperationPlanViewModal(opKey){
function getIntelligenceAnalyzeViewModal(iaKey){
$.ajax({
url: '/intelligenceNetwork/operationPlanViewModal',
data: {opKey: opKey},
url: '/intelligenceNetwork/intelligenceAnalyzeViewModal',
data: {iaKey: iaKey},
type: 'GET',
dataType:"html",
success: function(html){
$("#operationPlanViewModalBody").empty().append(html)
$("#operationPlanViewModal").modal('show');
$("#intelligenceAnalyzeViewModalBody").empty().append(html)
$("#intelligenceAnalyzeViewModal").modal('show');
},
error:function(){
@ -192,7 +201,7 @@ $(document).on('click', '.apprvBtn', function (){
$.ajax({
type : 'POST',
data : formData,
url : "/intelligenceNetwork/operationPlanStateChange",
url : "/intelligenceNetwork/intelligenceAnalyzeChange",
processData: false,
contentType: false,
beforeSend: function (xhr){
@ -200,7 +209,7 @@ $(document).on('click', '.apprvBtn', function (){
},
success : function(result) {
alert(approval+"되었습니다");
getOperationPlanViewModal(result);
getIntelligenceAnalyzeViewModal(result);
contentFade("out");
},
error : function(xhr, status) {

View File

@ -106,10 +106,24 @@
</tr>
</thead>
<tbody class="table-group-divider">
<tr class="operationPlanTr">
<tr class="intelligenceAnalyzeTr" th:each="list:${iaList}">
<td th:text="${list.iaKey}"></td>
<td th:text="|${list.iaSdate} ~ ${list.iaEdate}|"></td>
<td th:text="${list.totalCnt}"></td>
<td th:text="${list.specialCnt}"></td>
<td th:text="${list.middleCnt}"></td>
<td th:text="${list.tongCnt}"></td>
<td th:text="${list.joCnt}"></td>
<td th:text="${list.muCnt}"></td>
<td th:text="${list.fiCnt}"></td>
<td th:text="${list.iaTotal}"></td>
<td th:text="${list.faCnt}"></td>
<td th:text="${list.workCnt}"></td>
<td th:text="${list.arrestCnt}"></td>
<td th:text="${#temporals.format(list.wrtDt, 'yyyy-MM-dd HH:mm')}"></td>
<td th:text="${list.iaState}"></td>
<th:block>
<input type="hidden" class="iaKey" th:value="${list.iaKey}">
</th:block>
</tr>
</tbody>
@ -169,9 +183,9 @@
</div>
</div>
<div class="modal fade" id="operationPlanViewModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="planViewModalLabel" aria-hidden="true">
<div class="modal fade" id="intelligenceAnalyzeViewModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="planViewModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content" id="operationPlanViewModalBody">
<div class="modal-content" id="intelligenceAnalyzeViewModalBody">
</div>
</div>

View File

@ -8,14 +8,19 @@
<form action="#" method="post" id="intelligenceAnalyzeEditForm">
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<input type="hidden" id="affairList" name="affairList" th:value="${ia.affairList}">
<!-- <input type="hidden" name="opKey" th:value="${op.opKey}">
<input type="hidden" name="wrtOrgan" th:value="${op.wrtOrgan}">
<input type="hidden" name="wrtPart" th:value="${op.wrtPart}">
<input type="hidden" name="wrtUserSeq" th:value="${op.wrtUserSeq}">
<input type="hidden" name="wrtUserGrd" th:value="${op.wrtUserGrd}">
<input type="hidden" name="wrtUserNm" th:value="${op.wrtUserNm}">
<input type="hidden" name="wrtDt" id="wrtDt" th:value="${#temporals.format(op.wrtDt, 'yyyy-MM-dd HH:mm')}"> -->
<th:block th:if="${ia.iaKey eq null}">
<input type="hidden" name="affairList" th:value="${ia.affairList}">
</th:block>
<th:block th:unless="${ia.iaKey eq null}" th:each="list:${ia.affairList}">
<input type="hidden" name="affairList" th:value="${list}">
</th:block>
<input type="hidden" name="iaKey" th:value="${ia.iaKey}">
<input type="hidden" name="wrtOrgan" th:value="${ia.wrtOrgan}">
<input type="hidden" name="wrtPart" th:value="${ia.wrtPart}">
<input type="hidden" name="wrtUserSeq" th:value="${ia.wrtUserSeq}">
<input type="hidden" name="wrtUserGrd" th:value="${ia.wrtUserGrd}">
<input type="hidden" name="wrtUserNm" th:value="${ia.wrtUserNm}">
<input type="hidden" name="wrtDt" id="wrtDt" th:value="${#temporals.format(ia.wrtDt, 'yyyy-MM-dd HH:mm')}">
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">작성자</label>
<div class="col-sm-2">
@ -30,8 +35,8 @@
<div class="row mb-1">
<label for="iaDateSelectorDiv" class="col-sm-1 col-form-label col-form-label-sm text-center">실적기간</label>
<div class="input-group w-auto input-daterange" id="iaDateSelectorDiv">
<input type="text" class="form-control form-control-sm" id="iaSdate" name="iaSdate" readonly>
<input type="text" class="form-control form-control-sm" id="iaEdate" name="iaEdate" readonly>
<input type="text" class="form-control form-control-sm" id="iaSdate" name="iaSdate" th:value="${ia.iaSdate}" readonly>
<input type="text" class="form-control form-control-sm" id="iaEdate" name="iaEdate" th:value="${ia.iaEdate}" readonly>
</div>
<div class="col-auto">
<input type="button" class="btn btn-sm btn-outline-primary" id="affairModalBtn" value="불러오기">
@ -59,20 +64,19 @@
<th>검거</th>
</tr>
</thead>
<tbody class="table-group-divider text-center">
<tbody class="table-group-divider">
<tr>
<td><input class="form-control form-control-sm" id="totalCnt" type="number" disabled></td>
<td><input class="form-control form-control-sm" id="specialCnt" type="number" disabled></td>
<td><input class="form-control form-control-sm" id="middleCnt" type="number" disabled></td>
<td><input class="form-control form-control-sm" id="tongCnt" type="number" disabled></td>
<td><input class="form-control form-control-sm" id="joCnt" type="number" disabled></td>
<td><input class="form-control form-control-sm" id="muCnt" type="number" disabled></td>
<td><input class="form-control form-control-sm" name="fiCnt" type="number"></td>
<td><input class="form-control form-control-sm" id="totalCnt2" type="number" disabled></td>
<td><input class="form-control form-control-sm cntInput" name="faCnt" type="number"></td>
<td><input class="form-control form-control-sm cntInput" name="workCnt" type="number"></td>
<td><input class="form-control form-control-sm cntInput" name="arrestCnt" type="number"></td>
<td><input class="form-control form-control-sm text-center" id="totalCnt" type="number" th:value="${ia.totalCnt}" disabled></td>
<td><input class="form-control form-control-sm text-center" id="specialCnt" type="number" th:value="${ia.specialCnt}" disabled></td>
<td><input class="form-control form-control-sm text-center" id="middleCnt" type="number" th:value="${ia.middleCnt}" disabled></td>
<td><input class="form-control form-control-sm text-center" id="tongCnt" type="number" th:value="${ia.tongCnt}" disabled></td>
<td><input class="form-control form-control-sm text-center" id="joCnt" type="number" th:value="${ia.joCnt}" disabled></td>
<td><input class="form-control form-control-sm text-center" id="muCnt" type="number" th:value="${ia.muCnt}" disabled></td>
<td><input class="form-control form-control-sm text-center" name="fiCnt" type="number" th:value="${ia.fiCnt}"></td>
<td><input class="form-control form-control-sm text-center" id="totalCnt2" type="number" th:value="${ia.iaTotal}" placeholder="자동합산" disabled></td>
<td><input class="form-control form-control-sm cntInput text-center" name="faCnt" type="number" th:value="${ia.faCnt}"></td>
<td><input class="form-control form-control-sm cntInput text-center" name="workCnt" type="number" th:value="${ia.workCnt}"></td>
<td><input class="form-control form-control-sm cntInput text-center" name="arrestCnt" type="number" th:value="${ia.arrestCnt}"></td>
</tr>
</tbody>
</table>
@ -82,31 +86,31 @@
<div class="row mb-1">
<label for="hashTags" class="col-sm-1 col-form-label col-form-label-sm text-center">외사활동</label>
<div class="col-sm-11">
<textarea id="targetLocation" name="foreignAffairs" rows="5" cols="139" ></textarea>
<textarea id="targetLocation" name="foreignAffairs" th:utext="${ia.foreignAffairs}" rows="5" cols="139" ></textarea>
</div>
</div>
<div class="row mb-1">
<label for="hashTags" class="col-sm-1 col-form-label col-form-label-sm text-center">공작</label>
<div class="col-sm-11">
<textarea id="vulnerabilityAnalyze" name="work" rows="5" cols="139" ></textarea>
<textarea id="vulnerabilityAnalyze" name="work" th:utext="${ia.work}" rows="5" cols="139" ></textarea>
</div>
</div>
<div class="row mb-1">
<label for="hashTags" class="col-sm-1 col-form-label col-form-label-sm text-center">외사사범 검거</label>
<div class="col-sm-11">
<textarea id="eligibilityAnalyze" name="arrestOffenders" rows="5" cols="139" ></textarea>
<textarea id="eligibilityAnalyze" name="arrestOffenders" th:utext="${ia.arrestOffenders}" rows="5" cols="139" ></textarea>
</div>
</div>
<div class="row mb-1">
<label for="hashTags" class="col-sm-1 col-form-label col-form-label-sm text-center">분석 및 평가</label>
<div class="col-sm-11">
<textarea id="focusCollection" name="analysisEvaluation" rows="5" cols="139"></textarea>
<textarea id="focusCollection" name="analysisEvaluation" th:utext="${ia.analysisEvaluation}" rows="5" cols="139"></textarea>
</div>
</div>
<div class="row mb-1">
<label for="hashTags" class="col-sm-1 col-form-label col-form-label-sm text-center">대책</label>
<div class="col-sm-11">
<textarea id="focusCollection" name="measures" rows="5" cols="139"></textarea>
<textarea id="focusCollection" name="measures" th:utext="${ia.measures}" rows="5" cols="139"></textarea>
</div>
</div>

View File

@ -0,0 +1,173 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header bg-dark">
<h5 class="modal-title text-white" id="affairViewModalLabel">운영 실적 열람</h5>
<button type="button" class="btn-close f-invert" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input type="hidden" name="affairKey" id="viewModalAffairKey">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="boardTab" data-bs-toggle="tab" data-bs-target="#boardTabPanel" type="button" role="tab" aria-controls="boardTabPanel" aria-selected="true">본문</button>
</li>
</ul>
<div class="tab-content bg-white border border-top-0 p-2">
<div class="tab-pane fade p-2 show active" id="boardTabPanel" role="tabpanel" tabindex="0">
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">작성자</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="|${ia.wrtUserGrd} ${ia.wrtUserNm}|"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">작성일</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(ia.wrtDt, 'yyyy-MM-dd HH:mm')}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">상태</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${ia.iaState}"></label>
</div>
<hr>
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">실적기간</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="|${ia.iaSdate} ~ ${ia.iaEdate}|"></label>
</div>
<div class="row mb-1">
<div class="row justify-content-start text-center">
<table class="table table-sm table-bordered table-hover">
<thead>
<tr class="table-secondary">
<th colspan="6">첩보수집실적</th>
<th rowspan="2">허위오보</th>
<th colspan="4">활용실적</th>
</tr>
<tr>
<th></th>
<th>특보</th>
<th>중보</th>
<th>통보</th>
<th>조사</th>
<th>무가치</th>
<th></th>
<th>외사<br>활동</th>
<th>공작</th>
<th>검거</th>
</tr>
</thead>
<tbody class="table-group-divider text-center">
<tr>
<td th:text="${ia.totalCnt}"></td>
<td th:text="${ia.specialCnt}"></td>
<td th:text="${ia.middleCnt}"></td>
<td th:text="${ia.tongCnt}"></td>
<td th:text="${ia.joCnt}"></td>
<td th:text="${ia.muCnt}"></td>
<td th:text="${ia.fiCnt}"></td>
<td th:text="${ia.iaTotal}"></td>
<td th:text="${ia.faCnt}"></td>
<td th:text="${ia.workCnt}"></td>
<td th:text="${ia.arrestCnt}"></td>
</tr>
</tbody>
</table>
</div>
</div>
<hr>
<div class="row">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">외사활동</label>
<div class="col-sm-11 form-control-sm" id="contentDiv">
<div th:utext="${ia.foreignAffairs}"></div>
</div>
</div>
<hr>
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">공작</label>
<div class="col-sm-11 form-control-sm" id="contentDiv">
<div th:utext="${ia.work}"></div>
</div>
</div>
<hr>
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">외사사범 검거</label>
<div class="col-sm-11 form-control-sm" id="contentDiv">
<div th:utext="${ia.arrestOffenders}"></div>
</div>
</div>
<hr>
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">분석 및 평가</label>
<div class="col-sm-11 form-control-sm" id="contentDiv">
<div th:utext="${ia.analysisEvaluation}"></div>
</div>
</div>
<hr>
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">대책</label>
<div class="col-sm-11 form-control-sm" id="contentDiv">
<div th:utext="${ia.measures}"></div>
</div>
</div>
</div>
<div class="row">
<div class="col-12" th:unless="${#lists.isEmpty(ia.apprvList)}">
<hr>
<th:block th:each="apprv:${ia.apprvList}">
<div class="row">
<th:block th:each="commonCode:${session.commonCode.get('DST')}">
<label class="col-sm-2 col-form-label col-form-label-sm text-center" th:if="${commonCode.itemCd eq apprv.state}" th:text="|결재결과: ${commonCode.itemValue}|"></label>
</th:block>
<label class="col-sm-2 col-form-label col-form-label-sm text-center">
<th:block th:each="commonCode:${session.commonCode.get('JT')}">
<th:block th:if="${commonCode.itemCd eq apprv.userGrd}" th:text="|결제자: ${commonCode.itemValue} ${apprv.userNm}|"></th:block>
</th:block>
</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-center">
<th:block th:text="|관리관 의견: ${apprv.opinion}|"></th:block>
</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-center">
<th:block th:text="|지시사항: ${apprv.Instruction}|"></th:block>
</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-center">
<th:block th:text="|결제일시: ${#temporals.format(apprv.saveDt, 'yyyy-MM-dd HH:mm:ss')}|"></th:block>
</label>
</div>
</th:block>
</div>
</div>
<div class="col-12" th:if="${(apprvAuth eq 'APC001' or apprvAuth eq 'APC002' or apprvAuth eq 'APC003' or apprvAuth eq 'APC004') and ia.iaState eq 'DST002'}">
<hr>
<form action="#" method="post" id="apprvForm">
<div class="row">
<input type="hidden" name="iaKey" th:value="${ia.iaKey}">
<input type="hidden" name="state" id="viewModalApprvValue">
<div class="row">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">관리관 의견</label>
<div class="col-10">
<input type="text" class="form-control form-control-sm" name="opinion">
</div>
</div>
<br/><br/>
<div class="row">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">지시사항</label>
<div class="col-10">
<input type="text" class="form-control form-control-sm" name="Instruction">
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="modal-footer justify-content-between bg-light">
<div class="col-auto">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
</div>
<div class="col-auto">
<th:block th:if="${(apprvAuth eq 'APC001' or apprvAuth eq 'APC002' or apprvAuth eq 'APC003' or apprvAuth eq 'APC004') and ia.iaState eq 'DST002'}">
<button type="button" class="btn btn-danger apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST003':'DST005'}" th:value="반려">반려</button>
<button type="button" class="btn btn-success apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST004':'DST006'}" th:value="승인">승인</button>
</th:block>
<th:block th:unless="${ia.iaState eq 'DST004' or ia.iaState eq 'DST006'}"><!--승인 상태일때는 수정 불가 -->
<th:block th:if="${userSeq eq ia.wrtUserSeq or accessAuth eq 'ACC003'}"><!--작성자일 경우 수정 허용--><!--관리자일 경우 수정 허용-->
<button type="button" class="btn btn-warning" th:data-iakey="${ia.iaKey}" id="editBtn">수정</button>
</th:block>
</th:block>
</div>
</div>