발주취소 기능 추가, 발주서 메일 발송 시 도면 첨부 선택 기능 추가

This commit is contained in:
2026-01-16 16:54:52 +09:00
parent e8d9f273e0
commit ec94dde67a
6 changed files with 434 additions and 12 deletions

View File

@@ -2112,6 +2112,44 @@ public class PurchaseOrderController {
return resultMap;
}
/**
* 도면 파일 개수 조회 (AJAX)
* @param request
* @param paramMap - objId (PURCHASE_ORDER_MASTER_OBJID)
* @return
*/
@ResponseBody
@RequestMapping("/purchaseOrder/getDrawingFileCount.do")
public Map getDrawingFileCount(HttpServletRequest request, @RequestParam Map paramMap){
Map resultMap = new HashMap();
try {
String objId = CommonUtils.checkNull(paramMap.get("objId"));
if("".equals(objId)){
resultMap.put("result", "error");
resultMap.put("message", "잘못된 요청입니다.");
return resultMap;
}
// 도면 파일 개수 조회
paramMap.put("PURCHASE_ORDER_MASTER_OBJID", objId);
paramMap.put("MULTI_MASTER_OBJID", objId);
List fileList = commonService.selectList("purchaseOrder.purchaseOrderPartFileListForMail", null, paramMap);
int count = (fileList != null) ? fileList.size() : 0;
resultMap.put("result", "success");
resultMap.put("count", count);
} catch (Exception e) {
e.printStackTrace();
resultMap.put("result", "error");
resultMap.put("message", "도면 파일 조회 중 오류가 발생했습니다.");
}
return resultMap;
}
/**
* PDF 청크 업로드 (AJAX)
* @param request
@@ -2234,4 +2272,48 @@ public class PurchaseOrderController {
return resultMap;
}
/**
* 발주 취소 전 입고 여부 확인
* @param request
* @param paramMap
* @return
*/
@ResponseBody
@RequestMapping("/purchaseOrder/checkReceiptForCancel.do")
public Map checkReceiptForCancel(HttpServletRequest request, @RequestParam Map paramMap){
Map resultMap = new HashMap();
try {
resultMap = purchaseOrderService.checkReceiptForCancel(request, paramMap);
} catch (Exception e) {
e.printStackTrace();
resultMap.put("hasReceipt", true);
resultMap.put("message", "입고 확인 중 오류가 발생했습니다.");
}
return resultMap;
}
/**
* 발주 취소 실행 (입고가 없는 경우만)
* @param request
* @param paramMap
* @return
*/
@ResponseBody
@RequestMapping("/purchaseOrder/executeOrderCancel.do")
public Map executeOrderCancel(HttpServletRequest request, @RequestParam Map paramMap){
Map resultMap = new HashMap();
try {
resultMap = purchaseOrderService.executeOrderCancel(request, paramMap);
} catch (Exception e) {
e.printStackTrace();
resultMap.put("result", false);
resultMap.put("message", "발주 취소 중 오류가 발생했습니다: " + e.getMessage());
}
return resultMap;
}
}

View File

@@ -4246,6 +4246,7 @@ SELECT T.*
<select id="deliveryMngList_new" parameterType="map" resultType="map">
SELECT POM.OBJID
,POM.STATUS
<!-- ,TO_CHAR(CM.REGDATE, 'YYYY') AS CM_YEAR -->
,TO_CHAR(POM.REGDATE,'YYYY') AS POM_YEAR
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID::VARCHAR = CM.CUSTOMER_OBJID) AS CUSTOMER_NAME
@@ -6123,4 +6124,31 @@ FROM(
ORDER BY PART_NO
</select>
<!-- 발주 취소를 위한 입고 수량 조회 (ARRIVAL_PLAN 테이블) -->
<select id="getTotalReceiptQtyForCancel" parameterType="map" resultType="map">
SELECT
COALESCE(SUM(
CASE
WHEN AP.RECEIPT_QTY IS NULL OR AP.RECEIPT_QTY = '' THEN 0
ELSE AP.RECEIPT_QTY::NUMERIC
END
), 0) AS TOTAL_RECEIPT_QTY
FROM ARRIVAL_PLAN AP
WHERE AP.PARENT_OBJID = #{PURCHASE_ORDER_MASTER_OBJID}
</select>
<!-- 발주 취소 상태 업데이트 -->
<update id="updateOrderCancelStatus" parameterType="map">
UPDATE PURCHASE_ORDER_MASTER
SET STATUS = #{STATUS}
WHERE OBJID = #{OBJID}
</update>
<!-- 동시발주 하위건 발주 취소 상태 업데이트 -->
<update id="updateOrderCancelStatusMulti" parameterType="map">
UPDATE PURCHASE_ORDER_MASTER
SET STATUS = #{STATUS}
WHERE MULTI_MASTER_OBJID = #{OBJID}
</update>
</mapper>

View File

@@ -2961,6 +2961,8 @@ public class PurchaseOrderService {
String contents = CommonUtils.checkNull(paramMap.get("contents"));
String writerEmail = CommonUtils.checkNull(paramMap.get("WRITER_EMAIL"));
String writer = CommonUtils.checkNull(paramMap.get("WRITER"));
// 도면 파일 첨부 여부 (기본값: Y)
String includeDrawingFiles = CommonUtils.checkNull(paramMap.get("includeDrawingFiles"), "Y");
// 발주서 정보 조회
Map infoParam = new HashMap();
@@ -3035,8 +3037,8 @@ public class PurchaseOrderService {
attachFileList.add(excelFile);
}
// 2. 도면 파일 압축 첨부
if(partFileList != null && partFileList.size() > 0) {
// 2. 도면 파일 압축 첨부 (includeDrawingFiles가 Y인 경우에만)
if("Y".equals(includeDrawingFiles) && partFileList != null && partFileList.size() > 0) {
File zf = MailUtil.zipFileListMail(zipName, partFileList);
if(zf != null && zf.exists()) {
HashMap hm = new HashMap();
@@ -3177,4 +3179,126 @@ public class PurchaseOrderService {
}
return resultMap;
}
/**
* 발주 취소 전 입고 여부 확인
* @param request
* @param paramMap
* @return hasReceipt: 입고 여부, totalReceiptQty: 총 입고수량
*/
public Map checkReceiptForCancel(HttpServletRequest request, Map paramMap) throws Exception {
Map resultMap = new HashMap();
SqlSession sqlSession = null;
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession();
String purchaseOrderMasterObjid = CommonUtils.checkNull(paramMap.get("PURCHASE_ORDER_MASTER_OBJID"));
if(purchaseOrderMasterObjid.isEmpty()) {
resultMap.put("hasReceipt", true);
resultMap.put("message", "발주서 정보가 없습니다.");
return resultMap;
}
// 입고 수량 조회 (ARRIVAL_PLAN 테이블에서 RECEIPT_QTY 합계)
Map queryParam = new HashMap();
queryParam.put("PURCHASE_ORDER_MASTER_OBJID", purchaseOrderMasterObjid);
Map receiptInfo = (Map)sqlSession.selectOne("purchaseOrder.getTotalReceiptQtyForCancel", queryParam);
int totalReceiptQty = 0;
if(receiptInfo != null) {
// 대소문자 구분 없이 키 찾기
Object qtyValue = receiptInfo.get("TOTAL_RECEIPT_QTY");
if(qtyValue == null) {
qtyValue = receiptInfo.get("total_receipt_qty");
}
if(qtyValue != null) {
totalReceiptQty = Integer.parseInt(qtyValue.toString());
}
System.out.println("=== 발주취소 입고확인(check) === OBJID: " + purchaseOrderMasterObjid + ", receiptInfo: " + receiptInfo + ", totalReceiptQty: " + totalReceiptQty);
}
resultMap.put("hasReceipt", totalReceiptQty > 0);
resultMap.put("totalReceiptQty", totalReceiptQty);
} finally {
if(sqlSession != null) sqlSession.close();
}
return resultMap;
}
/**
* 발주 취소 실행 (입고가 없는 경우만)
* STATUS를 'orderCancel'로 변경
* @param request
* @param paramMap
* @return
*/
public Map executeOrderCancel(HttpServletRequest request, Map paramMap) throws Exception {
Map resultMap = new HashMap();
SqlSession sqlSession = null;
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
String purchaseOrderMasterObjid = CommonUtils.checkNull(paramMap.get("PURCHASE_ORDER_MASTER_OBJID"));
if(purchaseOrderMasterObjid.isEmpty()) {
resultMap.put("result", false);
resultMap.put("message", "발주서 정보가 없습니다.");
return resultMap;
}
// 입고 여부 재확인
Map queryParam = new HashMap();
queryParam.put("PURCHASE_ORDER_MASTER_OBJID", purchaseOrderMasterObjid);
Map receiptInfo = (Map)sqlSession.selectOne("purchaseOrder.getTotalReceiptQtyForCancel", queryParam);
int totalReceiptQty = 0;
if(receiptInfo != null) {
// 대소문자 구분 없이 키 찾기
Object qtyValue = receiptInfo.get("TOTAL_RECEIPT_QTY");
if(qtyValue == null) {
qtyValue = receiptInfo.get("total_receipt_qty");
}
if(qtyValue != null) {
totalReceiptQty = Integer.parseInt(qtyValue.toString());
}
System.out.println("=== 발주취소 입고확인 === OBJID: " + purchaseOrderMasterObjid + ", receiptInfo: " + receiptInfo + ", totalReceiptQty: " + totalReceiptQty);
}
if(totalReceiptQty > 0) {
resultMap.put("result", false);
resultMap.put("message", "입고된 항목이 있어 취소할 수 없습니다. (입고수량: " + totalReceiptQty + ")");
return resultMap;
}
// 발주 취소 처리 (STATUS = 'orderCancel')
Map updateParam = new HashMap();
updateParam.put("OBJID", purchaseOrderMasterObjid);
updateParam.put("STATUS", "orderCancel");
sqlSession.update("purchaseOrder.updateOrderCancelStatus", updateParam);
// 동시발주 하위건도 함께 취소
sqlSession.update("purchaseOrder.updateOrderCancelStatusMulti", updateParam);
sqlSession.commit();
resultMap.put("result", true);
resultMap.put("message", "발주가 취소되었습니다.");
} catch(Exception e) {
if(sqlSession != null) sqlSession.rollback();
throw e;
} finally {
if(sqlSession != null) sqlSession.close();
}
return resultMap;
}
}