Merge pull request '프로젝트관리 초기커밋' (#4) from V2025101701 into main

Reviewed-on: #4
This commit was merged in pull request #4.
This commit is contained in:
2025-10-21 07:39:43 +00:00
7 changed files with 354 additions and 23 deletions

View File

@@ -3909,6 +3909,18 @@
,CODE_NAME(CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,(SELECT CODE_NAME(O.PAID_TYPE) FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS FREE_OF_CHARGE
,(SELECT O.QUANTITY FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS CONTRACT_QTY
,(SELECT O.PART_NO FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PRODUCT_ITEM_CODE
,(SELECT O.PART_NAME FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PRODUCT_ITEM_NAME
,(SELECT O.SERIAL_NO FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS SERIAL_NO
영업관리_주문서관리_수주등록 ,EBOM_STATUS
,MBOM_STATUS
,(SELECT O.PURCHASE_DATE FROM PURCHASE_ORDER_MASTER AS O WHERE O.CONTRACT_MGMT_OBJID = T.CONTRACT_OBJID LIMIT 1) AS ORDER_DATE
,RECEIVING_RATE
,PRODUCTION_TEAM_12
,PRODUCTION_TEAM_3
,(SELECT O.SHIPPING_DATE::TEXT FROM SHIPMENT_LOG AS O WHERE O.TARGET_OBJID = T.CONTRACT_OBJID LIMIT 1) AS SHIPMENT_DATE
,(((SELECT SUM(COALESCE(DESIGN_RATE,'0')::INTEGER) / COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID)
+(SELECT SUM(COALESCE(PURCHASE_RATE,'0')::INTEGER) / COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID)
+(SELECT SUM(COALESCE(PRODUCE_RATE,'0')::INTEGER) / COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID)

View File

@@ -0,0 +1,257 @@
<%@ 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"%>
<%
PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN);
String connector = person.getUserId();
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=Constants.SYSTEM_NAME%></title>
<!-- //JSTL 페이징 변수선언 -->
<c:set var="totalCount" value="${empty TOTAL_COUNT?0:TOTAL_COUNT}" />
<c:set var="maxPage" value="${empty MAX_PAGE_SIZE?1:MAX_PAGE_SIZE}" />
<c:set var="nPage" value="${empty param.page?1:param.page}" />
<c:set var="pageIndex" value="${(nPage-1)/10}" />
<c:set var="nextPage" value="${empty NEXT_PAGE?1:NEXT_PAGE}" />
<c:set var="prevPage" value="${empty PREV_PAGE?1:PREV_PAGE}" />
<c:set var="now" value="<%=new java.util.Date() %>" />
<c:set var="sysYear"><fmt:formatDate value="${now}" pattern="yyyy" /></c:set>
<c:set var="connector" value="<%=connector %>" />
<style>
.select2-selection__choice {
font-size: 11px;
background-color: #fff !important;
border: none !important;
margin-right: 0px !important;
}
.select2-selection__choice__remove {
display: contents !important;
}
.select2-container .select2-selection--multiple {
min-height: 20px !important;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
margin-top: 3.5px !important;
}
.select2-selection__rendered {
height: 18px !important;
}
.select2-container .select2-selection--multiple .select2-selection__rendered {
overflow: auto !important;
}
</style>
<script type="text/javascript">
$(document).ready(function(){
$('.select2').select2();
//$('#Year' ).select2();
$("#btnSearch").click(function(){
$("#page").val("1");
fn_search();
});
$("#btnApply").click(function(){
//fn_apply("","regist");
});
fn_search();
});
var columns = [
{title:'CATEGORY_CD' ,field:'CATEGORY_CD' ,visible:false},
{headerHozAlign : 'center', hozAlign : 'left', width : '100', title : '프로젝트번호', field : 'PROJECT_NO' ,frozen:true,
formatter:fnc_createGridAnchorTag,
cellClick:function(e, cell){
var objid = fnc_checkNull(cell.getData().OBJID);
openProjectFormPopUp(objid);
}
},
{title:"프로젝트정보", headerHozAlign:'center', //고객정보
columns:[
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '주문유형', field : 'CATEGORY_NAME' },
{headerHozAlign : 'center', hozAlign : 'left', width : '90', title : '제품구분', field : 'PRODUCT_NAME' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '국내/해외', field : 'AREA_NAME' },
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '접수일', field : 'REG_DATE' },
{headerHozAlign : 'center', hozAlign : 'left', width : '120', title : '고객사', field : 'CUSTOMER_NAME' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '유/무상', field : 'FREE_OF_CHARGE'},
{headerHozAlign : 'center', hozAlign : 'left', width : '150', title : '품번', field : 'PRODUCT_ITEM_CODE' },
{headerHozAlign : 'center', hozAlign : 'left', width : '150', title : '품명', field : 'PRODUCT_ITEM_NAME' },
{headerHozAlign : 'center', hozAlign : 'left', width : '150', title : 'S/N', field : 'SERIAL_NO' },
{headerHozAlign : 'center', hozAlign : 'right', width : '90', title : '수주수량', field : 'CONTRACT_QTY' },
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '요청납기', field : 'REQ_DEL_DATE' }
],
},
{
title:'설계', headerHozAlign:'center',
columns:[
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : 'E-BOM', field : 'EBOM_STATUS'}
]
},
{
title:'생산관리', headerHozAlign:'center',
columns:[
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : 'M-BOM', field : 'MBOM_STATUS'}
]
},
{
title:'구매', headerHozAlign:'center',
columns:[
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '발주일', field : 'ORDER_DATE'},
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '입고율', field : 'RECEIVING_RATE'}
]
},
{
title:'생산', headerHozAlign:'center',
columns:[
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '제조1,2팀', field : 'PRODUCTION_TEAM_12'},
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '제조3팀', field : 'PRODUCTION_TEAM_3'}
]
},
{
title:'출하', headerHozAlign:'center',
columns:[
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '출하일', field : 'SHIPMENT_DATE'}
]
}
];
//var grid;
function fn_search(){
var selectedValues = $("#project_no").val();
$('<input>').attr({
type: 'hidden',
name: 'project_nos',
value: selectedValues
}).appendTo('#form1');
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/project/projectMgmtWbsGridList.do", columns, false);
}
//프로젝트의 form,detail 팝업을 보여준다.
function openProjectFormPopUp(objId){
var popup_width = 420;
var popup_height = 350;
var objId = objId;
var params = "?OBJID="+objId+"&ACTION_TYPE=edit";
var url = "/project/projectmodifyPopUp.do"+params;
fn_centerPopup(popup_width, popup_height, url);
}
</script>
</head>
<body class="<%--bodyNoScrollX--%>">
<form name="form1" id="form1" action="" method="post">
<div class="content-box">
<div class="content-box-s">
<div class="plm_menu_name_gdnsi" style="position:;">
<h2 style="">
<span>프로젝트관리_일정관리(WBS)3</span>
</h2>
<div class="btnArea">
<input type="button" value="조회" class="plm_btns" id="btnSearch" name="btnSearch">
</div>
</div>
<div id="plmSearchZon">
<table>
<tr>
<td><label for="Year">년도</label></td>
<td>
<select name="Year" id="Year" class="select2" autocomplete="off">
<option value="">선택</option>
<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>
<td><label for="project_no">프로젝트번호</label></td>
<td>
<select name="project_no" id="project_no" style="width:300px;" class="select2" autocomplete="off" multiple="multiple">
<option value="">선택</option>
${code_map.project_no}
</select>
</td>
<td><label for="category_cd">계약구분</label></td>
<td>
<select name="category_cd" id="category_cd" style="" class="select2" autocomplete="off">
<option value="">선택</option>
${code_map.category_cd}
</select>
</td>
<td><label for="customer_objid">고객사</label></td>
<td>
<select name="customer_objid" id="customer_objid" style="" class="select2" autocomplete="off">
<option value="">선택</option>
${code_map.customer_cd}
</select>
</td>
<td><label for="product">제품구분</label></td>
<td>
<select name="product" id="product" style="" class="select2" autocomplete="off">
<option value="">선택</option>
${code_map.product_cd}
</select>
</td>
<td class="align_r">
<label>예상납기일</label>
</td>
<td>
<input type="text" name="contract_start_date" id="contract_start_date" style="width:90px;" autocomplete="off" value="${param.contract_start_date}" class="date_icon">~
<input type="text" name="contract_end_date" id="contract_end_date" style="width:90px;" autocomplete="off" value="${param.contract_end_date}" class="date_icon">
</td>
</tr>
<tr>
<td class="align_r">
<label>입고지</label>
</td>
<td>
<input type="text" name="location" id="location" style="width:150px;" autocomplete="off" value="${param.location}">
</td>
<td class="align_r">
<label>셋업지</label>
</td>
<td>
<input type="text" name="setup" id="setup" style="width:150px;" autocomplete="off" value="${param.setup}">
</td>
<td><label for="pm_user_id">PM</label></td>
<td>
<select name="pm_user_id" id="pm_user_id" style="" class="select2" autocomplete="off">
<option value="">선택</option>
${code_map.pm_user_id}
</select>
</td>
</tr>
</table>
</div>
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
</div>
</div>
</form>
</body>
</html>

View File

@@ -47,7 +47,16 @@
<script type="text/javascript">
var columns = [
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '프로젝트번호', field : 'PROJECT_NO'},
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '영업번호', field : 'PROJECT_NO', frozen : true,
formatter: fnc_createGridAnchorTag,
cellClick: function(e, cell){
var rowData = cell.getData();
var popup_width = 600;
var popup_height = 400;
var url = "/salesMgmt/salesRegForm.do?orderNo=" + rowData.PROJECT_NO + "&saleNo=" + (rowData.SALE_NO || '');
fn_centerPopup(popup_width, popup_height, url);
}
},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '주문유형', field : 'ORDER_TYPE'},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '제품구분', field : 'PRODUCT_TYPE'},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '국내/해외', field : 'NATION'},

View File

@@ -46,8 +46,10 @@
});
function fn_openSaleRegPopup(orderNo, saleNo){
var popup_width = 600;
var popup_height = 400;
var url = "/salesMgmt/salesRegForm.do?orderNo=" + orderNo + "&saleNo=" + saleNo;
window.open(url, "", "width=600, height=400, menubars=no, scrollbars=yes, resizable=yes");
fn_centerPopup(popup_width, popup_height, url);
}
function fn_FileRegist(objId, docType, docTypeName){
@@ -64,7 +66,13 @@
<script type="text/javascript">
// 새로운 테이블 구조에 맞게 컬럼 정의 수정
var columns = [
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '프로젝트번호', field : 'PROJECT_NO'},
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '영업번호', field : 'PROJECT_NO', frozen : true,
formatter: fnc_createGridAnchorTag,
cellClick: function(e, cell){
var rowData = cell.getData();
fn_openSaleRegPopup(rowData.PROJECT_NO, rowData.SALE_NO);
}
},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '주문유형', field : 'ORDER_TYPE'},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '제품구분', field : 'PRODUCT_TYPE'},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '국내/해외', field : 'NATION'},

View File

@@ -9,7 +9,7 @@
--success-color: #34a853;
--danger-color: #ea4335;
--warning-color: #fbbc04;
--background: #f5f5f5;
--background: #ffffff;
--surface: #ffffff;
--border-color: #dadce0;
--text-primary: #202124;
@@ -936,25 +936,6 @@ div.plm_menu_name h2 span,
outline-offset: 2px;
}
/* 다크모드 지원 (선택사항) */
@media (prefers-color-scheme: dark) {
:root {
--background: #0f172a;
--surface: #1e293b;
--border-color: #334155;
--text-primary: #f1f5f9;
--text-secondary: #94a3b8;
}
.input_title {
background: #1e293b;
}
.btn_wrap {
background: #1e293b;
}
}
/* 드래그앤드롭 영역 스타일 */
.dropzone {
background: #f8fafc;

View File

@@ -3220,4 +3220,56 @@ public class ProjectController {
return "/project/wbsTaskProductSetupFormPopUp";
}
/**
* 프로젝트 진행 현황
* @param request
* @param paramMap
* @return
*/
@RequestMapping("/project/projectMgmtWbsList3.do")
public String projectMgmtWbsList3(HttpServletRequest request, @RequestParam Map paramMap){
//List list = service.getProjectMgntList(request,paramMap);
Map code_map = new HashMap();
try{
//String bizMakeOptionList(String code_id, String selValue, String sql_id)
//구분
code_map.put("category_cd" , commonService.bizMakeOptionList("0000167", CommonUtils.nullToEmpty((String)paramMap.get("category_cd")) , "common.getCodeselect"));
//고객사
code_map.put("customer_cd",commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)paramMap.get("customer_objid")),"common.getsupplyselect"));
//당사프로젟트번호
code_map.put("project_no",commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)paramMap.get("project_no")),"common.getCusProjectNoList"));
//제품구분
code_map.put("product_cd", commonService.bizMakeOptionList("0000001", CommonUtils.nullToEmpty((String)paramMap.get("product")),"common.getCodeselect")); //공장
//진행상황
code_map.put("status_cd" , commonService.bizMakeOptionList("0000932", CommonUtils.nullToEmpty((String)paramMap.get("status_cd")) , "common.getCodeselect"));
//결과
code_map.put("result_cd", commonService.bizMakeOptionList("0000963", CommonUtils.nullToEmpty((String)paramMap.get("result_cd")), "common.getCodeselect"));
//PM
code_map.put("pm_user_id", commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)paramMap.get("pm_user_id")), "common.getUserselect")); //구매 PM
request.setAttribute("code_map",code_map);
request.setAttribute("cu01_file", Constants.CUSTOMER_CODE01);
request.setAttribute("cu02_file", Constants.CUSTOMER_CODE02);
//request.setAttribute("LIST", list);
PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN);
String writer = CommonUtils.checkNull(person.getUserId());
request.setAttribute("writer", writer);
}catch(Exception e){
e.printStackTrace();
}
return "/project/projectMgmtWbsList3";
}
}

View File

@@ -3909,6 +3909,18 @@
,CODE_NAME(CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,(SELECT CODE_NAME(O.PAID_TYPE) FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS FREE_OF_CHARGE
,(SELECT O.QUANTITY FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS CONTRACT_QTY
,(SELECT O.PART_NO FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PRODUCT_ITEM_CODE
,(SELECT O.PART_NAME FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PRODUCT_ITEM_NAME
,(SELECT O.SERIAL_NO FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS SERIAL_NO
영업관리_주문서관리_수주등록 ,EBOM_STATUS
,MBOM_STATUS
,(SELECT O.PURCHASE_DATE FROM PURCHASE_ORDER_MASTER AS O WHERE O.CONTRACT_MGMT_OBJID = T.CONTRACT_OBJID LIMIT 1) AS ORDER_DATE
,RECEIVING_RATE
,PRODUCTION_TEAM_12
,PRODUCTION_TEAM_3
,(SELECT O.SHIPPING_DATE::TEXT FROM SHIPMENT_LOG AS O WHERE O.TARGET_OBJID = T.CONTRACT_OBJID LIMIT 1) AS SHIPMENT_DATE
,(((SELECT SUM(COALESCE(DESIGN_RATE,'0')::INTEGER) / COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID)
+(SELECT SUM(COALESCE(PURCHASE_RATE,'0')::INTEGER) / COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID)
+(SELECT SUM(COALESCE(PRODUCE_RATE,'0')::INTEGER) / COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID)