V20260210 #144
@@ -467,7 +467,7 @@ function fn_checkAssignmentAndOpenMbom(projectObjId) {
|
||||
dataType: "json",
|
||||
async: false,
|
||||
success: function(templateResponse) {
|
||||
if(templateResponse && templateResponse.MBOM_PART_NO) {
|
||||
if(templateResponse && templateResponse.TEMPLATE_HEADER_OBJID) {
|
||||
console.log("동일 품번의 M-BOM 템플릿 발견 - 팝업 열기");
|
||||
fn_openMBomFormPopup(projectObjId);
|
||||
} else {
|
||||
|
||||
@@ -234,18 +234,24 @@ function fn_search(){
|
||||
editor:"date"
|
||||
},
|
||||
{title:'검사자', field:'INSPECTOR_ID', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
editor: fn_select2Editor,
|
||||
editorParams: {
|
||||
valueId: "CODE", labelId: "NAME", values: _INSPECTOR_LIST,
|
||||
placeholder: "검사자 검색..."
|
||||
},
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_INSPECTOR_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_INSPECTOR_LIST}
|
||||
}
|
||||
},
|
||||
{title:'진행공정', field:'PROCESS_CD', headerHozAlign:'center', hozAlign:'center', width:130,
|
||||
editor: fnc_customSelectEditor,
|
||||
editor: fn_select2Editor,
|
||||
editorParams: {
|
||||
valueId: "CODE", labelId: "NAME", values: _PROCESS_LIST,
|
||||
placeholder: "공정 검색..."
|
||||
},
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_PROCESS_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_PROCESS_LIST}
|
||||
}
|
||||
},
|
||||
{title:'프로젝트번호', field:'PROJECT_OBJID', headerHozAlign:'center', hozAlign:'center', width:130,
|
||||
editor: fn_select2Editor,
|
||||
@@ -326,18 +332,24 @@ function fn_search(){
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_INSPECTION_RESULT_LIST}
|
||||
},
|
||||
{title:'담당팀', field:'DEPT_CD', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
editor: fn_select2Editor,
|
||||
editorParams: {
|
||||
valueId: "CODE", labelId: "NAME", values: _DEPT_LIST,
|
||||
placeholder: "담당팀 검색..."
|
||||
},
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_DEPT_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_DEPT_LIST}
|
||||
}
|
||||
},
|
||||
{title:'담당자', field:'USER_ID', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
editor: fn_select2Editor,
|
||||
editorParams: {
|
||||
valueId: "CODE", labelId: "NAME", values: _USER_LIST,
|
||||
placeholder: "담당자 검색..."
|
||||
},
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_USER_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_USER_LIST}
|
||||
}
|
||||
},
|
||||
|
||||
{title:'특이사항', field:'REMARK', headerHozAlign:'center', hozAlign:'left', width:150,
|
||||
|
||||
@@ -1163,14 +1163,14 @@ public class ProductionPlanningController extends BaseService {
|
||||
// 할당된 BOM도 없으면 Machine 이외 제품은 템플릿 확인
|
||||
String productCode = CommonUtils.checkNull(projectInfo.get("PRODUCT_CODE"));
|
||||
String partNo = CommonUtils.checkNull(projectInfo.get("PART_NO"));
|
||||
|
||||
|
||||
if(!"0000928".equals(productCode) && !"".equals(partNo)) {
|
||||
System.out.println("Machine 이외 제품 - 템플릿 조회 시도");
|
||||
Map<String, Object> templateParam = new HashMap<>();
|
||||
templateParam.put("partNo", partNo);
|
||||
|
||||
|
||||
Map<String, Object> template = commonService.selectOne("productionplanning.getLatestMbomTemplateByPartNo", request, templateParam);
|
||||
|
||||
|
||||
if(template != null && !template.isEmpty()) {
|
||||
bomReportObjid = CommonUtils.checkNull(template.get("TEMPLATE_HEADER_OBJID"));
|
||||
bomDataType = "TEMPLATE";
|
||||
|
||||
@@ -3406,31 +3406,25 @@
|
||||
BPQ.SEQ
|
||||
</select>
|
||||
|
||||
<!-- 품번으로 최신 M-BOM 조회 (Machine 이외 제품용) -->
|
||||
<!-- 품번으로 최신 M-BOM 조회 (MBOM_HEADER 기반, Machine 이외 제품용) -->
|
||||
<select id="getLatestMbomByPartNo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
PM.OBJID,
|
||||
COALESCE(
|
||||
(SELECT PBR.PART_NO
|
||||
FROM PART_BOM_REPORT PBR
|
||||
WHERE PBR.OBJID::VARCHAR = PM.BOM_REPORT_OBJID
|
||||
LIMIT 1),
|
||||
''
|
||||
) AS MBOM_PART_NO,
|
||||
PM.BOM_REPORT_OBJID,
|
||||
PM.PART_NO,
|
||||
PM.PART_NAME,
|
||||
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS SAVE_DATE
|
||||
FROM
|
||||
PROJECT_MGMT PM
|
||||
SELECT
|
||||
MH.OBJID AS TEMPLATE_HEADER_OBJID,
|
||||
MH.MBOM_NO,
|
||||
MH.PROJECT_OBJID,
|
||||
MH.PART_NO,
|
||||
MH.PART_NAME,
|
||||
TO_CHAR(MH.REGDATE, 'YYYY-MM-DD') AS SAVE_DATE
|
||||
FROM
|
||||
MBOM_HEADER MH
|
||||
INNER JOIN PROJECT_MGMT PM ON MH.PROJECT_OBJID = PM.OBJID
|
||||
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
|
||||
WHERE
|
||||
PM.PART_NO = #{partNo}
|
||||
AND PM.MBOM_STATUS = 'Y'
|
||||
AND PM.BOM_REPORT_OBJID IS NOT NULL
|
||||
AND CM.PRODUCT != '0001807' <!-- Machine 제외 -->
|
||||
ORDER BY
|
||||
PM.REGDATE DESC
|
||||
WHERE
|
||||
MH.PART_NO = #{partNo}
|
||||
AND MH.STATUS = 'Y'
|
||||
AND CM.PRODUCT != '0000928' <!-- Machine 제외 -->
|
||||
ORDER BY
|
||||
MH.REGDATE DESC
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
|
||||
@@ -3900,21 +3900,35 @@ ORDER BY V.PATH2
|
||||
|
||||
<!-- ==================== 품의서 관리 ==================== -->
|
||||
|
||||
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 소재단가 기준 -->
|
||||
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 공급업체 기준 -->
|
||||
<!-- 소재단가+공급업체가 입력된 품목 대상 (소재 유무에 따라 수량/합계 분기) -->
|
||||
<!-- 구매리스트와 동일 기준으로 동일 품번 그룹핑 (PART_OBJID + SUPPLY_TYPE + RAW_MATERIAL + RAW_MATERIAL_SIZE) -->
|
||||
<select id="getProposalTargetPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
MD.OBJID,
|
||||
MIN(MD.OBJID) AS OBJID,
|
||||
STRING_AGG(MD.OBJID::VARCHAR, ',' ORDER BY MD.OBJID) AS ORIGINAL_OBJIDS,
|
||||
MD.PART_OBJID,
|
||||
PM.PART_NO,
|
||||
PM.PART_NAME,
|
||||
MD.QTY,
|
||||
MD.UNIT_PRICE,
|
||||
MD.TOTAL_PRICE,
|
||||
MD.VENDOR AS VENDOR_PM,
|
||||
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.VENDOR) AS VENDOR_NAME,
|
||||
MD.NET_QTY,
|
||||
MD.PO_QTY,
|
||||
MD.PRODUCTION_QTY,
|
||||
MIN(PM.PART_NO) AS PART_NO,
|
||||
MIN(PM.PART_NAME) AS PART_NAME,
|
||||
CASE WHEN COALESCE(MIN(MD.RAW_MATERIAL_PART_NO), '') != ''
|
||||
THEN SUM(COALESCE(MD.PO_QTY, 0))
|
||||
ELSE SUM(COALESCE(MD.PRODUCTION_QTY, 0))
|
||||
END AS QTY,
|
||||
MIN(MD.UNIT_PRICE) AS UNIT_PRICE,
|
||||
CASE WHEN COALESCE(MIN(MD.RAW_MATERIAL_PART_NO), '') != ''
|
||||
THEN COALESCE(MIN(MD.UNIT_PRICE), 0) * SUM(COALESCE(MD.PO_QTY, 0))
|
||||
ELSE COALESCE(MIN(MD.UNIT_PRICE), 0) * SUM(COALESCE(MD.PRODUCTION_QTY, 0))
|
||||
END AS TOTAL_PRICE,
|
||||
MIN(MD.VENDOR) AS VENDOR_PM,
|
||||
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MIN(MD.VENDOR)) AS VENDOR_NAME,
|
||||
SUM(COALESCE(MD.NET_QTY, 0)) AS NET_QTY,
|
||||
SUM(COALESCE(MD.PO_QTY, 0)) AS PO_QTY,
|
||||
SUM(COALESCE(MD.PRODUCTION_QTY, 0)) AS PRODUCTION_QTY,
|
||||
MIN(MD.RAW_MATERIAL_PART_NO) AS RAW_MATERIAL_NO,
|
||||
COALESCE(MIN(MD.RAW_MATERIAL), '') AS RAW_MATERIAL,
|
||||
COALESCE(MIN(MD.RAW_MATERIAL_SIZE), '') AS SIZE,
|
||||
MIN(MD.UNIT) AS UNIT,
|
||||
COALESCE(MIN(MD.USE_YN), 'Y') AS USE_YN,
|
||||
'MBOM' AS DATA_SOURCE,
|
||||
'MATERIAL' AS PROPOSAL_TYPE
|
||||
FROM
|
||||
@@ -3930,24 +3944,33 @@ ORDER BY V.PATH2
|
||||
AND MD.VENDOR != ''
|
||||
-- 소재 품의서가 생성되지 않은 품목만
|
||||
AND MD.PROPOSAL_DATE IS NULL
|
||||
ORDER BY MD.REGDATE
|
||||
GROUP BY MD.PART_OBJID,
|
||||
COALESCE(MD.SUPPLY_TYPE, ''),
|
||||
COALESCE(MD.RAW_MATERIAL, ''),
|
||||
COALESCE(MD.RAW_MATERIAL_SIZE, '')
|
||||
ORDER BY MIN(MD.REGDATE)
|
||||
</select>
|
||||
|
||||
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 가공단가 기준 -->
|
||||
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 가공업체 기준 -->
|
||||
<!-- 가공단가+가공업체가 입력된 품목 대상 (부품, 제작수량) -->
|
||||
<!-- 구매리스트와 동일 기준으로 동일 품번 그룹핑 -->
|
||||
<select id="getProposalTargetPartsFromMBomProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
MD.OBJID,
|
||||
MIN(MD.OBJID) AS OBJID,
|
||||
STRING_AGG(MD.OBJID::VARCHAR, ',' ORDER BY MD.OBJID) AS ORIGINAL_OBJIDS,
|
||||
MD.PART_OBJID,
|
||||
PM.PART_NO,
|
||||
PM.PART_NAME,
|
||||
MD.QTY,
|
||||
MD.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||
MD.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||
MD.PROCESSING_VENDOR AS VENDOR_PM,
|
||||
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.PROCESSING_VENDOR) AS VENDOR_NAME,
|
||||
MD.NET_QTY,
|
||||
MD.PO_QTY,
|
||||
MD.PRODUCTION_QTY,
|
||||
MIN(PM.PART_NO) AS PART_NO,
|
||||
MIN(PM.PART_NAME) AS PART_NAME,
|
||||
SUM(COALESCE(MD.PRODUCTION_QTY, 0)) AS QTY,
|
||||
MIN(MD.PROCESSING_UNIT_PRICE) AS UNIT_PRICE,
|
||||
COALESCE(MIN(MD.PROCESSING_UNIT_PRICE), 0) * SUM(COALESCE(MD.PRODUCTION_QTY, 0)) AS TOTAL_PRICE,
|
||||
MIN(MD.PROCESSING_VENDOR) AS VENDOR_PM,
|
||||
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MIN(MD.PROCESSING_VENDOR)) AS VENDOR_NAME,
|
||||
SUM(COALESCE(MD.NET_QTY, 0)) AS NET_QTY,
|
||||
SUM(COALESCE(MD.PO_QTY, 0)) AS PO_QTY,
|
||||
SUM(COALESCE(MD.PRODUCTION_QTY, 0)) AS PRODUCTION_QTY,
|
||||
MIN(MD.UNIT) AS UNIT,
|
||||
COALESCE(MIN(MD.USE_YN), 'Y') AS USE_YN,
|
||||
'MBOM' AS DATA_SOURCE,
|
||||
'PROCESSING' AS PROPOSAL_TYPE
|
||||
FROM
|
||||
@@ -3963,19 +3986,24 @@ ORDER BY V.PATH2
|
||||
AND MD.PROCESSING_VENDOR != ''
|
||||
-- 가공 품의서가 생성되지 않은 품목만
|
||||
AND MD.PROCESSING_PROPOSAL_DATE IS NULL
|
||||
ORDER BY MD.REGDATE
|
||||
GROUP BY MD.PART_OBJID,
|
||||
COALESCE(MD.SUPPLY_TYPE, ''),
|
||||
COALESCE(MD.RAW_MATERIAL, ''),
|
||||
COALESCE(MD.RAW_MATERIAL_SIZE, '')
|
||||
ORDER BY MIN(MD.REGDATE)
|
||||
</select>
|
||||
|
||||
<!-- 품의서 대상 제외 품목 조회 - M-BOM 기반 (소재단가O, 공급업체X) -->
|
||||
<!-- 동일 품번 그룹핑 -->
|
||||
<select id="getProposalExcludedPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
MD.OBJID,
|
||||
MIN(MD.OBJID) AS OBJID,
|
||||
MD.PART_OBJID,
|
||||
PM.PART_NO,
|
||||
PM.PART_NAME,
|
||||
MD.QTY,
|
||||
MD.UNIT_PRICE,
|
||||
MD.TOTAL_PRICE,
|
||||
MIN(PM.PART_NO) AS PART_NO,
|
||||
MIN(PM.PART_NAME) AS PART_NAME,
|
||||
SUM(COALESCE(MD.QTY, 0)) AS QTY,
|
||||
MIN(MD.UNIT_PRICE) AS UNIT_PRICE,
|
||||
COALESCE(MIN(MD.UNIT_PRICE), 0) * SUM(COALESCE(MD.QTY, 0)) AS TOTAL_PRICE,
|
||||
'MBOM' AS DATA_SOURCE,
|
||||
'MATERIAL' AS PROPOSAL_TYPE
|
||||
FROM
|
||||
@@ -3990,19 +4018,24 @@ ORDER BY V.PATH2
|
||||
AND (MD.VENDOR IS NULL OR MD.VENDOR = '')
|
||||
-- 소재 품의서가 생성되지 않은 품목만
|
||||
AND MD.PROPOSAL_DATE IS NULL
|
||||
ORDER BY MD.REGDATE
|
||||
GROUP BY MD.PART_OBJID,
|
||||
COALESCE(MD.SUPPLY_TYPE, ''),
|
||||
COALESCE(MD.RAW_MATERIAL, ''),
|
||||
COALESCE(MD.RAW_MATERIAL_SIZE, '')
|
||||
ORDER BY MIN(MD.REGDATE)
|
||||
</select>
|
||||
|
||||
<!-- 품의서 대상 제외 품목 조회 - M-BOM 기반 (가공단가O, 가공업체X) -->
|
||||
<!-- 동일 품번 그룹핑 -->
|
||||
<select id="getProposalExcludedPartsFromMBomProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
MD.OBJID,
|
||||
MIN(MD.OBJID) AS OBJID,
|
||||
MD.PART_OBJID,
|
||||
PM.PART_NO,
|
||||
PM.PART_NAME,
|
||||
MD.QTY,
|
||||
MD.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||
MD.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||
MIN(PM.PART_NO) AS PART_NO,
|
||||
MIN(PM.PART_NAME) AS PART_NAME,
|
||||
SUM(COALESCE(MD.QTY, 0)) AS QTY,
|
||||
MIN(MD.PROCESSING_UNIT_PRICE) AS UNIT_PRICE,
|
||||
COALESCE(MIN(MD.PROCESSING_UNIT_PRICE), 0) * SUM(COALESCE(MD.QTY, 0)) AS TOTAL_PRICE,
|
||||
'MBOM' AS DATA_SOURCE,
|
||||
'PROCESSING' AS PROPOSAL_TYPE
|
||||
FROM
|
||||
@@ -4017,24 +4050,38 @@ ORDER BY V.PATH2
|
||||
AND (MD.PROCESSING_VENDOR IS NULL OR MD.PROCESSING_VENDOR = '')
|
||||
-- 가공 품의서가 생성되지 않은 품목만
|
||||
AND MD.PROCESSING_PROPOSAL_DATE IS NULL
|
||||
ORDER BY MD.REGDATE
|
||||
GROUP BY MD.PART_OBJID,
|
||||
COALESCE(MD.SUPPLY_TYPE, ''),
|
||||
COALESCE(MD.RAW_MATERIAL, ''),
|
||||
COALESCE(MD.RAW_MATERIAL_SIZE, '')
|
||||
ORDER BY MIN(MD.REGDATE)
|
||||
</select>
|
||||
|
||||
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 소재단가 기준 -->
|
||||
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 공급업체 기준 -->
|
||||
<!-- 소재단가+공급업체가 입력된 품목 대상 (소재 유무에 따라 수량/합계 분기) -->
|
||||
<select id="getProposalTargetPartsFromManual" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
SRP.OBJID,
|
||||
SRP.PART_OBJID,
|
||||
PM.PART_NO,
|
||||
PM.PART_NAME,
|
||||
SRP.QTY,
|
||||
CASE WHEN SRP.RAW_MATERIAL_NO IS NOT NULL AND SRP.RAW_MATERIAL_NO != ''
|
||||
THEN SRP.PO_QTY
|
||||
ELSE SRP.PRODUCTION_QTY
|
||||
END AS QTY,
|
||||
SRP.UNIT_PRICE,
|
||||
SRP.TOTAL_PRICE,
|
||||
CASE WHEN SRP.RAW_MATERIAL_NO IS NOT NULL AND SRP.RAW_MATERIAL_NO != ''
|
||||
THEN COALESCE(SRP.UNIT_PRICE, 0) * COALESCE(SRP.PO_QTY, 0)
|
||||
ELSE COALESCE(SRP.UNIT_PRICE, 0) * COALESCE(SRP.PRODUCTION_QTY, 0)
|
||||
END AS TOTAL_PRICE,
|
||||
SRP.VENDOR_PM,
|
||||
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.VENDOR_PM) AS VENDOR_NAME,
|
||||
SRP.NET_QTY,
|
||||
SRP.PO_QTY,
|
||||
SRP.PRODUCTION_QTY,
|
||||
SRP.RAW_MATERIAL_NO,
|
||||
SRP.RAW_MATERIAL,
|
||||
SRP.SIZE,
|
||||
'MANUAL' AS DATA_SOURCE,
|
||||
'MATERIAL' AS PROPOSAL_TYPE
|
||||
FROM
|
||||
@@ -4053,14 +4100,15 @@ ORDER BY V.PATH2
|
||||
ORDER BY SRP.REGDATE
|
||||
</select>
|
||||
|
||||
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 가공단가 기준 -->
|
||||
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 가공업체 기준 -->
|
||||
<!-- 가공단가+가공업체가 입력된 품목 대상 (부품, 제작수량) -->
|
||||
<select id="getProposalTargetPartsFromManualProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
SRP.OBJID,
|
||||
SRP.PART_OBJID,
|
||||
PM.PART_NO,
|
||||
PM.PART_NAME,
|
||||
SRP.QTY,
|
||||
SRP.PRODUCTION_QTY AS QTY,
|
||||
SRP.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||
SRP.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||
SRP.PROCESSING_VENDOR AS VENDOR_PM,
|
||||
@@ -4177,7 +4225,8 @@ ORDER BY V.PATH2
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 소재 -->
|
||||
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 공급업체 -->
|
||||
<!-- 그룹핑된 합산 데이터를 직접 INSERT (동일 품번 합산 대응) -->
|
||||
<insert id="insertProposalPartFromMBom" parameterType="map">
|
||||
INSERT INTO SALES_REQUEST_PART (
|
||||
OBJID,
|
||||
@@ -4194,27 +4243,26 @@ ORDER BY V.PATH2
|
||||
PROPOSAL_DATE,
|
||||
WRITER,
|
||||
REGDATE
|
||||
)
|
||||
SELECT
|
||||
) VALUES (
|
||||
#{NEW_OBJID},
|
||||
#{PROPOSAL_MASTER_OBJID},
|
||||
PART_OBJID,
|
||||
QTY,
|
||||
UNIT,
|
||||
UNIT_PRICE,
|
||||
TOTAL_PRICE,
|
||||
VENDOR AS VENDOR_PM,
|
||||
NET_QTY,
|
||||
PO_QTY,
|
||||
USE_YN,
|
||||
NOW() AS PROPOSAL_DATE,
|
||||
#{PART_OBJID},
|
||||
#{QTY},
|
||||
#{UNIT},
|
||||
#{UNIT_PRICE},
|
||||
#{TOTAL_PRICE},
|
||||
#{VENDOR_PM},
|
||||
#{NET_QTY},
|
||||
#{PO_QTY},
|
||||
#{USE_YN},
|
||||
NOW(),
|
||||
#{WRITER},
|
||||
NOW()
|
||||
FROM MBOM_DETAIL
|
||||
WHERE OBJID = #{SOURCE_OBJID}
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 가공 -->
|
||||
<!-- 그룹핑된 합산 데이터를 직접 INSERT (동일 품번 합산 대응) -->
|
||||
<insert id="insertProposalPartFromMBomProcessing" parameterType="map">
|
||||
INSERT INTO SALES_REQUEST_PART (
|
||||
OBJID,
|
||||
@@ -4231,27 +4279,26 @@ ORDER BY V.PATH2
|
||||
PROPOSAL_DATE,
|
||||
WRITER,
|
||||
REGDATE
|
||||
)
|
||||
SELECT
|
||||
) VALUES (
|
||||
#{NEW_OBJID},
|
||||
#{PROPOSAL_MASTER_OBJID},
|
||||
PART_OBJID,
|
||||
PRODUCTION_QTY AS QTY,
|
||||
UNIT,
|
||||
PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||
PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||
PROCESSING_VENDOR AS VENDOR_PM,
|
||||
NET_QTY,
|
||||
PO_QTY,
|
||||
USE_YN,
|
||||
NOW() AS PROPOSAL_DATE,
|
||||
#{PART_OBJID},
|
||||
#{QTY},
|
||||
#{UNIT},
|
||||
#{UNIT_PRICE},
|
||||
#{TOTAL_PRICE},
|
||||
#{VENDOR_PM},
|
||||
#{NET_QTY},
|
||||
#{PO_QTY},
|
||||
#{USE_YN},
|
||||
NOW(),
|
||||
#{WRITER},
|
||||
NOW()
|
||||
FROM MBOM_DETAIL
|
||||
WHERE OBJID = #{SOURCE_OBJID}
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!-- 품의서용 SALES_REQUEST_PART 생성 (수동 작성 품목 복사) - 소재 -->
|
||||
<!-- 품의서용 SALES_REQUEST_PART 생성 (수동 작성 품목 복사) - 공급업체 -->
|
||||
<!-- 소재 유무에 따라 QTY/TOTAL_PRICE 분기 -->
|
||||
<insert id="insertProposalPartFromManual" parameterType="map">
|
||||
INSERT INTO SALES_REQUEST_PART (
|
||||
OBJID,
|
||||
@@ -4273,10 +4320,16 @@ ORDER BY V.PATH2
|
||||
#{NEW_OBJID},
|
||||
#{PROPOSAL_MASTER_OBJID},
|
||||
PART_OBJID,
|
||||
QTY,
|
||||
CASE WHEN RAW_MATERIAL_NO IS NOT NULL AND RAW_MATERIAL_NO != ''
|
||||
THEN PO_QTY
|
||||
ELSE PRODUCTION_QTY
|
||||
END AS QTY,
|
||||
UNIT,
|
||||
UNIT_PRICE,
|
||||
TOTAL_PRICE,
|
||||
CASE WHEN RAW_MATERIAL_NO IS NOT NULL AND RAW_MATERIAL_NO != ''
|
||||
THEN COALESCE(UNIT_PRICE, 0) * COALESCE(PO_QTY, 0)
|
||||
ELSE COALESCE(UNIT_PRICE, 0) * COALESCE(PRODUCTION_QTY, 0)
|
||||
END AS TOTAL_PRICE,
|
||||
VENDOR_PM,
|
||||
NET_QTY,
|
||||
PO_QTY,
|
||||
|
||||
@@ -62,6 +62,9 @@ public class ContractMgmtService {
|
||||
@Autowired
|
||||
CommonService commonService;
|
||||
|
||||
@Autowired
|
||||
com.pms.service.ProductionPlanningService productionPlanningService;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 계약관리 목록 조회
|
||||
@@ -2784,6 +2787,16 @@ private String encodeImageToBase64(String imagePath) {
|
||||
// 프로젝트 SETUP_TASK 등록
|
||||
cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", projectParam);
|
||||
|
||||
// 동일 품번 M-BOM 자동 복사 (Machine 제외)
|
||||
if(!isMachine) {
|
||||
copyMbomIfSamePartNoExists(sqlSession,
|
||||
(String)projectParam.get("OBJID"),
|
||||
CommonUtils.checkNull(item.get("PART_NO")),
|
||||
CommonUtils.checkNull(item.get("PART_NAME")),
|
||||
person.getUserId(),
|
||||
itemQuantity);
|
||||
}
|
||||
|
||||
// project_no - unit 폴더 생성
|
||||
Map<String,Object> projectInfo = (Map)sqlSession.selectOne("project.getProjectMngInfo", projectParam);
|
||||
|
||||
@@ -2999,6 +3012,16 @@ private String encodeImageToBase64(String imagePath) {
|
||||
// 프로젝트 SETUP_TASK 등록
|
||||
cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", projectParam);
|
||||
|
||||
// 동일 품번 M-BOM 자동 복사 (Machine 제외)
|
||||
if(!isMachine) {
|
||||
copyMbomIfSamePartNoExists(sqlSession,
|
||||
(String)projectParam.get("OBJID"),
|
||||
CommonUtils.checkNull(item.get("PART_NO")),
|
||||
CommonUtils.checkNull(item.get("PART_NAME")),
|
||||
person.getUserId(),
|
||||
itemQuantity);
|
||||
}
|
||||
|
||||
// project_no - unit 폴더 생성
|
||||
Map<String,Object> projectInfo = (Map)sqlSession.selectOne("project.getProjectMngInfo", projectParam);
|
||||
|
||||
@@ -3787,4 +3810,33 @@ private String encodeImageToBase64(String imagePath) {
|
||||
if(sqlSession != null) sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 동일 품번의 최신 M-BOM이 있으면 자동 복사
|
||||
* 프로젝트 자동생성 시 WBS TASK 등록 직후 호출
|
||||
*/
|
||||
private void copyMbomIfSamePartNoExists(SqlSession sqlSession, String projectObjId,
|
||||
String partNo, String partName, String userId, int orderQuantity) {
|
||||
try {
|
||||
if(partNo == null || partNo.isEmpty()) return;
|
||||
|
||||
// 동일 품번의 최신 M-BOM 템플릿 조회
|
||||
Map<String, Object> templateParam = new HashMap<>();
|
||||
templateParam.put("partNo", partNo);
|
||||
Map<String, Object> template = sqlSession.selectOne("productionplanning.getLatestMbomTemplateByPartNo", templateParam);
|
||||
|
||||
if(template != null && !template.isEmpty()) {
|
||||
template = CommonUtils.toUpperCaseMapKey(template);
|
||||
String templateHeaderObjid = CommonUtils.checkNull(template.get("TEMPLATE_HEADER_OBJID"));
|
||||
|
||||
System.out.println("동일 품번(" + partNo + ") M-BOM 발견 → 프로젝트(" + projectObjId + ")에 자동 복사 (수주수량: " + orderQuantity + ")");
|
||||
|
||||
productionPlanningService.copyMbomFromTemplate(
|
||||
sqlSession, userId, projectObjId, templateHeaderObjid, partNo, partName, orderQuantity);
|
||||
}
|
||||
} catch(Exception e) {
|
||||
System.out.println("M-BOM 자동 복사 중 오류 (프로젝트 생성에는 영향 없음): " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2199,20 +2199,30 @@ public class SalesMngService {
|
||||
Map partParam = new HashMap();
|
||||
partParam.put("NEW_OBJID", CommonUtils.createObjId());
|
||||
partParam.put("PROPOSAL_MASTER_OBJID", proposalMasterObjid);
|
||||
partParam.put("SOURCE_OBJID", sourceObjid);
|
||||
partParam.put("WRITER", userId);
|
||||
partParam.put("PROPOSAL_TYPE", proposalType);
|
||||
|
||||
// M-BOM 기반 여부 + 소재/가공 구분에 따라 INSERT 쿼리 분기
|
||||
if(!mbomHeaderObjid.isEmpty()) {
|
||||
// M-BOM 기반
|
||||
// M-BOM 기반: 그룹핑된 합산 데이터를 직접 파라미터로 전달
|
||||
partParam.put("PART_OBJID", part.get("PART_OBJID"));
|
||||
partParam.put("QTY", part.get("QTY"));
|
||||
partParam.put("UNIT", CommonUtils.checkNull(part.get("UNIT")));
|
||||
partParam.put("UNIT_PRICE", part.get("UNIT_PRICE"));
|
||||
partParam.put("TOTAL_PRICE", part.get("TOTAL_PRICE"));
|
||||
partParam.put("VENDOR_PM", CommonUtils.checkNull(part.get("VENDOR_PM")));
|
||||
partParam.put("NET_QTY", part.get("NET_QTY"));
|
||||
partParam.put("PO_QTY", part.get("PO_QTY"));
|
||||
partParam.put("USE_YN", CommonUtils.checkNull(part.get("USE_YN")));
|
||||
|
||||
if("PROCESSING".equals(proposalType)) {
|
||||
sqlSession.insert("salesMng.insertProposalPartFromMBomProcessing", partParam);
|
||||
} else {
|
||||
sqlSession.insert("salesMng.insertProposalPartFromMBom", partParam);
|
||||
}
|
||||
} else {
|
||||
// 수동 작성
|
||||
// 수동 작성: 기존 방식 유지 (SALES_REQUEST_PART에서 개별 복사)
|
||||
partParam.put("SOURCE_OBJID", sourceObjid);
|
||||
if("PROCESSING".equals(proposalType)) {
|
||||
sqlSession.insert("salesMng.insertProposalPartFromManualProcessing", partParam);
|
||||
} else {
|
||||
|
||||
@@ -1105,48 +1105,53 @@ public class ProductionPlanningService {
|
||||
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
|
||||
// 현재 날짜 (YYMMDD)
|
||||
mbomNo = generateMbomNo(sqlSession, sourceBomType, baseBomPartNo);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
return mbomNo;
|
||||
}
|
||||
|
||||
/**
|
||||
* M-BOM 품번 생성 (기존 트랜잭션 공유)
|
||||
*/
|
||||
public String generateMbomNo(SqlSession sqlSession, String sourceBomType, String baseBomPartNo) {
|
||||
String mbomNo = "";
|
||||
|
||||
try {
|
||||
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyMMdd");
|
||||
String dateStr = sdf.format(new java.util.Date());
|
||||
|
||||
String mbomPrefix = "";
|
||||
|
||||
if("EBOM".equals(sourceBomType)) {
|
||||
// E-BOM 기준: M-{E-BOM품번}-YYMMDD
|
||||
// E-BOM 품번이 이미 M-으로 시작하면 중복 방지
|
||||
String cleanPartNo = baseBomPartNo;
|
||||
if(cleanPartNo.startsWith("M-")) {
|
||||
cleanPartNo = cleanPartNo.substring(2); // "M-" 제거
|
||||
cleanPartNo = cleanPartNo.substring(2);
|
||||
}
|
||||
mbomPrefix = "M-" + cleanPartNo + "-" + dateStr;
|
||||
} else if("TEMPLATE".equals(sourceBomType)) {
|
||||
// 템플릿 기준: M-{품번}-YYMMDD
|
||||
String cleanPartNo = baseBomPartNo.trim();
|
||||
if(cleanPartNo.startsWith("M-")) {
|
||||
cleanPartNo = cleanPartNo.substring(2); // "M-" 제거
|
||||
cleanPartNo = cleanPartNo.substring(2);
|
||||
}
|
||||
mbomPrefix = "M-" + cleanPartNo + "-" + dateStr;
|
||||
} else if("MBOM".equals(sourceBomType)) {
|
||||
// M-BOM 기준: 기존 M-BOM 품번에서 날짜/순번 부분 제거 후 새 날짜 추가
|
||||
// 예: M-000AN014000-251124-01 → M-000AN014000 → M-000AN014000-251126-01
|
||||
|
||||
String basePart = baseBomPartNo;
|
||||
|
||||
// 잘못된 형식 정규화 (M-M-..., M-E-... 등)
|
||||
// 예: M-M-000AN014000-251124-01-251124 → M-000AN014000-251124-01-251124
|
||||
while(basePart.startsWith("M-M-") || basePart.startsWith("M-E-")) {
|
||||
basePart = "M-" + basePart.substring(4);
|
||||
}
|
||||
|
||||
// 마지막의 모든 날짜-순번 패턴 제거 (중복 복사 대응)
|
||||
// 예: M-000AN014000-251124-01-251125-01 → M-000AN014000
|
||||
// 날짜(6자리) 또는 순번(2자리)가 나오지 않을 때까지 반복
|
||||
while(true) {
|
||||
int lastDashIndex = basePart.lastIndexOf("-");
|
||||
if(lastDashIndex > 0) {
|
||||
String suffix = basePart.substring(lastDashIndex + 1);
|
||||
// 날짜(6자리) 또는 순번(2자리)인 경우만 제거
|
||||
if(suffix.matches("\\d{2}") || suffix.matches("\\d{6}")) {
|
||||
basePart = basePart.substring(0, lastDashIndex);
|
||||
} else {
|
||||
@@ -1157,28 +1162,21 @@ public class ProductionPlanningService {
|
||||
}
|
||||
}
|
||||
|
||||
// 새 날짜 추가
|
||||
mbomPrefix = basePart + "-" + dateStr;
|
||||
}
|
||||
|
||||
// 같은 날짜의 최대 순번 조회
|
||||
Map<String, Object> seqParam = new HashMap<>();
|
||||
seqParam.put("mbomPrefix", mbomPrefix);
|
||||
|
||||
Integer maxSeq = (Integer) sqlSession.selectOne("productionplanning.getMaxMbomSeqByDate", seqParam);
|
||||
int nextSeq = (maxSeq != null ? maxSeq : 0) + 1;
|
||||
|
||||
// 최종 M-BOM 품번 생성
|
||||
mbomNo = mbomPrefix + "-" + String.format("%02d", nextSeq);
|
||||
|
||||
System.out.println("생성된 M-BOM 품번: " + mbomNo);
|
||||
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
return mbomNo;
|
||||
@@ -1591,6 +1589,175 @@ public class ProductionPlanningService {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 동일 품번의 최신 M-BOM을 새 프로젝트에 자동 복사 (독립 트랜잭션)
|
||||
*/
|
||||
public String copyMbomFromTemplate(HttpServletRequest request, String projectObjId,
|
||||
String templateHeaderObjId, String partNo, String partName, int orderQuantity) {
|
||||
SqlSession sqlSession = null;
|
||||
String newHeaderObjid = null;
|
||||
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
|
||||
HttpSession session = request.getSession();
|
||||
PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN);
|
||||
String userId = CommonUtils.checkNull(person.getUserId());
|
||||
|
||||
newHeaderObjid = copyMbomFromTemplate(sqlSession, userId, projectObjId, templateHeaderObjId, partNo, partName, orderQuantity);
|
||||
|
||||
if(newHeaderObjid != null) {
|
||||
sqlSession.commit();
|
||||
}
|
||||
} catch(Exception e) {
|
||||
if(sqlSession != null) sqlSession.rollback();
|
||||
newHeaderObjid = null;
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(sqlSession != null) sqlSession.close();
|
||||
}
|
||||
|
||||
return newHeaderObjid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 동일 품번의 최신 M-BOM을 새 프로젝트에 자동 복사 (기존 트랜잭션 공유)
|
||||
* 수주 확정 → 프로젝트 자동생성 시 ContractMgmtService에서 호출
|
||||
*/
|
||||
public String copyMbomFromTemplate(SqlSession sqlSession, String userId, String projectObjId,
|
||||
String templateHeaderObjId, String partNo, String partName, int orderQuantity) {
|
||||
String newHeaderObjid = null;
|
||||
|
||||
try {
|
||||
// 1. 새 MBOM_HEADER 생성 (M-BOM 품번 규칙 적용)
|
||||
newHeaderObjid = CommonUtils.createObjId();
|
||||
String mbomNo = generateMbomNo(sqlSession, "TEMPLATE", partNo);
|
||||
Map<String, Object> headerParam = new HashMap<>();
|
||||
headerParam.put("objid", newHeaderObjid);
|
||||
headerParam.put("mbomNo", mbomNo);
|
||||
headerParam.put("sourceBomType", "TEMPLATE");
|
||||
headerParam.put("sourceEbomObjid", null);
|
||||
headerParam.put("sourceMbomObjid", templateHeaderObjId);
|
||||
headerParam.put("projectObjId", projectObjId);
|
||||
headerParam.put("partNo", partNo);
|
||||
headerParam.put("partName", partName);
|
||||
headerParam.put("sessionUserId", userId);
|
||||
sqlSession.insert("productionplanning.insertMbomHeader", headerParam);
|
||||
|
||||
// 2. 템플릿의 MBOM_DETAIL 조회
|
||||
Map<String, Object> detailParam = new HashMap<>();
|
||||
detailParam.put("mbomHeaderObjid", templateHeaderObjId);
|
||||
List<Map<String, Object>> templateDetails = sqlSession.selectList("productionplanning.getMbomDetailList", detailParam);
|
||||
|
||||
if(templateDetails != null && !templateDetails.isEmpty()) {
|
||||
// 3. CHILD_OBJID 매핑 생성 (old → new)
|
||||
Map<String, String> childObjidMap = new HashMap<>();
|
||||
for(Map<String, Object> detail : templateDetails) {
|
||||
detail = CommonUtils.toUpperCaseMapKey(detail);
|
||||
String oldObjid = CommonUtils.checkNull(detail.get("OBJID"));
|
||||
String oldChildObjid = CommonUtils.checkNull(detail.get("CHILD_OBJID"));
|
||||
if(!"".equals(oldObjid)) {
|
||||
childObjidMap.put(oldObjid, CommonUtils.createObjId());
|
||||
}
|
||||
if(!"".equals(oldChildObjid) && !childObjidMap.containsKey(oldChildObjid)) {
|
||||
childObjidMap.put(oldChildObjid, CommonUtils.createObjId());
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 매핑 적용하여 MBOM_DETAIL 복사 (수주/제작 수량은 초기화)
|
||||
for(Map<String, Object> detail : templateDetails) {
|
||||
detail = CommonUtils.toUpperCaseMapKey(detail);
|
||||
String oldObjid = CommonUtils.checkNull(detail.get("OBJID"));
|
||||
String oldChildObjid = CommonUtils.checkNull(detail.get("CHILD_OBJID"));
|
||||
String oldParentObjid = CommonUtils.checkNull(detail.get("PARENT_OBJID"));
|
||||
|
||||
String newObjid = childObjidMap.containsKey(oldObjid) ? childObjidMap.get(oldObjid) : CommonUtils.createObjId();
|
||||
String newChildObjid = childObjidMap.containsKey(oldChildObjid) ? childObjidMap.get(oldChildObjid) : newObjid;
|
||||
String newParentObjid = !"".equals(oldParentObjid)
|
||||
? (childObjidMap.containsKey(oldParentObjid) ? childObjidMap.get(oldParentObjid) : oldParentObjid) : "";
|
||||
|
||||
Map<String, Object> insertParam = new HashMap<>();
|
||||
insertParam.put("objid", newObjid);
|
||||
insertParam.put("mbomHeaderObjid", newHeaderObjid);
|
||||
insertParam.put("parentObjid", newParentObjid);
|
||||
insertParam.put("childObjid", newChildObjid);
|
||||
insertParam.put("seq", detail.get("SEQ"));
|
||||
insertParam.put("level", detail.get("LEVEL"));
|
||||
insertParam.put("partObjid", detail.get("PART_OBJID"));
|
||||
insertParam.put("partNo", detail.get("PART_NO"));
|
||||
insertParam.put("partName", detail.get("PART_NAME"));
|
||||
insertParam.put("qty", detail.get("QTY"));
|
||||
insertParam.put("unit", detail.get("UNIT"));
|
||||
insertParam.put("supplyType", detail.get("SUPPLY_TYPE"));
|
||||
insertParam.put("makeOrBuy", detail.get("MAKE_OR_BUY"));
|
||||
insertParam.put("rawMaterialPartNo", detail.get("RAW_MATERIAL_PART_NO"));
|
||||
insertParam.put("rawMaterialSpec", detail.get("RAW_MATERIAL_SPEC"));
|
||||
insertParam.put("rawMaterial", detail.get("RAW_MATERIAL"));
|
||||
insertParam.put("rawMaterialSize", detail.get("RAW_MATERIAL_SIZE"));
|
||||
insertParam.put("processingVendor", detail.get("PROCESSING_VENDOR"));
|
||||
insertParam.put("processingDeadline", detail.get("PROCESSING_DEADLINE"));
|
||||
insertParam.put("grindingDeadline", detail.get("GRINDING_DEADLINE"));
|
||||
// REQUIRED_QTY(소요량)는 원본 복사, 나머지 수량은 수주수량 기준 재계산
|
||||
double requiredQty = 0;
|
||||
try {
|
||||
Object reqObj = detail.get("REQUIRED_QTY");
|
||||
if(reqObj != null) requiredQty = Double.parseDouble(String.valueOf(reqObj));
|
||||
} catch(Exception ignore) {}
|
||||
|
||||
double productionQty = requiredQty * orderQuantity;
|
||||
|
||||
insertParam.put("requiredQty", detail.get("REQUIRED_QTY"));
|
||||
insertParam.put("orderQty", null);
|
||||
insertParam.put("productionQty", productionQty > 0 ? productionQty : null);
|
||||
insertParam.put("stockQty", null);
|
||||
insertParam.put("shortageQty", null);
|
||||
insertParam.put("netQty", null);
|
||||
insertParam.put("poQty", null);
|
||||
insertParam.put("vendor", detail.get("VENDOR"));
|
||||
insertParam.put("unitPrice", detail.get("UNIT_PRICE"));
|
||||
insertParam.put("processingUnitPrice", detail.get("PROCESSING_UNIT_PRICE"));
|
||||
insertParam.put("totalPrice", null);
|
||||
insertParam.put("currency", detail.get("CURRENCY"));
|
||||
insertParam.put("leadTime", detail.get("LEAD_TIME"));
|
||||
insertParam.put("minOrderQty", detail.get("MIN_ORDER_QTY"));
|
||||
insertParam.put("proposalDate", null);
|
||||
insertParam.put("remark", detail.get("REMARK"));
|
||||
insertParam.put("sessionUserId", userId);
|
||||
|
||||
sqlSession.insert("productionplanning.insertMbomDetail", insertParam);
|
||||
}
|
||||
}
|
||||
|
||||
// 5. PROJECT_MGMT MBOM_STATUS 업데이트
|
||||
Map<String, Object> statusParam = new HashMap<>();
|
||||
statusParam.put("projectObjId", projectObjId);
|
||||
statusParam.put("sessionUserId", userId);
|
||||
sqlSession.update("productionplanning.updateProjectMbomStatus", statusParam);
|
||||
|
||||
// 6. 이력 저장
|
||||
String historyObjid = CommonUtils.createObjId();
|
||||
Map<String, Object> historyParam = new HashMap<>();
|
||||
historyParam.put("objid", historyObjid);
|
||||
historyParam.put("mbomHeaderObjid", newHeaderObjid);
|
||||
historyParam.put("changeType", "COPY_FROM_TEMPLATE");
|
||||
historyParam.put("changeDescription", "동일 품번(" + partNo + ") M-BOM 자동 복사");
|
||||
historyParam.put("beforeData", "{}");
|
||||
historyParam.put("afterData", "{\"sourceHeaderObjid\":\"" + templateHeaderObjId + "\"}");
|
||||
historyParam.put("sessionUserId", userId);
|
||||
sqlSession.insert("productionplanning.insertMbomHistory", historyParam);
|
||||
|
||||
System.out.println("========== M-BOM 자동 복사 완료 ==========");
|
||||
System.out.println("프로젝트: " + projectObjId);
|
||||
System.out.println("원본 템플릿: " + templateHeaderObjId);
|
||||
System.out.println("새 M-BOM: " + newHeaderObjid);
|
||||
|
||||
} catch(Exception e) {
|
||||
newHeaderObjid = null;
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return newHeaderObjid;
|
||||
}
|
||||
|
||||
/**
|
||||
* MBOM_HEADER 테이블에 해당 OBJID가 존재하는지 확인
|
||||
* @param objId
|
||||
|
||||
Reference in New Issue
Block a user