Files
wace_plm/WebContent/WEB-INF/view/project/dashBoardMain.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

585 lines
20 KiB
Plaintext

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.pms.common.utils.*"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ 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>
<c:set var="now" value="<%=new java.util.Date() %>"/>
<c:set var="sysYear"><fmt:formatDate value="${now}" pattern="yyyy" /></c:set>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<link rel="stylesheet" href="/css/jsgantt.css" type="text/css">
<script type="text/javascript" src="/js/jsgantt.js" ></script>
<script type="text/javascript" src="/js/jquery.floatThead.min.js" ></script>
<script>
$(document).ready(function(){
//차종별 예상매출액 상세보기 팝업
$(".blue_btn").click(function(){
Swal.fire('gannt 표시');
});
//틀고정
//$('#fixTable').floatThead();
$("input:radio[name=chk]").click(function(){
$('#fixTable').floatThead();
var objId= $(this).attr("data-objId");
/* document.form1.action = "/project/dashBoardMain.do?objId="+objId;
document.form1.submit(); */
pie_chart2(objId);
var url = "/project/dashBoardgantt.do?objId="+objId;
$('#ganttChartFrame').attr('src', url);
//gantt_chart(objId);
// pie_chart3(objId);
})
if(""!="${Year}"){
$("#Year").val("${Year}");
}
//수주활동 Chart
//fn_setGrid1Data();
//fn_setGrid2Data();
//차종별 Task 진행현황 pie chart구성
/* $("input[type=radio]").click(function(){
var carObjId = $(this).val();
var carCode = $(this).attr("data-CAR_CODE");
fn_getTaskStatusInfo(carObjId);
$("#title").text(carCode+" Task 진행현황");
}); */
$("input[type=radio]").eq(0).trigger("click");
$("#Year").change(function(){
fn_search($(this).val());
});
//chart2
//사전원가 시스템 연동 예상매출액 Chart
//fn_getCostSystemEstimatedSalesChart();
/* //chart4
var chart4List = ${empty chart4?'[]':chart4};
if(chart4List != null){
setChart4("chart4", chart4List);
}else{
var noData = "<div id=\"chart4MessageArea\" style=\"width:100%;height:50%;padding-top:10%;text-align:center;\">조회된 정보가 없습니다.</div>";
$("#chart4").html(noData);
}
*/
pie_chart1();
});
function pie_chart1(){
var SUM1 ="";
var SUM2 ="";
var SUM3 ="";
var SUM4 ="";
var Year = $("#Year").val();
$.ajax({
url:"/dashboard/getmainDash_chart1.do",
type:"POST",
data:{"Year":Year},
dataType:"json",
async:false,
success:function(data){
$.each(data, function(i){
SUM1=data[i][0].SUM1;
SUM2=data[i][0].SUM2;
SUM3=data[i][0].SUM3;
SUM4=data[i][0].SUM4;
});
},
error: function(jqxhr, status, error){
}
});
google.charts.load("current", {packages:["corechart"]});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Task', '값'],
['신규',SUM1],
['공통',SUM2],
['개조',SUM3],
['RepeatOrder',SUM4]
]);
var options = {
title: '',
is3D: true,
};
var chart = new google.visualization.PieChart(document.getElementById('chart1'));
chart.draw(data, options);
}
}
//이슈차트
/* function pie_chart2(oid){
Highcharts.chart('chart2', {
chart: {
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false,
type: 'pie'
},
title: {
text: '이슈 (Quality)'
},
tooltip: {
pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'
},
accessibility: {
point: {
valueSuffix: '%'
}
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: true,
format: '<b>{point.name}</b>: {point.percentage:.1f} %'
}
}
},
series: [{
name: 'Brands',
colorByPoint: true,
data: [{
name: '설계오류',
y: 61.41,
}, {
name: '가공오류',
y: 11.84
}, {
name: '조립오류',
y: 10.85
}, {
name: '고객변경',
y: 4.67
}]
}]
});
} */
function pie_chart2(oid){
var SUM1 ="";
var SUM2 ="";
var SUM3 ="";
var SUM4 ="";
$.ajax({
url:"/dashboard/getmainDash_chart2.do",
type:"POST",
data:{"objId":oid},
dataType:"json",
async:false,
success:function(data){
$.each(data, function(i){
SUM1=data[i][0].SUM1;
SUM2=data[i][0].SUM2;
SUM3=data[i][0].SUM3;
SUM4=data[i][0].SUM4;
});
},
error: function(jqxhr, status, error){
}
});
google.charts.load("current", {packages:["corechart"]});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Task', '값'],
['재료비',SUM1],
['노무비',SUM2],
['경비',SUM3],
['외주',SUM4],
]);
var options = {
title: '',
is3D: true,
};
var chart = new google.visualization.PieChart(document.getElementById('chart2'));
chart.draw(data, options);
}
/* Highcharts.chart('chart2', {
chart: {
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false,
type: 'pie'
},
title: {
text: '발주금액 (Purchase)'
},
tooltip: {
pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'
},
accessibility: {
point: {
valueSuffix: '%'
}
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: true,
format: '<b>{point.name}</b>: {point.percentage:.1f} %'
}
}
},
series: [{
name: 'Brands',
colorByPoint: true,
data: [{
name: '완제품기계',
y: 61.41,
}, {
name: '완제품전장',
y: 11.84
}, {
name: '원재료',
y: 10.85
}, {
name: '외주기계',
y: 4.67
}, {
name: '외주전장',
y: 4.67
}]
}]
}); */
}
//영업활동등록 상세
function fn_projectConceptDetail(objId,managerPm){
window.open("/ordermgmt/ordermgmtUpdateFormPopup.do?objId="+objId+"&managerPm="+managerPm, "", "width=650, height=930");
}
//수주활동 검색 기능
function fn_search(param){
document.form1.action = "/project/dashBoardMain.do?Year="+param;
document.form1.submit();
}
function fn_issueListDetail(val){
document.form1.action = "/project/issueList.do?total_projectNo="+val+"&project_code="+val;
document.form1.submit();
}
function fn_inputCostStatusListDetail(val){
//$("#LIST_KIND").val(val);
$("#total_projectNo").val(val);
document.form1.action = "/costMgmt/inputCostStatusList.do?total_projectNo="+val;
document.form1.submit();
}
</script>
</head>
<body>
<form name="form1" action="" method="post">
<input type="hidden" name="total_projectNo" id="total_projectNo">
<div class="content-box">
<div class="content-box-s">
<div id="plmSearchZon">
<table>
<tr>
<td><label for="Year">연도</label></td>
<td>
<select name="Year" id="Year" class="select2" autocomplete="off">
<c:forEach begin="${sysYear-4}" end="${sysYear}" var="req_year">
<option value="${req_year}"${param.Year eq req_year ? 'selected':'' }>${req_year}</option>
</c:forEach>
</select>
</td>
</tr>
</table>
</div>
<div style="width:100%;margin-bottom:25px;height:450px;overflow-y:auto">
<div >
<table class="plm_table" style=" width: 100%; border-bottom: 1px solid #444444;" id="fixTable">
<colgroup>
<col width="3%">
<col width="18%">
<col width="5%">
<col width="16%">
<col width="30%">
<col width="10%">
<!-- <col width="65px"> -->
<col width="5%"> <!-- 발생 -->
<col width="5%"> <!-- 조치 -->
<col width="5%">
<col width="5%">
<col width="14%">
<col width="14%">
<col width="14%">
<col width="7%">
<col width="7%">
<col width="7%">
<col width="14%">
<col width="14%">
<col width="14%">
<col width="7%">
</colgroup>
<thead>
<tr class="plm_thead">
<td colspan="6">Project</td>
<td colspan="4">이슈(Quality)</td>
<td colspan="4">원가(Cost)</td>
<td colspan="2">납기(Delivery)</td>
<td colspan="4">외주현황</td>
</tr>
<tr class="plm_sub_thead">
<td></td>
<td>No.</td>
<td>지역</td>
<td>고객사</td>
<td>Name</td>
<td>납기일</td>
<!-- <td>수주Item</td> -->
<td>발생</td>
<td>조치</td>
<td>미결</td>
<td>조치율</td>
<!-- <td>계</td>
<td>목표(%)</td>
<td>재료비</td>
<td>목표(%)</td>
<td>노무비</td>
<td>목표(%)</td>
<td>경비</td>
<td>목표(%)</td> -->
<td>수주가</td>
<td>예가</td>
<td>실적가</td>
<td>집행률</td>
<td>진척율</td>
<td>지연일</td>
<td>(소계)</td>
<td>기구</td>
<td>전장</td>
<td>비율</td>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${!empty LIST}">
<c:forEach var="info" items="${LIST}" varStatus="status">
<tr>
<td>
<input type="radio" name="chk" id="chk" data-objId="${info.ORDER_MGMT_OBJID}">
</td>
<td title="${info.PROJECT_NO}"><a href="#" onclick="javascript:fn_projectConceptDetail('${info.ORDER_MGMT_OBJID}','${info.MANAGER_PM }')">${info.PROJECT_NO}</a></td>
<td title="${info.REGION_NAME}">${info.REGION_NAME}</td>
<td title="${info.CUSTOMER_NAME}" style="text-align:left; padding:0px 0px 0px 8px;">${info.CUSTOMER_NAME}</td>
<td title="${info.ORDER_TITLE}" style="text-align:left; padding:0px 0px 0px 8px;" >${info.ORDER_TITLE}</td>
<td title="${info.DEL_DATE}">${info.DEL_DATE}</td>
<td title="${info.OCCUR}">${info.OCCUR}</td>
<td title="${info.MEASURE}">${info.MEASURE}</td>
<td title="${info.DEPENDENCE}"><a href="#" onclick="javascript:fn_issueListDetail('${info.ORDER_MGMT_OBJID}','update','','','total')">
<font color="red">${info.DEPENDENCE}</font></a></td>
<td title="<fmt:formatNumber value="${info.OCCUR_RATE}" pattern="#0.0"/>"><fmt:formatNumber value="${info.OCCUR_RATE}"/> ${empty info.OCCUR_RATE ? '': '%'}</td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.ORDER_PRICE}"><fmt:formatNumber value="${info.ORDER_PRICE}"/></fmt></td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.PLAN_SUM}"><fmt:formatNumber value="${info.PLAN_SUM}"/></fmt></td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.NEW_TOTAL_SUM}"><a href="#" onclick="javascript:fn_inputCostStatusListDetail('${info.PROJECT_NO}','');return false;"><fmt:formatNumber value="${info.NEW_TOTAL_SUM}"/></fmt></a></td>
<td title="${info.NEW_GOAL_RATE}">${info.NEW_GOAL_RATE} ${empty info.NEW_GOAL_RATE ? '':'%'}</td>
<td title="${info.PROGRESS}">${info.PROGRESS} ${empty info.PROGRESS ? '':'%'}</td>
<td title="${info.DELAY_DATE}">${info.DELAY_DATE} ${empty info.DELAY_DATE ? '0 일':'일'}</td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.PER_OUT_TOTALSUM}"><fmt:formatNumber value="${info.PER_OUT_TOTALSUM}"/></fmt></td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.PER_OUT_SUM}"><fmt:formatNumber value="${info.PER_OUT_SUM}"/></fmt></td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.PER_OUT_SUM1}"><fmt:formatNumber value="${info.PER_OUT_SUM1}"/></fmt></td>
<td title="${info.PER_OUT_RATE}">${info.PER_OUT_RATE} ${empty info.PER_OUT_RATE ? '':'%'}</td>
<%-- <td title="${info.ORDER_NAME}" style="text-align:left; padding:0px 0px 0px 8px;">${info.ORDER_NAME}</td> --%>
<%-- <td title="${info.OCCUR1}">${info.OCCUR1}</td>
<td title="${info.OCCUR2}">${info.OCCUR2}</td> --%>
<%-- <td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.TOTAL_SUM}"><fmt:formatNumber value="${info.TOTAL_SUM}"/></fmt></td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.TOTAL_AVR}"><fmt:formatNumber value="${info.TOTAL_AVR}" pattern="#0.0"/></td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.SUM1}"><fmt:formatNumber value="${info.SUM1}"/></fmt></td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.AVR}"><fmt:formatNumber value="${info.AVR}" pattern="#0.0"/></td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.TOTAL_LABORCOSTS}"><fmt:formatNumber value="${info.TOTAL_LABORCOSTS}"/></fmt></td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.LABORCOSTS_GOEL_RATE}"><fmt:formatNumber value="${info.LABORCOSTS_GOEL_RATE}" pattern="#0.0"/></td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.SETTLE_AMOUNT}"><fmt:formatNumber value="${info.SETTLE_AMOUNT}"/></fmt></td>
<td style="text-align:right; padding:0px 15px 0px 0px;" title="${info.SETTLE_GOEL_RATE}"><fmt:formatNumber value="${info.SETTLE_GOEL_RATE}" pattern="#0.0"/></td> --%>
<%-- <td title="${info.PROGRESS}">${info.PROGRESS} ${empty info.PROGRESS ? '':'%'}</td>
<td title="${info.DELAY_DATE}">${info.DELAY_DATE} ${empty info.DELAY_DATE ? '':'일'}</td> --%>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="19" align="center">조회된 데이터가 없습니다.</td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</div>
</div>
<br>
<table border="0" style="margin:0px 8px; width:100%; box-sizing:border-box">
<tr>
<td style="width:20%"><div style="background:#eaf7fd;padding:5px 10px;color:#163f93;font-weight:bold;font-size:13px;margin-right:5px">년도별_매출현황 </div></td>
<td style="width:22%"><div style="background:#eaf7fd;padding:5px 10px;color:#163f93;font-weight:bold;font-size:13px;margin-right:40px">프로젝트별_원가현황</div></td>
<td style="width:58%"><div style="background:#eaf7fd;padding:5px 10px;color:#163f93;font-weight:bold;font-size:13px">일정 (계획 vs 실적) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 범례 : 진행중 <img src="/images/ing.png" width="15" height="15" alt=""/>&nbsp;&nbsp;&nbsp; 완료 <img src="/images/complet.png" width="15" height="15" alt=""/>&nbsp;&nbsp;&nbsp; 지연 <img src="/images/delay.png" width="15" height="15" alt=""/>&nbsp;&nbsp;&nbsp; 지연완료 <img src="/images/delaycomplet.png" width="15" height="15" alt=""/> </div></td>
</tr>
<tr>
<td style="vertical-align:top">
<div id="chart1" style="height:262px;border:1px solid #ccc; margin-right:5px"></div></td>
<td style="vertical-align:top"><div id="chart2" style="height:262px;border:1px solid #ccc; margin-right:40px"></div></td>
<td>
<iframe id="ganttChartFrame" style="width:100%;height:270px;border:0" src="/project/dashBoardgantt.do"></iframe>
</td>
</tr>
</table>
<br>
</form>
<script language="javascript">
$("#gannt").html("");
var g = new JSGantt.GanttChart('g',document.getElementById('gannt'), 'day');
//간트차트
function gantt_chart(oid){
var TASK_NAME ="";
var TASK_START_PLAN_DATE ="";
var TASK_END_PLAN_DATE ="";
var TASK_START_DATE ="";
var TASK_END_DATE ="";
var RATE ="";
var STD_TXT="";
g.setShowRes(0); // Show/Hide Responsible (0/1)
g.setShowDur(0); // Show/Hide Duration (0/1)
g.setShowComp(0); // Show/Hide % Complete(0/1)
g.setCaptionType('Resource'); // Set to Show Caption
if( g ) {
$.ajax({
url:"/dashboard/getmainDash_gantt.do",
type:"POST",
data:{"objId":oid},
dataType:"json",
async:false,
success:function(data){
$.each(data, function(i){
for(var j=0;j<data[i].length;j++){
TASK_NAME = data[i][j].TASK_NAME
TASK_START_PLAN_DATE = data[i][j].TASK_START_PLAN_DATE
TASK_END_PLAN_DATE = data[i][j].TASK_END_PLAN_DATE
TASK_START_DATE =data[i][j].TASK_START_DATE;
TASK_END_DATE =data[i][j].TASK_END_DATE;
RATE = data[i][j].RATE
var PLUSTXT ="";
if(TASK_START_PLAN_DATE==undefined){return;}
if(TASK_END_PLAN_DATE==undefined){TASK_END_PLAN_DATE ='00/00/0000';}
if(RATE==undefined){RATE ='0';}
if(TASK_START_DATE!=undefined && TASK_END_DATE!=undefined){
PLUSTXT="~";
}
if(TASK_START_DATE==undefined){
TASK_START_DATE ='';
}
if(TASK_END_DATE==undefined){TASK_END_DATE ='';}
STD_TXT = TASK_START_DATE+PLUSTXT+TASK_END_DATE;
g.AddTaskItem(new JSGantt.TaskItem(11, TASK_NAME, TASK_START_PLAN_DATE, TASK_END_PLAN_DATE, 'ff00ff', '', 0, STD_TXT, RATE, 0, 1, 1));
}
});
},
error: function(jqxhr, status, error){
}
});
//pGanttVar.AddTaskItem(new JSGantt.TaskItem(pID , pName, pStart, pEnd, pColor, pLink, pMile, pRes, pComp, pGroup, pParent, pOpen, pDepend,pCaption));
/* g.AddTaskItem(new JSGantt.TaskItem(11, 'Chart Object', '2/20/2008', '4/20/2008', 'ff00ff', '', 0, 'Shlomy', 100, 0, 1, 1));
g.AddTaskItem(new JSGantt.TaskItem(11, 'Chart Object', '2/20/2008', '4/20/2008', 'ff00ff', '', 0, 'Shlomy', 100, 0, 1, 1));
g.AddTaskItem(new JSGantt.TaskItem(11, 'Chart Object', '2/20/2008', '4/20/2008', 'ff00ff', 'http://www.yahoo.com', 0, 'Shlomy', 100, 0, 1, 1));
g.AddTaskItem(new JSGantt.TaskItem(11, 'Chart Object', '2/20/2008', '4/20/2008', 'ff00ff', 'http://www.yahoo.com', 0, 'Shlomy', 100, 0, 1, 1)); */
g.Draw();
g.DrawDependencies();
}
else
{
Swal.fire("not defined");
}
}
</script>
</body>
</html>