Files
wace_plm/WebContent/WEB-INF/view/productDevMng/productDevMngDashBoard.jsp
chpark da06c4684c Initial commit: WACE PLM with database initialization features
- Add Docker Compose configurations for dev, prod, and standalone environments
- Add database initialization scripts (init-db.sh, init-db-docker.sh)
- Add enhanced start-docker-linux.sh with DB init support
- Add comprehensive database initialization guide
- Support for automatic dbexport.pgsql import on first run
- Include safety checks for production environment
2025-08-29 15:46:08 +09:00

558 lines
20 KiB
Plaintext

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.pms.common.utils.*"%>
<%@ page import="java.util.*" %>
<%@include file= "/init.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=Constants.SYSTEM_NAME%></title>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/data.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<script>
$(document).ready(function(){
//고객사 목록 조회
fn_setOEMList();
fn_setCarTypeList("${baseParamMap.OEM_OBJID}");
//고객사별 차종 목록 조회
$("#search_oemObjId").change(function(){
var oemObjId = $(this).val();
fn_setCarTypeList(oemObjId);
});
$(".btnSearch").click(function(){
var oemObjId = fnc_checkNull($("#search_oemObjId").val());
if(oemObjId == ""){
Swal.fire("고객사를 선택해주시기 바랍니다.");
$("#search_oemObjId").focus();
return;
}
fn_setChart1Data();
});
//차종별 승인서 작성현황 Chart
var chart2List = ${empty chart2?'[]':chart2};
if(chart2List != null){
setChart2("chart2", chart2List);
}else{
var noData = "<div id=\"chart2MessageArea\" style=\"width:100%;height:50%;padding-top:10%;text-align:center;\">조회된 정보가 없습니다.</div>";
$("#chart2").html(noData);
}
//제품개발 발생 PopUp
$(document).on("click", ".btnProductStatusDetail", function(e){
var oemObjId = fnc_checkNull($(this).attr("data-OEM"));
var carObjId = fnc_checkNull($(this).attr("data-CAR"));
var applyStatus = fnc_checkNull($(this).attr("data-APPLY_STATUS"));
var params = "?search_oemObjId="+oemObjId+"&search_carObjId="+carObjId+"&search_applyStatus="+applyStatus;
window.open("/productDevMng/eoApplyStatusList.do"+params,"eoApplyStatusListFormPopUp","width=1700, height=800");
});
//제품개발 금형,지그 PopUp
$(document).on("click", ".btnProductMoldJigDetail", function(e){
var oemObjId = fnc_checkNull($(this).attr("data-OEM"));
var carObjId = fnc_checkNull($(this).attr("data-CAR"));
var status = fnc_checkNull($(this).attr("data-STATUS"));
var type = fnc_checkNull($(this).attr("data-TYPE"));
var params = "?";
if(oemObjId != null) params += "&search_oemObjId="+oemObjId;
if(carObjId != null) params += "&search_carObjId="+carObjId;
if(type == "mold") params += "&search_moldStatus="+status;
if(type == "jig") params += "&search_jigStatus="+status;
window.open("/productDevMng/eoApplyStatusList.do"+params,"eoApplyStatusListFormPopUp","width=1700, height=800");
});
fn_setChart1Data();
});
</script>
<script>
//EO List 적용현황 Popup을 호출한다.
function fn_openPieEOList(obj){
var carObjId = fnc_checkNullDefaultValue($("#search_carObjId").val(),"");
var oemObjId = fnc_checkNullDefaultValue($("#search_oemObjId").val(),"");
var applyStatus = fnc_checkNull(obj.options.name);
if(applyStatus == "적용"){
var applyStatusType = "complete";
}else if (applyStatus == "미적용"){
var applyStatusType = "uncomplete";
}
var params = "?";
if(oemObjId != null) params += "&search_oemObjId="+oemObjId;
if(carObjId != null) params += "&search_carObjId="+carObjId;
if(applyStatusType != null) params += "&search_applyStatus="+applyStatusType;
window.open("/productDevMng/eoApplyStatusList.do"+params, "", "width=1700, height=800");
}
//EO List 승인서 작성현황 Popup을 호출한다.
function fn_openEOList(obj){
var carObjId = fnc_checkNullDefaultValue(obj.series.options.carObjId[obj.index],"");
var oemObjId = fnc_checkNullDefaultValue(obj.series.options.oemObjId[obj.index],"");
var statusName = fnc_checkNullDefaultValue(obj.series.name,"");
var applyStatus = fnc_checkNull(obj.options.name);
var type = "";
if(statusName == "금형 승인서 등록") type = "mold";
if(statusName == "JIG 승인서 등록") type = "jig";
var params = "?";
if(oemObjId != null) params += "&search_oemObjId="+oemObjId;
if(carObjId != null) params += "&search_carObjId="+carObjId;
if(type == "mold") params += "&search_moldStatus=registed";
if(type == "jig") params += "&search_jigStatus=registed";
window.open("/productDevMng/eoApplyStatusList.do"+params, "", "width=1700, height=800");
}
//oem1 목록 조회
function fn_setOEMList(){
$.ajax({
url:"/common/getOEMList.do",
type:"POST",
data:{"isJson":true},
dataType:"json",
async:false,
success:function(data){
var appendCode = "";
$.each(data, function(i){
appendCode += "<option value='"+data[i].OBJID+"'>"+data[i].OEM_NAME+"("+data[i].OEM_CODE+")</option>";
});
$("#search_oemObjId").append(appendCode);
var paramValue = "${empty param.search_oemObjId?baseParamMap.OEM_OBJID:param.search_oemObjId}";
if(paramValue != ""){
$("#search_oemObjId > option[value="+paramValue+"]").attr("selected", "true");
$("#search_oemObjId").trigger("change");
}
},
error: function(jqxhr, status, error){
}
});
}
//car 목록 조회
function fn_setCarTypeList(oemObjId){
if(oemObjId !=""){
$.ajax({
url:"/common/getCarTypeList.do",
type:"POST",
data:{"isJson":true, "search_oemObjId":oemObjId},
dataType:"json",
async:false,
success:function(data){
var appendCode = "";
appendCode += "";
$.each(data, function(i){
appendCode += "<option value='"+data[i].OBJID+"'>"+data[i].CAR_CODE+"("+data[i].CAR_NAME+")</option>";
});
$("#search_carObjId").children().remove();
$("#search_carObjId").append(appendCode);
var paramValue = "${empty param.search_carObjId?baseParamMap.CAR_OBJID:param.search_carObjId}";
if(paramValue != ""){
$("#search_carObjId > option[value="+paramValue+"]").attr("selected", "true");
}
},
error: function(jqxhr, status, error){
}
});
}else{
$("#search_carObjId").children().remove();
$("#search_carObjId").append("<option value=''>선택</option>");
}
}
//chart1
function fn_setChart1Data(){
var oemObjId = $("#search_oemObjId").val();
var carObjId = $("#search_carObjId").val();
$.ajax({
url:"/dashboard/productDevMngDashBoard_chart1.do",
type:"POST",
data:{"search_carObjId":carObjId},
dataType:"json",
success:function(data){
//set chart
var name = fnc_checkNull(data.CAR_CODE);
var applyCnt = Number(fnc_checkNullDefaultValue(data.APPLY_CNT, 0));
var nonApplyCnt = Number(fnc_checkNullDefaultValue(data.NON_APPLY_CNT, 0));
var sum = applyCnt + nonApplyCnt;
if(sum == 0){
var noData = "<div id=\"chart1MessageArea\" style=\"width:100%;height:50%;padding-top:10%;text-align:center;\">조회된 정보가 없습니다.</div>";
$("#chart1").html(noData);
}else{
setChart1("chart1", data);
}
},
error: function(jqxhr, status, error){
Swal.fire(jqxhr.statusText + ", " + status + ", " + error);
Swal.fire(jqxhr.status);
Swal.fire(jqxhr.responseText);
}
});
}
//chart1
function setChart1(divId, resultMap){
var name = fnc_checkNull(resultMap.CAR_CODE);
var applyCnt = Number(fnc_checkNullDefaultValue(resultMap.APPLY_CNT, 0));
var nonApplyCnt = Number(fnc_checkNullDefaultValue(resultMap.NON_APPLY_CNT, 0));
//Swal.fire("name : "+name+", completeCnt : "+completeCnt+", planCnt : "+planCnt+", ongoingCnt : "+ongoingCnt+", delayCnt : "+delayCnt);
$('#'+divId).highcharts({
colors: ['#558ed5', '#ff6d6d', '#bed0f6','#90ff7d', '#b6a6ca', '#bfbfbf','#cc7b38', '#383838', '#00cc99','#9bbb59', '#40e1f2', '#6155f9','#9c4f30', '#aabad7', '#d9aaa9'],
chart: {
type : 'pie'
},
title: {
text: 'EO 적용현황'
},
plotOptions:{
series: {
dataLabels: {
enabled: true,
format: '{point.name}: {point.y}건'
}
}
},
plotOptions:{
series: {
dataLabels: {
enabled: true,
format: '{point.name}: {point.y}건'
},
cursor:'pointer',
point:{
events:{
click:function(){
console.log(this);
fn_openPieEOList(this);
}
}
}
}
},
"series": [
{
name: name
, data : [
{
'name' : '적용',
'y' : applyCnt
},
{
'name' : '미적용',
'y' : nonApplyCnt
}
]
}
]
});
}
//chart2
function setChart2(divId, resultList){
var name = [];
//금형
var moldRegistedCnt = [];
var moldNotRegistedCnt = [];
var moldNoTargetCnt = [];
var moldTargetNoChooseCnt = [];
//지그
var jigRegistedCnt = [];
var jigNotRegistedCnt = [];
var jigNoTargetCnt = [];
var jigTargetNoChooseCnt = [];
//표현값
var moldCnt = [];
var jigCnt = [];
var allCnt = [];
var oemObjId = [];
var carObjId = [];
$.each(resultList , function(i){
name[i] = resultList[i].CAR_CODE;
allCnt[i] = Number(fnc_checkNullDefaultValue(resultList[i].ALL_CNT, 0));
moldRegistedCnt[i] = Number(fnc_checkNullDefaultValue(resultList[i].MOLD_REGISTED_CNT, 0));
moldNotRegistedCnt[i] = Number(fnc_checkNullDefaultValue(resultList[i].MOLD_NOT_REGISTED_CNT, 0));
moldNoTargetCnt[i] = Number(fnc_checkNullDefaultValue(resultList[i].MOLD_NO_TARGET_CNT, 0));
moldTargetNoChooseCnt[i] = Number(fnc_checkNullDefaultValue(resultList[i].MOLD_TARGET_NO_CHOOSE_CNT, 0));
jigRegistedCnt[i] = Number(fnc_checkNullDefaultValue(resultList[i].JIG_REGISTED_CNT, 0));
jigNotRegistedCnt[i] = Number(fnc_checkNullDefaultValue(resultList[i].JIG_NOT_REGISTED_CNT, 0));
jigNoTargetCnt[i] = Number(fnc_checkNullDefaultValue(resultList[i].JIG_NO_TARGET_CNT, 0));
jigTargetNoChooseCnt[i] = Number(fnc_checkNullDefaultValue(resultList[i].JIG_TARGET_NO_CHOOSE_CNT, 0));
oemObjId[i] = Number(fnc_checkNullDefaultValue(resultList[i].OEM_OBJID, 0));
carObjId[i] = Number(fnc_checkNullDefaultValue(resultList[i].CAR_OBJID, 0));
moldCnt[i] = moldRegistedCnt[i]+moldNotRegistedCnt[i]+moldNoTargetCnt[i];
jigCnt[i] = jigRegistedCnt[i]+jigRegistedCnt[i]+jigNoTargetCnt[i];
//Swal.fire("name : "+name[i]+", allCnt : "+allCnt[i]+", moldRegistedCnt : "+moldRegistedCnt[i]+", jigRegistedCnt : "+jigRegistedCnt[i]);
});
//Swal.fire("name : "+name+", allCnt : "+allCnt+", moldRegistedCnt : "+moldRegistedCnt+", jigRegistedCnt : "+jigRegistedCnt);
$('#'+divId).highcharts({
chart: {
type: 'column'
},
title: {
text: '차종별 승인서 작성현황'
},
xAxis: {
categories: name
},
yAxis: [{
min: 0,
title: {
text: ''
}
}, {
title: {
text: ''
},
opposite: true
}],
legend: {
shadow: false
},
tooltip: {
shared: true
},
plotOptions: {
column: {
grouping: false,
shadow: false,
borderWidth: 0
},
series: {
cursor:'pointer',
point:{
events:{
click:function(){
console.log(this);
fn_openEOList(this);
}
}
}
}
},
series: [{
name: '전체',
color: '#eee',
data: allCnt,
oemObjId:oemObjId,
carObjId:carObjId,
tooltip: {
valuePrefix: '',
valueSuffix: '건'
},
pointPadding: 0.3,
pointPlacement: -0.2
}, {
name: '금형 승인서 등록',
color: '#e8ce62',
data: moldCnt,
oemObjId:oemObjId,
carObjId:carObjId,
tooltip: {
valuePrefix: '',
valueSuffix: '건'
},
pointPadding: 0.4,
pointPlacement: -0.2
}, {
name: '전체',
color: '#eee',
data: allCnt,
oemObjId:oemObjId,
carObjId:carObjId,
tooltip: {
valuePrefix: '',
valueSuffix: '건'
},
pointPadding: 0.3,
pointPlacement: 0.2,
yAxis: 1
}, {
name: 'JIG 승인서 등록',
color: '#79ad86',
data: jigCnt,
oemObjId:oemObjId,
carObjId:carObjId,
tooltip: {
valuePrefix: '건',
valueSuffix: '건'
},
pointPadding: 0.4,
pointPlacement: 0.2,
yAxis: 1
}]
});
}
</script>
</head>
<body>
<form name="form1" action="" method="post">
<div style="min-width:1600px;">
<div class="plm_menu_name">
<h2>
<span>제품개발관리</span>
</h2>
</div>
<div class="fourblock" style="margin:30px 0; width:35%; float:left !important; margin-left:1%;">
<div class="fourblock_search">
<table>
<tr>
<td rowspan="2">&nbsp;&nbsp;&nbsp;&nbsp;검색조건&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td><lable for="" class="orangeTitleDot" style="font-weight:300; font-size:13px;">고객사</lable></td>
<td>
<select name="search_oemObjId" id="search_oemObjId" style="width:100px;">
<option value="">선택</option>
</select>
</td>
<td><lable for="" class="orangeTitleDot" style="font-weight:300; font-size:13px;">차종</lable></td>
<td>
<select name="search_carObjId" id="search_carObjId" style="width:180px;">
<option value="">선택</option>
</select>
</td>
<td><input type="button" value="조회" class="btnSearch blue_btn" style="float:none;"></td>
</tr>
</table>
</div>
<div id="chart1" style="width:80%; height: 280px; margin: 0 auto;"></div>
</div>
<div class="fourblock" style="margin:30px 0; width:60%; float:right !important; margin-right:1%;">
<div id="chart2" style="min-width: 310px; width:85%; height: 350px; margin: 0 auto"></div>
</div>
<div class="fourblock" style="border:0; width:35%; float:left !important; margin-left:1%;">
<div class="plm_table_wrap">
<div style="overflow-y:scroll;">
<table class="plm_table" style="width:100%;">
<thead>
<tr class="plm_thead">
<td rowspan="2">차종</td>
<td colspan="3">발생</td>
<td rowspan="2">적용율(%)</td>
</tr>
<tr class="plm_sub_thead">
<td>적용</td>
<td>미적용</td>
<td>계</td>
</tr>
</thead>
</table>
</div>
<div class="plm_scroll_table" style="width:100%; height:320px;">
<table class="plm_table">
<tbody>
<c:choose>
<c:when test="${!empty grid1}">
<c:forEach var="info" items="${grid1}" varStatus="status">
<tr>
<td title="${info.CAR_CODE}">${info.CAR_CODE}</td>
<td title="${info.APPLY_CNT}"><a href="#" class="btnProductStatusDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" data-APPLY_STATUS = "complete" >${info.APPLY_CNT}</a></td>
<td title="${info.NON_APPLY_CNT}"><a href="#" class="btnProductStatusDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" data-APPLY_STATUS = "uncomplete" >${info.NON_APPLY_CNT}</a></td>
<td title="${info.ALL_CNT}"><a href="#" class="btnProductStatusDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" >${info.ALL_CNT}</a></td>
<td title="${info.APPLY_RATIO}">${info.APPLY_RATIO}</td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="4" align="center">조회된 정보가 없습니다.</td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</div>
</div>
</div>
<div class="fourblock" style="width:60%; border:0; float:right !important; margin-right:1%;">
<div class="plm_table_wrap">
<div style="overflow-y:scroll;">
<table class="plm_table" style="width:100%;">
<thead>
<tr class="plm_thead">
<td rowspan="3">차종</td>
<td colspan="6">금형</td>
<td colspan="6">지그</td>
</tr>
<tr class="plm_sub_thead">
<td>등록</td>
<td>미등록</td>
<td>승인서작성<br>미대상</td>
<td>승인서작성<br>대상미선택</td>
<td>계</td>
<td>등록률(%)</td>
<td>등록</td>
<td>미등록</td>
<td>승인서작성<br>미대상</td>
<td>승인서작성<br>대상미선택</td>
<td>계</td>
<td>등록률(%)</td>
</tr>
</thead>
</table>
</div>
<div class="plm_scroll_table" style="width:100%; height:262px;">
<table class="plm_table">
<tbody>
<c:choose>
<c:when test="${!empty grid2}">
<c:forEach var="info" items="${grid2}" varStatus="status">
<tr>
<td title="${info.CAR_CODE}">${info.CAR_CODE}</td>
<td title="${info.MOLD_REGISTED_CNT}"><a href="#" class="btnProductMoldJigDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" data-STATUS = "registed" data-TYPE="mold" >${info.MOLD_REGISTED_CNT}</a></td>
<td title="${info.MOLD_NOT_REGISTED_CNT}"><a href="#" class="btnProductMoldJigDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" data-STATUS = "unregisted" data-TYPE="mold">${info.MOLD_NOT_REGISTED_CNT}</a></td>
<td title="${info.MOLD_NO_TARGET_CNT}"><a href="#" class="btnProductMoldJigDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" data-STATUS = "untarget" data-TYPE="mold">${info.MOLD_NO_TARGET_CNT}</a></td>
<td title="${info.MOLD_TARGET_NO_CHOOSE_CNT}"><a href="#" class="btnProductMoldJigDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" data-STATUS = "unchoose" data-TYPE="mold">${info.MOLD_TARGET_NO_CHOOSE_CNT}</a></td>
<td title="${info.ALL_CNT}"><a href="#" class="btnProductMoldJigDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" data-TYPE="mold">${info.ALL_CNT}</a></td>
<td title="${info.MOLD_REGISTED_RATIO}">${info.MOLD_REGISTED_RATIO}</td>
<td title="${info.JIG_REGISTED_CNT}"><a href="#" class="btnProductMoldJigDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" data-STATUS = "registed" data-TYPE="jig">${info.JIG_REGISTED_CNT}</a></td>
<td title="${info.JIG_NOT_REGISTED_CNT}"><a href="#" class="btnProductMoldJigDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" data-STATUS = "unregisted" data-TYPE="jig">${info.JIG_NOT_REGISTED_CNT}</a></td>
<td title="${info.JIG_NO_TARGET_CNT}"><a href="#" class="btnProductMoldJigDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" data-STATUS = "untarget" data-TYPE="jig">${info.JIG_NO_TARGET_CNT}</a></td>
<td title="${info.JIG_TARGET_NO_CHOOSE_CNT}"><a href="#" class="btnProductMoldJigDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" data-STATUS = "unchoose" data-TYPE="jig">${info.JIG_TARGET_NO_CHOOSE_CNT}</a></td>
<td title="${info.ALL_CNT}"><a href="#" class="btnProductMoldJigDetail" data-OEM="${info.OEM_OBJID}" data-CAR="${info.CAR_OBJID}" >${info.ALL_CNT}</a></td>
<td title="${info.JIG_REGISTED_RATIO}">${info.JIG_REGISTED_RATIO}</td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="13" align="center">조회된 정보가 없습니다.</td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</div>
</div>
</div>
</div>
</form>
</body>
</html>