From 03d8cb481e8d54c23850e1653eeb098ef652624f Mon Sep 17 00:00:00 2001 From: syc0123 Date: Thu, 26 Mar 2026 15:53:26 +0900 Subject: [PATCH] =?UTF-8?q?[RAPID]=20=EC=88=98=EC=A3=BC=EB=B3=B5=EC=82=AC?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20-=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC/Controller/Service/Mapper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) --- .../view/contractMgmt/orderMgmtList.jsp | 45 ++++++ .../controller/ContractMgmtController.java | 17 ++ src/com/pms/salesmgmt/mapper/contractMgmt.xml | 145 ++++++++++++++++++ .../service/ContractMgmtService.java | 63 ++++++++ 4 files changed, 270 insertions(+) diff --git a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp index ee85be9..cf4522e 100644 --- a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp @@ -85,6 +85,50 @@ $(document).ready(function(){ } }); + //수주복사 + $("#btnCopy").click(function(){ + var selectedData = _tabulGrid.getSelectedData(); + if(selectedData.length < 1){ + Swal.fire("복사할 행을 선택해주십시오."); + return false; + } else if(selectedData.length > 1){ + Swal.fire("한번에 한개의 수주만 복사 가능합니다."); + return false; + } + + var sourceObjId = fnc_checkNull(selectedData[0].OBJID); + var contractNo = fnc_checkNull(selectedData[0].CONTRACT_NO); + + Swal.fire({ + title: '수주복사', + html: '[' + contractNo + '] 수주를 복사하시겠습니까?', + icon: 'question', + showCancelButton: true, + confirmButtonText: '복사', + cancelButtonText: '취소' + }).then((result) => { + if(result.isConfirmed) { + $.ajax({ + url: "/contractMgmt/copyEstimateAndOrderInfo.do", + type: "POST", + data: {"sourceObjId": sourceObjId}, + dataType: "json", + success: function(data) { + if(data.result == "SUCCESS") { + Swal.fire("복사가 완료되었습니다. (영업번호: " + data.newContractNo + ")"); + fn_search(); + } else { + Swal.fire("복사 중 오류가 발생했습니다."); + } + }, + error: function(jqxhr, status, error) { + Swal.fire("복사 중 오류가 발생했습니다. " + error); + } + }); + } + }); + }); + //결재상신 (Amaranth) $("#btnApproval").click(function(){ var selectedData = _tabulGrid.getSelectedData(); @@ -1055,6 +1099,7 @@ function openProjectFormPopUp(objId){
+ diff --git a/src/com/pms/salesmgmt/controller/ContractMgmtController.java b/src/com/pms/salesmgmt/controller/ContractMgmtController.java index 2854520..a2024b7 100644 --- a/src/com/pms/salesmgmt/controller/ContractMgmtController.java +++ b/src/com/pms/salesmgmt/controller/ContractMgmtController.java @@ -2783,6 +2783,23 @@ public class ContractMgmtController { return "/ajax/ajaxResult"; } + /** + * 수주 복사 + */ + @ResponseBody + @RequestMapping(value="/contractMgmt/copyEstimateAndOrderInfo.do", method=RequestMethod.POST) + public Map copyEstimateAndOrderInfo(HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + try { + resultMap = contractMgmtService.copyEstimateAndOrderInfo(request, paramMap); + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("result", "FAIL"); + resultMap.put("message", e.getMessage()); + } + return resultMap; + } + /** * 수주정보 저장 * @param session diff --git a/src/com/pms/salesmgmt/mapper/contractMgmt.xml b/src/com/pms/salesmgmt/mapper/contractMgmt.xml index d680e10..9d58bc3 100644 --- a/src/com/pms/salesmgmt/mapper/contractMgmt.xml +++ b/src/com/pms/salesmgmt/mapper/contractMgmt.xml @@ -5983,4 +5983,149 @@ WHERE LIMIT 1 + + + + + + INSERT INTO CONTRACT_MGMT ( + OBJID, + CATEGORY_CD, + CUSTOMER_OBJID, + PRODUCT, + AREA_CD, + CUSTOMER_EQUIP_NAME, + CUSTOMER_PROJECT_NAME, + CUSTOMER_PRODUCTION_NO, + MECHANICAL_TYPE, + PAID_TYPE, + RECEIPT_DATE, + REQ_DEL_DATE, + CONTRACT_RESULT, + PO_NO, + ORDER_DATE, + CONTRACT_CURRENCY, + EXCHANGE_RATE, + REGDATE, + WRITER, + CONTRACT_NO, + IS_DIRECT_ORDER, + ORDER_SUPPLY_PRICE, + ORDER_VAT, + ORDER_TOTAL_AMOUNT + ) + SELECT + #{newObjId}, + CATEGORY_CD, + CUSTOMER_OBJID, + PRODUCT, + AREA_CD, + CUSTOMER_EQUIP_NAME, + CUSTOMER_PROJECT_NAME, + CUSTOMER_PRODUCTION_NO, + MECHANICAL_TYPE, + PAID_TYPE, + RECEIPT_DATE, + REQ_DEL_DATE, + '', + PO_NO, + ORDER_DATE, + CONTRACT_CURRENCY, + EXCHANGE_RATE, + NOW(), + #{writer}, + #{newContractNo}, + IS_DIRECT_ORDER, + ORDER_SUPPLY_PRICE, + ORDER_VAT, + ORDER_TOTAL_AMOUNT + FROM CONTRACT_MGMT + WHERE OBJID = #{sourceObjId} + + + + + INSERT INTO CONTRACT_ITEM ( + OBJID, + CONTRACT_OBJID, + SEQ, + PART_OBJID, + PART_NO, + PART_NAME, + QUANTITY, + DUE_DATE, + CUSTOMER_REQUEST, + RETURN_REASON, + REGDATE, + WRITER, + STATUS, + ORDER_QUANTITY, + ORDER_UNIT_PRICE, + ORDER_SUPPLY_PRICE, + ORDER_VAT, + ORDER_TOTAL_AMOUNT + ) + SELECT + #{newItemObjId}, + #{newContractObjId}, + SEQ, + PART_OBJID, + PART_NO, + PART_NAME, + QUANTITY, + DUE_DATE, + CUSTOMER_REQUEST, + RETURN_REASON, + NOW(), + #{writer}, + 'ACTIVE', + ORDER_QUANTITY, + ORDER_UNIT_PRICE, + ORDER_SUPPLY_PRICE, + ORDER_VAT, + ORDER_TOTAL_AMOUNT + FROM CONTRACT_ITEM + WHERE OBJID = #{sourceItemObjId} + AND STATUS = 'ACTIVE' + + + + + INSERT INTO CONTRACT_ITEM_SERIAL ( + OBJID, + ITEM_OBJID, + SEQ, + SERIAL_NO, + REGDATE, + WRITER, + STATUS + ) + SELECT + #{prefix} || SEQ::VARCHAR, + #{newItemObjId}, + SEQ, + SERIAL_NO, + NOW(), + #{writer}, + 'ACTIVE' + FROM CONTRACT_ITEM_SERIAL + WHERE ITEM_OBJID = #{sourceItemObjId} + AND STATUS = 'ACTIVE' + + + + + \ No newline at end of file diff --git a/src/com/pms/salesmgmt/service/ContractMgmtService.java b/src/com/pms/salesmgmt/service/ContractMgmtService.java index 72288d3..aa9b74d 100644 --- a/src/com/pms/salesmgmt/service/ContractMgmtService.java +++ b/src/com/pms/salesmgmt/service/ContractMgmtService.java @@ -2591,6 +2591,69 @@ private String encodeImageToBase64(String imagePath) { return items; } + /** + * 수주 복사 + * 기존 수주의 기본정보 + 품목 + S/N을 복사하여 새 수주 생성 (수주상태만 빈값) + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public Map copyEstimateAndOrderInfo(HttpServletRequest request, Map paramMap){ + Map resultMap = new HashMap(); + SqlSession sqlSession = null; + try{ + sqlSession = SqlMapConfig.getInstance().getSqlSession(); + PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); + + String sourceObjId = CommonUtils.checkNull(paramMap.get("sourceObjId")); + String newObjId = CommonUtils.createObjId(); + String writer = person.getUserId(); + + // 1. 새 영업번호 채번 (MAX+1) + String newContractNo = sqlSession.selectOne("contractMgmt.getNextContractNo", paramMap); + + // 2. CONTRACT_MGMT 복사 + Map copyParam = new HashMap(); + copyParam.put("sourceObjId", sourceObjId); + copyParam.put("newObjId", newObjId); + copyParam.put("newContractNo", newContractNo); + copyParam.put("writer", writer); + sqlSession.insert("contractMgmt.copyContractMgmt", copyParam); + + // 3. 원본 품목 OBJID 목록 조회 + List sourceItemObjIds = sqlSession.selectList("contractMgmt.getActiveItemObjIds", copyParam); + + // 4. 품목 + S/N 복사 + if(sourceItemObjIds != null) { + for(String sourceItemObjId : sourceItemObjIds) { + String newItemObjId = CommonUtils.createObjId(); + + Map itemCopyParam = new HashMap(); + itemCopyParam.put("sourceItemObjId", sourceItemObjId); + itemCopyParam.put("newItemObjId", newItemObjId); + itemCopyParam.put("newContractObjId", newObjId); + itemCopyParam.put("writer", writer); + sqlSession.insert("contractMgmt.copyContractItems", itemCopyParam); + + // S/N 복사 + String snPrefix = CommonUtils.createObjId() + "_"; + itemCopyParam.put("prefix", snPrefix); + sqlSession.insert("contractMgmt.copyContractItemSerials", itemCopyParam); + } + } + + sqlSession.commit(); + resultMap.put("result", "SUCCESS"); + resultMap.put("newContractNo", newContractNo); + } catch(Exception e){ + if(sqlSession != null) sqlSession.rollback(); + e.printStackTrace(); + resultMap.put("result", "FAIL"); + resultMap.put("message", e.getMessage()); + } finally { + if(sqlSession != null) sqlSession.close(); + } + return resultMap; + } + /** * 견적요청 및 수주 통합 저장 * 견적요청 정보와 수주 정보를 한번에 저장