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

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>