# Conflicts:
#	src/main/resources/templates/fragments/leftMenu.html
강석 최 2022-10-31 18:24:43 +09:00
commit 479126666f
15 changed files with 958 additions and 70 deletions

View File

@ -13,7 +13,7 @@ import com.dbnt.faisp.main.fipTarget.service.FipTargetService;
import com.dbnt.faisp.main.organMgt.service.OrganConfigService; import com.dbnt.faisp.main.organMgt.service.OrganConfigService;
import com.dbnt.faisp.main.userInfo.model.UserInfo; import com.dbnt.faisp.main.userInfo.model.UserInfo;
import com.dbnt.faisp.main.userInfo.service.UserInfoService; import com.dbnt.faisp.main.userInfo.service.UserInfoService;
import com.dbnt.faisp.util.Excel;
import com.dbnt.faisp.util.ParamMap; import com.dbnt.faisp.util.ParamMap;
import com.dbnt.faisp.util.Utils; import com.dbnt.faisp.util.Utils;
@ -160,7 +160,7 @@ public class FipTargetController {
return partInfo.getPiSeq(); return partInfo.getPiSeq();
} }
@GetMapping("/PartInfoHistoryPage") @GetMapping("/partInfoHistoryPage")
public ModelAndView PartInfoHistoryPage(PartInfo partInfo) { public ModelAndView PartInfoHistoryPage(PartInfo partInfo) {
ModelAndView mav = new ModelAndView("fipTarget/partInfoHistory"); ModelAndView mav = new ModelAndView("fipTarget/partInfoHistory");
mav.addObject("partInfoList", fipTargetService.selectPartInfoSeq(partInfo)); mav.addObject("partInfoList", fipTargetService.selectPartInfoSeq(partInfo));
@ -474,11 +474,37 @@ public class FipTargetController {
public ModelAndView ipShipList(@AuthenticationPrincipal UserInfo loginUser, ShipInfo shipInfo, HttpServletResponse response) { public ModelAndView ipShipList(@AuthenticationPrincipal UserInfo loginUser, ShipInfo shipInfo, HttpServletResponse response) {
ModelAndView mav = new ModelAndView("fipTarget/ipShipList"); ModelAndView mav = new ModelAndView("fipTarget/ipShipList");
shipInfo.setDownOrganCdList(loginUser.getDownOrganCdList()); shipInfo.setDownOrganCdList(loginUser.getDownOrganCdList());
//엑셀다운
if(shipInfo.getExcel() != null && shipInfo.getExcel().equals("Y")){
String[] headers = {"hangro", "owner_nm", "ship_nm", "ship_weight", "susong", "operation_cnt", "close_yn", "wrt_dt"};
String[] headerNames = { "항로", "사업자"+System.lineSeparator()+"(한국대리점)", "선명", "국제"+System.lineSeparator()+"총톤수", "수송능력", "운항횟수", "휴항", "최종수정일"};
String[] columnType = { "String", "String", "String", "String", "String", "String", "String","String"};
String sheetName="";
String excelFileName="";
if(shipInfo.getSiType().equals("KRCN")) {
sheetName = "한-중 국제여객선 현황";
excelFileName = "한-중 국제여객선 현황";
}else if(shipInfo.getSiType().equals("KRJPRU")) {
sheetName = "한-일,러 국제여객선 현황";
excelFileName = "한-일,러 국제여객선 현황";
}
List<ParamMap> ipShipList= fipTargetService.selectShipInfoListToExcle(shipInfo);
try {
Utils.ipShipDownExcel(ipShipList, response, headers, headerNames,columnType, sheetName, excelFileName);
} catch (IOException e) {
}
return null;
}
//메뉴권한 확인 //메뉴권한 확인
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/target/ipShipList?siType="+shipInfo.getSiType()).get(0).getAccessAuth(); String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/target/ipShipList?siType="+shipInfo.getSiType()).get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth); mav.addObject("accessAuth", accessAuth);
shipInfo.setQueryInfo(); shipInfo.setQueryInfo();
mav.addObject("shipInfoList", fipTargetService.selectShipInfoList(shipInfo));
shipInfo.setContentCnt(fipTargetService.selectShipInfoListCnt(shipInfo));
shipInfo.setPaginationInfo(); shipInfo.setPaginationInfo();
mav.addObject("uesrId", loginUser.getUserId()); mav.addObject("uesrId", loginUser.getUserId());
mav.addObject("searchParams", shipInfo); mav.addObject("searchParams", shipInfo);
@ -489,13 +515,69 @@ public class FipTargetController {
public ModelAndView ipShipEditModal(@AuthenticationPrincipal UserInfo loginUser,ShipInfo shipInfo) { public ModelAndView ipShipEditModal(@AuthenticationPrincipal UserInfo loginUser,ShipInfo shipInfo) {
ModelAndView mav = new ModelAndView("fipTarget/ipShipEditModal"); ModelAndView mav = new ModelAndView("fipTarget/ipShipEditModal");
//메뉴권한 확인 //메뉴권한 확인
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/target/partWorkList").get(0).getAccessAuth(); String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/target/ipShipList?siType="+shipInfo.getSiType()).get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth); mav.addObject("accessAuth", accessAuth);
mav.addObject("siType", shipInfo.getSiType());
return mav; return mav;
} }
@PostMapping("/saveShipInfo")
public void saveShipInfo (@AuthenticationPrincipal UserInfo loginUser, ShipInfo shipInfo){
shipInfo.setWrtNm(loginUser.getUserId());
shipInfo.setWrtPart(loginUser.getOfcCd());
shipInfo.setWrtTitle(loginUser.getTitleCd());
shipInfo.setWrtUserSeq(loginUser.getUserSeq());
shipInfo.setWrtOrgan(loginUser.getOgCd());
shipInfo.setWrtDt(LocalDateTime.now());
fipTargetService.saveShipInfo(shipInfo);
}
@GetMapping("/shipInfoView")
public ModelAndView shipInfoView(@AuthenticationPrincipal UserInfo loginUser,ShipInfo shipInfo) {
ModelAndView mav = new ModelAndView("fipTarget/ipShipViewModal");
mav.addObject("shipInfo", fipTargetService.selectShipInfo(shipInfo));
//메뉴권한 확인
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/target/ipShipList?siType="+shipInfo.getSiType()).get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth);
//첫번째 작성 UserSeq
mav.addObject("wrtUserSeq", fipTargetService.selectFirstWrtId(shipInfo));
mav.addObject("userSeq", loginUser.getUserSeq());
return mav;
}
@PostMapping("/updateShipInfo")
public ShipInfo updateShipInfo (@AuthenticationPrincipal UserInfo loginUser,ShipInfo shipInfo){
shipInfo.setWrtNm(loginUser.getUserId());
shipInfo.setWrtPart(loginUser.getOfcCd());
shipInfo.setWrtTitle(loginUser.getTitleCd());
shipInfo.setWrtUserSeq(loginUser.getUserSeq());
shipInfo.setWrtOrgan(loginUser.getOgCd());
shipInfo.setWrtDt(LocalDateTime.now());
return fipTargetService.updateShipInfo(shipInfo);
}
@GetMapping("/ipShipHistory")
public ModelAndView ipShipHistory(ShipInfo shipInfo) {
ModelAndView mav = new ModelAndView("fipTarget/ipShipHistory");
mav.addObject("shipInfoList", fipTargetService.selectShipInfoSeq(shipInfo));
return mav;
}
@GetMapping("/ipShipHistoryView")
@ResponseBody
public ShipInfo ipShipHistoryView(ShipInfo shipInfo){
return fipTargetService.selectIpShipHistoryView(shipInfo);
}
@PostMapping("/deleteShipInfo")
@ResponseBody
public void deleteShipInfo(@RequestBody ShipInfo shipInfo) {
fipTargetService.deleteShipInfo(shipInfo);
}
//국제여객선 끝

View File

@ -3,6 +3,7 @@ package com.dbnt.faisp.main.fipTarget.mapper;
import com.dbnt.faisp.main.fipTarget.model.PartInfo; import com.dbnt.faisp.main.fipTarget.model.PartInfo;
import com.dbnt.faisp.main.fipTarget.model.PartInfoFile; import com.dbnt.faisp.main.fipTarget.model.PartInfoFile;
import com.dbnt.faisp.main.fipTarget.model.PartWork; import com.dbnt.faisp.main.fipTarget.model.PartWork;
import com.dbnt.faisp.main.fipTarget.model.ShipInfo;
import com.dbnt.faisp.main.fipTarget.model.Vulnerable; import com.dbnt.faisp.main.fipTarget.model.Vulnerable;
import com.dbnt.faisp.util.ParamMap; import com.dbnt.faisp.util.ParamMap;
@ -51,6 +52,15 @@ public interface FipTargetMapper {
Vulnerable selectVulnInfo(Vulnerable vulnerable); Vulnerable selectVulnInfo(Vulnerable vulnerable);
List<ShipInfo> selectShipInfoList(ShipInfo shipInfo);
Integer selectShipInfoListCnt(ShipInfo shipInfo);
ShipInfo selectShipInfo(ShipInfo shipInfo);
List<ParamMap> selectShipInfoListToExcle(ShipInfo shipInfo);

View File

@ -38,7 +38,7 @@ public class ShipInfo extends BaseModel implements Serializable{
@Column(name = "start_point") @Column(name = "start_point")
private String startPoint; private String startPoint;
@Column(name = "end_point") @Column(name = "end_point")
private Integer endPoint; private String endPoint;
@Column(name = "distance_nm") @Column(name = "distance_nm")
private String distanceNm; private String distanceNm;
@Column(name = "distance_km") @Column(name = "distance_km")
@ -50,7 +50,7 @@ public class ShipInfo extends BaseModel implements Serializable{
@Column(name = "operation_cnt") @Column(name = "operation_cnt")
private String operationCnt; private String operationCnt;
@Column(name = "ship_weight") @Column(name = "ship_weight")
private Integer shipWeight; private Double shipWeight;
@Column(name = "passenger_cnt") @Column(name = "passenger_cnt")
private Integer passengerCnt; private Integer passengerCnt;
@Column(name = "freight_cnt") @Column(name = "freight_cnt")
@ -76,6 +76,9 @@ public class ShipInfo extends BaseModel implements Serializable{
@Transient @Transient
private String excel; private String excel;
@Transient
private String weightStr;
@Override @Override
public String toString() { public String toString() {

View File

@ -0,0 +1,26 @@
package com.dbnt.faisp.main.fipTarget.repository;
import com.dbnt.faisp.main.fipTarget.model.ShipInfo;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface ShipInfoRepository extends JpaRepository<ShipInfo, ShipInfo.ShipInfoId> {
ShipInfo findTopBySiTypeOrderBySiSeqDesc(String siType);
List<ShipInfo> findBySiSeqAndSiTypeOrderByVersionNoDesc(Integer siSeq, String siType);
void deleteBySiSeqAndSiType(Integer siSeq, String siType);
@Query(value = "SELECT wrt_user_seq FROM ship_info WHERE si_seq=:siSeq AND si_type=:siType order by version_no asc limit 1", nativeQuery = true)
Integer getWrtUserSeq(@Param("siSeq") Integer siSeq,@Param("siType") String siType);
}

View File

@ -12,6 +12,8 @@ import com.dbnt.faisp.main.fipTarget.model.PartWork;
import com.dbnt.faisp.main.fipTarget.model.PartWork.PartWorkId; import com.dbnt.faisp.main.fipTarget.model.PartWork.PartWorkId;
import com.dbnt.faisp.main.fipTarget.model.PartWorkFile; import com.dbnt.faisp.main.fipTarget.model.PartWorkFile;
import com.dbnt.faisp.main.fipTarget.model.PartWorkFile.PartWorkFileId; import com.dbnt.faisp.main.fipTarget.model.PartWorkFile.PartWorkFileId;
import com.dbnt.faisp.main.fipTarget.model.ShipInfo;
import com.dbnt.faisp.main.fipTarget.model.ShipInfo.ShipInfoId;
import com.dbnt.faisp.main.fipTarget.model.VulnFile; import com.dbnt.faisp.main.fipTarget.model.VulnFile;
import com.dbnt.faisp.main.fipTarget.model.VulnFile.VulnFileId; import com.dbnt.faisp.main.fipTarget.model.VulnFile.VulnFileId;
import com.dbnt.faisp.main.fipTarget.model.Vulnerable; import com.dbnt.faisp.main.fipTarget.model.Vulnerable;
@ -19,6 +21,7 @@ import com.dbnt.faisp.main.fipTarget.repository.PartInfoFileRepository;
import com.dbnt.faisp.main.fipTarget.repository.PartInfoRepository; import com.dbnt.faisp.main.fipTarget.repository.PartInfoRepository;
import com.dbnt.faisp.main.fipTarget.repository.PartWorkFileRepository; import com.dbnt.faisp.main.fipTarget.repository.PartWorkFileRepository;
import com.dbnt.faisp.main.fipTarget.repository.PartWorkRepository; import com.dbnt.faisp.main.fipTarget.repository.PartWorkRepository;
import com.dbnt.faisp.main.fipTarget.repository.ShipInfoRepository;
import com.dbnt.faisp.main.fipTarget.repository.VulnFileRepository; import com.dbnt.faisp.main.fipTarget.repository.VulnFileRepository;
import com.dbnt.faisp.main.fipTarget.repository.VulnRepository; import com.dbnt.faisp.main.fipTarget.repository.VulnRepository;
import com.dbnt.faisp.util.ParamMap; import com.dbnt.faisp.util.ParamMap;
@ -31,6 +34,8 @@ 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.text.DecimalFormat;
import java.time.LocalDateTime;
import java.util.*; import java.util.*;
@Service @Service
@ -45,6 +50,7 @@ public class FipTargetService extends BaseService {
private final PartWorkFileRepository partWorkFileRepository; private final PartWorkFileRepository partWorkFileRepository;
private final VulnRepository vulnRepository; private final VulnRepository vulnRepository;
private final VulnFileRepository vulnFileRepository; private final VulnFileRepository vulnFileRepository;
private final ShipInfoRepository shipInfoRepository;
private final FipTargetMapper fipTargetMapper; private final FipTargetMapper fipTargetMapper;
@Transactional @Transactional
@ -407,6 +413,87 @@ public class FipTargetService extends BaseService {
vulnRepository.deleteById(vulnerable.getVulnKey()); vulnRepository.deleteById(vulnerable.getVulnKey());
} }
@Transactional
public void saveShipInfo(ShipInfo shipInfo) {
ShipInfo dbShip = shipInfoRepository.findTopBySiTypeOrderBySiSeqDesc(shipInfo.getSiType());
if(dbShip == null) {
shipInfo.setSiSeq(1);
shipInfo.setVersionNo(1);
}else {
shipInfo.setSiSeq(dbShip.getSiSeq()+1);
shipInfo.setVersionNo(1);
}
shipInfoRepository.save(shipInfo);
}
public List<ShipInfo> selectShipInfoList(ShipInfo shipInfo) {
List<ShipInfo> List = fipTargetMapper.selectShipInfoList(shipInfo);
DecimalFormat formatter3 = new DecimalFormat("#,##0.####");
for(ShipInfo tmpList : List) {
if(tmpList.getShipWeight() != null) {
tmpList.setWeightStr(formatter3.format(tmpList.getShipWeight()));
}
}
return List;
}
public Integer selectShipInfoListCnt(ShipInfo shipInfo) {
return fipTargetMapper.selectShipInfoListCnt(shipInfo);
}
public ShipInfo selectShipInfo(ShipInfo shipInfo) {
return fipTargetMapper.selectShipInfo(shipInfo);
}
@Transactional
public ShipInfo updateShipInfo(ShipInfo shipInfo) {
ShipInfo dbShip = shipInfoRepository.findById(new ShipInfoId(shipInfo.getSiSeq(),shipInfo.getSiType(), shipInfo.getVersionNo())).orElse(null);
ShipInfo shipTmp = new ShipInfo();
shipTmp.setSiSeq(dbShip.getSiSeq());
shipTmp.setSiType(dbShip.getSiType());
shipTmp.setVersionNo(dbShip.getVersionNo()+1);
shipTmp.setStartPoint(shipInfo.getStartPoint());
shipTmp.setEndPoint(shipInfo.getEndPoint());
shipTmp.setOwnerNm(shipInfo.getOwnerNm());
shipTmp.setShipNm(shipInfo.getShipNm());
shipTmp.setDistanceNm(shipInfo.getDistanceNm());
shipTmp.setDistanceKm(shipInfo.getDistanceKm());
shipTmp.setShipWeight(shipInfo.getShipWeight());
shipTmp.setPassengerCnt(shipInfo.getPassengerCnt());
shipTmp.setFreightCnt(shipInfo.getFreightCnt());
shipTmp.setOperationCnt(shipInfo.getOperationCnt());
shipTmp.setCloseYn(shipInfo.getCloseYn());
shipTmp.setDescription(shipInfo.getDescription());
shipTmp.setWrtNm(shipInfo.getWrtNm());
shipTmp.setWrtPart(shipInfo.getWrtPart());
shipTmp.setWrtTitle(shipInfo.getWrtTitle());
shipTmp.setWrtUserSeq(shipInfo.getWrtUserSeq());
shipTmp.setWrtOrgan(shipInfo.getWrtOrgan());
shipTmp.setWrtDt(shipInfo.getWrtDt());
return shipInfoRepository.save(shipTmp);
}
public List<ShipInfo> selectShipInfoSeq(ShipInfo shipInfo) {
return shipInfoRepository.findBySiSeqAndSiTypeOrderByVersionNoDesc(shipInfo.getSiSeq(),shipInfo.getSiType());
}
public ShipInfo selectIpShipHistoryView(ShipInfo shipInfo) {
return shipInfoRepository.findById(new ShipInfoId(shipInfo.getSiSeq(),shipInfo.getSiType(), shipInfo.getVersionNo())).orElse(null);
}
@Transactional
public void deleteShipInfo(ShipInfo shipInfo) {
shipInfoRepository.deleteBySiSeqAndSiType(shipInfo.getSiSeq(),shipInfo.getSiType());
}
public List<ParamMap> selectShipInfoListToExcle(ShipInfo shipInfo) {
return fipTargetMapper.selectShipInfoListToExcle(shipInfo);
}
public Integer selectFirstWrtId(ShipInfo shipInfo) {
return shipInfoRepository.getWrtUserSeq(shipInfo.getSiSeq(),shipInfo.getSiType());
}

View File

@ -4,6 +4,7 @@ package com.dbnt.faisp.util;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -877,4 +878,85 @@ public class Utils {
} }
} }
public static void ipShipDownExcel(List<ParamMap> ipShipList, HttpServletResponse response, String[] headers,
String[] headerNames, String[] columnType, String sheetName, String excelFileName) throws IOException {
DecimalFormat formatter3 = new DecimalFormat("#,##0.####");
if(Utils.isNotEmpty(ipShipList)) {
// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
XSSFWorkbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet(sheetName);
Row headerRow = sheet.createRow(0);
CellStyle cellStyle1 = wb.createCellStyle(); //쉼표들어간 숫자 양식
CellStyle cellStyle2 = wb.createCellStyle();
CellStyle cellStyle3 = wb.createCellStyle();//숫자양식
CellStyle headerStyle = wb.createCellStyle(); //숫자양식
XSSFDataFormat format = wb.createDataFormat();
cellStyle1.setDataFormat(format.getFormat("#,##0"));
cellStyle2.setDataFormat(format.getFormat("#,##0"));
cellStyle3.setWrapText(true);
cellStyle1.setAlignment(HorizontalAlignment.CENTER);
cellStyle2.setAlignment(HorizontalAlignment.CENTER);
cellStyle3.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
headerStyle.setFillForegroundColor((short)3);
headerStyle.setFillForegroundColor(IndexedColors.LIME.getIndex());
headerStyle.setWrapText(true);
//로우그리기
for(int i=0; i<ipShipList.size(); i++) {
ParamMap rowData = ipShipList.get(i);
Row row = sheet.createRow(i+1);
rowData.set("hangro", rowData.get("start_point")+"/"+rowData.get("end_point")+System.lineSeparator()+"("+rowData.get("distance_nm")+","+rowData.get("distance_km")+")");
if(rowData.get("ship_weight") != null) {
rowData.set("ship_weight", formatter3.format(rowData.get("ship_weight")));
}
rowData.set("susong", "여객: "+rowData.get("passenger_cnt")+"명"+System.lineSeparator()+"화물 :"+rowData.get("freight_cnt")+"TEU");
for(int j=0; j<headers.length; j++) {
Cell cell = row.createCell(j);
if(columnType[j].equalsIgnoreCase("Money")) {
cell.setCellValue(rowData.getInt(headers[j]));
cell.setCellStyle(cellStyle1);
} else if(columnType[j].equalsIgnoreCase("double")) {
cell.setCellValue(rowData.getInt(headers[j]));
cell.setCellStyle(cellStyle2);
} else if(columnType[j].equalsIgnoreCase("String")) {
cell.setCellValue(rowData.getString(headers[j]));
cell.setCellStyle(cellStyle3);
} else {
cell.setCellValue(rowData.getString(headers[j]));
}
}
}
//헤더그리기
for(int j=0; j<headerNames.length; j++) {
Cell cell = headerRow.createCell(j);
cell.setCellValue(headerNames[j]);
cell.setCellStyle(headerStyle);
sheet.autoSizeColumn(j);
sheet.setColumnWidth(j, (sheet.getColumnWidth(j)) +(short)1024);
}
//엑셀이름 한글깨짐방지
String outputFileName = new String(excelFileName.getBytes("KSC5601"), "8859_1");
response.setHeader("Set-Cookie", "fileDownload=true; path=/");
response.setHeader("Content-Disposition", String.format("attachment; filename=\""+outputFileName+"_"+Utils.getTimeStampString("yyyyMMdd_HHmm")+".xlsx\""));
wb.write(response.getOutputStream());
wb.close();
} else {
createNoDataAlert(response);
}
}
} }

View File

@ -529,4 +529,110 @@
where vuln_key = #{vulnKey} where vuln_key = #{vulnKey}
</select> </select>
<select id="selectShipInfoList" resultType="ShipInfo" parameterType="ShipInfo">
select si.si_seq,
version_no,
si_type,
start_point,
end_point,
distance_nm,
distance_km,
owner_nm,
ship_nm,
ship_weight,
passenger_cnt,
freight_cnt,
operation_cnt,
close_yn,
wrt_dt
from ship_info si,
(select si_seq ,max(version_no) as lastVer
from ship_info group by si_seq) b
where si.si_seq = b.si_seq
and si.version_no = b.lastVer
and si.si_type = #{siType}
order by si.si_seq desc
limit #{rowCnt} offset #{firstIndex}
</select>
<select id="selectShipInfoListCnt" resultType="Integer" parameterType="ShipInfo">
select count(*)
from(
select si.si_seq,
version_no,
si_type,
start_point,
end_point,
distance_nm,
distance_km,
owner_nm,
ship_nm,
ship_weight,
passenger_cnt,
freight_cnt,
operation_cnt,
close_yn,
wrt_dt
from ship_info si,
(select si_seq ,max(version_no) as lastVer
from ship_info group by si_seq) b
where si.si_seq = b.si_seq
and si.version_no = b.lastVer
and si.si_type = #{siType}
order by si.si_seq desc
) a
</select>
<select id="selectShipInfo" resultType="ShipInfo" parameterType="ShipInfo">
select si.si_seq,
version_no,
si_type,
start_point,
end_point,
distance_nm,
distance_km,
owner_nm,
ship_nm,
ship_weight,
passenger_cnt,
freight_cnt,
operation_cnt,
close_yn,
description,
wrt_dt
from ship_info si,
(select si_seq ,max(version_no) as lastVer
from ship_info group by si_seq) b
where si.si_seq = b.si_seq
and si.version_no = b.lastVer
and si.si_seq = #{siSeq}
and si.si_type = #{siType}
</select>
<select id="selectShipInfoListToExcle" resultType="com.dbnt.faisp.util.ParamMap" parameterType="ShipInfo">
select si.si_seq,
version_no,
si_type,
start_point,
end_point,
distance_nm,
distance_km,
owner_nm,
ship_nm,
ship_weight,
passenger_cnt,
freight_cnt,
operation_cnt,
close_yn,
to_char(wrt_dt, 'YYYY-MM-DD HH24:MI') as wrt_dt
from ship_info si,
(select si_seq ,max(version_no) as lastVer
from ship_info group by si_seq) b
where si.si_seq = b.si_seq
and si.version_no = b.lastVer
and si.si_type = #{siType}
order by si.si_seq desc
</select>
</mapper> </mapper>

View File

@ -52,3 +52,21 @@
.modal-xxl{ .modal-xxl{
--bs-modal-width : 1440px; --bs-modal-width : 1440px;
} }
/*사이드바 카테고리 트리*/
.btn-toggle:hover, .btn-toggle:focus {
color: rgba(0, 0, 0, .85);
background-color: #d2f4ea;
}
.btn-toggle::before {
width: 1.25em;
line-height: 0;
content: url("/img/bootstrap-icons-1.9.1/caret-right-fill.svg");
transition: transform .35s ease;
transform-origin: 0.5em 50%;
}
.btn-toggle[aria-expanded="true"]::before {
content: url("/img/bootstrap-icons-1.9.1/caret-down-fill.svg");
/*왜 안돌까?*/
/*transform: rotate(90deg);*/
}

View File

@ -299,7 +299,7 @@ $(document).on('click', '#updatePartInfo', function (){
function showHistory(piSeq){ function showHistory(piSeq){
$.ajax({ $.ajax({
url: '/target/PartInfoHistoryPage', url: '/target/partInfoHistoryPage',
data: { data: {
piSeq: piSeq piSeq: piSeq
}, },

View File

@ -8,6 +8,15 @@ $(document).on('click', '#krjpruTab', function (){
$(document).on('click', '#addKRCN', function (){ $(document).on('click', '#addKRCN', function (){
const siType = 'KRCN'; const siType = 'KRCN';
showEditModal(siType);
})
$(document).on('click', '#addKRJPRU', function (){
const siType = 'KRJPRU';
showEditModal(siType);
})
function showEditModal(siType){
$.ajax({ $.ajax({
url: '/target/ipShipEditModal', url: '/target/ipShipEditModal',
data: {siType: siType}, data: {siType: siType},
@ -22,4 +31,237 @@ $(document).on('click', '#addKRCN', function (){
} }
}); });
}
$(document).on('click', '#saveShipInfo', function (){
if($('#startPoint').val() == ''){
alert('출발지를 입력해주세요.');
$('#startPoint').focus();
return false;
}
if($('#endPoint').val() == ''){
alert('도착지를 입력해주세요');
$('#endPoint').focus();
return false;
}
if($('#distanceNm').val() == ''){
alert('거리(해리)를 입력해주세요');
$('#distanceNm').focus();
return false;
}
if($('#distanceKm').val() == ''){
alert('거리(Km)를 입력해주세요');
$('#distanceKm').focus();
return false;
}
if($('#ownerNm').val() == ''){
alert('사업자를를 입력해주세요');
$('#ownerNm').focus();
return false;
}
if($('#shipNm').val() == ''){
alert('선명을 입력해주세요');
$('#shipNm').focus();
return false;
}
if(confirm("저장하시겠습니까?")){
contentFade("in");
const formData = new FormData($("#shipInfoSave")[0]);
$.ajax({
type : 'POST',
data : formData,
url : "/target/saveShipInfo",
processData: false,
contentType: false,
success : function(result) {
alert("저장되었습니다.");
contentFade("out");
location.reload();
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")
contentFade("out");
}
})
}
})
$(document).on('click', '.shipInfoTr', function (){
const siSeq = (Number($(this).find(".siSeq").val()));
const siType = $(this).find(".siType").val();
showViewModal(siSeq,siType);
})
$(document).on('click', '#viewTab', function (){
const siSeq = (Number($(this).data('siseq')));
const siType = $(this).data('sitype');
showViewModal(siSeq,siType);
})
function showViewModal(siSeq,siType){
$.ajax({
url: '/target/shipInfoView',
data: {
siSeq: siSeq,
siType: siType
},
type: 'GET',
dataType:"html",
success: function(html){
$("#ipShipModalContent").empty().append(html);
$("#ipShipModal").modal('show');
},
error:function(){
}
});
}
$(document).on('click', '#historyTab', function (){
const siSeq = (Number($(this).data('siseq')));
const siType = $(this).data('sitype');
showHistory(siSeq,siType);
})
function showHistory(siSeq,siType){
$.ajax({
url: '/target/ipShipHistory',
data: {
siSeq: siSeq,
siType: siType
},
type: 'GET',
dataType:"html",
success: function(html){
$("#ipShipModalContent").empty().append(html);
$("#ipShipModal").modal('show');
},
error:function(){
}
});
}
$(document).on('click', '#updateShipInfo', function (){
if($('#startPointM').val() == ''){
alert('출발지를 입력해주세요.');
$('#startPointM').focus();
return false;
}
if($('#endPointM').val() == ''){
alert('도착지를 입력해주세요');
$('#endPointM').focus();
return false;
}
if($('#distanceNmM').val() == ''){
alert('거리(해리)를 입력해주세요');
$('#distanceNmM').focus();
return false;
}
if($('#distanceKmM').val() == ''){
alert('거리(Km)를 입력해주세요');
$('#distanceKmM').focus();
return false;
}
if($('#ownerNmM').val() == ''){
alert('사업자를를 입력해주세요');
$('#ownerNmM').focus();
return false;
}
if($('#shipNmM').val() == ''){
alert('선명을 입력해주세요');
$('#shipNmM').focus();
return false;
}
if(confirm("수정하시겠습니까?")){
contentFade("in");
const formData = new FormData($("#shipInfoUpdate")[0]);
$.ajax({
type : 'POST',
data : formData,
url : "/target/updateShipInfo",
processData: false,
contentType: false,
success : function(result) {
alert("수정되었습니다.");
contentFade("out");
showViewModal(result.siSeq,result.siType);
},
error : function(xhr, status) {
alert("수정에 실패하였습니다.")
contentFade("out");
}
})
}
})
$(document).on('click', '.historyInfoTr', function (){
$(this).find('.hisChk').prop('checked',true)
if($(this).find('.hisChk').prop('checked')){
$('.hisChk').prop('checked',false);
$(this).find('.hisChk').prop('checked',true)
}
$.ajax({
url: '/target/ipShipHistoryView',
data: {
siSeq: Number($(this).find(".siSeq").val()),
siType: $(this).find(".siType").val(),
versionNo : Number($(this).find(".verNo").val())
},
type: 'GET',
dataType:"json",
success: function(data){
$('#hHangro').val(data.startPoint+' / '+data.endPoint+'('+data.distanceNm+','+data.distanceKm+')');
$('#hOwnerNm').val(data.ownerNm);
$('#hShipNm').val(data.shipNm);
$('#hShipWeight').val(data.shipWeight);
$('#hSusong').val('여객 : '+data.passengerCnt+'명'+'\n'+'화물 : '+data.freightCnt+'TEU')
$('#hOperationCnt').val(data.operationCnt);
$('#hCloseYn').val(data.closeYn);
console.log(data);
},
error:function(){
}
});
})
$(document).on('click', '#deleteShipInfo', function (){
const siSeq = $('#vSiSeq').val();
const siType = $('#vSiType').val();
if(confirm("삭제하시겠습니까?")){
contentFade("in");
$.ajax({
type : 'POST',
url : "/target/deleteShipInfo",
data : JSON.stringify({siSeq:siSeq,siType:siType}),
contentType: 'application/json',
beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
},
success : function(data) {
alert("삭제 처리되었습니다.");
location.reload();
},
error : function(xhr, status) {
alert("삭제 처리에 실패하였습니다");
}
})
}
})
$(document).on('click', '#goExcel', function (){
if(confirm("엑셀로 다운로드 하시겠습니까?")){
$('input[name=excel]').val('Y');
$('#searchFm').submit();
$('input[name=excel]').val('');
}else{
false;
}
})
$(document).on('click', '#btn-close', function (){
location.reload();
}) })

View File

@ -2,68 +2,73 @@
<html lang="ko" xmlns:th="http://www.thymeleaf.org"> <html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="menuEditModalLabel">국제여객선 등록</h5> <h5 class="modal-title" th:text="${siType eq 'KRCN' ? '한-중 국제여객선 등록' : siType eq 'KRJPRU' ? '한-일,러 국제여객선 등록' : null}"></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form id="partInfoSave" method="post"> <form id="shipInfoSave" method="post">
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/> <input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/> <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<input type="hidden" name="siType" th:value="${siType}">
<h5 class="text-center">항로</h5> <h5 class="text-center">항로</h5>
<div class="mb-2 row"> <div class="mb-2 row">
<label for="startPoint" class="col-sm-2 col-form-label text-center">출발</label> <label for="startPoint" class="col-sm-2 col-form-label text-center">출발</label>
<div class="col-sm-3"> <div class="col-sm-3">
<input type="text" class="form-control" id="startPoint" name="startPoint" placeholder="직접입력"> <input type="text" class="form-control" id="startPoint" name="startPoint">
</div> </div>
<label for="endPoint" class="col-sm-2 col-form-label text-center">도착</label> <label for="endPoint" class="col-sm-2 col-form-label text-center">도착</label>
<div class="col-sm-3"> <div class="col-sm-3">
<input type="text" class="form-control" id="endPoint" name="endPoint" placeholder="직접입력"> <input type="text" class="form-control" id="endPoint" name="endPoint">
</div> </div>
</div> </div>
<div class="mb-2 row"> <div class="mb-2 row">
<label for="distanceNm" class="col-sm-2 col-form-label text-center">거리(해리)</label> <label for="distanceNm" class="col-sm-2 col-form-label text-center">거리(해리)</label>
<div class="col-sm-3"> <div class="col-sm-3">
<input type="text" class="form-control" id="distanceNm" name="distanceNm" placeholder="직접입력"> <input type="text" class="form-control" id="distanceNm" name="distanceNm" placeholder="ex:OOO해리">
</div> </div>
<label for="distanceKm" class="col-sm-2 col-form-label text-center">거리(KM)</label> <label for="distanceKm" class="col-sm-2 col-form-label text-center">거리(KM)</label>
<div class="col-sm-3"> <div class="col-sm-3">
<input type="text" class="form-control" id="distanceKm" name="distanceKm" placeholder="직접입력"> <input type="text" class="form-control" id="distanceKm" name="distanceKm" placeholder="ex:OOOKm">
</div> </div>
</div> </div>
<br><br> <br><br>
<div class="mb-3 row"> <div class="mb-3 row">
<label for="shipWeight" class="col-sm-2 col-form-label text-center">국제총톤 수</label> <label for="shipWeight" class="col-sm-2 col-form-label text-center">국제총톤 수</label>
<div class="col-sm-4"> <div class="col-sm-4">
<input type="text" class="form-control" id="shipWeight" name="shipWeight" placeholder="직접입력"> <input type="number" class="form-control" id="shipWeight" name="shipWeight">
</div> </div>
<label for="passengerCnt" class="col-sm-2 col-form-label text-center">여객</label> <label for="passengerCnt" class="col-sm-2 col-form-label text-center">여객</label>
<div class="col-sm-4"> <div class="col-sm-4">
<input type="text" class="form-control" id="passengerCnt" name="passengerCnt" placeholder="직접입력"> <input type="number" class="form-control" id="passengerCnt" name="passengerCnt" placeholder="단위:명">
</div> </div>
<label for="freightCnt" class="col-sm-2 col-form-label text-center">화물</label> <label for="freightCnt" class="col-sm-2 col-form-label text-center">화물</label>
<div class="col-sm-4"> <div class="col-sm-4">
<input type="text" class="form-control" id="freightCnt" name="freightCnt" placeholder="직접입력"> <input type="number" class="form-control" id="freightCnt" name="freightCnt" placeholder="단위:TEU">
</div> </div>
</div> </div>
<br><br> <br><br>
<div class="mb-4 row"> <div class="mb-4 row">
<label for="ownerNm" class="col-sm-2 col-form-label text-center">사업자</label> <label for="ownerNm" class="col-sm-2 col-form-label text-center">사업자</label>
<div class="col-sm-4"> <div class="col-sm-4">
<input type="text" class="form-control" id="ownerNm" name="ownerNm" placeholder="직접입력"> <input type="text" class="form-control" id="ownerNm" name="ownerNm">
</div> </div>
<label for="shipNm" class="col-sm-2 col-form-label text-center">선명</label> <label for="shipNm" class="col-sm-2 col-form-label text-center">선명</label>
<div class="col-sm-4"> <div class="col-sm-4">
<input type="text" class="form-control" id="shipNm" name="shipNm" placeholder="직접입력"> <input type="text" class="form-control" id="shipNm" name="shipNm">
</div> </div>
<label for="operationCnt" class="col-sm-2 col-form-label text-center">운항횟수</label> <label for="operationCnt" class="col-sm-2 col-form-label text-center">운항횟수</label>
<div class="col-sm-4"> <div class="col-sm-4">
<input type="text" class="form-control" id="operationCnt" name="operationCnt" placeholder="직접입력"> <input type="text" class="form-control" id="operationCnt" name="operationCnt" placeholder="ex:주0회(00H)">
</div> </div>
</div> </div>
<div class="mb-1 row"> <div class="mb-1 row">
<label for="closeYn" class="col-sm-2 col-form-label text-center">휴항</label> <label for="closeYn" class="col-sm-2 col-form-label text-center">휴항</label>
<div class="col-sm-4"> <div class="col-sm-2">
<input type="text" class="form-control" id="closeYn" name="closeYn" placeholder="직접입력"> <select class="form-select form-select-sm" id="closeYn" name="closeYn">
<option value="">선택</option>
<option value="O">O</option>
<option value="X">X</option>
</select>
</div> </div>
</div> </div>
<div class="mb-1 row"> <div class="mb-1 row">
@ -76,8 +81,8 @@
</div> </div>
<div class="modal-footer justify-content-between"> <div class="modal-footer justify-content-between">
<div class="col-auto"> <div class="col-auto">
<button type="button" id="btn-close" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
<button type="button" class="btn btn-primary" id="savePartInfo">저장</button> <button type="button" class="btn btn-primary" id="saveShipInfo">저장</button>
</div> </div>
</div> </div>
</html> </html>

View File

@ -0,0 +1,98 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header">
<h5 class="modal-title" th:text="${shipInfo.siType eq 'KRCN' ? '한-중 국제여객선 수정이력' : shipInfo.siType eq 'KRJPRU' ? '한-일,러 국제여객선 수정이력' : null}"></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link" id="viewTab" th:data-siseq="${shipInfoList[0].siSeq}" th:data-sitype="${shipInfoList[0].siType}" data-bs-toggle="tab" data-bs-target="#accessTabPanel" type="button" role="tab" aria-controls="accessTabPanel" aria-selected="true">현황상세</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link active" id="historyTab" th:data-siseq="${shipInfoList[0].siSeq}" th:data-sitype="${shipInfoList[0].siType}" data-bs-toggle="tab" data-bs-target="#approvalTabPanel" type="button" role="tab" aria-controls="approvalTabPanel" aria-selected="false">수정이력</button>
</li>
</ul>
<div class="row justify-content-start">
<div class="col-4">
<div class="card">
<div class="card-body">
<div class="row">
<table class="table table-striped" id="categoryTable">
<thead>
<tr>
<th></th>
<th>작성자</th>
<th>등록일</th>
</tr>
</thead>
<tbody class="overflow-scroll">
<tr class="historyInfoTr" th:each="si:${shipInfoList}">
<td><input type="checkbox" class="hisChk">
<input type="hidden" class="siSeq" th:value="${si.siSeq}">
<input type="hidden" class="siType" th:value="${si.siType}">
<input type="hidden" class="verNo" th:value="${si.versionNo}"></td>
<td th:text="${si.wrtNm}"></td>
<td th:text="${#temporals.format(si.wrtDt, 'yyyy-MM-dd')}"></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-8" id="valueDiv">
<div class="row mb-3">
<label for="cat1Cd" class="col-sm-4 col-form-label col-form-label-sm text-center">항로</label>
<div class="col-sm-7">
<input type="text" class="form-control" id="hHangro" readonly>
</div>
</div>
<div class="row mb-3">
<label for="cat1Cd" class="col-sm-4 col-form-label col-form-label-sm text-center">사업자</label>
<div class="col-sm-7">
<input type="text" class="form-control" id="hOwnerNm" readonly>
</div>
</div>
<div class="row mb-3">
<label for="cat2Cd" class="col-sm-4 col-form-label col-form-label-sm text-center">선명</label>
<div class="col-sm-7">
<input type="text" class="form-control" id="hShipNm" readonly>
</div>
</div>
<div class="row mb-3">
<label for="cat3Cd" class="col-sm-4 col-form-label col-form-label-sm text-center">국제총톤수</label>
<div class="col-sm-7">
<input type="text" class="form-control" id="hShipWeight" readonly>
</div>
</div>
<div class="row mb-3">
<label for="cat3Cd" class="col-sm-4 col-form-label col-form-label-sm text-center">수송능력</label>
<div class="col-sm-7">
<textarea class="form-control" id="hSusong" readonly></textarea>
</div>
</div>
<div class="row mb-3">
<label for="cat2Cd" class="col-sm-4 col-form-label col-form-label-sm text-center">운항횟수</label>
<div class="col-sm-7">
<input type="text" class="form-control" id="hOperationCnt" readonly>
</div>
</div>
<div class="row mb-3">
<label for="cat3Cd" class="col-sm-4 col-form-label col-form-label-sm text-center">휴항</label>
<div class="col-sm-7">
<input type="text" class="form-control" id="hCloseYn" readonly>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer justify-content-between">
<div class="col-auto">
<button type="button" class="btn btn-secondary"
data-bs-dismiss="modal">닫기</button>
</div>
</div>
</html>

View File

@ -13,6 +13,7 @@
<div class="row mx-0"> <div class="row mx-0">
<div class="col-12 card text-center"> <div class="col-12 card text-center">
<div class="card-body"> <div class="card-body">
<button id="goExcel">엑셀 다운</button>
<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" th:classappend="${searchParams.siType eq 'KRCN'?' active':''}" id="krcnTab" data-bs-toggle="tab" type="button" role="tab">한-중 국제여객선 현황</button> <button class="nav-link" th:classappend="${searchParams.siType eq 'KRCN'?' active':''}" id="krcnTab" data-bs-toggle="tab" type="button" role="tab">한-중 국제여객선 현황</button>
@ -21,25 +22,11 @@
<button class="nav-link" th:classappend="${searchParams.siType eq 'KRJPRU'?' active':''}" id="krjpruTab" data-bs-toggle="tab" type="button" role="tab">한-일,러 국제여객선 현황</button> <button class="nav-link" th:classappend="${searchParams.siType eq 'KRJPRU'?' active':''}" id="krjpruTab" data-bs-toggle="tab" type="button" role="tab">한-일,러 국제여객선 현황</button>
</li> </li>
</ul> </ul>
<form method="get" th:action="@{/equip/List}"> <form id="searchFm" method="get" th:action="@{/target/ipShipList}">
<input type="hidden" name="pageIndex" id="pageIndex" th:value="${searchParams.pageIndex}"> <input type="hidden" name="pageIndex" id="pageIndex" th:value="${searchParams.pageIndex}">
<div class="row justify-content-between pe-3 py-1"> <input type="hidden" name="siType" th:value="${searchParams.siType}">
<div class="col-auto"> <input type="hidden" name="excel">
<select class="form-select" name="rowCnt" id="rowCnt"> <input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색" style="display:none;">
<th:block th:each="num : ${#numbers.sequence(1,5)}">
<option th:value="${num*10}" th:text="${num*10}" th:selected="${searchParams.rowCnt==num*10}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<div class="row justify-content-end">
<div class="col-auto">
<input type="text" class="form-control form-control-sm">
</div>
<input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색">
</div>
</div>
</div>
</form> </form>
<div class="row justify-content-start"> <div class="row justify-content-start">
<div class="col-12"> <div class="col-12">
@ -60,8 +47,28 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr class="shipInfoTr" th:each="si:${shipInfoList}">
<th:block>
<input type="hidden" class="siSeq" th:value="${si.siSeq}">
<input type="hidden" class="siType" th:value="${si.siType}">
<input type="hidden" class="verNo" th:value="${si.versionNo}">
</th:block>
<td th:inline="text">
[[${si.startPoint}]]/[[${si.endPoint}]]
<br/>
([[${si.distanceNm}]],[[${si.distanceKm}]])
</td>
<td th:text="${si.ownerNm}"></td>
<td th:text="${si.shipNm}"></td>
<td th:text="${si.weightStr}"></td>
<td th:inline="text">
여객:[[${si.passengerCnt}]]명
<br/>
화물:[[${si.freightCnt}]]TEU
</td>
<td th:text="${si.operationCnt}"></td>
<td th:text="${si.closeYn}"></td>
<td th:text="${#temporals.format(si.wrtDt, 'yyyy-MM-dd HH:mm')}"></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -0,0 +1,99 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header">
<h5 class="modal-title" th:text="${shipInfo.siType eq 'KRCN' ? '한-중 국제여객선 상세' : shipInfo.siType eq 'KRJPRU' ? '한-일,러 국제여객선 상세' : null}"></h5>
<button type="button" id="btn-close" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="viewTab" th:data-siseq="${shipInfo.siSeq}" th:data-sitype="${shipInfo.siType}" data-bs-toggle="tab" data-bs-target="#accessTabPanel" type="button" role="tab" aria-controls="accessTabPanel" aria-selected="true">현황상세</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="historyTab" th:data-siseq="${shipInfo.siSeq}" th:data-sitype="${shipInfo.siType}" data-bs-toggle="tab" data-bs-target="#approvalTabPanel" type="button" role="tab" aria-controls="approvalTabPanel" aria-selected="false">수정이력</button>
</li>
</ul>
<form id="shipInfoUpdate" method="post">
<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="vSiSeq" name="siSeq" th:value="${shipInfo.siSeq}">
<input type="hidden" id="vSiType" name="siType" th:value="${shipInfo.siType}">
<input type="hidden" name="versionNo" th:value="${shipInfo.versionNo}">
<h5 class="text-center">항로</h5>
<div class="mb-2 row">
<label for="startPointM" class="col-sm-2 col-form-label text-center">출발</label>
<div class="col-sm-3">
<input type="text" class="form-control" id="startPointM" name="startPoint" th:value="${shipInfo.startPoint}">
</div>
<label for="endPointM" class="col-sm-2 col-form-label text-center">도착</label>
<div class="col-sm-3">
<input type="text" class="form-control" id="endPointM" name="endPoint" th:value="${shipInfo.endPoint}">
</div>
</div>
<div class="mb-2 row">
<label for="distanceNmM" class="col-sm-2 col-form-label text-center">거리(해리)</label>
<div class="col-sm-3">
<input type="text" class="form-control" id="distanceNmM" name="distanceNm" th:value="${shipInfo.distanceNm}" placeholder="ex:OOO해리">
</div>
<label for="distanceKmM" class="col-sm-2 col-form-label text-center">거리(KM)</label>
<div class="col-sm-3">
<input type="text" class="form-control" id="distanceKmM" name="distanceKm" th:value="${shipInfo.distanceKm}" placeholder="ex:OOOKm">
</div>
</div>
<br><br>
<div class="mb-3 row">
<label for="shipWeightM" class="col-sm-2 col-form-label text-center">국제총톤 수</label>
<div class="col-sm-4">
<input type="number" class="form-control" id="shipWeightM" name="shipWeight" th:value="${shipInfo.shipWeight}">
</div>
<label for="passengerCntM" class="col-sm-2 col-form-label text-center">여객</label>
<div class="col-sm-4">
<input type="number" class="form-control" id="passengerCntM" name="passengerCnt" th:value="${shipInfo.passengerCnt}" placeholder="단위:명">
</div>
<label for="freightCntM" class="col-sm-2 col-form-label text-center">화물</label>
<div class="col-sm-4">
<input type="number" class="form-control" id="freightCntM" name="freightCnt" th:value="${shipInfo.freightCnt}" placeholder="단위:TEU">
</div>
</div>
<br><br>
<div class="mb-4 row">
<label for="ownerNmM" class="col-sm-2 col-form-label text-center">사업자</label>
<div class="col-sm-4">
<input type="text" class="form-control" id="ownerNmM" name="ownerNm" th:value="${shipInfo.ownerNm}">
</div>
<label for="shipNmM" class="col-sm-2 col-form-label text-center">선명</label>
<div class="col-sm-4">
<input type="text" class="form-control" id="shipNmM" name="shipNm" th:value="${shipInfo.shipNm}">
</div>
<label for="operationCntM" class="col-sm-2 col-form-label text-center">운항횟수</label>
<div class="col-sm-4">
<input type="text" class="form-control" id="operationCntM" name="operationCnt" th:value="${shipInfo.operationCnt}" placeholder="ex:주0회(00H)">
</div>
</div>
<div class="mb-1 row">
<label for="closeYnM" class="col-sm-2 col-form-label text-center">휴항</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" id="closeYnM" name="closeYn">
<option value="">선택</option>
<option value="O" th:selected="${shipInfo.closeYn eq 'O'}">O</option>
<option value="X" th:selected="${shipInfo.closeYn eq 'X'}">X</option>
</select>
</div>
</div>
<div class="mb-1 row">
<label for="descriptionM" class="col-sm-2 col-form-label text-center">비고</label>
<div class="col-sm-4">
<textarea id="descriptionM" name="description" rows="4" cols="50" th:utext="${shipInfo.description}"></textarea>
</div>
</div>
</form>
</div>
<div class="modal-footer justify-content-between">
<div class="col-auto">
<button type="button" class="btn btn-secondary" id="btn-close" data-bs-dismiss="modal">닫기</button>
<button type="button" class="btn btn-danger" id="deleteShipInfo" th:if="${accessAuth eq 'ACC003'} or ${wrtUserSeq eq userSeq}">삭제</button>
<button type="button" class="btn btn-warning" id="updateShipInfo" th:if="${accessAuth eq 'ACC003'} or ${wrtUserSeq eq userSeq}">수정</button>
</div>
</div>
</html>

View File

@ -4,23 +4,50 @@
<a href="/" class="d-flex"> <a href="/" class="d-flex">
<img id="logo" th:src="@{/img/logo.png}" alt="logo" title="logo"> <img id="logo" th:src="@{/img/logo.png}" alt="logo" title="logo">
</a> </a>
<ul class="nav nav-pills flex-column my-3"> <div class="flex-shrink-0 pe-3 py-3 bg-transparent">
<li th:each="firstMenu:${session.menuList}"> <ul class="list-unstyled ps-0">
<li class="mb-1" th:each="firstMenu:${session.menuList}">
<th:block th:each="cat1Code:${session.commonCode.get('CAT1')}"> <th:block th:each="cat1Code:${session.commonCode.get('CAT1')}">
<th:block th:if="${cat1Code.itemCd eq firstMenu.cat1Cd}"> <th:block th:if="${cat1Code.itemCd eq firstMenu.cat1Cd}">
<a href="#" class="nav-link link-dark firstMenuLink" th:text="${cat1Code.itemValue}"></a> <button class="btn btn-toggle align-items-center rounded collapsed"
<div class="menuDiv secondMenu h-100 bg-white" style="display: none"> data-bs-toggle="collapse" aria-expanded="false"
<ul class="nav nav-pills flex-column"> th:data-bs-target="'#collapse'+${cat1Code.itemCd}" th:text="${cat1Code.itemValue}">
</button>
<div class="collapse ps-3" th:id="|collapse${cat1Code.itemCd}|">
<ul class="btn-toggle-nav list-unstyled fw-normal pb-1">
<li th:each="secondMenu:${firstMenu.childList}"> <li th:each="secondMenu:${firstMenu.childList}">
<th:block th:each="cat2Code:${session.commonCode.get('CAT2')}"> <th:block th:each="cat2Code:${session.commonCode.get('CAT2')}">
<th:block th:if="${cat2Code.itemCd eq secondMenu.cat2Cd}"> <th:block th:if="${cat2Code.itemCd eq secondMenu.cat2Cd}">
<a class="nav-link link-dark secondMenuLink" th:text="${cat2Code.itemValue}" th:href="${#lists.isEmpty(secondMenu.childList)?secondMenu.menuUrl:'#'}"></a> <ul class="list-unstyled ps-0">
<div class="menuDiv thirdMenu h-100 bg-white" style="display: none" th:if="${#lists.isEmpty(secondMenu.childList) ne true}"> <li class="mb-1">
<ul class="nav nav-pills flex-column"> <th:block th:unless="${#lists.isEmpty(secondMenu.childList)}">
<button class="btn btn-toggle align-items-center rounded collapsed"
data-bs-toggle="collapse" aria-expanded="false" th:onclick="location.href='#'"
th:data-bs-target="'#collapse'+${cat2Code.itemCd}" th:text="${cat2Code.itemValue}">
</button>
</th:block>
<th:block th:if="${#lists.isEmpty(secondMenu.childList)}">
<a th:href="@{${secondMenu.menuUrl}}" class="bi bi-dash link-dark rounded ps-3 text-decoration-none"
th:text="${cat2Code.itemValue}"></a>
</th:block>
<div class="collapse ps-3" th:id="|collapse${cat2Code.itemCd}|">
<ul class="btn-toggle-nav list-unstyled fw-normal pb-1">
<li th:each="thirdMenu:${secondMenu.childList}"> <li th:each="thirdMenu:${secondMenu.childList}">
<th:block th:each="cat3Code:${session.commonCode.get('CAT3')}"> <th:block th:each="cat3Code:${session.commonCode.get('CAT3')}">
<th:block th:if="${cat3Code.itemCd eq thirdMenu.cat3Cd}"> <th:block th:if="${cat3Code.itemCd eq thirdMenu.cat3Cd}">
<a class="nav-link link-dark" th:text="${cat3Code.itemValue}" th:href="${thirdMenu.menuUrl}"></a> <ul class="list-unstyled ps-0">
<li>
<a th:href="@{${thirdMenu.menuUrl}}" class="bi bi-dash link-dark rounded ps-3 text-decoration-none"
th:text="${cat3Code.itemValue}"></a>
</li>
</ul>
</th:block>
</th:block>
</li>
</ul>
</div>
</li>
</ul>
</th:block> </th:block>
</th:block> </th:block>
</li> </li>
@ -31,9 +58,5 @@
</li> </li>
</ul> </ul>
</div> </div>
</th:block>
</th:block>
</li>
</ul>
</div> </div>
</html> </html>