- 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
614 lines
18 KiB
Plaintext
614 lines
18 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>
|
|
$(document).ready(function(){
|
|
$(".date_delete").click(function(){
|
|
$(".from_to_date").val("");
|
|
});
|
|
|
|
//고객사 목록 조회
|
|
fn_setOEMList();
|
|
|
|
//고객사별 차종 목록 조회
|
|
$("#search_oemObjId").change(function(){
|
|
var oemObjId = $(this).val();
|
|
|
|
fn_setCarTypeList(oemObjId);
|
|
});
|
|
|
|
//등록팝업
|
|
$(".docTransferRegBtn").click(function(){
|
|
window.open("/transfer/docTransferFormPopup.do?actionType=regist", "", "width=1000, height=580");
|
|
});
|
|
|
|
//개발품목을 통한 갑지의 상세 PopUp
|
|
$(".btnDocTransferBaseInfo").click(function(){
|
|
|
|
var objId = $(this).attr("data-OBJID");
|
|
|
|
window.open("/transfer/docTransferDetailPopup.do?objId="+objId, "", "width=1000, height=580");
|
|
});
|
|
|
|
//문서이관 관리리스트 선택 시 팝업
|
|
$(".btnDocTransferDetailPopup").click(function(){
|
|
var targetObjId = $(this).attr("data-OBJID");
|
|
window.open("/transfer/docTransferTypeOfCarPopup.do?targetObjId="+targetObjId, "", "width=1700, height=885");
|
|
});
|
|
|
|
//문서이관 관리리스트의 차종버튼 클릭시
|
|
$(".btnRadio").click(function(){
|
|
var docTransferObjId = $(this).val();
|
|
|
|
fn_getDocTransferResultPieChart(docTransferObjId);
|
|
fn_getDocTransferDeptResultColumnChart(docTransferObjId);
|
|
fn_getDocTransferHandOverResultColumnChart(docTransferObjId);
|
|
});
|
|
|
|
//인수인계 정보팝업
|
|
$(document).on("click", ".btnOpenTakeOverHisPopup", function(){
|
|
var targetObjId = $(this).attr("data-TARGET_OBJID");
|
|
var takeOverHisObjId = $(this).attr("data-TAKE_OVER_HIS_OBJID");
|
|
var partNo = $(this).attr("data-PART_NO");
|
|
|
|
var url = "/transfer/opinionFormPopup.do?targetObjId="+targetObjId+"&partNo="+partNo;
|
|
window.open(url, "takeOverHisResultPopup", "width=1000, height=455");
|
|
//Swal.fire("targetObjId : "+targetObjId+", takeOverHisObjId : "+takeOverHisObjId);
|
|
});
|
|
|
|
//조회
|
|
$(".btnSearch").click(function(){
|
|
fn_search();
|
|
});
|
|
|
|
$("#btnSetBaseInfo").click(function(){
|
|
var objId = $("#objId").val();
|
|
fn_getDocTransferList(objId);
|
|
});
|
|
|
|
fnc_datepick();
|
|
|
|
var radioObj = $("input[name=btnRadio]");
|
|
|
|
if(radioObj.length > 0){
|
|
$("input:radio[name=btnRadio]").eq(0).attr("checked",true).trigger("click");
|
|
}
|
|
|
|
});
|
|
</script>
|
|
<script>
|
|
//검색기능
|
|
function fn_search(){
|
|
document.form1.action = "/transfer/moldTransferList.do";
|
|
document.form1.submit();
|
|
}
|
|
|
|
//oem 목록 조회
|
|
function fn_setOEMList(){
|
|
$.ajax({
|
|
url:"/common/getOEMList.do",
|
|
type:"POST",
|
|
data:{"isJson":true},
|
|
dataType:"json",
|
|
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 = "${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",
|
|
success:function(data){
|
|
var appendCode = "";
|
|
appendCode += "<option value=''>선택</option>";
|
|
$.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 = "${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>");
|
|
}
|
|
}
|
|
|
|
//해당 문서이관에 해당하는 진행현황 PIE Chart를 가져온다.
|
|
function fn_getDocTransferResultPieChart(docTransferObjId){
|
|
$("#chart1").empty();
|
|
|
|
var prodGroupArr = [];
|
|
|
|
if(docTransferObjId != ""){
|
|
$.ajax({
|
|
url:"/dashboard/getDocTransferResultPieChart.do",
|
|
type:"POST",
|
|
data:{"objId":docTransferObjId},
|
|
dataType:"json",
|
|
async:false,
|
|
success:function(data){
|
|
|
|
var resultData = null;
|
|
|
|
if(fnc_checkNullDefaultValue(data.TOTAL_CNT,0) > 0){
|
|
|
|
resultData = data;
|
|
|
|
prodGroupArr = fn_getDocTransferResultPieChartDrillDown(docTransferObjId);
|
|
|
|
fn_drawDocTransferResultPieChart("chart1",resultData,prodGroupArr);
|
|
|
|
}else{
|
|
var noData = "<div id=\"chart3MessageArea\" style=\"width:100%;height:50%;padding-top:10%;text-align:center;\">조회된 정보가 없습니다.</div>";
|
|
$("#chart1").append(noData);
|
|
$("#chart2").append(noData);
|
|
}
|
|
},
|
|
error: function(jqxhr, status, error){
|
|
}
|
|
});
|
|
}else{
|
|
var noData = "<div id=\"chart3MessageArea\" style=\"width:100%;height:50%;padding-top:10%;text-align:center;\">조회된 정보가 없습니다.</div>";
|
|
$("#chart1").append(noData);
|
|
$("#chart2").append(noData);
|
|
}
|
|
}
|
|
|
|
//해당 문서이관에 해당하는 진행현황 PIE Chart Drill down 정보를 가져온다.
|
|
function fn_getDocTransferResultPieChartDrillDown(objId){
|
|
|
|
var prodGroupArr = [];
|
|
|
|
$.ajax({
|
|
url:"/dashboard/getDocTransferResultPieChartDrillDown.do",
|
|
type:"POST",
|
|
data:{"objId":objId},
|
|
dataType:"json",
|
|
async:false,
|
|
success:function(data){
|
|
if(data.length > 0){
|
|
prodGroupArr = data;
|
|
}
|
|
},
|
|
error: function(jqxhr, status, error){
|
|
}
|
|
});
|
|
|
|
return prodGroupArr;
|
|
|
|
}
|
|
|
|
//조회된 정보를 통해 해당 문서이관에 해당하는 제품별 진행현황 PIE Chart를 그려준다.
|
|
function fn_drawDocTransferResultPieChart(areaId,data,prodGroupArr){
|
|
|
|
var okArr = [];
|
|
var ngArr = [];
|
|
var proceedingArr = [];
|
|
|
|
$.each(prodGroupArr,function(i){
|
|
okArr.push(
|
|
[fnc_checkNull(prodGroupArr[i].PRODUCT_NAME),Number(fnc_checkNullDefaultValue(prodGroupArr[i].OK_CNT,0))]
|
|
);
|
|
ngArr.push(
|
|
[fnc_checkNull(prodGroupArr[i].PRODUCT_NAME),Number(fnc_checkNullDefaultValue(prodGroupArr[i].NG_CNT,0))]
|
|
);
|
|
proceedingArr.push(
|
|
[fnc_checkNull(prodGroupArr[i].PRODUCT_NAME),Number(fnc_checkNullDefaultValue(prodGroupArr[i].PROCEEDING_CNT,0))]
|
|
);
|
|
});
|
|
|
|
|
|
|
|
$('#'+areaId).highcharts({
|
|
colors: ['#558ed5', '#7dace8', '#a0c2eb','#e6e9ee','#d3e3f6','#73bbae','#ddd475','#e6c15d','#b9d5ea'],
|
|
chart: {
|
|
plotBackgroundColor: null,
|
|
plotBorderWidth: null,
|
|
plotShadow: false,
|
|
type: 'pie'
|
|
},
|
|
title: {
|
|
text: ''
|
|
},
|
|
tooltip: {
|
|
pointFormat: '{series.name}: <b>{point.y} 건</b>'
|
|
},
|
|
plotOptions: {
|
|
pie: {
|
|
allowPointSelect: true,
|
|
cursor: 'pointer',
|
|
dataLabels: {
|
|
enabled: true,
|
|
format: '<b>{point.name}</b>: {point.y} 건',
|
|
style: {
|
|
color: (Highcharts.theme && Highcharts.theme.contrastTextColor) || 'black'
|
|
}
|
|
}
|
|
}
|
|
},
|
|
series: [
|
|
{
|
|
name:"건수",
|
|
colorByPoint:true,
|
|
data:[
|
|
{
|
|
name: "승인",
|
|
y: Number(fnc_checkNullDefaultValue(data.OK_CNT, 0)),
|
|
drilldown: "ok"
|
|
},
|
|
{
|
|
name: "승인거부",
|
|
y: Number(fnc_checkNullDefaultValue(data.NG_CNT, 0)),
|
|
drilldown:"ng"
|
|
},
|
|
{
|
|
name: "진행중",
|
|
y: Number(fnc_checkNullDefaultValue(data.PROCEEDING_CNT, 0)),
|
|
drilldown:"proceeding"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
drilldown:{
|
|
series:[
|
|
{
|
|
name:"승인",
|
|
id:"ok",
|
|
data:okArr
|
|
},
|
|
{
|
|
name:"승인거부",
|
|
id:"ng",
|
|
data:ngArr
|
|
},
|
|
{
|
|
name:"진행중",
|
|
id:"proceeding",
|
|
data:proceedingArr
|
|
}
|
|
]
|
|
}
|
|
});
|
|
}
|
|
|
|
//부서별 문서이관 승인현황 정보를 가져온다.
|
|
function fn_getDocTransferDeptResultColumnChart(objId){
|
|
$.ajax({
|
|
url:"/dashboard/getDocTransferDeptResultColumnChart.do",
|
|
type:"POST",
|
|
data:{"objId":objId},
|
|
dataType:"json",
|
|
async:false,
|
|
success:function(data){
|
|
if(data != null){
|
|
setChart2("chart2", data);
|
|
}
|
|
},
|
|
error: function(jqxhr, status, error){
|
|
}
|
|
});
|
|
}
|
|
|
|
function setChart2(divId, deptInfo){
|
|
|
|
$('#'+divId).highcharts({
|
|
chart: {
|
|
type: 'column'
|
|
},
|
|
title: {
|
|
text: ''
|
|
},
|
|
xAxis: {
|
|
categories: ['생산','생산관리','보전','부품구매','양산품질']
|
|
},
|
|
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: [
|
|
Number(fnc_checkNullDefaultValue(deptInfo.PRODUCTION_TOTAL_TARGET_CNT,0)),
|
|
Number(fnc_checkNullDefaultValue(deptInfo.PRODUCT_MNG_TOTAL_TARGET_CNT,0)),
|
|
Number(fnc_checkNullDefaultValue(deptInfo.INTEGRITY_TOTAL_TARGET_CNT,0)),
|
|
Number(fnc_checkNullDefaultValue(deptInfo.COMPONENT_BUY_TOTAL_TARGET_CNT,0)),
|
|
Number(fnc_checkNullDefaultValue(deptInfo.PROD_QUALITY_TOTAL_TARGET_CNT,0))
|
|
],
|
|
tooltip: {
|
|
valuePrefix: '',
|
|
valueSuffix: '건'
|
|
},
|
|
pointPadding: 0.3,
|
|
pointPlacement: -0.2
|
|
}, {
|
|
name: '승인',
|
|
color: '#e8ce62',
|
|
data: [
|
|
Number(fnc_checkNullDefaultValue(deptInfo.PRODUCTION_OK_CNT,0)),
|
|
Number(fnc_checkNullDefaultValue(deptInfo.PRODUCT_MNG_OK_CNT,0)),
|
|
Number(fnc_checkNullDefaultValue(deptInfo.INTEGRITY_OK_CNT,0)),
|
|
Number(fnc_checkNullDefaultValue(deptInfo.COMPONENT_BUY_OK_CNT,0)),
|
|
Number(fnc_checkNullDefaultValue(deptInfo.PROD_QUALITY_OK_CNT,0))
|
|
],
|
|
tooltip: {
|
|
valuePrefix: '',
|
|
valueSuffix: '건'
|
|
},
|
|
pointPadding: 0.4,
|
|
pointPlacement: -0.2
|
|
}]
|
|
});
|
|
}
|
|
|
|
function fn_getDocTransferHandOverResultColumnChart(objId){
|
|
|
|
$.ajax({
|
|
url:"/dashboard/getDocTransferHandOverResultColumnChart.do",
|
|
type:"POST",
|
|
data:{"objId":objId},
|
|
dataType:"json",
|
|
async:false,
|
|
success:function(data){
|
|
if(data.length > 0){
|
|
setChart3("chart3", data);
|
|
}
|
|
},
|
|
error: function(jqxhr, status, error){
|
|
}
|
|
});
|
|
}
|
|
|
|
function setChart3(divId,deptInfo){
|
|
|
|
var deptArr = [];
|
|
var confirmArr = [];
|
|
var noConfirmArr = [];
|
|
|
|
$.each(deptInfo, function(i){
|
|
var deptName = fnc_checkNull(deptInfo[i].HAND_OVER_DEPT_NAME);
|
|
var confirmCnt = fnc_checkNullDefaultValue(deptInfo[i].HAND_OVER_TOTAL_CONFIRM_CNT,0);
|
|
var noConfirmCnt = fnc_checkNullDefaultValue(deptInfo[i].HAND_OVER_TOTAL_NO_CONFIRM_CNT,0);
|
|
deptArr[i] = deptName;
|
|
confirmArr[i] = Number(confirmCnt);
|
|
noConfirmArr[i] = Number(noConfirmCnt);
|
|
});
|
|
|
|
$('#'+divId).highcharts({
|
|
chart: {
|
|
type: 'bar'
|
|
},
|
|
title: {
|
|
text: ''
|
|
},
|
|
xAxis: {
|
|
categories: deptArr
|
|
},
|
|
yAxis: {
|
|
min: 0,
|
|
title: {
|
|
text: ''
|
|
},
|
|
tickInterval: 1
|
|
},
|
|
legend: {
|
|
reversed: true
|
|
},
|
|
plotOptions: {
|
|
series: {
|
|
stacking: 'normal'
|
|
}
|
|
},
|
|
series: [{
|
|
name: '확정',
|
|
data: confirmArr
|
|
}, {
|
|
name: '미확정',
|
|
data: noConfirmArr
|
|
}]
|
|
});
|
|
}
|
|
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<form name="form1" id="form1" action="" method="post">
|
|
<div style="min-width:1500px;">
|
|
<div class="plm_menu_name">
|
|
<h2>
|
|
<span>문서이관</span>
|
|
</h2>
|
|
</div>
|
|
<div id="plmSearchZon">
|
|
<table class="short_search">
|
|
<tr>
|
|
<td><label for="">고객사</label></td>
|
|
<td>
|
|
<select name="search_oemObjId" id="search_oemObjId">
|
|
<option value="">선택</option>
|
|
</select>
|
|
</td>
|
|
<td><label for="">차종</label></td>
|
|
<td>
|
|
<select name="search_carObjId" id="search_carObjId">
|
|
<option value="">선택</option>
|
|
</select>
|
|
</td>
|
|
<td><label for="">이관상태</label></td>
|
|
<td>
|
|
<select name="search_takeOverStatus" id="search_takeOverStatus">
|
|
<option value="">선택</option>
|
|
<option value="complete" ${param.search_takeOverStatus eq 'complete'?'selected':''}>이관완료</option>
|
|
<option value="create" ${param.search_takeOverStatus eq 'create'?'selected':''}>진행중</option>
|
|
</select>
|
|
</td>
|
|
<td><label for="">이관기간</label></td>
|
|
<td colspan="">
|
|
<input type="text" id="search_takeOverfromDate" name="search_takeOverfromDate" class="from_to_date" value="${param.search_takeOverFromDate}" readonly>
|
|
~ <input type="text" id="search_takeOverToDate" name="search_takeOverToDate" class="from_to_date" value="${param.search_takeOverToDate}" readonly>
|
|
<input type="button" class="date_delete" value="x">
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="btn_wrap" style="float:right; width:38.3%; height:40px; box-shadow: 5px 7px 10px 0px #ccc;">
|
|
<div class="plm_btn_wrap" style="margin-right:22px;">
|
|
<input type="button" value="조회" class="btnSearch plm_btns">
|
|
<input type="button" value="등록" class="plm_btns docTransferRegBtn">
|
|
<input type="button" value="문서 기준정보 지정" id="btnSetBaseInfo" class="plm_btns">
|
|
<input type="button" value="Task Link" class="plm_btns">
|
|
</div>
|
|
</div>
|
|
<div class="contents_page_basic_margin">
|
|
<div class="fourblock" style="width:60%; margin: 45px 0 15px 0; float:left; border:0; height:300px; border-radius: 10px 0 10px 10px; padding: 38px 20px 0 13px; box-shadow: 5px 7px 10px 0px #ccc;">
|
|
<div class="title_div" style="margin-top:-20px;line-height: 13px;">문서이관 관리리스트</div>
|
|
<div class="plm_table_wrap">
|
|
<div style="overflow-y:scroll;">
|
|
<table class="plm_table" style="width:100%;">
|
|
<colgroup>
|
|
<col width="5%" />
|
|
<col width="5%" />
|
|
<col width="*" />
|
|
<col width="*" />
|
|
<col width="10%" />
|
|
<col width="10%" />
|
|
<col width="10%" />
|
|
<col width="10%" />
|
|
<col width="10%" />
|
|
</colgroup>
|
|
<thead style="border-bottom: 2px solid #6c93a7;">
|
|
<tr class="plm_thead" style="background-image: linear-gradient(#86b3cb, #75a0b6);">
|
|
<td></td>
|
|
<td>No</td>
|
|
<td>고객사</td>
|
|
<td>차종</td>
|
|
<td>이관 품목</td>
|
|
<td>이관율(%)</td>
|
|
<td>이관상태</td>
|
|
<td>양산일자</td>
|
|
<td>이관완료일자</td>
|
|
</tr>
|
|
</thead>
|
|
</table>
|
|
</div>
|
|
<div class="plm_scroll_table" style="width:100%; height:250px;">
|
|
<table class="plm_table">
|
|
<colgroup>
|
|
<col width="5%" />
|
|
<col width="5%" />
|
|
<col width="*" />
|
|
<col width="*" />
|
|
<col width="10%" />
|
|
<col width="10%" />
|
|
<col width="10%" />
|
|
<col width="10%" />
|
|
<col width="10%" />
|
|
</colgroup>
|
|
<tbody id="mainList">
|
|
<c:choose>
|
|
<c:when test="${!empty LIST}">
|
|
<c:forEach var="info" items="${LIST}" varStatus="status">
|
|
<tr>
|
|
<td><input type="radio" name="btnRadio" class="btnRadio" value="${info.OBJID}" data-WRITER="${info.WRITER}"></td>
|
|
<td>${info.RNUM}</td>
|
|
<td>${info.OEM_NAME}</td>
|
|
<td>${info.CAR_CODE}</td>
|
|
<td><a href="#" class="btnDocTransferBaseInfo" data-OBJID="${info.OBJID}">${info.PROD_CNT}</a></td>
|
|
<td>${info.COMPLETE_RATIO}%</td>
|
|
<td><a href="#" class="btnDocTransferDetailPopup" data-OBJID="${info.OBJID}">${info.TRANSFER_STATUS eq 'OK'?'이관완료':'진행중'}</a></td>
|
|
<td>${info.SOP}</td>
|
|
<td>${info.TRANSFER_STATUS eq 'OK'?info.TRANSFER_DATE:''}</td>
|
|
</tr>
|
|
</c:forEach>
|
|
</c:when>
|
|
<c:otherwise>
|
|
<tr>
|
|
<td align="center" colspan="9">조회된 정보가 없습니다.</td>
|
|
</tr>
|
|
</c:otherwise>
|
|
</c:choose>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="fourblock" style="width:35%; margin-bottom:15px; margin:42px 0 0 0; float:right; height:300px;">
|
|
<div class="title_div" style="margin-top:-20px;line-height: 13px;">양산문서 이관현황</div>
|
|
<div id="chart1" style="width:80%; height:230px; margin: 30px auto 0;"></div>
|
|
</div>
|
|
<div class="fourblock" style="width:60%; float:left; height:300px; margin-left:14px;">
|
|
<div class="title_div" style="margin-top:-20px;line-height: 13px;">인계 진행현황</div>
|
|
<div id="chart3" style="width:80%; height:230px; margin: 30px auto 0;"></div>
|
|
</div>
|
|
<div class="fourblock" style="width:35%; margin-right: 0; float:right; height:300px;">
|
|
<div class="title_div" style="margin-top:-20px;line-height: 13px;">인수부서 승인현황</div>
|
|
<div id="chart2" style="width:80%; height:300px; margin: 30px auto 0;"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</body>
|
|
</html> |