m-bom 버전 이력 팝업 & 총단가 저장 안되는 오류 수정 등...

This commit is contained in:
2025-11-28 18:38:23 +09:00
parent 91edcb9fe7
commit 169fbeda16
8 changed files with 347 additions and 75 deletions

View File

@@ -1606,4 +1606,28 @@ public class ProductionPlanningController extends BaseService {
}
return resultMap;
}
/**
* M-BOM 이력 팝업
*/
@RequestMapping("/productionplanning/mBomHistoryPopup.do")
public String mBomHistoryPopup(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
try {
String mbomHeaderObjid = CommonUtils.checkNull(paramMap.get("mbomHeaderObjid"));
if(!"".equals(mbomHeaderObjid)) {
// M-BOM 헤더 정보 조회
paramMap.put("mbomHeaderObjid", mbomHeaderObjid);
Map<String, Object> mbomHeader = commonService.selectOne("productionplanning.getMbomHeaderByObjid", request, paramMap);
request.setAttribute("mbomHeader", mbomHeader);
// M-BOM 이력 조회
List<Map<String, Object>> historyList = commonService.selectList("productionplanning.getMbomHistoryList", request, paramMap);
request.setAttribute("historyList", historyList);
}
} catch(Exception e) {
e.printStackTrace();
}
return "/productionplanning/mBomHistoryPopup";
}
}

View File

@@ -2922,8 +2922,8 @@
WHERE CIS.ITEM_OBJID = CI.OBJID
AND UPPER(CIS.STATUS) = 'ACTIVE'
AND CIS.SERIAL_NO IS NOT NULL) AS SERIAL_NO,
-- 수량: CONTRACT_ITEM의 수량
COALESCE(CI.ORDER_QUANTITY::numeric, PM.QUANTITY::numeric, 0) AS QUANTITY,
-- 수량: PROJECT_MGMT 우선
COALESCE(PM.QUANTITY::numeric, CI.ORDER_QUANTITY::numeric, 0) AS QUANTITY,
-- 요청납기: CONTRACT_ITEM 우선
COALESCE(CI.DUE_DATE, PM.DUE_DATE, CM.req_del_date) AS REQ_DEL_DATE,
-- 고객요청사항: CONTRACT_ITEM에서 가져옴
@@ -3805,7 +3805,7 @@
<if test="proposalDate != null">
PROPOSAL_DATE,
</if>
STATUS, WRITER, REGDATE, REMARK
STATUS, WRITER, REGDATE, EDITER, EDIT_DATE, REMARK
) VALUES (
#{objid}, #{mbomHeaderObjid}, #{parentObjid}, #{childObjid}, #{seq}, #{level},
#{partObjid}, #{partNo}, #{partName}, #{qty}, #{unit},
@@ -3818,7 +3818,7 @@
<if test="proposalDate != null">
#{proposalDate},
</if>
'ACTIVE', #{sessionUserId}, NOW(), #{remark}
'ACTIVE', #{sessionUserId}, NOW(), #{sessionUserId}, NOW(), #{remark}
)
</insert>
@@ -3884,6 +3884,41 @@
ORDER BY REGDATE DESC, MBOM_NO
</select>
<!-- M-BOM 헤더 정보 조회 (OBJID로) -->
<select id="getMbomHeaderByObjid" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
OBJID,
MBOM_NO,
PART_NO,
PART_NAME,
SOURCE_BOM_TYPE,
TO_CHAR(REGDATE, 'YYYY-MM-DD HH24:MI:SS') AS REGDATE,
WRITER,
TO_CHAR(EDIT_DATE, 'YYYY-MM-DD HH24:MI:SS') AS EDIT_DATE,
EDITER,
STATUS
FROM MBOM_HEADER
WHERE OBJID::VARCHAR = #{mbomHeaderObjid}
</select>
<!-- M-BOM 이력 조회 -->
<select id="getMbomHistoryList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MH.OBJID,
MH.MBOM_HEADER_OBJID,
MH.CHANGE_TYPE,
MH.CHANGE_DESCRIPTION,
TO_CHAR(MH.CHANGE_DATE, 'YYYY-MM-DD HH24:MI:SS') AS CHANGE_DATE,
MH.CHANGE_USER,
COALESCE(
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MH.CHANGE_USER LIMIT 1),
MH.CHANGE_USER
) AS CHANGE_USER_NAME
FROM MBOM_HISTORY MH
WHERE MH.MBOM_HEADER_OBJID::VARCHAR = #{mbomHeaderObjid}
ORDER BY MH.CHANGE_DATE DESC
</select>
<!-- M-BOM 상세 리스트 조회 (이력용) -->
<select id="getMbomDetailList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT

View File

@@ -753,8 +753,8 @@ VALUES
#{SALES_BOM_QTY_OBJID },
#{PART_OBJID },
#{SALES_REQUEST_MASTER_OBJID},
#{QTY },
#{ORG_QTY },
COALESCE(NULLIF(TRIM(#{QTY}::TEXT), '')::NUMERIC, 0),
COALESCE(NULLIF(TRIM(#{ORG_QTY}::TEXT), '')::NUMERIC, 0),
#{PARTNER_OBJID },
#{PARTNER_PRICE },
#{DELIVERY_REQUEST_DATE },
@@ -768,8 +768,8 @@ VALUES
SALES_BOM_QTY_OBJID = #{SALES_BOM_QTY_OBJID },
PART_OBJID = #{PART_OBJID },
SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID},
QTY = #{QTY },
ORG_QTY = #{ORG_QTY },
QTY = COALESCE(NULLIF(TRIM(#{QTY}::TEXT), '')::NUMERIC, 0),
ORG_QTY = COALESCE(NULLIF(TRIM(#{ORG_QTY}::TEXT), '')::NUMERIC, 0),
PARTNER_OBJID = #{PARTNER_OBJID },
PARTNER_PRICE = #{PARTNER_PRICE },
DELIVERY_REQUEST_DATE = #{DELIVERY_REQUEST_DATE },

View File

@@ -1867,10 +1867,32 @@ public class PurchaseOrderService {
partParam.put("OBJID", CommonUtils.createObjId());
partParam.put("PURCHASE_ORDER_MASTER_OBJID", purchaseOrderMasterObjid);
partParam.put("PART_OBJID", CommonUtils.checkNull((String) partMap.get("part_objid")));
partParam.put("QTY", CommonUtils.checkNull(partMap.get("qty"), "0"));
// ORDER_QTY는 쿼리에서 PO_QTY 우선으로 계산된 값 사용
partParam.put("ORDER_QTY", CommonUtils.checkNull(partMap.get("order_qty"), "0"));
partParam.put("PARTNER_PRICE", CommonUtils.checkNull(partMap.get("partner_price"), "0"));
// 수량 처리
String qtyStr = CommonUtils.checkNull(partMap.get("qty"), "0");
String orderQtyStr = CommonUtils.checkNull(partMap.get("order_qty"), "0");
partParam.put("QTY", qtyStr);
partParam.put("ORDER_QTY", orderQtyStr);
// 단가 정보
String partnerPrice = CommonUtils.checkNull(partMap.get("partner_price"), "0");
String totalPrice = CommonUtils.checkNull(partMap.get("total_price"), "0");
partParam.put("PARTNER_PRICE", partnerPrice);
// 총액 계산 (품의서에서 가져온 TOTAL_PRICE 사용, 없으면 계산)
if ("0".equals(totalPrice) || "".equals(totalPrice)) {
try {
double orderQty = Double.parseDouble(orderQtyStr);
double price = Double.parseDouble(partnerPrice);
totalPrice = String.valueOf((long)(orderQty * price));
} catch (NumberFormatException e) {
totalPrice = "0";
}
}
partParam.put("SUPPLY_UNIT_PRICE", totalPrice);
partParam.put("PART_NO", CommonUtils.checkNull((String) partMap.get("part_no")));
partParam.put("PART_NAME", CommonUtils.checkNull((String) partMap.get("part_name")));
partParam.put("SPEC", CommonUtils.checkNull((String) partMap.get("spec")));