V20260210 #143

Merged
hjjeong merged 4 commits from V20260210 into main 2026-02-21 13:36:23 +00:00
5 changed files with 114 additions and 65 deletions

View File

@@ -103,6 +103,7 @@ $(document).ready(function(){
// 컬럼 정의 (입고품목 상세 기준) - 신규
// =====================================================
var columns = [
{formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:40, frozen:true},
{headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'검사일', field:'INSPECTION_DATE', frozen: true, sorter: "string"},
{headerHozAlign:'center', hozAlign:'center', minWidth:70, widthGrow:1, title:'검사자', field:'INSPECTOR_NAME', frozen: true},
{headerHozAlign:'center', hozAlign:'center', minWidth:105, widthGrow:1, title:'품의서 No', field:'PROPOSAL_NO', frozen: true},

View File

@@ -44,6 +44,8 @@ String connector = person.getUserId();
.inspection-ok { color: #28a745; font-weight: bold; }
/* 공통에서 추가되는 초기화, Excel Download 버튼 숨기기 */
.resetBtn, .excelBtn { display: none !important; }
/* select2 드롭다운이 Tabulator 그리드 위에 표시되도록 */
.select2-container--open .select2-dropdown { z-index: 99999 !important; }
</style>
<script type="text/javascript">
@@ -165,6 +167,62 @@ function fn_getPartListByProject(projectNo) {
return partList;
}
// select2 기반 Tabulator 커스텀 에디터 (프로젝트/품번용)
function fn_select2Editor(cell, onRendered, success, cancel, editorParams) {
var cellValue = cell.getValue() || "";
var values = (typeof editorParams.values === "function") ? editorParams.values(cell) : editorParams.values;
var valueId = editorParams.valueId || "CODE";
var labelId = editorParams.labelId || "NAME";
var placeholder = editorParams.placeholder || "검색...";
var container = document.createElement("div");
container.style.width = "100%";
container.style.position = "relative";
var select = document.createElement("select");
select.style.width = "100%";
// 옵션 생성
if(values && values.length > 0) {
values.forEach(function(item) {
var option = document.createElement("option");
option.value = item[valueId];
option.text = item[labelId];
if(item[valueId] == cellValue) option.selected = true;
select.appendChild(option);
});
}
container.appendChild(select);
onRendered(function() {
$(select).select2({
dropdownParent: $("body"),
placeholder: placeholder,
allowClear: true,
width: "100%"
});
$(select).select2("open");
$(select).on("select2:select select2:clear", function(e) {
var selectedVal = $(select).val() || "";
// 콜백 호출 (프로젝트 변경 시 연동 처리 등)
if(typeof editorParams.onSelect === "function") {
editorParams.onSelect(cell, selectedVal);
}
success(selectedVal);
});
$(select).on("select2:close", function() {
setTimeout(function() { success($(select).val() || ""); }, 100);
});
});
return container;
}
// 그리드 초기화 및 조회
function fn_search(){
// 파일 팝업이 열려있는 동안에는 새로고침 방지
@@ -190,59 +248,24 @@ function fn_search(){
editorParams: {valueId:"CODE", labelId:"NAME", values:_PROCESS_LIST}
},
{title:'프로젝트번호', field:'PROJECT_OBJID', headerHozAlign:'center', hozAlign:'center', width:130,
editor: function(cell, onRendered, success, cancel, editorParams) {
var cellValue = cell.getValue();
var select = document.createElement("select");
select.style.width = "100%";
select.style.boxSizing = "border-box";
// 옵션 생성
_PROJECT_LIST.forEach(function(item) {
var option = document.createElement("option");
option.value = item.CODE;
option.text = item.NAME;
if(item.CODE == cellValue) option.selected = true;
select.appendChild(option);
});
// 선택 변경 시 즉시 적용 및 제품구분 업데이트
select.addEventListener("change", function() {
var selectedValue = select.value;
editor: fn_select2Editor,
editorParams: {
valueId: "CODE", labelId: "NAME", values: _PROJECT_LIST,
placeholder: "프로젝트 검색...",
onSelect: function(cell, selectedValue) {
var productName = "";
// 제품구분 찾기
for(var i = 0; i < _PROJECT_LIST.length; i++) {
if(_PROJECT_LIST[i].CODE == selectedValue) {
productName = _PROJECT_LIST[i].PRODUCT_NAME || "";
break;
}
}
// 파트 목록 미리 로드
if(selectedValue) {
fn_getPartListByProject(selectedValue);
}
// 제품구분 및 파트 초기화
if(selectedValue) fn_getPartListByProject(selectedValue);
cell.getRow().update({
"PART_OBJID": "",
"PART_NO": "",
"PART_NAME": "",
"PART_OBJID": "", "PART_NO": "", "PART_NAME": "",
"PRODUCT_NAME": productName
});
success(selectedValue);
});
select.addEventListener("blur", function() {
success(select.value);
});
onRendered(function() {
select.focus();
});
return select;
}
},
formatter: function(cell) {
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_PROJECT_LIST});
@@ -252,16 +275,19 @@ function fn_search(){
editor: false
},
{title:'품번', field:'PART_OBJID', headerHozAlign:'center', hozAlign:'left', width:250,
editor: fnc_customSelectEditor,
editor: fn_select2Editor,
editorParams: function(cell) {
var projectObjid = cell.getData().PROJECT_OBJID;
var partList = fn_getPartListByProject(projectObjid);
return {
valueId: "CODE", labelId: "NAME", values: partList,
placeholder: "품번 검색..."
};
},
formatter: function(cell) {
var projectObjid = cell.getData().PROJECT_OBJID;
var partList = fn_getPartListByProject(projectObjid);
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values: partList});
},
editorParams: function(cell) {
var projectObjid = cell.getData().PROJECT_OBJID;
var partList = fn_getPartListByProject(projectObjid);
return {valueId:"CODE", labelId:"NAME", values: partList};
}
},
{title:'품명', field:'PART_NAME', headerHozAlign:'center', hozAlign:'left', width:180,

View File

@@ -223,6 +223,7 @@ async function fn_createExcelFile(data){
// 컬럼: 검사일, 검사자, 제품구분, 품명(모델명), 작업지시번호, 부품품번, 부품명, 입고수량 합계, 양품수량 합계, 불량수량 합계, 불량율, 재생수량 합계, 최종양품수량 합계
var columns = [
{formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:40, frozen:true},
{headerHozAlign:'center', hozAlign:'center', minWidth:150, widthGrow:1, title:'검사일', field:'INSPECTION_DATE',
formatter:fnc_createGridAnchorTag,
cellClick: function(e, cell){
@@ -347,25 +348,47 @@ function fn_openInspectionPopUp(rowData){
hiddenForm.submit();
}
// 반제품검사 등록 팝업 (신규 등록)
// 반제품검사 등록 팝업 (선택된 행이 있으면 기존 데이터, 없으면 신규 등록)
function fn_registPopUp(){
var selected = _tabulGrid ? _tabulGrid.getSelectedData() : [];
var popup_width = 1800;
var popup_height = 1050;
var hiddenForm = document.hiddenForm;
var target = "semiProductInspectionPopUp";
var url = "/quality/semiProductInspectionFormPopUp.do";
fn_centerPopup(popup_width, popup_height, "", target);
if(selected.length > 1){
Swal.fire("한건씩 등록 가능합니다.");
return;
}
fn_centerPopup(popup_width, popup_height, "", target);
hiddenForm.action = url;
hiddenForm.OBJID.value = ''; // 신규 등록이므로 빈값
hiddenForm.INSPECTION_GROUP_ID.value = ''; // 신규 등록이므로 빈값
hiddenForm.actionType.value = 'new';
hiddenForm.MODEL_NAME.value = '';
hiddenForm.WORK_ORDER_NO.value = '';
hiddenForm.PART_NO.value = '';
hiddenForm.PART_NAME.value = '';
hiddenForm.INSPECTION_DATE.value = '';
if(selected.length == 1){
// 선택된 행이 있으면 기존 데이터로 열기
var rowData = selected[0];
hiddenForm.OBJID.value = rowData.OBJID || '';
hiddenForm.INSPECTION_GROUP_ID.value = rowData.INSPECTION_GROUP_ID || '';
hiddenForm.MODEL_NAME.value = rowData.MODEL_NAME || '';
hiddenForm.WORK_ORDER_NO.value = rowData.WORK_ORDER_NO || '';
hiddenForm.PART_NO.value = rowData.PART_NO || '';
hiddenForm.PART_NAME.value = rowData.PART_NAME || '';
hiddenForm.INSPECTION_DATE.value = rowData.INSPECTION_DATE || '';
hiddenForm.actionType.value = 'view';
} else {
// 선택된 행이 없으면 신규 등록
hiddenForm.OBJID.value = '';
hiddenForm.INSPECTION_GROUP_ID.value = '';
hiddenForm.actionType.value = 'new';
hiddenForm.MODEL_NAME.value = '';
hiddenForm.WORK_ORDER_NO.value = '';
hiddenForm.PART_NO.value = '';
hiddenForm.PART_NAME.value = '';
hiddenForm.INSPECTION_DATE.value = '';
}
hiddenForm.target = target;
hiddenForm.submit();
}

View File

@@ -714,7 +714,7 @@ body {
<input type="button" value="거래명세서 생성" class="plm_btns" id="btnTransactionStatement" style="background-color: #2196F3; color: white;">
--%>
<input type="button" value="출하지시/판매등록" class="plm_btns" id="btnBulkRegister" style="background-color: #4CAF50; color: white;">
<input type="button" value="분할출하" class="plm_btns" id="btnSplitShipment" style="background-color: #FF9800; color: white;">
<!-- <input type="button" value="분할출하" class="plm_btns" id="btnSplitShipment" style="background-color: #FF9800; color: white;"> -->
</div>
</div>
<div id="plmSearchZon">

View File

@@ -1193,7 +1193,7 @@
#{PART_OBJID},
REPLACE(#{BOM_QTY}::VARCHAR, ',', ''),
REPLACE(#{QTY}::VARCHAR, ',', ''),
REPLACE(#{ORDER_QTY}::VARCHAR, ',', ''),
COALESCE(NULLIF(REPLACE(#{ORDER_QTY}::VARCHAR, ',', ''), '')::NUMERIC::INTEGER, 0),
#{PARTNER_PRICE},
#{REMARK},
#{WRITER},
@@ -1231,7 +1231,7 @@
) ON CONFLICT (OBJID) DO
UPDATE
SET
ORDER_QTY = REPLACE(#{ORDER_QTY} ::VARCHAR, ',', '')
ORDER_QTY = COALESCE(NULLIF(REPLACE(#{ORDER_QTY}::VARCHAR, ',', ''), '')::NUMERIC::INTEGER, 0)
,PARTNER_PRICE = REPLACE(#{PARTNER_PRICE} ::VARCHAR, ',', '')
,REMARK = #{REMARK}
<!--
@@ -1836,8 +1836,7 @@
<select id="getPurchaseOrderDeliveryTargetPartList" parameterType="map" resultType="map">
SELECT
P.*,
(REAL_ORDER_QTY::NUMERIC -TOTAL_DELIVERY_QTY::NUMERIC) AS NON_ARRIVAL_QTY
<!-- (ORDER_QTY::NUMERIC -(TOTAL_DELIVERY_QTY::NUMERIC - TOTAL_DEFECT_QTY::NUMERIC)) AS NON_ARRIVAL_QTY -->
(ORDER_QTY::NUMERIC - TOTAL_DELIVERY_QTY::NUMERIC) AS NON_ARRIVAL_QTY
FROM(
SELECT
ROW_NUMBER() OVER(ORDER BY PM.PART_NO, POP.REGDATE DESC) AS RNUM,
@@ -1855,7 +1854,7 @@
WHEN POM.PARTNER_OBJID LIKE 'C_%' THEN (SELECT CLIENT_NM FROM CLIENT_MNG WHERE 'C_' || OBJID::VARCHAR = POM.PARTNER_OBJID)
ELSE (SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE 1=1 AND OBJID::VARCHAR = POM.PARTNER_OBJID)
END AS PARTNER_NAME,
POP.ORDER_QTY,
COALESCE(NULLIF(POP.ORDER_QTY::VARCHAR, '')::NUMERIC::INTEGER, 0) AS ORDER_QTY,
POP.REAL_ORDER_QTY,
POP.OBJID AS ORDER_PART_OBJID,
POP.PURCHASE_ORDER_MASTER_OBJID,