생산관리 생산계획 완성, 실적관리는 틀만..
This commit is contained in:
@@ -0,0 +1,302 @@
|
||||
<%@ 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"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ page import="java.util.*" %>
|
||||
<%@include file= "/init_new.jsp" %>
|
||||
<c:set var="now" value="<%=new java.util.Date()%>" />
|
||||
<c:set var="today"><fmt:formatDate value="${now}" pattern="yyyy-MM-dd" /></c:set>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title><%=Constants.SYSTEM_NAME%></title>
|
||||
<style>
|
||||
.input_title {border-left:1px solid #ccc; background-color:#f5f5f5; font-weight:bold;}
|
||||
.pmsPopupForm tr:last-child td{border-bottom:1px solid #ccc;}
|
||||
.pmsPopupForm td { padding: 5px 8px; }
|
||||
.required-mark { color: red; font-weight: bold; margin-left: 2px; }
|
||||
.readonly-field { background-color: #eee !important; }
|
||||
/* 공통 버튼 숨기기 */
|
||||
.resetBtn, .excelBtn { display: none !important; }
|
||||
body { min-height: auto !important; }
|
||||
</style>
|
||||
</head>
|
||||
<script type="text/javascript" src="/js/tabulator/tabulator_custom.js"></script>
|
||||
<script>
|
||||
var grid;
|
||||
var _projectObjid = "${param.projectObjid}";
|
||||
var _resultType = "${param.resultType}";
|
||||
|
||||
// 실적유형 목록
|
||||
var _RESULT_TYPE_LIST = [
|
||||
{"CODE": "ASSEMBLY", "NAME": "완조립"},
|
||||
{"CODE": "INSPECTION", "NAME": "검사"},
|
||||
{"CODE": "SHIP_WAIT", "NAME": "출하대기"}
|
||||
];
|
||||
|
||||
$(function(){
|
||||
fnc_datepick();
|
||||
$(".select2").select2();
|
||||
|
||||
// 프로젝트 정보 로드
|
||||
if(_projectObjid) {
|
||||
fn_loadProjectInfo();
|
||||
}
|
||||
|
||||
// 그리드 초기화
|
||||
fn_initGrid();
|
||||
|
||||
// 실적 목록 조회
|
||||
fn_search();
|
||||
|
||||
// 행추가 버튼
|
||||
$("#btnAddRow").click(function(){
|
||||
fn_addRow();
|
||||
});
|
||||
|
||||
// 행삭제 버튼
|
||||
$("#btnDelRow").click(function(){
|
||||
fn_delRow();
|
||||
});
|
||||
|
||||
// 저장 버튼
|
||||
$("#btnSave").click(function(){
|
||||
fn_save();
|
||||
});
|
||||
});
|
||||
|
||||
// 날짜 선택기 초기화
|
||||
function fnc_datepick(){
|
||||
var $dateinput = $("input.date_icon");
|
||||
for(var i=0; i<$dateinput.length; i++){
|
||||
$dateinput.eq(i).attr("size","10");
|
||||
$dateinput.eq(i).datepicker({
|
||||
changeMonth:true,
|
||||
changeYear:true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 프로젝트 정보 로드
|
||||
function fn_loadProjectInfo() {
|
||||
$.ajax({
|
||||
url: "/productionplanning/getProdPlanProjectInfo.do",
|
||||
type: "POST",
|
||||
data: { "projectObjid": _projectObjid },
|
||||
dataType: "json",
|
||||
async: false,
|
||||
success: function(data){
|
||||
if(data && data.result == "success" && data.info){
|
||||
var info = data.info;
|
||||
$("#PROJECT_NO").text(fnc_checkNull(info.project_no));
|
||||
$("#PART_NO").text(fnc_checkNull(info.part_no));
|
||||
$("#PART_NAME").text(fnc_checkNull(info.part_name));
|
||||
$("#ORDER_QTY").text(fnc_checkNull(info.order_qty));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 그리드 컬럼 정의
|
||||
var columns = [
|
||||
{formatter:"rowSelection", titleFormatter:"rowSelection", headerHozAlign:'center', hozAlign:"center", headerSort:false, width:30},
|
||||
{title:'OBJID', field:'OBJID', visible: false},
|
||||
{title:'실적유형', field:'RESULT_TYPE', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: "list",
|
||||
editorParams: {
|
||||
values: {"ASSEMBLY":"완조립", "INSPECTION":"검사", "SHIP_WAIT":"출하대기"}
|
||||
},
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
if(val == 'ASSEMBLY') return '완조립';
|
||||
if(val == 'INSPECTION') return '검사';
|
||||
if(val == 'SHIP_WAIT') return '출하대기';
|
||||
return val;
|
||||
}
|
||||
},
|
||||
{title:'실적일자', field:'RESULT_DATE', headerHozAlign:'center', hozAlign:'center', width:110,
|
||||
editor: "input"
|
||||
},
|
||||
{title:'실적수량', field:'RESULT_QTY', headerHozAlign:'center', hozAlign:'right', width:90,
|
||||
editor: "number",
|
||||
formatter: "money", formatterParams: {thousand:",", precision:false}
|
||||
},
|
||||
{title:'S/N', field:'SERIAL_NO', headerHozAlign:'center', hozAlign:'left', width:120,
|
||||
editor: "input"
|
||||
},
|
||||
{title:'작업자', field:'WORKER_NAME', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: "input"
|
||||
},
|
||||
{title:'비고', field:'REMARK', headerHozAlign:'center', hozAlign:'left', minWidth:150,
|
||||
editor: "input"
|
||||
}
|
||||
];
|
||||
|
||||
// 그리드 초기화
|
||||
function fn_initGrid() {
|
||||
grid = new Tabulator("#grid", {
|
||||
layout: "fitColumns",
|
||||
height: "calc(100vh - 200px)",
|
||||
columns: columns,
|
||||
data: [],
|
||||
selectableRows: true,
|
||||
placeholder: "데이터가 없습니다."
|
||||
});
|
||||
}
|
||||
|
||||
// 실적 목록 조회
|
||||
function fn_search() {
|
||||
var params = {
|
||||
projectObjid: _projectObjid,
|
||||
resultType: _resultType
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
url: "/productionplanning/getProdResultList.do",
|
||||
type: "POST",
|
||||
data: params,
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
if(data && data.list) {
|
||||
grid.setData(data.list);
|
||||
}
|
||||
},
|
||||
error: function(jqxhr, status, error){
|
||||
console.error("실적 조회 실패:", error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 행 추가
|
||||
function fn_addRow() {
|
||||
var newRow = {
|
||||
OBJID: '',
|
||||
RESULT_TYPE: _resultType || 'ASSEMBLY',
|
||||
RESULT_DATE: '${today}',
|
||||
RESULT_QTY: '',
|
||||
SERIAL_NO: '',
|
||||
WORKER_NAME: '${connectUserName}',
|
||||
REMARK: ''
|
||||
};
|
||||
grid.addRow(newRow);
|
||||
}
|
||||
|
||||
// 행 삭제
|
||||
function fn_delRow() {
|
||||
var selectedRows = grid.getSelectedRows();
|
||||
if(selectedRows.length === 0) {
|
||||
Swal.fire('삭제할 행을 선택해주세요.');
|
||||
return;
|
||||
}
|
||||
|
||||
selectedRows.forEach(function(row) {
|
||||
row.delete();
|
||||
});
|
||||
}
|
||||
|
||||
// 저장
|
||||
function fn_save() {
|
||||
var allData = grid.getData();
|
||||
|
||||
if(allData.length === 0) {
|
||||
Swal.fire('저장할 데이터가 없습니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
// 유효성 검사
|
||||
for(var i = 0; i < allData.length; i++) {
|
||||
var row = allData[i];
|
||||
if(!row.RESULT_TYPE) {
|
||||
Swal.fire('실적유형을 선택해주세요. (행 ' + (i+1) + ')');
|
||||
return;
|
||||
}
|
||||
if(!row.RESULT_DATE) {
|
||||
Swal.fire('실적일자를 입력해주세요. (행 ' + (i+1) + ')');
|
||||
return;
|
||||
}
|
||||
if(!row.RESULT_QTY || row.RESULT_QTY <= 0) {
|
||||
Swal.fire('실적수량을 입력해주세요. (행 ' + (i+1) + ')');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(!confirm('저장하시겠습니까?')) return;
|
||||
|
||||
$.ajax({
|
||||
url: "/productionplanning/saveProdResultList.do",
|
||||
type: "POST",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({
|
||||
projectObjid: _projectObjid,
|
||||
resultList: allData
|
||||
}),
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
if(data.result == "success") {
|
||||
alert(data.msg || "저장되었습니다.");
|
||||
if(opener && opener.fn_search) {
|
||||
opener.fn_search();
|
||||
}
|
||||
fn_search(); // 새로고침
|
||||
} else {
|
||||
Swal.fire(data.msg || "저장에 실패했습니다.");
|
||||
}
|
||||
},
|
||||
error: function(jqxhr, status, error){
|
||||
Swal.fire("저장 중 오류가 발생했습니다.");
|
||||
console.error(error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 팝업 닫힐 때 부모 새로고침
|
||||
window.addEventListener('unload', function() {
|
||||
if(window.opener && window.opener.fn_search) {
|
||||
window.opener.fn_search();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<body style="overflow-x: hidden;">
|
||||
<form name="form1" id="form1" method="post">
|
||||
<input type="hidden" name="PROJECT_OBJID" id="PROJECT_OBJID" value="${param.projectObjid}">
|
||||
<input type="hidden" name="RESULT_TYPE" id="RESULT_TYPE_HIDDEN" value="${param.resultType}">
|
||||
|
||||
<section>
|
||||
<div class="plm_menu_name" style="display:flex;">
|
||||
<h2 style="width:100%;height:50px;text-align:center;margin-top:10px;">
|
||||
<span style="font-size:20px;">생산실적 등록/수정</span>
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<!-- 프로젝트 정보 표시 -->
|
||||
<div style="padding:10px; background:#f5f5f5; border-bottom:1px solid #ddd;">
|
||||
<table style="width:100%;">
|
||||
<tr>
|
||||
<td style="width:70px; font-weight:bold;">프로젝트:</td>
|
||||
<td style="width:150px;"><span id="PROJECT_NO">-</span></td>
|
||||
<td style="width:50px; font-weight:bold;">품번:</td>
|
||||
<td style="width:150px;"><span id="PART_NO">-</span></td>
|
||||
<td style="width:50px; font-weight:bold;">품명:</td>
|
||||
<td><span id="PART_NAME">-</span></td>
|
||||
<td style="width:70px; font-weight:bold;">수주수량:</td>
|
||||
<td style="width:70px;"><span id="ORDER_QTY">-</span></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="plm_menu_name_gdnsi">
|
||||
<h2><span>실적 목록</span></h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" value="행추가" class="plm_btns" id="btnAddRow">
|
||||
<input type="button" value="행삭제" class="plm_btns" id="btnDelRow">
|
||||
<input type="button" value="저장" class="plm_btns" id="btnSave">
|
||||
<input type="button" value="닫기" class="plm_btns" onclick="window.close();">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="grid" style="margin: 10px;"></div>
|
||||
</section>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user