매출관리까지 한 작업 중간커밋

This commit is contained in:
leeheejin
2025-11-10 14:40:34 +09:00
parent 8b3c8b182c
commit 1530d643f2
8 changed files with 814 additions and 203 deletions

View File

@@ -258,9 +258,48 @@ public class SalesNcollectMgmtController {
// 기존 판매 정보 조회 후 환종(통화) 공통코드 세팅
Map<String, Object> saleInfo = null;
String salesCurrency = "";
if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) {
// contractObjId가 있으면 주문서 관리에서 넘어온 것 -> 수주 데이터 조회
if(paramMap.get("contractObjId") != null && !paramMap.get("contractObjId").equals("")) {
// 수주 데이터 조회 (CONTRACT_ITEM 테이블에서)
saleInfo = salesNcollectMgmtService.getOrderDataForSale(paramMap);
salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY"));
request.setAttribute("saleInfo", saleInfo);
request.setAttribute("orderInfo", saleInfo);
}
// orderNo가 있으면 기존 판매 정보 조회
else if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) {
saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap);
salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY"));
// 판매 정보가 비어있거나 금액이 0이면 수주 데이터로 채우기
if(saleInfo == null ||
(saleInfo.get("SALES_SUPPLY_PRICE") == null ||
"0".equals(String.valueOf(saleInfo.get("SALES_SUPPLY_PRICE"))) ||
Integer.parseInt(String.valueOf(saleInfo.get("SALES_SUPPLY_PRICE"))) == 0)) {
// orderNo로 contractObjId 조회 후 수주 데이터 가져오기
Map<String, Object> orderDataParam = new HashMap<String, Object>();
orderDataParam.put("orderNo", paramMap.get("orderNo"));
Map<String, Object> orderData = salesNcollectMgmtService.getOrderDataByOrderNo(orderDataParam);
if(orderData != null && orderData.get("SALES_SUPPLY_PRICE") != null) {
// 수주 데이터를 saleInfo에 병합 (기존 S/N 등은 유지)
if(saleInfo == null) saleInfo = new HashMap<String, Object>();
saleInfo.put("SALES_QUANTITY", orderData.get("SALES_QUANTITY"));
saleInfo.put("SALES_UNIT_PRICE", orderData.get("SALES_UNIT_PRICE"));
saleInfo.put("SALES_SUPPLY_PRICE", orderData.get("SALES_SUPPLY_PRICE"));
saleInfo.put("SALES_VAT", orderData.get("SALES_VAT"));
saleInfo.put("SALES_TOTAL_AMOUNT", orderData.get("SALES_TOTAL_AMOUNT"));
saleInfo.put("SALES_CURRENCY", orderData.get("SALES_CURRENCY"));
saleInfo.put("SALES_CURRENCY_NAME", orderData.get("SALES_CURRENCY_NAME"));
saleInfo.put("SALES_EXCHANGE_RATE", orderData.get("SALES_EXCHANGE_RATE"));
if(saleInfo.get("SHIPPING_DATE") == null || "".equals(saleInfo.get("SHIPPING_DATE"))) {
saleInfo.put("SHIPPING_DATE", orderData.get("SHIPPING_DATE"));
}
salesCurrency = CommonUtils.nullToEmpty((String)orderData.get("SALES_CURRENCY"));
}
}
request.setAttribute("saleInfo", saleInfo);
// orderInfo로 견적 정보 전달 (saleInfo가 이미 모든 필요한 정보를 포함)

View File

@@ -974,14 +974,24 @@
<if test="shippingMethod != null and shippingMethod != ''">
/* SHIPPING_METHOD 필드 없음 - 검색 조건 무시 */
</if>
<if test="manager != null and manager != ''">
AND T.PM_USER_ID = #{manager}
</if>
<if test="incoterms != null and incoterms != ''">
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
</if>
-- 등록일 기준 최신순 정렬 (프로젝트 번호는 보조 정렬)
ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
<if test="manager != null and manager != ''">
AND T.PM_USER_ID = #{manager}
</if>
<if test="incoterms != null and incoterms != ''">
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
</if>
<if test="salesStatus != null and salesStatus != ''">
<choose>
<when test="salesStatus == 'NOT_CLOSED'">
AND (T.SALES_STATUS IS NULL OR T.SALES_STATUS = '' OR T.SALES_STATUS != '완료')
</when>
<otherwise>
AND T.SALES_STATUS = #{salesStatus}
</otherwise>
</choose>
</if>
-- 등록일 기준 최신순 정렬 (프로젝트 번호는 보조 정렬)
ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
</select>
<!-- 매출관리 그리드 목록 개수 - project_mgmt 테이블 기반 -->
@@ -1068,13 +1078,23 @@
<if test="shippingMethod != null and shippingMethod != ''">
/* SHIPPING_METHOD 필드 없음 - 검색 조건 무시 */
</if>
<if test="manager != null and manager != ''">
AND T.PM_USER_ID = #{manager}
</if>
<if test="incoterms != null and incoterms != ''">
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
</if>
</select>
<if test="manager != null and manager != ''">
AND T.PM_USER_ID = #{manager}
</if>
<if test="incoterms != null and incoterms != ''">
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
</if>
<if test="salesStatus != null and salesStatus != ''">
<choose>
<when test="salesStatus == 'NOT_CLOSED'">
AND (T.SALES_STATUS IS NULL OR T.SALES_STATUS = '' OR T.SALES_STATUS != '완료')
</when>
<otherwise>
AND T.SALES_STATUS = #{salesStatus}
</otherwise>
</choose>
</if>
</select>
<!-- 매출관리 합계 조회 (Total 공급가액, 부가세, 총액) -->
<select id="getSalesMgmtTotals" parameterType="map" resultType="map">
@@ -1393,5 +1413,115 @@
WHERE T.PROJECT_NO = #{orderNo}
</select>
<!--
/**
* 주문서 관리에서 수주 데이터 조회 (판매등록용)
* CONTRACT_ITEM 테이블에서 수주 정보를 가져와 판매등록 폼에 자동 채우기
* @since 2025.11.10
* @author assistant
* @version 1.0
**/
-->
<select id="getOrderDataForSale" parameterType="map" resultType="map">
/* salesNcollectMgmt.getOrderDataForSale - 주문서 관리에서 판매등록용 수주 데이터 조회 */
SELECT
-- 기본 정보
CM.CONTRACT_NO AS ORDER_NO,
CM.OBJID AS CONTRACT_OBJID,
-- 수주 금액 정보 (CONTRACT_ITEM 테이블에서 합산) - VARCHAR 타입이므로 NUMERIC으로 캐스팅
COALESCE(SUM(CI.ORDER_QUANTITY::NUMERIC), 0) AS SALES_QUANTITY,
COALESCE(ROUND(AVG(CI.ORDER_UNIT_PRICE::NUMERIC), 2), 0) AS SALES_UNIT_PRICE,
COALESCE(SUM(CI.ORDER_SUPPLY_PRICE::NUMERIC), 0) AS SALES_SUPPLY_PRICE,
COALESCE(SUM(CI.ORDER_VAT::NUMERIC), 0) AS SALES_VAT,
COALESCE(SUM(CI.ORDER_TOTAL_AMOUNT::NUMERIC), 0) AS SALES_TOTAL_AMOUNT,
-- 환종 정보
CM.CONTRACT_CURRENCY AS SALES_CURRENCY,
CODE_NAME(CM.CONTRACT_CURRENCY) AS SALES_CURRENCY_NAME,
COALESCE(CM.EXCHANGE_RATE::NUMERIC, 0) AS SALES_EXCHANGE_RATE,
-- 수주 날짜 - VARCHAR 타입이므로 그대로 사용
CM.ORDER_DATE AS SHIPPING_DATE,
-- 담당자
CM.PM_USER_ID AS MANAGER
FROM CONTRACT_MGMT CM
LEFT JOIN CONTRACT_ITEM CI ON CM.OBJID::VARCHAR = CI.CONTRACT_OBJID AND UPPER(CI.STATUS) = 'ACTIVE'
WHERE CM.OBJID = #{contractObjId}::NUMERIC
GROUP BY
CM.CONTRACT_NO,
CM.OBJID,
CM.CONTRACT_CURRENCY,
CM.EXCHANGE_RATE,
CM.ORDER_DATE,
CM.PM_USER_ID
</select>
<!--
/**
* orderNo(PROJECT_NO)로 수주 데이터 조회 (판매등록용)
* PROJECT_MGMT에서 CONTRACT_OBJID를 찾아서 수주 데이터 조회
* @since 2025.11.10
* @author assistant
* @version 1.0
**/
-->
<select id="getOrderDataByOrderNo" parameterType="map" resultType="map">
/* salesNcollectMgmt.getOrderDataByOrderNo - orderNo로 판매등록용 수주 데이터 조회 */
SELECT
-- 기본 정보
CM.CONTRACT_NO AS ORDER_NO,
CM.OBJID AS CONTRACT_OBJID,
-- 수주 금액 정보 (CONTRACT_ITEM 테이블에서 합산) - VARCHAR 타입이므로 NUMERIC으로 캐스팅
COALESCE(SUM(CI.ORDER_QUANTITY::NUMERIC), 0) AS SALES_QUANTITY,
COALESCE(ROUND(AVG(CI.ORDER_UNIT_PRICE::NUMERIC), 2), 0) AS SALES_UNIT_PRICE,
COALESCE(SUM(CI.ORDER_SUPPLY_PRICE::NUMERIC), 0) AS SALES_SUPPLY_PRICE,
COALESCE(SUM(CI.ORDER_VAT::NUMERIC), 0) AS SALES_VAT,
COALESCE(SUM(CI.ORDER_TOTAL_AMOUNT::NUMERIC), 0) AS SALES_TOTAL_AMOUNT,
-- 환종 정보
CM.CONTRACT_CURRENCY AS SALES_CURRENCY,
CODE_NAME(CM.CONTRACT_CURRENCY) AS SALES_CURRENCY_NAME,
COALESCE(CM.EXCHANGE_RATE::NUMERIC, 0) AS SALES_EXCHANGE_RATE,
-- 수주 날짜 - VARCHAR 타입이므로 그대로 사용
CM.ORDER_DATE AS SHIPPING_DATE,
-- 담당자
CM.PM_USER_ID AS MANAGER
FROM PROJECT_MGMT PM
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
LEFT JOIN CONTRACT_ITEM CI ON CM.OBJID::VARCHAR = CI.CONTRACT_OBJID AND UPPER(CI.STATUS) = 'ACTIVE'
WHERE PM.PROJECT_NO = #{orderNo}
GROUP BY
CM.CONTRACT_NO,
CM.OBJID,
CM.CONTRACT_CURRENCY,
CM.EXCHANGE_RATE,
CM.ORDER_DATE,
CM.PM_USER_ID
</select>
<!--
/**
* 매출마감 처리
* @since 2025.11.10
* @author system
* @version 1.0
**/
-->
<update id="salesDeadlineConfirm" parameterType="map">
/* salesNcollectMgmt.salesDeadlineConfirm - PROJECT_MGMT의 SALES_STATUS를 '완료'로 업데이트 및 매출마감일 저장 */
UPDATE PROJECT_MGMT
SET
SALES_STATUS = '완료',
SALES_DEADLINE_DATE = #{deadlineDate}
WHERE OBJID::VARCHAR = #{OBJID}
</update>
</mapper>

View File

@@ -259,6 +259,58 @@ public class SalesNcollectMgmtService {
return CommonUtils.toUpperCaseMapKey(resultMap);
}
/**
* <pre>
* 주문서 관리에서 수주 데이터 조회 (판매등록용)
* CONTRACT_ITEM 테이블에서 수주 정보를 가져와 판매등록 폼에 자동 채우기
* </pre>
* @param paramMap - contractObjId
* @return Map<String, Object>
*/
public Map<String, Object> getOrderDataForSale(Map<String, Object> paramMap) {
Map<String, Object> resultMap = new HashMap<String, Object>();
SqlSession sqlSession = null;
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession();
resultMap = sqlSession.selectOne("salesNcollectMgmt.getOrderDataForSale", paramMap);
} catch(Exception e) {
e.printStackTrace();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
return CommonUtils.toUpperCaseMapKey(resultMap);
}
/**
* <pre>
* orderNo(PROJECT_NO)로 수주 데이터 조회 (판매등록용)
* PROJECT_MGMT에서 CONTRACT_OBJID를 찾아서 수주 데이터 조회
* </pre>
* @param paramMap - orderNo
* @return Map<String, Object>
*/
public Map<String, Object> getOrderDataByOrderNo(Map<String, Object> paramMap) {
Map<String, Object> resultMap = new HashMap<String, Object>();
SqlSession sqlSession = null;
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession();
resultMap = sqlSession.selectOne("salesNcollectMgmt.getOrderDataByOrderNo", paramMap);
} catch(Exception e) {
e.printStackTrace();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
return CommonUtils.toUpperCaseMapKey(resultMap);
}
public Map<String, Object> saveSaleRegistration(HttpServletRequest request, Map<String, Object> paramMap) {
Map<String, Object> resultMap = new HashMap<String, Object>();
SqlSession sqlSession = null;
@@ -802,34 +854,65 @@ public class SalesNcollectMgmtService {
Map resultMap = new HashMap();
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
try{
System.out.println("===== 매출마감 처리 시작 =====");
System.out.println("paramMap: " + paramMap);
/*String checkParam = CommonUtils.checkNull(paramMap.get("checkArr"));
String[] targetObjIdList = checkParam.split(",");
String objIdListStr = CommonUtils.checkNull(paramMap.get("objIdList"));
String deadlineDate = CommonUtils.checkNull(paramMap.get("deadlineDate"));
if(null != targetObjIdList && 0 < targetObjIdList.length){*/
System.out.println("objIdListStr: " + objIdListStr);
System.out.println("deadlineDate: " + deadlineDate);
if(objIdListStr == null || objIdListStr.isEmpty()){
resultMap.put("result", false);
resultMap.put("msg", "선택된 항목이 없습니다.");
System.out.println("에러: 선택된 항목 없음");
return resultMap;
}
if(deadlineDate == null || deadlineDate.isEmpty()){
resultMap.put("result", false);
resultMap.put("msg", "매출마감일을 입력해주세요.");
System.out.println("에러: 매출마감일 없음");
return resultMap;
}
String[] targetObjIdList = objIdListStr.split(",");
System.out.println("targetObjIdList 길이: " + targetObjIdList.length);
if(null != targetObjIdList && 0 < targetObjIdList.length){
HttpSession session = request.getSession();
sqlSession = SqlMapConfig.getInstance().getSqlSession();
PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN);
String userId = person.getUserId();
System.out.println("userId: " + userId);
/*for(int i=0;i<targetObjIdList.length;i++){*/
//String objId = CommonUtils.checkNull(targetObjIdList[i]);
//HashMap sqlParamMap = new HashMap();
//sqlParamMap.put("OBJID", objId);
//paramMap.put("PAYMENT_DATE", CommonUtils.getDateTime(new Date(), "yyyy-MM-dd"));
sqlSession.update("salesNcollectMgmt.salesDeadlineConfirm",paramMap);
/*}*/
for(int i=0; i<targetObjIdList.length; i++){
String objId = CommonUtils.checkNull(targetObjIdList[i]);
System.out.println("처리 중 OBJID[" + i + "]: " + objId);
HashMap sqlParamMap = new HashMap();
sqlParamMap.put("OBJID", objId);
sqlParamMap.put("userId", userId);
sqlParamMap.put("deadlineDate", deadlineDate);
System.out.println("SQL 실행 전 - sqlParamMap: " + sqlParamMap);
int updateCount = sqlSession.update("salesNcollectMgmt.salesDeadlineConfirm", sqlParamMap);
System.out.println("SQL 실행 결과 - 업데이트된 행 수: " + updateCount);
}
sqlSession.commit();
System.out.println("커밋 완료");
resultMap.put("result", true);
resultMap.put("msg", "확인되었습니다");
/*}*/
resultMap.put("msg", targetObjIdList.length + "건의 매출마감이 완료되었습니다.");
}
System.out.println("===== 매출마감 처리 완료 =====");
}catch(Exception e){
resultMap.put("result", false);
resultMap.put("msg", "확인에 실패하였습니다");
resultMap.put("msg", "매출마감 처리 중 오류가 발생했습니다.");
sqlSession.rollback();
throw e;
System.out.println("===== 매출마감 처리 중 예외 발생 =====");
e.printStackTrace();
}finally{
sqlSession.close();
}