영업관리 화면 수정 등...

This commit is contained in:
2025-11-26 14:49:14 +09:00
parent 2f9c7bbaf2
commit 930ee1a20b
5 changed files with 197 additions and 30 deletions

View File

@@ -253,13 +253,13 @@ function fn_search(){
_tabulGrid.on("renderComplete", function(){
fn_calculateTotalFromGrid();
// 그리드 렌더링 완료 후 높이 계산
fnc_calculateContentHeight("gridDiv", 20);
fnc_calculateContentHeight("gridDiv", 30);
});
}
// 윈도우 리사이즈 이벤트 (한 번만 등록)
$(window).off("resize.gridHeight").on("resize.gridHeight", function() {
fnc_calculateContentHeight("gridDiv", 20);
fnc_calculateContentHeight("gridDiv", 30);
});
}

View File

@@ -33,11 +33,14 @@
$(document).ready(function(){
_fnc_datepick();
// 그리드 높이 동적 계산 (Total 합계 영역 + 여유 공간 80px)
fnc_calculateContentHeight("gridDiv", 80);
$(window).resize(function() {
fnc_calculateContentHeight("gridDiv", 80);
});
// DOM 렌더링 완료 후 그리드 높이 계산
setTimeout(function() {
fnc_calculateContentHeight("gridDiv", 10);
}, 100);
$(window).resize(function() {
fnc_calculateContentHeight("gridDiv", 10);
});
// select2가 로드되었을 때만 초기화
if(typeof $.fn !== 'undefined' && typeof $.fn.select2 === 'function') {
@@ -200,7 +203,7 @@ var columns = [
//{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '매출마감', field : 'SALES_STATUS'},
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '매출마감', field : 'SALES_DEADLINE_DATE'},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '발주일', field : 'ORDER_DATE'},
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '발주번호', field : 'PO_NO'},
{headerHozAlign : 'center', hozAlign : 'left', width : '120', title : '발주번호', field : 'PO_NO'},
{headerHozAlign : 'center', hozAlign : 'left', width : '150', title : '고객사', field : 'CUSTOMER'},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '제품구분', field : 'PRODUCT_TYPE'},
{headerHozAlign : 'center', hozAlign : 'left', width : '180', title : '품명', field : 'PRODUCT_NAME'},
@@ -228,8 +231,8 @@ var columns = [
{headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '환율', field : 'SALES_EXCHANGE_RATE',
formatter: "money", formatterParams: {thousand: ",", symbolAfter: "", precision: 2}
},
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : 'S/N', field : 'SERIAL_NO'},
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '품번', field : 'PRODUCT_NO'}
{headerHozAlign : 'center', hozAlign : 'left', width : '120', title : 'S/N', field : 'SERIAL_NO'},
{headerHozAlign : 'center', hozAlign : 'left', width : '120', title : '품번', field : 'PRODUCT_NO'}
// 주석처리된 컬럼들 (필요없는 항목)
// {headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '접수일', field : 'RECEIPT_DATE'},
// {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '유/무상', field : 'PAYMENT_TYPE'},

View File

@@ -12,6 +12,14 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=Constants.SYSTEM_NAME%></title>
<style>
body, html {
overflow-x: hidden;
width: 100%;
margin: 0;
padding: 0;
}
</style>
<script>
// Excel 버튼 이벤트 등록 함수
@@ -30,19 +38,14 @@
_fnc_datepick(); // 날짜 선택기 초기화
$('.select2').select2(); // select2 초기화
// 그리드 높이 동적 계산 (Total 합계 영역 + 여유 공간 80px)
fnc_calculateContentHeight("gridDiv", 80);
// 디버그: 계산된 높이 확인
console.log("=== 그리드 높이 디버그 ===");
console.log("윈도우 높이:", $(window).height());
console.log("#gridDiv 높이:", $('#gridDiv').height());
console.log("#mainGrid 높이:", $('#mainGrid').height());
$(window).resize(function() {
fnc_calculateContentHeight("gridDiv", 80);
console.log("리사이즈 후 #gridDiv 높이:", $('#gridDiv').height());
});
// DOM 렌더링 완료 후 그리드 높이 계산
setTimeout(function() {
fnc_calculateContentHeight("gridDiv", 10);
}, 100);
$(window).resize(function() {
fnc_calculateContentHeight("gridDiv", 10);
});
// 품번/품명 Select2 AJAX 초기화
initPartSelect2Ajax("#search_partNo", "#search_partName", "#search_partObjId", {
@@ -330,9 +333,9 @@ var columns = [
{headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '환율', field : 'SALES_EXCHANGE_RATE',
formatter: "money", formatterParams: {thousand: ",", symbolAfter: "", precision: 2}
},
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : 'S/N', field : 'SERIAL_NO'},
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '품번', field : 'PRODUCT_NO'},
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '거래명세서', field : 'TRANSACTION_STATEMENT',
{headerHozAlign : 'center', hozAlign : 'left', width : '120', title : 'S/N', field : 'SERIAL_NO'},
{headerHozAlign : 'center', hozAlign : 'left', width : '120', title : '품번', field : 'PRODUCT_NO'},
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '거래명세서', field : 'TRANSACTION_STATEMENT',
formatter: function(cell) {
var data = cell.getRow().getData();
var projectNo = data.PROJECT_NO;

View File

@@ -1201,12 +1201,13 @@ public class ProductionPlanningController extends BaseService {
mbomDetailList = commonService.selectList("partMng.getBOMTreeList", request, bomParam);
System.out.println("할당된 E-BOM 조회 - mbomDetailList size: " + (mbomDetailList != null ? mbomDetailList.size() : 0));
} else if("ASSIGNED_MBOM".equals(bomDataType)) {
// 할당된 M-BOM: MBOM_DETAIL 테이블에서 조회 (ORDER_QTY, PRODUCTION_QTY 포함)
// 할당된 M-BOM: 구조만 조회 (생산 정보 제외)
Map<String, Object> mbomParam = new HashMap<>();
mbomParam.put("mbomHeaderObjid", bomReportObjid);
List tempList = commonService.selectList("productionplanning.getSavedMbomTreeList", request, mbomParam);
mbomDetailList = (List<Map<String, Object>>) (List<?>) CommonUtils.keyChangeUpperList(tempList);
System.out.println("할당된 M-BOM 조회 - mbomDetailList size: " + (mbomDetailList != null ? mbomDetailList.size() : 0));
List tempList = commonService.selectList("productionplanning.getMbomStructureOnly", request, mbomParam);
// UpperKeyMap으로 이미 대문자 변환되어 오므로 keyChangeUpperList 불필요
mbomDetailList = (List<Map<String, Object>>) (List<?>) tempList;
System.out.println("할당된 M-BOM 구조만 조회 - size: " + (mbomDetailList != null ? mbomDetailList.size() : 0));
}
}

View File

@@ -4095,6 +4095,166 @@
ORDER BY V.PATH2
</select>
<!-- M-BOM 구조만 조회 (할당용 - 생산 정보 제외) -->
<select id="getMbomStructureOnly" parameterType="map" resultType="com.pms.common.UpperKeyMap">
/* productionplanning.getMbomStructureOnly - M-BOM 구조만 조회 (생산 정보 제외) */
WITH RECURSIVE VIEW_BOM(
MBOM_HEADER_OBJID,
OBJID,
PARENT_OBJID,
CHILD_OBJID,
PART_OBJID,
PART_NO,
PART_NAME,
QTY,
ITEM_QTY,
QTY_TEMP,
REGDATE,
SEQ,
STATUS,
LEV,
PATH,
PATH2,
CYCLE,
UNIT,
WRITER
) AS (
SELECT
A.MBOM_HEADER_OBJID,
A.OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PART_OBJID,
A.PART_NO,
A.PART_NAME,
A.QTY,
A.QTY,
A.QTY,
A.REGDATE,
A.SEQ,
A.STATUS,
1,
ARRAY [A.CHILD_OBJID::TEXT],
ARRAY [A.SEQ::TEXT],
FALSE,
A.UNIT,
A.WRITER
FROM
MBOM_DETAIL A
WHERE 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND A.MBOM_HEADER_OBJID = #{mbomHeaderObjid}
AND A.STATUS = 'ACTIVE'
UNION ALL
SELECT
B.MBOM_HEADER_OBJID,
B.OBJID,
B.PARENT_OBJID,
B.CHILD_OBJID,
B.PART_OBJID,
B.PART_NO,
B.PART_NAME,
B.QTY,
B.QTY,
B.QTY,
B.REGDATE,
B.SEQ,
B.STATUS,
LEV + 1,
PATH||B.CHILD_OBJID::TEXT,
PATH2||B.SEQ::TEXT,
B.PARENT_OBJID = ANY(PATH),
B.UNIT,
B.WRITER
FROM
MBOM_DETAIL B
JOIN
VIEW_BOM
ON B.PARENT_OBJID = VIEW_BOM.CHILD_OBJID
AND VIEW_BOM.MBOM_HEADER_OBJID = B.MBOM_HEADER_OBJID
AND B.STATUS = 'ACTIVE'
)
SELECT
V.MBOM_HEADER_OBJID AS BOM_REPORT_OBJID,
V.OBJID,
V.PARENT_OBJID,
V.CHILD_OBJID,
V.PART_OBJID,
V.PART_OBJID AS LAST_PART_OBJID,
V.PART_OBJID AS BOM_LAST_PART_OBJID,
V.PART_NO,
V.PART_NAME,
V.QTY,
V.ITEM_QTY,
V.QTY_TEMP,
V.LEV AS LEVEL,
(SELECT COUNT(*) FROM MBOM_DETAIL WHERE PARENT_OBJID = V.CHILD_OBJID) AS SUB_PART_CNT,
V.SEQ,
V.STATUS,
V.UNIT,
V.WRITER,
TO_CHAR(V.REGDATE, 'YYYY-MM-DD HH24:MI:SS') AS REGDATE,
-- 생산 정보는 모두 NULL
NULL AS SUPPLY_TYPE,
NULL AS MAKE_OR_BUY,
NULL AS RAW_MATERIAL_NO,
NULL AS RAW_MATERIAL_SPEC,
NULL AS RAW_MATERIAL,
NULL AS SIZE,
NULL AS PROCESSING_VENDOR,
NULL AS PROCESSING_DEADLINE,
NULL AS GRINDING_DEADLINE,
NULL AS REQUIRED_QTY,
NULL AS ORDER_QTY,
NULL AS PRODUCTION_QTY,
NULL AS STOCK_QTY,
NULL AS SHORTAGE_QTY,
NULL AS VENDOR,
NULL AS UNIT_PRICE,
NULL AS TOTAL_PRICE,
NULL AS CURRENCY,
NULL AS LEAD_TIME,
NULL AS MIN_ORDER_QTY,
NULL AS EDITER,
NULL AS EDIT_DATE,
NULL AS REMARK,
-- E-BOM 호환 필드
NULL AS PARENT_PART_NO,
NULL AS CONTRACT_OBJID,
CASE WHEN V.LEV = 1 THEN V.OBJID ELSE NULL END AS ROOT_OBJID,
CASE WHEN V.LEV = 1 THEN V.OBJID ELSE NULL END AS SUB_ROOT_OBJID,
1 AS LEAF,
-- PART_MNG 테이블에서 파트 속성 정보
P.SPEC,
P.MATERIAL,
P.WEIGHT,
P.PART_TYPE,
P.REVISION,
P.MAKER,
P.THICKNESS,
P.WIDTH,
P.HEIGHT,
P.OUT_DIAMETER,
P.IN_DIAMETER,
P.LENGTH,
P.SOURCING_CODE,
P.HEAT_TREATMENT_HARDNESS,
P.HEAT_TREATMENT_METHOD,
P.SURFACE_TREATMENT,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.UNIT) AS UNIT_TITLE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.PART_TYPE) AS PART_TYPE_TITLE,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('3D_CAD')) AS CU01_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_DRAWING_CAD')) AS CU02_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
V.LEV
FROM VIEW_BOM V
INNER JOIN PART_MNG P ON P.OBJID = V.PART_OBJID
WHERE 1=1
ORDER BY V.PATH2
</select>
<!-- MBOM_HEADER 테이블에 OBJID 존재 여부 확인 -->
<select id="checkMbomHeaderExists" parameterType="map" resultType="int">
/* productionplanning.checkMbomHeaderExists - M-BOM 존재 확인 */