fix:외사장비현황 중간저장

TaehunPark 2022-09-26 17:57:06 +09:00
parent a827129d1b
commit bdffee9f96
16 changed files with 508 additions and 115 deletions

View File

@ -1,12 +1,10 @@
package com.dbnt.faisp.equip; package com.dbnt.faisp.equip;
import com.dbnt.faisp.authMgt.service.AuthMgtService; import com.dbnt.faisp.authMgt.service.AuthMgtService;
import com.dbnt.faisp.equip.model.Equip; import com.dbnt.faisp.equip.model.Equip;
import com.dbnt.faisp.equip.model.EquipLog;
import com.dbnt.faisp.equip.service.EquipService; import com.dbnt.faisp.equip.service.EquipService;
import com.dbnt.faisp.organMgt.service.OrganConfigService;
import com.dbnt.faisp.translator.model.Translator;
import com.dbnt.faisp.translator.model.TranslatorCrr;
import com.dbnt.faisp.translator.service.TranslatorService;
import com.dbnt.faisp.userInfo.model.UserInfo; import com.dbnt.faisp.userInfo.model.UserInfo;
import com.dbnt.faisp.util.ParamMap; import com.dbnt.faisp.util.ParamMap;
import com.dbnt.faisp.util.Utils; import com.dbnt.faisp.util.Utils;
@ -19,13 +17,12 @@ import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
@ -36,17 +33,17 @@ import org.springframework.web.servlet.ModelAndView;
@RequestMapping("/equip") @RequestMapping("/equip")
public class EquipController { public class EquipController {
private final AuthMgtService authMgtService;
private final TranslatorService translatorSevice;
private final OrganConfigService organConfigService;
private final EquipService equipService; private final EquipService equipService;
private final AuthMgtService authMgtService;
@GetMapping("/equipStatus") @GetMapping("/equipStatus")
public ModelAndView equipStatus(Equip equip) { public ModelAndView equipStatus(@AuthenticationPrincipal UserInfo loginUser, Equip equip) {
ModelAndView mav = new ModelAndView("equip/equipStatus"); ModelAndView mav = new ModelAndView("equip/equipStatus");
mav.addObject("equipList", equipService.selectEquipStatus(equip));
//메뉴권한 확인
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/equip/equipStatus").get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth);
mav.addObject("equipList", equipService.selectEquipStatus(equip));
return mav; return mav;
} }
@ -60,7 +57,6 @@ public class EquipController {
@GetMapping("/equipTypeSelecBox") @GetMapping("/equipTypeSelecBox")
public ModelAndView equipTypeSelecBox(String equType) { public ModelAndView equipTypeSelecBox(String equType) {
System.out.println("@@"+equType);
ModelAndView mav = new ModelAndView("equip/equipTypeSelecBox"); ModelAndView mav = new ModelAndView("equip/equipTypeSelecBox");
mav.addObject("equType", equType); mav.addObject("equType", equType);
return mav; return mav;
@ -78,6 +74,10 @@ public class EquipController {
@GetMapping("/List") @GetMapping("/List")
public ModelAndView equipList(@AuthenticationPrincipal UserInfo loginUser,Equip equip) { public ModelAndView equipList(@AuthenticationPrincipal UserInfo loginUser,Equip equip) {
ModelAndView mav = new ModelAndView("equip/equipList"); ModelAndView mav = new ModelAndView("equip/equipList");
//메뉴권한 확인
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/equip/equipStatus").get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth);
equip.setDownOrganCdList(loginUser.getDownOrganCdList()); equip.setDownOrganCdList(loginUser.getDownOrganCdList());
ParamMap equType = equipService.selectEduType(equip); ParamMap equType = equipService.selectEduType(equip);
mav.addObject("equType", equType.get("equ_type")); mav.addObject("equType", equType.get("equ_type"));
@ -92,8 +92,12 @@ public class EquipController {
} }
@GetMapping("/updatePage") @GetMapping("/updatePage")
public ModelAndView equipUpdatePage(Equip equip) { public ModelAndView equipUpdatePage(@AuthenticationPrincipal UserInfo loginUser, Equip equip) {
ModelAndView mav = new ModelAndView("equip/equipModifyModal"); ModelAndView mav = new ModelAndView("equip/equipModifyModal");
//메뉴권한 확인
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/equip/equipStatus").get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth);
mav.addObject("userId", loginUser.getUserId());
mav.addObject("equInfo", equipService.selectEquipInfo(equip)); mav.addObject("equInfo", equipService.selectEquipInfo(equip));
return mav; return mav;
} }
@ -101,7 +105,6 @@ public class EquipController {
@PostMapping("/updateEquip") @PostMapping("/updateEquip")
@ResponseBody @ResponseBody
public int updateEquip(@AuthenticationPrincipal UserInfo loginUser,Equip equip, MultipartHttpServletRequest request){ public int updateEquip(@AuthenticationPrincipal UserInfo loginUser,Equip equip, MultipartHttpServletRequest request){
System.out.println("equip@"+equip);
equip.setWrtNm(loginUser.getUserId()); equip.setWrtNm(loginUser.getUserId());
equip.setMgtOrgan(loginUser.getOgCd()); equip.setMgtOrgan(loginUser.getOgCd());
equip.setWrtOrgan(loginUser.getOgCd()); equip.setWrtOrgan(loginUser.getOgCd());
@ -124,8 +127,8 @@ public class EquipController {
} }
@PostMapping("/epuipDelete") @PostMapping("/epuipDelete")
public void epuipDelete(@RequestBody List<Equip> equip){ public void epuipDelete(@AuthenticationPrincipal UserInfo loginUser, @RequestBody List<Equip> equip){
equipService.equipDelete(equip); equipService.equipDelete(equip,loginUser);
} }
@ -164,6 +167,39 @@ public class EquipController {
} }
} }
@GetMapping("/Log")
public ModelAndView equipLog(@AuthenticationPrincipal UserInfo loginUser,EquipLog equipLog) {
ModelAndView mav = new ModelAndView("equip/equipLogList");
equipLog.setDownOrganCdList(loginUser.getDownOrganCdList());
equipLog.setQueryInfo();
mav.addObject("logList", equipService.selectEquipLogList(equipLog));
equipLog.setContentCnt(equipService.selectEquipLogListCnt(equipLog));
equipLog.setPaginationInfo();
mav.addObject("searchParams", equipLog);
return mav;
}
@GetMapping("/statusExcelDown")
public void statisticsExcelDown(Model model,HttpServletResponse response, Equip equip) {
String[] headers = { "rownum","equ_type", "item_value", "total", "cnt_bon", "cnt_center", "cnt_incheon", "cnt_pyeongtaek", "cnt_taean","cnt_boryeong","cnt_west","cnt_mokpo","cnt_buan",
"cnt_gunsan","cnt_yusu","cnt_wando","cnt_south","cnt_ulsan","cnt_busan","cnt_changwon","cnt_tongyong","cnt_sacheon","cnt_east","cnt_sokcho","cnt_donghe",
"cnt_ulgin","cnt_pohang","cnt_jeju","cnt_jejuseo","cnt_seoguipo"};
String[] headerNames = { "", "", "", "", "", "중부", "", "","","","서해","","","","","","남해","","","","","","동해","","","","","제주","",""};
String[] headerNames2 = { "연번", "분류", "세부분류", "총계", "본청", "청", "인천서", "평택서","태안서","보령서","청","목포서","부안서","군산서","여수서","완도서","청","울산서","부산서","창원서","통영서","서천서","청","속초서","동해서","울진서","포항서","청","제주서","서귀포서"};
String[] columnType = { "int", "String", "String", "int", "int", "int", "int", "int","int","int","int","int","int","int","int","int","int","int","int","int",
"int","int","int","int","int","int","int","int","int","int"};
String sheetName = "외사장비현황";
String excelFileName = "외사장비현황";
List<ParamMap> equStatusList = equipService.selectEquipStatus(equip);
try {
Utils.downEquipStatusExcel(equStatusList, response, headers, headerNames,headerNames2, columnType, sheetName, excelFileName);
} catch (IOException e) {
model.addAttribute("message", "엑셀다운로드 중 오류가 발생했습니다.");
}
}

View File

@ -1,9 +1,7 @@
package com.dbnt.faisp.equip.mapper; package com.dbnt.faisp.equip.mapper;
import com.dbnt.faisp.equip.model.Equip; import com.dbnt.faisp.equip.model.Equip;
import com.dbnt.faisp.translator.model.Translator; import com.dbnt.faisp.equip.model.EquipLog;
import com.dbnt.faisp.translator.model.TranslatorCrr;
import com.dbnt.faisp.userInfo.model.UserInfo;
import com.dbnt.faisp.util.ParamMap; import com.dbnt.faisp.util.ParamMap;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@ -25,6 +23,10 @@ public interface EquipMapper {
Equip selectHistoryDetail(Equip equip); Equip selectHistoryDetail(Equip equip);
List<EquipLog> selectEquipLogList(EquipLog equipLog);
Integer selectEquipLogListCnt(EquipLog equipLog);
} }

View File

@ -42,8 +42,6 @@ public class Equip extends BaseModel implements Serializable{
private String detailType; private String detailType;
@Column(name = "stored_year") @Column(name = "stored_year")
private String storedYear; private String storedYear;
@Column(name = "mgt_type")
private String mgtType;
@Column(name = "item_qty") @Column(name = "item_qty")
private Integer itemQty; private Integer itemQty;
@Column(name = "item_condition") @Column(name = "item_condition")
@ -73,7 +71,8 @@ public class Equip extends BaseModel implements Serializable{
private Integer deleteFileKey; private Integer deleteFileKey;
@Transient @Transient
private Integer deleteFileVnum; private Integer deleteFileVnum;
@Transient
private String noUpdateImg;
@Embeddable @Embeddable
@Data @Data

View File

@ -0,0 +1,56 @@
package com.dbnt.faisp.equip.model;
import com.dbnt.faisp.config.BaseModel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.time.LocalDateTime;
@Getter
@Setter
@Entity
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "equ_Log")
public class EquipLog extends BaseModel{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "el_seq")
private Integer userSeq;
@Column(name = "equ_type")
private String equType;
@Column(name = "detail_type")
private String detailType;
@Column(name = "el_contents")
private String elContents;
@Column(name = "wrt_nm")
private String wrtNm;
@Column(name = "wrt_organ")
private String wrtOrgan;
@Column(name = "wrt_dt")
private LocalDateTime wrtDt;
@Transient
private String sosok;
@Transient
private String detailSosok;
@Transient
private String detailName;
@Override
public String toString() {
return "EquipLog [userSeq=" + userSeq + ", equType=" + equType + ", detailType=" + detailType + ", elContents="
+ elContents + ", wrtNm=" + wrtNm + ", wrtOrgan=" + wrtOrgan + ", wrtDt=" + wrtDt + ", sosok=" + sosok
+ ", detailSosok=" + detailSosok + ", detailName=" + detailName + "]";
}
}

View File

@ -0,0 +1,15 @@
package com.dbnt.faisp.equip.repository;
import com.dbnt.faisp.equip.model.EquipLog;
import org.springframework.data.jpa.repository.JpaRepository;
public interface EquipLogRepository extends JpaRepository<EquipLog, Integer> {
}

View File

@ -3,7 +3,6 @@ package com.dbnt.faisp.equip.repository;
import com.dbnt.faisp.equip.model.Equip; import com.dbnt.faisp.equip.model.Equip;
import java.util.List; import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;

View File

@ -6,10 +6,10 @@ import com.dbnt.faisp.equip.model.Equip;
import com.dbnt.faisp.equip.model.Equip.EquipId; import com.dbnt.faisp.equip.model.Equip.EquipId;
import com.dbnt.faisp.equip.model.EquipFile; import com.dbnt.faisp.equip.model.EquipFile;
import com.dbnt.faisp.equip.model.EquipFile.EquipFileId; import com.dbnt.faisp.equip.model.EquipFile.EquipFileId;
import com.dbnt.faisp.equip.model.EquipLog;
import com.dbnt.faisp.equip.repository.EquipFileRepository; import com.dbnt.faisp.equip.repository.EquipFileRepository;
import com.dbnt.faisp.equip.repository.EquipLogRepository;
import com.dbnt.faisp.equip.repository.EquipRepository; import com.dbnt.faisp.equip.repository.EquipRepository;
import com.dbnt.faisp.translator.model.Translator;
import com.dbnt.faisp.translator.model.Translator.TranslatorId;
import com.dbnt.faisp.userInfo.model.UserInfo; import com.dbnt.faisp.userInfo.model.UserInfo;
import com.dbnt.faisp.util.ParamMap; import com.dbnt.faisp.util.ParamMap;
import com.dbnt.faisp.util.Utils; import com.dbnt.faisp.util.Utils;
@ -24,6 +24,7 @@ import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.File;
import java.time.LocalDateTime;
import java.util.*; import java.util.*;
@Service @Service
@ -34,6 +35,7 @@ public class EquipService {
private final EquipRepository equipRepository; private final EquipRepository equipRepository;
private final EquipFileRepository equipFileRepository; private final EquipFileRepository equipFileRepository;
private final EquipLogRepository equipLogRepository;
private final EquipMapper equipMapper; private final EquipMapper equipMapper;
@ -51,6 +53,14 @@ public class EquipService {
equipRepository.save(equip); equipRepository.save(equip);
} }
saveFile(equip,request); saveFile(equip,request);
EquipLog equLog = new EquipLog();
equLog.setEquType(equip.getEquType());
equLog.setDetailType(equip.getDetailType());
equLog.setElContents("입력");
equLog.setWrtNm(equip.getWrtNm());
equLog.setWrtOrgan(equip.getWrtOrgan());
equLog.setWrtDt(equip.getWrtDt());
equipLogRepository.save(equLog);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -147,6 +157,14 @@ public class EquipService {
equipTmp.setWrtDt(equip.getWrtDt()); equipTmp.setWrtDt(equip.getWrtDt());
equipRepository.save(equipTmp); equipRepository.save(equipTmp);
updateFile(equip,equipTmp,request); updateFile(equip,equipTmp,request);
EquipLog equLog = new EquipLog();
equLog.setEquType(equip.getEquType());
equLog.setDetailType(equip.getDetailType());
equLog.setElContents("수정");
equLog.setWrtNm(equip.getWrtNm());
equLog.setWrtOrgan(equip.getWrtOrgan());
equLog.setWrtDt(equip.getWrtDt());
equipLogRepository.save(equLog);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -200,6 +218,17 @@ public class EquipService {
equipFile.setFilePath(path); equipFile.setFilePath(path);
equipFile.setFileSize(FileSize); equipFile.setFileSize(FileSize);
equipFileRepository.save(equipFile);
} else if(equip.getNoUpdateImg() != null) {
EquipFile equipFile = new EquipFile();
equipFile.setEquKey(equipTmp.getEquKey());
equipFile.setVersionNo(equipTmp.getVersionNo());
EquipFile dbEquFile = equipFileRepository.findById(new EquipFileId(equip.getEquKey(), equip.getVersionNo())).orElse(null);
equipFile.setOrigNm(dbEquFile.getOrigNm());
equipFile.setConvNm(dbEquFile.getConvNm());
equipFile.setFileExtn(dbEquFile.getFileExtn());
equipFile.setFilePath(dbEquFile.getFilePath());
equipFile.setFileSize(dbEquFile.getFileSize());
equipFileRepository.save(equipFile); equipFileRepository.save(equipFile);
} else { } else {
EquipFile equipFile = new EquipFile(); EquipFile equipFile = new EquipFile();
@ -226,7 +255,7 @@ public class EquipService {
} }
@Transactional @Transactional
public void equipDelete(List<Equip> equip) { public void equipDelete(List<Equip> equip,UserInfo loginUser) {
for(Equip equ: equip) { for(Equip equ: equip) {
//파일삭제 //파일삭제
Equip dbEquip = equipMapper.selectEquipInfo(equ); Equip dbEquip = equipMapper.selectEquipInfo(equ);
@ -240,9 +269,25 @@ public class EquipService {
} }
equipRepository.deleteByEquKey(equ.getEquKey()); equipRepository.deleteByEquKey(equ.getEquKey());
equipFileRepository.deleteByEquKey(equ.getEquKey()); equipFileRepository.deleteByEquKey(equ.getEquKey());
EquipLog equLog = new EquipLog();
equLog.setEquType(dbEquip.getEquType());
equLog.setDetailType(dbEquip.getDetailType());
equLog.setElContents("삭제");
equLog.setWrtNm(loginUser.getUserId());
equLog.setWrtOrgan(loginUser.getOgCd());
equLog.setWrtDt(LocalDateTime.now());
equipLogRepository.save(equLog);
} }
} }
public List<EquipLog> selectEquipLogList(EquipLog equipLog) {
return equipMapper.selectEquipLogList(equipLog);
}
public Integer selectEquipLogListCnt(EquipLog equipLog) {
return equipMapper.selectEquipLogListCnt(equipLog);
}

View File

@ -1,7 +1,6 @@
package com.dbnt.faisp.translator; package com.dbnt.faisp.translator;
import com.dbnt.faisp.authMgt.service.AuthMgtService; import com.dbnt.faisp.authMgt.service.AuthMgtService;
import com.dbnt.faisp.organMgt.service.OrganConfigService;
import com.dbnt.faisp.translator.model.Translator; import com.dbnt.faisp.translator.model.Translator;
import com.dbnt.faisp.translator.model.TranslatorCrr; import com.dbnt.faisp.translator.model.TranslatorCrr;
import com.dbnt.faisp.translator.service.TranslatorService; import com.dbnt.faisp.translator.service.TranslatorService;
@ -12,9 +11,7 @@ import com.dbnt.faisp.util.Utils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -30,7 +27,6 @@ public class TranslatorController {
private final AuthMgtService authMgtService; private final AuthMgtService authMgtService;
private final TranslatorService translatorSevice; private final TranslatorService translatorSevice;
private final OrganConfigService organConfigService;
@GetMapping("/info") @GetMapping("/info")

View File

@ -1,35 +1,19 @@
package com.dbnt.faisp.util; package com.dbnt.faisp.util;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Date; import java.util.Date;
import java.util.Enumeration;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.FillPatternType;
@ -41,12 +25,6 @@ import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFDataFormat; import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import com.dbnt.faisp.util.ParamMap;
public class Utils { public class Utils {
@ -288,6 +266,114 @@ public class Utils {
} }
public static void downEquipStatusExcel(List<ParamMap> list, HttpServletResponse response, String[] headers, String[] headerNames,String[] headerNames2, String[] columnType, String sheetName, String excelFileName) throws IOException {
if(Utils.isNotEmpty(list)) {
// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
XSSFWorkbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet(sheetName);
Row headerRow = sheet.createRow(0);
Row headerRow2 = sheet.createRow(1);
CellStyle cellStyle1 = wb.createCellStyle(); //쉼표들어간 숫자 양식
CellStyle cellStyle2 = wb.createCellStyle(); //숫자양식
CellStyle headerStyle = wb.createCellStyle(); //숫자양식
CellStyle headerStyle2 = wb.createCellStyle();
CellStyle headerStyle3 = wb.createCellStyle();
XSSFDataFormat format = wb.createDataFormat();
cellStyle1.setDataFormat(format.getFormat("#,##0"));
cellStyle2.setDataFormat(format.getFormat("#,##0"));
cellStyle2.setAlignment(HorizontalAlignment.CENTER);
headerStyle2.setBorderTop(BorderStyle.THIN);
headerStyle2.setBorderBottom(BorderStyle.THIN);
headerStyle2.setBorderLeft(BorderStyle.THIN);
headerStyle2.setBorderRight(BorderStyle.THIN);
headerStyle2.setAlignment(HorizontalAlignment.CENTER);
headerStyle2.setFillPattern(FillPatternType.SOLID_FOREGROUND);
headerStyle2.setFillForegroundColor((short)3);
headerStyle2.setFillForegroundColor(IndexedColors.LIME.getIndex());
headerStyle.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
headerStyle.setFillForegroundColor((short)3);
headerStyle.setFillForegroundColor(IndexedColors.LIME.getIndex());
headerStyle3.setBorderTop(BorderStyle.THIN);
headerStyle3.setBorderBottom(BorderStyle.THIN);
headerStyle3.setBorderLeft(BorderStyle.THIN);
headerStyle3.setBorderRight(BorderStyle.THIN);
headerStyle3.setAlignment(HorizontalAlignment.CENTER);
headerStyle3.setFillPattern(FillPatternType.SOLID_FOREGROUND);
headerStyle3.setFillForegroundColor((short)3);
headerStyle3.setFillForegroundColor(IndexedColors.LIME.getIndex());
//로우그리기
for(int i=0; i<list.size(); i++) {
ParamMap rowData = list.get(i);
Row row = sheet.createRow(i+2);
for(int j=0; j<headers.length; j++) {
Cell cell = row.createCell(j);
if(columnType[j].equalsIgnoreCase("Int")) {
cell.setCellValue(rowData.getInt(headers[j]));
cell.setCellStyle(cellStyle2);
} else if(columnType[j].equalsIgnoreCase("String")) {
cell.setCellValue(rowData.getString(headers[j]));
} 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(headerStyle3);
sheet.autoSizeColumn(j);
sheet.setColumnWidth(j, (sheet.getColumnWidth(j)) + 1000);
}
sheet.addMergedRegion(new CellRangeAddress(0,0,0,4));
sheet.addMergedRegion(new CellRangeAddress(0,0,5,9));
sheet.addMergedRegion(new CellRangeAddress(0,0,10,15));
sheet.addMergedRegion(new CellRangeAddress(0,0,16,21));
sheet.addMergedRegion(new CellRangeAddress(0,0,22,26));
sheet.addMergedRegion(new CellRangeAddress(0,0,27,29));
for(int j=0; j<headerNames2.length; j++) {
Cell cell = headerRow2.createCell(j);
cell.setCellValue(headerNames2[j]);
cell.setCellStyle(headerStyle2);
sheet.autoSizeColumn(j);
sheet.setColumnWidth(j, (sheet.getColumnWidth(j)) + 1000);
}
//엑셀이름 한글깨짐방지
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 {
response.setHeader("Content-Type", "text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.write("<html lang=\"ko\">");
out.write("<head>");
out.write("<script type=\"text/javascript\">");
out.write("alert('데이터가 없습니다.');");
out.write("history.back(-1);");
out.write("</script>");
out.write("</head>");
out.write("</html>");
out.flush();
out.close();
}
}

View File

@ -6,7 +6,8 @@
<mapper namespace="com.dbnt.faisp.equip.mapper.EquipMapper"> <mapper namespace="com.dbnt.faisp.equip.mapper.EquipMapper">
<select id="selectEquipStatus" resultType="com.dbnt.faisp.util.ParamMap" parameterType="Equip"> <select id="selectEquipStatus" resultType="com.dbnt.faisp.util.ParamMap" parameterType="Equip">
select category_cd, select (ROW_NUMBER() OVER()) AS rownum,
category_cd,
equ_type, equ_type,
item_value, item_value,
item_cd, item_cd,
@ -291,6 +292,7 @@
item_qty, item_qty,
item_condition, item_condition,
note, note,
wrt_nm,
ef.orig_nm, ef.orig_nm,
ef.conv_nm, ef.conv_nm,
ef.file_path ef.file_path
@ -340,6 +342,62 @@
and em.equ_key = #{equKey} and em.equ_key = #{equKey}
and em.version_no = #{versionNo} and em.version_no = #{versionNo}
</select> </select>
<select id="selectEquipLogList" resultType="EquipLog" parameterType="EquipLog">
select (select item_value from code_mgt cm where cm.item_cd = el.equ_type) as equ_type,
(select item_value from code_mgt cm where cm.item_cd = el.detail_type) as detail_name,
detail_type,
case
when oc.organ_type = 'OGC001' then (select item_value from code_mgt cm where cm.item_cd = oc.organ_cd )
when oc.organ_type = 'OGC002' then (select item_value from code_mgt cm where cm.item_cd = oc.organ_cd )
else (select item_value from code_mgt cm where cm.item_cd = oc.parent_organ )
end as sosok,
case
when oc.organ_type = 'OGC003' then (select item_value from code_mgt cm where cm.item_cd = oc.organ_cd )
else null
end as detail_sosok,
el_contents,
wrt_nm,
wrt_dt
from equ_log el,
organ_config oc
where el.wrt_organ = oc.organ_cd
and wrt_organ in
<foreach collection="downOrganCdList" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
order by el.wrt_dt desc
limit #{rowCnt} offset #{firstIndex}
</select>
<select id="selectEquipLogListCnt" resultType="int" parameterType="EquipLog">
select count(*)
from(
select (select item_value from code_mgt cm where cm.item_cd = el.equ_type) as equ_type,
(select item_value from code_mgt cm where cm.item_cd = el.detail_type) as detail_name,
detail_type,
case
when oc.organ_type = 'OGC001' then (select item_value from code_mgt cm where cm.item_cd = oc.organ_cd )
when oc.organ_type = 'OGC002' then (select item_value from code_mgt cm where cm.item_cd = oc.organ_cd )
else (select item_value from code_mgt cm where cm.item_cd = oc.parent_organ )
end as sosok,
case
when oc.organ_type = 'OGC003' then (select item_value from code_mgt cm where cm.item_cd = oc.organ_cd )
else null
end as detail_sosok,
el_contents,
wrt_nm,
wrt_dt
from equ_log el,
organ_config oc
where el.wrt_organ = oc.organ_cd
and wrt_organ in
<foreach collection="downOrganCdList" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
order by el.wrt_dt desc
) a
</select>
</mapper> </mapper>

View File

@ -94,6 +94,10 @@ $(document).on('click', '#saveEquip', function (){
}); });
$(document).on('click', '#equUpdateBtn', function (){ $(document).on('click', '#equUpdateBtn', function (){
if($('input:checkbox[name=equChk]:checked').length < 1){
alert("게시물을 선택해주세요")
return false;
}
if($('input:checkbox[name=equChk]:checked').length > 1){ if($('input:checkbox[name=equChk]:checked').length > 1){
alert("한개만 선택해주세요") alert("한개만 선택해주세요")
return false; return false;
@ -168,6 +172,10 @@ $(document).on('click', '#updateEquip', function (){
}); });
$(document).on('click', '#historyBtn', function (){ $(document).on('click', '#historyBtn', function (){
if($('input:checkbox[name=equChk]:checked').length < 1){
alert("게시물을 선택해주세요")
return false;
}
if($('input:checkbox[name=equChk]:checked').length > 1){ if($('input:checkbox[name=equChk]:checked').length > 1){
alert("한개만 선택해주세요") alert("한개만 선택해주세요")
return false; return false;
@ -254,3 +262,19 @@ $(document).ready( function() {
$('.equInfoCheckBox').prop('checked',this.checked); $('.equInfoCheckBox').prop('checked',this.checked);
}); });
}); });
$(document).on('click', '#statusExcel', function (){
if(confirm("엑셀로 다운로드 하시겠습니까?")){
location.href='/equip/statusExcelDown'
}
})
$(document).on('click', '#closeModal', function (){
location.reload();
})
$(document).on('click', '.btn-close', function (){
location.reload();
})

View File

@ -94,7 +94,7 @@
</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" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button> <button type="button" class="btn btn-secondary" id="closeModal" data-bs-dismiss="modal">닫기</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -8,7 +8,6 @@
<div layout:fragment="content"> <div layout:fragment="content">
<main class="pt-3"> <main class="pt-3">
<h4 th:text="|${equType}-${detailType} 세부현황|"></h4> <h4 th:text="|${equType}-${detailType} 세부현황|"></h4>
<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}"/>
<div class="row mx-0"> <div class="row mx-0">
@ -28,26 +27,7 @@
<div class="col-auto"> <div class="col-auto">
<div class="row justify-content-end"> <div class="row justify-content-end">
<div class="col-auto"> <div class="col-auto">
<select class="form-select form-select-sm" name="ogCd"> <input type="text" class="form-control form-control-sm">
<option value="">관서 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<select class="form-select form-select-sm" name="ofcCd">
<option value="">부서 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('OFC')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<input type="text" class="form-control form-control-sm" name="userNm" >
</div>
<div class="col-auto">
<input type="text" class="form-control form-control-sm" name="userId">
</div> </div>
<input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색"> <input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색">
</div> </div>
@ -94,9 +74,9 @@
</table> </table>
</div> </div>
<div class="col-auto"> <div class="col-auto">
<input type="button" class="btn btn-success" value="삭제" id="equDeleteBtn"> <input type="button" class="btn btn-success" value="삭제" id="equDeleteBtn" th:unless="${accessAuth eq 'ACC001'}">
<input type="button" class="btn btn-success" value="수정" id="equUpdateBtn"> <input type="button" class="btn btn-success" value="수정" id="equUpdateBtn" th:unless="${accessAuth eq 'ACC001'}">
<input type="button" class="btn btn-success" value="수정이력" id="historyBtn"> <input type="button" class="btn btn-success" value="수정이력" id="historyBtn" th:unless="${accessAuth eq 'ACC001'}">
</div> </div>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-auto"> <div class="col-auto">

View File

@ -0,0 +1,120 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/layout}">
<th:block layout:fragment="script">
<script type="text/javascript" th:src="@{/js/equip/equip.js}"></script>
</th:block>
<div layout:fragment="content">
<main class="pt-3">
<h4>외사장비현황</h4>
<ul class="nav nav-tabs" id="boardTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link" th:onclick="|location.href='@{/equip/equipStatus}'|" id="contentTab" data-bs-toggle="tab" data-bs-target="#contentDiv" type="button" role="tab">장비현황</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link active" id="logTab" data-bs-toggle="tab" data-bs-target="#logDiv" type="button" role="tab">수정이력</button>
</li>
</ul>
<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 text-center">
<div class="card-body">
<form method="get" th:action="@{/equip/Log}">
<input type="hidden" name="pageIndex" id="pageIndex" th:value="${searchParams.pageIndex}">
<input type="hidden" name="detailType" th:value="${searchParams.detailType}">
<div class="row justify-content-between pe-3 py-1">
<div class="col-auto">
<select class="form-select" name="rowCnt" id="rowCnt">
<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">
<select class="form-select form-select-sm" name="ofcCd">
<option value="">부서 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('OFC')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<input type="text" class="form-control form-control-sm" name="userId">
</div>
<input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색">
</div>
</div>
</div>
</form>
<div class="row justify-content-start">
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="row">
<table class="table table-striped">
<thead>
<tr>
<th>소속</th>
<th>세부소속</th>
<th>분류</th>
<th>세부분류</th>
<th>수정자</th>
<th>수정내용</th>
<th>수정일시</th>
</tr>
</thead>
<tbody>
<tr th:each="log:${logList}">
<td th:text="${log.sosok}"></td>
<td th:text="${log.detailSosok}"></td>
<td th:text="${log.equType}"></td>
<td th:text="${log.detailName}" style="color: blue; cursor:pointer;" th:onclick="|location.href='@{/equip/List(detailType=${log.detailType})}'|"></td>
<td th:text="${log.wrtNm}"></td>
<td th:text="${log.elContents}"></td>
<td th:text="${#temporals.format(log.wrtDt, 'yyyy-MM-dd')}"></td>
</tr>
</tbody>
</table>
</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==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>
</div>
</div>
</div>
</main>
</div>
</html>

View File

@ -72,7 +72,7 @@
<label for="cat3Cd" class="col-sm-4 col-form-label col-form-label-sm text-center">장비사진</label> <label for="cat3Cd" class="col-sm-4 col-form-label col-form-label-sm text-center">장비사진</label>
<div class="col-sm-6"> <div class="col-sm-6">
<div id="imgUpload"> <div id="imgUpload">
<input type="text" class="form-control" th:value="${equInfo.origNm}" readonly th:if="${not #strings.isEmpty(equInfo.origNm)}"> <input type="text" name="noUpdateImg" class="form-control" th:value="${equInfo.origNm}" readonly th:if="${not #strings.isEmpty(equInfo.origNm)}">
<input type="button" id="deleteImgBtn" value="삭제" th:if="${not #strings.isEmpty(equInfo.origNm)}" th:attr="onclick=|deleteImg('${equInfo.equKey}','${equInfo.versionNo}')|"> <input type="button" id="deleteImgBtn" value="삭제" th:if="${not #strings.isEmpty(equInfo.origNm)}" th:attr="onclick=|deleteImg('${equInfo.equKey}','${equInfo.versionNo}')|">
<input type="text" class="form-control" value="등록된 사진이 없습니다." readonly th:if="${#strings.isEmpty(equInfo.origNm)}"> <input type="text" class="form-control" value="등록된 사진이 없습니다." readonly th:if="${#strings.isEmpty(equInfo.origNm)}">
<input type="button" id="addImgBtn" value="추가" th:if="${#strings.isEmpty(equInfo.origNm)}"> <input type="button" id="addImgBtn" value="추가" th:if="${#strings.isEmpty(equInfo.origNm)}">
@ -86,8 +86,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" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button> <button type="button" class="btn btn-secondary" id="closeModal" data-bs-dismiss="modal">닫기</button>
<button type="button" class="btn btn-primary" id="updateEquip">수정</button> <button type="button" class="btn btn-primary" id="updateEquip" th:if="${accessAuth eq 'ACC003'} or ${equInfo.wrtNm eq userId}">수정</button>
</div> </div>
</div> </div>
</html> </html>

View File

@ -13,7 +13,7 @@
<button class="nav-link active" id="contentTab" data-bs-toggle="tab" data-bs-target="#contentDiv" type="button" role="tab">장비현황</button> <button class="nav-link active" id="contentTab" data-bs-toggle="tab" data-bs-target="#contentDiv" type="button" role="tab">장비현황</button>
</li> </li>
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link" id="logTab" data-bs-toggle="tab" data-bs-target="#logDiv" type="button" role="tab">수정이력</button> <button class="nav-link" th:onclick="|location.href='@{/equip/Log}'|" id="logTab" data-bs-toggle="tab" data-bs-target="#logDiv" type="button" role="tab">수정이력</button>
</li> </li>
</ul> </ul>
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/> <input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
@ -25,30 +25,8 @@
<input type="hidden" name="userStatus" id="userStatus" > <input type="hidden" name="userStatus" id="userStatus" >
<div class="row justify-content-between pe-3 py-1"> <div class="row justify-content-between pe-3 py-1">
<div class="col-auto"> <div class="col-auto">
<input type="button" class="btn btn-success" id="statusExcel" value="엑셀다운">
<div class="row justify-content-end"> <div class="row justify-content-end">
<div class="col-auto">
<select class="form-select form-select-sm" name="ogCd">
<option value="">관서 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<select class="form-select form-select-sm" name="ofcCd">
<option value="">부서 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('OFC')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<input type="text" class="form-control form-control-sm" name="userNm" placeholder="사용자명">
</div>
<div class="col-auto">
<input type="text" class="form-control form-control-sm" name="userId" placeholder="사용자 아이디">
</div>
<input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색">
</div> </div>
</div> </div>
</div> </div>
@ -60,7 +38,6 @@
<div class="row"> <div class="row">
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr>
<tr> <tr>
<th rowspan="2">연번</th> <th rowspan="2">연번</th>
<th rowspan="2">분류</th> <th rowspan="2">분류</th>
@ -83,7 +60,7 @@
<th>목포서</th> <th>목포서</th>
<th>부안서</th> <th>부안서</th>
<th>군산서</th> <th>군산서</th>
<th>여수</th> <th>여수</th>
<th>완도서</th> <th>완도서</th>
<th></th> <th></th>
<th>울산서</th> <th>울산서</th>
@ -138,7 +115,7 @@
</table> </table>
</div> </div>
<div class="col-auto"> <div class="col-auto">
<input type="button" class="btn btn-success" value="등록" id="addEquip"> <input type="button" class="btn btn-success" value="등록" id="addEquip" th:unless="${accessAuth eq 'ACC001'}">
</div> </div>
<div class="row justify-content-center"> <div class="row justify-content-center">
</div> </div>