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

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

@@ -1405,70 +1405,70 @@
<select id="getContractMgmtInfo" parameterType="map" resultType="map">
SELECT
OBJID
,CATEGORY_CD
,CUSTOMER_OBJID
,PRODUCT
,CUSTOMER_PROJECT_NAME
,STATUS_CD
,DUE_DATE
,LOCATION
,SETUP
,FACILITY
,FACILITY_QTY
,FACILITY_TYPE
,FACILITY_DEPTH
,PRODUCTION_NO
,BUS_CAL_CD
,CATEGORY1_CD
,CHG_USER_ID
,PLAN_DATE
,COMPLETE_DATE
,RESULT_CD
,PROJECT_NO
,PM_USER_ID
,CONTRACT_PRICE
,CONTRACT_PRICE_CURRENCY
,CONTRACT_CURRENCY
,REGDATE
,WRITER
,CONTRACT_NO
,CUSTOMER_EQUIP_NAME
,REQ_DEL_DATE
,CONTRACT_DEL_DATE
,CONTRACT_COMPANY
,CONTRACT_DATE
,PO_NO
,MANUFACTURE_PLANT
,CONTRACT_RESULT
,PROJECT_NAME
,SPEC_USER_ID
,SPEC_PLAN_DATE
,SPEC_COMP_DATE
,SPEC_RESULT_CD
,EST_USER_ID
,EST_PLAN_DATE
,EST_COMP_DATE
,EST_RESULT_CD
,AREA_CD
,TARGET_PROJECT_NO
,TARGET_PROJECT_NO_DIRECT
,CUSTOMER_PRODUCTION_NO
,MECHANICAL_TYPE
,OVERHAUL_ORDER
,PAID_TYPE
,RECEIPT_DATE
,PART_NO
,PART_NAME
,SERIAL_NO
,QUANTITY
,CUSTOMER_REQUEST
,EXCHANGE_RATE
,ORDER_DATE
,ORDER_UNIT_PRICE
,ORDER_SUPPLY_PRICE
,ORDER_VAT
,ORDER_TOTAL_AMOUNT
A.OBJID
,A.CATEGORY_CD
,A.CUSTOMER_OBJID
,A.PRODUCT
,A.CUSTOMER_PROJECT_NAME
,A.STATUS_CD
,A.DUE_DATE
,A.LOCATION
,A.SETUP
,A.FACILITY
,A.FACILITY_QTY
,A.FACILITY_TYPE
,A.FACILITY_DEPTH
,A.PRODUCTION_NO
,A.BUS_CAL_CD
,A.CATEGORY1_CD
,A.CHG_USER_ID
,A.PLAN_DATE
,A.COMPLETE_DATE
,A.RESULT_CD
,A.PROJECT_NO
,A.PM_USER_ID
,A.CONTRACT_PRICE
,A.CONTRACT_PRICE_CURRENCY
,A.CONTRACT_CURRENCY
,A.REGDATE
,A.WRITER
,A.CONTRACT_NO
,A.CUSTOMER_EQUIP_NAME
,A.REQ_DEL_DATE
,A.CONTRACT_DEL_DATE
,A.CONTRACT_COMPANY
,A.CONTRACT_DATE
,A.PO_NO
,A.MANUFACTURE_PLANT
,A.CONTRACT_RESULT
,A.PROJECT_NAME
,A.SPEC_USER_ID
,A.SPEC_PLAN_DATE
,A.SPEC_COMP_DATE
,A.SPEC_RESULT_CD
,A.EST_USER_ID
,A.EST_PLAN_DATE
,A.EST_COMP_DATE
,A.EST_RESULT_CD
,A.AREA_CD
,A.TARGET_PROJECT_NO
,A.TARGET_PROJECT_NO_DIRECT
,A.CUSTOMER_PRODUCTION_NO
,A.MECHANICAL_TYPE
,A.OVERHAUL_ORDER
,A.PAID_TYPE
,A.RECEIPT_DATE
,A.PART_NO
,A.PART_NAME
,A.SERIAL_NO
,A.QUANTITY
,A.CUSTOMER_REQUEST
,A.EXCHANGE_RATE
,A.ORDER_DATE
,A.ORDER_UNIT_PRICE
,A.ORDER_SUPPLY_PRICE
,A.ORDER_VAT
,A.ORDER_TOTAL_AMOUNT
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt01' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT1
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt02' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT2
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt03' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT3
@@ -1479,6 +1479,21 @@
,(SELECT TO_CHAR(REGDATE, 'YYYY-MM-DD' ) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt03' AND UPPER(STATUS) = 'ACTIVE' ORDER BY REGDATE desc LIMIT 1) AS FILE_DATE3
,(SELECT TO_CHAR(REGDATE, 'YYYY-MM-DD' ) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt04' AND UPPER(STATUS) = 'ACTIVE' ORDER BY REGDATE desc LIMIT 1) AS FILE_DATE4
,(SELECT TO_CHAR(REGDATE, 'YYYY-MM-DD' ) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt05' AND UPPER(STATUS) = 'ACTIVE' ORDER BY REGDATE desc LIMIT 1) AS FILE_DATE5
-- 결재 상태 추가
,COALESCE(
(SELECT CASE
WHEN UPPER(AP.STATUS) = 'INPROCESS' THEN '결재중'
WHEN UPPER(AP.STATUS) = 'COMPLETE' THEN '결재완료'
WHEN UPPER(AP.STATUS) = 'REJECT' THEN '반려'
WHEN UPPER(AP.STATUS) = 'CANCEL' THEN '취소'
ELSE '작성중'
END
FROM APPROVAL AP
WHERE AP.TARGET_OBJID::VARCHAR = (SELECT objid::VARCHAR FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = A.OBJID ORDER BY REGDATE DESC LIMIT 1)
AND AP.TARGET_TYPE = 'CONTRACT_ESTIMATE'
LIMIT 1),
'작성중'
) AS APPR_STATUS
FROM CONTRACT_MGMT A
WHERE A.OBJID = #{objId}
</select>
@@ -2227,8 +2242,11 @@ SELECT
,SUPPLY_TEL_NO
,REG_ID
,TO_CHAR(REG_DATE,'YYYY-MM-DD') REGDATE
,STATUS
,CHARGE_USER_NAME
,STATUS
,CHARGE_USER_NAME
,COALESCE(NULLIF(MANAGER1_NAME, ''), NULLIF(MANAGER2_NAME, ''), NULLIF(MANAGER3_NAME, ''), NULLIF(MANAGER4_NAME, ''), MANAGER5_NAME) AS MANAGER1_NAME
,COALESCE(NULLIF(MANAGER1_EMAIL, ''), NULLIF(MANAGER2_EMAIL, ''), NULLIF(MANAGER3_EMAIL, ''), NULLIF(MANAGER4_EMAIL, ''), MANAGER5_EMAIL) AS MANAGER1_EMAIL
,(SELECT COUNT(*) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = SUPPLY_MNG.OBJID::VARCHAR AND DOC_TYPE = 'BUS_REG_CERT' AND UPPER(STATUS) = 'ACTIVE') AS BUS_REG_FILE_CNT
,case UPPER(STATUS)
when 'ACTIVE' then '활성화'
when 'INACTIVE' then '비활성화'
@@ -2279,10 +2297,13 @@ SELECT
,SUPPLY_BUSNAME
,SUPPLY_STOCKNAME
,SUPPLY_TEL_NO
,REG_ID
,TO_CHAR(REG_DATE,'YYYY-MM-DD') REGDATE
,STATUS
,CHARGE_USER_NAME
,REG_ID
,TO_CHAR(REG_DATE,'YYYY-MM-DD') REGDATE
,STATUS
,COALESCE(NULLIF(MANAGER1_NAME, ''), NULLIF(MANAGER2_NAME, ''), NULLIF(MANAGER3_NAME, ''), NULLIF(MANAGER4_NAME, ''), MANAGER5_NAME) AS MANAGER1_NAME
,COALESCE(NULLIF(MANAGER1_EMAIL, ''), NULLIF(MANAGER2_EMAIL, ''), NULLIF(MANAGER3_EMAIL, ''), NULLIF(MANAGER4_EMAIL, ''), MANAGER5_EMAIL) AS MANAGER1_EMAIL
,(SELECT COUNT(*) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = SUPPLY_MNG.OBJID::VARCHAR AND DOC_TYPE = 'BUS_REG_CERT' AND UPPER(STATUS) = 'ACTIVE') AS BUS_REG_FILE_CNT
,CHARGE_USER_NAME
,case UPPER(STATUS)
when 'ACTIVE' then '활성화'
when 'INACTIVE' then '비활성화'
@@ -2357,6 +2378,16 @@ SELECT
,OFFICE_NO
,EMAIL
,CUS_NO
,MANAGER1_NAME
,MANAGER1_EMAIL
,MANAGER2_NAME
,MANAGER2_EMAIL
,MANAGER3_NAME
,MANAGER3_EMAIL
,MANAGER4_NAME
,MANAGER4_EMAIL
,MANAGER5_NAME
,MANAGER5_EMAIL
)
VALUES
(
@@ -2379,25 +2410,45 @@ SELECT
,#{office_no }
,#{email }
,(SELECT 'CUS-' || LPAD((SELECT MAX(SUBSTR(CUS_NO,5,8))::INTEGER+1 FROM SUPPLY_MNG)::VARCHAR,4,'0'))
,#{manager1_name }
,#{manager1_email }
,#{manager2_name }
,#{manager2_email }
,#{manager3_name }
,#{manager3_email }
,#{manager4_name }
,#{manager4_email }
,#{manager5_name }
,#{manager5_email }
)
ON CONFLICT (OBJID) DO
UPDATE
SET
SUPPLY_CODE =#{supply_code }
,SUPPLY_NAME =#{supply_name }
,REG_NO =#{reg_no }
,SUPPLY_ADDRESS =#{supply_address }
,SUPPLY_BUSNAME =#{supply_busname }
,SUPPLY_STOCKNAME =#{supply_stockname }
,SUPPLY_TEL_NO =#{supply_tel_no }
,SUPPLY_FAX_NO =#{supply_fax_no }
,CHARGE_USER_NAME =#{charge_user_name }
,PAYMENT_METHOD =#{payment_method }
,REG_ID =#{reg_id }
,AREA_CD =#{area_cd }
,BUS_REG_NO =#{bus_reg_no }
,OFFICE_NO =#{office_no }
,EMAIL =#{email }
SUPPLY_CODE =#{supply_code }
,SUPPLY_NAME =#{supply_name }
,REG_NO =#{reg_no }
,SUPPLY_ADDRESS =#{supply_address }
,SUPPLY_BUSNAME =#{supply_busname }
,SUPPLY_STOCKNAME =#{supply_stockname }
,SUPPLY_TEL_NO =#{supply_tel_no }
,SUPPLY_FAX_NO =#{supply_fax_no }
,CHARGE_USER_NAME =#{charge_user_name }
,PAYMENT_METHOD =#{payment_method }
,REG_ID =#{reg_id }
,AREA_CD =#{area_cd }
,BUS_REG_NO =#{bus_reg_no }
,OFFICE_NO =#{office_no }
,EMAIL =#{email }
,MANAGER1_NAME =#{manager1_name }
,MANAGER1_EMAIL =#{manager1_email }
,MANAGER2_NAME =#{manager2_name }
,MANAGER2_EMAIL =#{manager2_email }
,MANAGER3_NAME =#{manager3_name }
,MANAGER3_EMAIL =#{manager3_email }
,MANAGER4_NAME =#{manager4_name }
,MANAGER4_EMAIL =#{manager4_email }
,MANAGER5_NAME =#{manager5_name }
,MANAGER5_EMAIL =#{manager5_email }
</update>

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

@@ -96,6 +96,7 @@ $(document).ready(function(){
});
var columns = [
{formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:40, frozen:true},
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '영업번호', field : 'CONTRACT_NO', frozen:true,
formatter:fnc_createGridAnchorTag,
cellClick:function(e, cell){
@@ -187,7 +188,64 @@ var columns = [
//var grid;
function fn_search(){
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/contractMgmt/contractGridList.do", columns, true);
// 그리드 조회 및 Total 합계 업데이트를 위한 커스텀 AJAX
$.ajax({
url: "/contractMgmt/contractGridList.do",
type: "POST",
data: $("#form1").serializeObject(),
dataType: "json",
beforeSend: function(){
_startLoading("Loading...");
},
complete: function(){
_endLoading();
},
success: function(response) {
// 그리드 데이터 설정
if(_tabulGrid){
_tabulGrid.setData(response.RESULTLIST || []);
} else {
// 그리드 초기화
_tabulGrid = new Tabulator("#mainGrid", {
layout: _tabul_layout_fitColumns,
columns: columns,
data: response.RESULTLIST || [],
selectable: true
});
}
// 조회된 전체 데이터의 합계 계산
var totalSupplyPrice = 0;
var totalVat = 0;
var totalAmount = 0;
if(response.RESULTLIST && response.RESULTLIST.length > 0) {
response.RESULTLIST.forEach(function(row) {
var supplyPrice = parseFloat(row.ORDER_SUPPLY_PRICE_SUM || 0);
var vat = parseFloat(row.ORDER_VAT_SUM || 0);
var amount = parseFloat(row.ORDER_TOTAL_AMOUNT_SUM || 0);
totalSupplyPrice += supplyPrice;
totalVat += vat;
totalAmount += amount;
});
}
// 합계 표시
$("#totalSupplyPrice").text(Number(totalSupplyPrice).toLocaleString());
$("#totalVat").text(Number(totalVat).toLocaleString());
$("#totalAmount").text(Number(totalAmount).toLocaleString());
// 페이징 HTML 업데이트
if(response.PAGE_HTML){
$(".table_paging_wrap").html(response.PAGE_HTML);
}
},
error: function(jqxhr, status, error){
alert("데이터 조회 중 오류가 발생했습니다.");
console.error(error);
}
});
}
function _fnc_datepick(){
@@ -665,6 +723,19 @@ function openProjectFormPopUp(objId){
</table>
</div>
<!-- Total 합계 표시 영역 -->
<div style="padding: 3px 10px; background: #f5f5f5; border-radius: 3px; margin: 10px 0;">
<span style="font-weight: bold; font-size: 12px; margin-right: 20px;">
Total 공급가액: <span id="totalSupplyPrice" style="color: #2196F3;">0</span> 원
</span>
<span style="font-weight: bold; font-size: 12px; margin-right: 20px;">
Total 부가세: <span id="totalVat" style="color: #FF9800;">0</span> 원
</span>
<span style="font-weight: bold; font-size: 12px;">
Total 총액: <span id="totalAmount" style="color: #4CAF50;">0</span> 원
</span>
</div>
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
</div>
</div>

View File

@@ -53,61 +53,129 @@
fn_search();
});
$("#btnDeadline").click(function(){
var targetObj = _tabulGrid.getSelectedData();
if(1 == targetObj.length){
var OBJID = fnc_checkNull(targetObj[0].OBJID);
var status = fnc_checkNull(targetObj[0].SALES_STATUS);
//var settleAmount = fnc_checkNull(targetObj[0].SETTLE_AMOUNT);
$("#btnDeadline").click(function(){
var targetObj = _tabulGrid.getSelectedData();
if(0 == targetObj.length){
Swal.fire("선택된 내용이 없습니다.");
return false;
}
if(status == '' || status == null || status == '매출마감'){
Swal.fire({
title: '선택된 데이터를 매출마감 처리하시겠습니까?',
text: '',
icon: 'warning',
showCancelButton: true, // cancel버튼 보이기. 기본은 원래 없음
confirmButtonColor: '#3085d6', // confrim 버튼 색깔 지정
cancelButtonColor: '#d33', // cancel 버튼 색깔 지정
confirmButtonText: '확인', // confirm 버튼 텍스트 지정
cancelButtonText: '취소', // cancel 버튼 텍스트 지정
reverseButtons: false, // 버튼 순서 거꾸로
}).then(result => {
// 만약 Promise리턴을 받으면,
if (result.isConfirmed) { // 만약 모달창에서 confirm 버튼을 눌렀다면
$.ajax({
url:"/salesNcollectMgmt/salesDeadlineConfirm.do",
type:"POST",
data: {"OBJID" : OBJID},
dataType:"json",
success:function(data){
Swal.fire(data.msg);
fn_search();
},
error: function(jqxhr, status, error){
}
});
}
});
}else{
alert("매출마감 전 데이터만 매출마감 가능합니다.");
return false;
}
//var productGroup = fnc_checkNull(targetObj[0].PRODUCT_GROUP);
//var product = fnc_checkNull(targetObj[0].PRODUCT);
//var releaseObjId = fnc_checkNull(targetObj[0].RELEASE_OBJID);
}else if(0 == targetObj.length){
Swal.fire("선택된 내용이 없습니다.");
return false;
}else if(1 < targetObj.length){
Swal.fire("한번에 1개의 내용만 등록 가능합니다. ");
// 선택된 항목 중 이미 매출마감된 항목이 있는지 체크
var hasCompletedItem = false;
for(var i = 0; i < targetObj.length; i++){
var status = fnc_checkNull(targetObj[i].SALES_STATUS);
if(status == '완료'){
hasCompletedItem = true;
break;
}
}
if(hasCompletedItem){
Swal.fire("매출마감 전 데이터만 매출마감 가능합니다.");
return false;
}
// 매출마감일 입력 팝업
Swal.fire({
title: '매출마감 처리',
html:
'<div style="text-align:left; padding:10px;">' +
'<label style="display:block; margin-bottom:5px;">세금계산서 발행일 (매출마감일)</label>' +
'<input type="text" id="deadlineDate" class="swal2-input" placeholder="YYYY-MM-DD" style="width:90%; margin:0;">' +
'<div style="margin-top:10px; color:#666; font-size:12px;">선택된 ' + targetObj.length + '건의 데이터를 매출마감 처리합니다.</div>' +
'</div>',
icon: 'info',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '확인',
cancelButtonText: '취소',
onOpen: function() {
// datepicker 초기화
$('#deadlineDate').datepicker({
dateFormat: 'yy-mm-dd',
changeMonth: true,
changeYear: true
});
// 오늘 날짜를 기본값으로 설정
var today = new Date();
var dateStr = today.getFullYear() + '-' +
String(today.getMonth() + 1).padStart(2, '0') + '-' +
String(today.getDate()).padStart(2, '0');
$('#deadlineDate').val(dateStr);
},
preConfirm: function() {
const deadlineDate = $('#deadlineDate').val();
if (!deadlineDate) {
Swal.showValidationMessage('매출마감일을 입력해주세요.');
return false;
}
//fn_confirm();
// 날짜 형식 검증 (YYYY-MM-DD)
var datePattern = /^\d{4}-\d{2}-\d{2}$/;
if (!datePattern.test(deadlineDate)) {
Swal.showValidationMessage('날짜 형식이 올바르지 않습니다. (YYYY-MM-DD)');
return false;
}
return deadlineDate;
}
}).then(function(result) {
if (result.isConfirmed) {
var deadlineDate = result.value;
var objIdList = [];
// 선택된 항목들의 OBJID 수집
for(var i = 0; i < targetObj.length; i++){
objIdList.push(fnc_checkNull(targetObj[i].OBJID));
}
// AJAX 요청
console.log('매출마감 요청 - objIdList:', objIdList);
console.log('매출마감 요청 - deadlineDate:', deadlineDate);
console.log('매출마감 요청 - 전송 데이터:', {
objIdList: objIdList.join(','),
deadlineDate: deadlineDate
});
$.ajax({
url: "/salesNcollectMgmt/salesDeadlineConfirm.do",
type: "POST",
data: {
"objIdList": objIdList.join(','),
"deadlineDate": deadlineDate
},
dataType: "json",
success: function(data){
console.log('매출마감 응답 - result:', data.result);
console.log('매출마감 응답 - msg:', data.msg);
console.log('매출마감 응답 - 전체:', JSON.stringify(data));
Swal.fire({
title: data.msg || '처리되었습니다.',
icon: data.result ? 'success' : 'error'
}).then(() => {
if(data.result) {
fn_search();
}
});
},
error: function(jqxhr, status, error){
console.error('매출마감 AJAX 에러 - status:', status);
console.error('매출마감 AJAX 에러 - error:', error);
console.error('매출마감 AJAX 에러 - responseText:', jqxhr.responseText);
console.error('매출마감 AJAX 에러 - statusText:', jqxhr.statusText);
Swal.fire({
title: '매출마감 처리 중 오류가 발생했습니다.',
text: error || jqxhr.statusText || '서버 오류',
icon: 'error'
});
}
});
}
});
});
fn_search();
});
</script>
@@ -115,6 +183,7 @@
<script type="text/javascript">
var columns = [
{formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:40, frozen:true},
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '프로젝트번호', field : 'PROJECT_NO', frozen : true
// formatter: fnc_createGridAnchorTag,
// cellClick: function(e, cell){
@@ -197,16 +266,37 @@ function fn_search(){
// 그리드 데이터 설정
if(_tabulGrid){
_tabulGrid.setData(response.RESULTLIST || []);
} else {
// 그리드 초기화
_tabulGrid = new Tabulator("#mainGrid", {
layout: _tabul_layout_fitColumns,
columns: columns,
data: response.RESULTLIST || []
});
// 그리드 초기화 후 Excel 버튼 이벤트 등록
fn_bindExcelButton();
}
} else {
// 그리드 초기화
_tabulGrid = new Tabulator("#mainGrid", {
layout: _tabul_layout_fitColumns,
columns: columns,
data: response.RESULTLIST || [],
selectable: "highlight" // 다중 선택 가능하도록 설정
});
// 행 클릭으로 다중 선택
_tabulGrid.on("rowClick", function(e, row){
// 체크박스나 체크박스 셀을 클릭한 경우는 제외
if($(e.target).hasClass('tabulator-row-handle') ||
$(e.target).closest('.tabulator-row-handle').length > 0 ||
e.target.type === 'checkbox') {
return;
}
// 이미 선택된 행인지 확인
if(row.isSelected()){
// 선택된 행 클릭 시 해제
row.deselect();
} else {
// 선택되지 않은 행 클릭 시 선택 (기존 선택 유지)
row.select();
}
});
// 그리드 초기화 후 Excel 버튼 이벤트 등록
fn_bindExcelButton();
}
// Total 합계 업데이트
if(response && response.TOTALS){
@@ -432,17 +522,25 @@ function fn_FileRegist(objId, docType, docTypeName){
</select>
</td>
<td class="label"><label for="">출하대기 상태</label></td>
<td><select name="shippingStatus" class="select2" style="width:150px;"><option value="">전체</option>${codeMap.shippingStatusList}</select></td>
<td class="label"><label for="">출고방법</label></td>
<td>
<select name="shippingMethod" class="select2" style="width:150px;">
<option value="">전체</option>
<option value="DIRECT">직납</option>
<option value="PARCEL">택배</option>
</select>
</td>
</tr>
<td class="label"><label for="">출하대기 상태</label></td>
<td><select name="shippingStatus" class="select2" style="width:150px;"><option value="">전체</option>${codeMap.shippingStatusList}</select></td>
<td class="label"><label for="">출고방법</label></td>
<td>
<select name="shippingMethod" class="select2" style="width:150px;">
<option value="">전체</option>
<option value="DIRECT">직납</option>
<option value="PARCEL">택배</option>
</select>
</td>
<td class="label"><label for="">매출마감</label></td>
<td>
<select name="salesStatus" class="select2" style="width:120px;">
<option value="">전체</option>
<option value="완료">매출마감</option>
<option value="NOT_CLOSED">매출마감 전</option>
</select>
</td>
</tr>
<tr>

View File

@@ -0,0 +1,9 @@
-- PROJECT_MGMT 테이블에 매출마감일 컬럼 추가
-- 2025-11-10
-- SALES_DEADLINE_DATE 컬럼 추가 (매출마감일 - 세금계산서 발행일)
ALTER TABLE PROJECT_MGMT ADD COLUMN IF NOT EXISTS SALES_DEADLINE_DATE VARCHAR(10);
-- 컬럼 코멘트 추가
COMMENT ON COLUMN PROJECT_MGMT.SALES_DEADLINE_DATE IS '매출마감일 (세금계산서 발행일)';

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();
}