This commit is contained in:
2026-02-09 18:21:17 +09:00
13 changed files with 491 additions and 162 deletions

View File

@@ -4992,8 +4992,16 @@ ORDER BY V.PATH2
<if test="VENDOR_OBJID != null and VENDOR_OBJID != ''">
AND QRM.VENDOR_OBJID::VARCHAR = #{VENDOR_OBJID}
</if>
<if test="STATUS != null and STATUS != ''">
AND QRM.STATUS = #{STATUS}
<!-- 메일발송 여부 검색 (날짜 유무 기준) -->
<if test="MAIL_SEND_YN != null and MAIL_SEND_YN != ''">
<choose>
<when test="MAIL_SEND_YN == 'Y'.toString()">
AND QRM.MAIL_SEND_DATE IS NOT NULL
</when>
<otherwise>
AND QRM.MAIL_SEND_DATE IS NULL
</otherwise>
</choose>
</if>
<!-- 작성자 검색 -->
<if test="writer != null and writer != ''">
@@ -5068,6 +5076,7 @@ ORDER BY V.PATH2
QRD.UNIT_PRICE,
QRD.REMARK,
QRD.REG_DATE,
QRD.DELIVERY_REQUEST_DATE,
-- 마스터 정보
QRM.VENDOR_TYPE,
QRM.VENDOR_OBJID,
@@ -5078,6 +5087,14 @@ ORDER BY V.PATH2
ORDER BY QRD.OBJID
</select>
<!-- 견적요청서 번호 셀렉트 목록 -->
<select id="getQuotationRequestNoList" parameterType="map" resultType="map">
SELECT DISTINCT QUOTATION_REQUEST_NO AS "CODE", QUOTATION_REQUEST_NO AS "NAME"
FROM QUOTATION_REQUEST_MASTER
WHERE QUOTATION_REQUEST_NO IS NOT NULL AND QUOTATION_REQUEST_NO != ''
ORDER BY QUOTATION_REQUEST_NO DESC
</select>
<!-- 견적요청서 번호 생성 -->
<select id="getNextQuotationRequestNo" parameterType="map" resultType="string">
SELECT 'Q' || TO_CHAR(NOW(), 'YYYYMMDD') || '-' || LPAD(NEXTVAL('SEQ_QUOTATION_REQUEST_NO')::VARCHAR, 3, '0')
@@ -5144,11 +5161,12 @@ ORDER BY V.PATH2
)
</insert>
<!-- 견적요청서 상세 단가 업데이트 -->
<!-- 견적요청서 상세 단가/입고요청일 업데이트 -->
<update id="updateQuotationRequestDetailPrice" parameterType="map">
UPDATE QUOTATION_REQUEST_DETAIL SET
UNIT_PRICE = #{UNIT_PRICE}::NUMERIC,
TOTAL_PRICE = #{QTY}::NUMERIC * #{UNIT_PRICE}::NUMERIC,
DELIVERY_REQUEST_DATE = CASE WHEN #{DELIVERY_REQUEST_DATE} IS NOT NULL AND #{DELIVERY_REQUEST_DATE} != '' THEN #{DELIVERY_REQUEST_DATE} ELSE NULL END,
EDIT_DATE = NOW()
WHERE OBJID = #{OBJID}::NUMERIC
</update>
@@ -5175,6 +5193,9 @@ ORDER BY V.PATH2
<if test="VENDOR_TYPE == 'PROCESSING'">
PROCESSING_UNIT_PRICE = #{UNIT_PRICE}::NUMERIC
</if>
<if test="DELIVERY_REQUEST_DATE != null and DELIVERY_REQUEST_DATE != ''">
, DELIVERY_REQUEST_DATE = #{DELIVERY_REQUEST_DATE}
</if>
, EDIT_DATE = NOW()
WHERE OBJID IN (
SELECT MD2.OBJID

View File

@@ -1648,16 +1648,16 @@ public class SalesMngController {
try {
// 프로젝트번호
code_map.put("project_no", commonService.bizMakeOptionList("", (String)paramMap.get("project_no"), "common.getProjectNameList"));
// 견적요청서 번호 목록
code_map.put("quotation_request_no", commonService.bizMakeOptionList("", (String)paramMap.get("QUOTATION_REQUEST_NO"), "salesMng.getQuotationRequestNoList"));
// 업체 목록
code_map.put("vendor_objid", commonService.bizMakeOptionList("", (String)paramMap.get("vendor_objid"), "common.getClientMngSupplySelect"));
// 상태
// 메일발송 상태 (미발송/발송)
String statusOptions = "";
statusOptions += "<option value=''>전체</option>";
statusOptions += "<option value='create'" + ("create".equals(paramMap.get("status")) ? " selected" : "") + ">작성중</option>";
statusOptions += "<option value='sent'" + ("sent".equals(paramMap.get("status")) ? " selected" : "") + ">발송완료</option>";
statusOptions += "<option value='received'" + ("received".equals(paramMap.get("status")) ? " selected" : "") + ">견적수신</option>";
statusOptions += "<option value='completed'" + ("completed".equals(paramMap.get("status")) ? " selected" : "") + ">완료</option>";
code_map.put("status", statusOptions);
statusOptions += "<option value='N'" + ("N".equals(paramMap.get("MAIL_SEND_YN")) ? " selected" : "") + ">미발송</option>";
statusOptions += "<option value='Y'" + ("Y".equals(paramMap.get("MAIL_SEND_YN")) ? " selected" : "") + ">발송</option>";
code_map.put("mail_send_yn", statusOptions);
// 작성자
code_map.put("writer", commonService.bizMakeOptionList("", (String)paramMap.get("writer"), "common.getUserselect"));
//제품구분

View File

@@ -2090,7 +2090,10 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
COALESCE(CM.PO_NO, '') AS PO_NO,
COALESCE(CM.ORDER_DATE, '') AS ORDER_DATE,
COALESCE((SELECT SUM(SR.SALES_QUANTITY) FROM SALES_REGISTRATION SR WHERE SR.PROJECT_NO = T.PROJECT_NO), 0) AS SALES_QUANTITY,
COALESCE(T.QUANTITY::NUMERIC, 0) - COALESCE((SELECT SUM(SR.SALES_QUANTITY) FROM SALES_REGISTRATION SR WHERE SR.PROJECT_NO = T.PROJECT_NO), 0) AS REMAINING_QUANTITY
COALESCE(T.QUANTITY::NUMERIC, 0) - COALESCE((SELECT SUM(SR.SALES_QUANTITY) FROM SALES_REGISTRATION SR WHERE SR.PROJECT_NO = T.PROJECT_NO), 0) AS REMAINING_QUANTITY,
COALESCE(NULLIF(CM.ORDER_UNIT_PRICE, '')::NUMERIC, 0) AS ORDER_UNIT_PRICE,
COALESCE(NULLIF(CM.EXCHANGE_RATE, '')::NUMERIC, 1) AS EXCHANGE_RATE,
COALESCE(CM.CONTRACT_CURRENCY, '') AS CONTRACT_CURRENCY
FROM PROJECT_MGMT T
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = T.CONTRACT_OBJID
LEFT JOIN SUPPLY_MNG SM ON SM.OBJID = CASE WHEN T.CUSTOMER_OBJID ~ '^[0-9]+$' THEN T.CUSTOMER_OBJID::NUMERIC ELSE NULL END

View File

@@ -2458,19 +2458,22 @@ public class SalesMngService {
String salesRequestPartObjid = CommonUtils.checkNull(detail.get("SALES_REQUEST_PART_OBJID"));
String unitPrice = CommonUtils.checkNull(detail.get("UNIT_PRICE"));
String qty = CommonUtils.checkNull(detail.get("QTY"));
String deliveryRequestDate = CommonUtils.checkNull(detail.get("DELIVERY_REQUEST_DATE"));
// 1. 견적요청서 상세 단가 업데이트
// 1. 견적요청서 상세 단가/입고요청일 업데이트
Map updateParam = new HashMap();
updateParam.put("OBJID", detailObjid);
updateParam.put("UNIT_PRICE", unitPrice);
updateParam.put("QTY", qty);
updateParam.put("DELIVERY_REQUEST_DATE", deliveryRequestDate);
sqlSession.update("salesMng.updateQuotationRequestDetailPrice", updateParam);
// 2. 구매리스트 단가 업데이트
// 2. 구매리스트 단가/입고요청일 업데이트
Map purchaseUpdateParam = new HashMap();
purchaseUpdateParam.put("SALES_REQUEST_PART_OBJID", salesRequestPartObjid);
purchaseUpdateParam.put("UNIT_PRICE", unitPrice);
purchaseUpdateParam.put("VENDOR_TYPE", vendorType);
purchaseUpdateParam.put("DELIVERY_REQUEST_DATE", deliveryRequestDate);
sqlSession.update("salesMng.updatePurchaseListPriceFromQuotation", purchaseUpdateParam);
}

View File

@@ -360,6 +360,14 @@ public Map<String, Object> saveSaleRegistration(HttpServletRequest request, Map<
System.out.println("saleNo (파라미터): " + saleNo);
System.out.println("salesQuantity: " + paramMap.get("salesQuantity"));
// 폼 필드명(manager) → SQL 파라미터명(managerUserId) 매핑
if(paramMap.get("manager") != null && !"".equals(paramMap.get("manager"))) {
paramMap.put("managerUserId", paramMap.get("manager"));
}
System.out.println("serialNo: " + paramMap.get("serialNo"));
System.out.println("manager → managerUserId: " + paramMap.get("managerUserId"));
// 모든 판매를 shipment_log에 기록 (분할 출하 방식 통일)
// 1. 해당 프로젝트의 sales_registration 레코드 확인
Map<String, Object> checkParam = new HashMap<String, Object>();
@@ -391,9 +399,10 @@ public Map<String, Object> saveSaleRegistration(HttpServletRequest request, Map<
baseRecord.put("salesExchangeRate", paramMap.get("salesExchangeRate"));
baseRecord.put("shippingDate", paramMap.get("shippingDate"));
baseRecord.put("shippingMethod", paramMap.get("shippingMethod"));
baseRecord.put("managerUserId", paramMap.get("managerUserId"));
baseRecord.put("managerUserId", paramMap.get("managerUserId")); // 위에서 manager → managerUserId 매핑됨
baseRecord.put("incoterms", paramMap.get("incoterms"));
baseRecord.put("serialNo", paramMap.get("serialNo"));
System.out.println("insertSaleRegistration - serialNo: " + paramMap.get("serialNo"));
baseRecord.put("shippingOrderStatus", "출하지시"); // 자동으로 출하지시 상태 설정
baseRecord.put("cretEmpNo", paramMap.get("cretEmpNo"));
@@ -495,22 +504,21 @@ public Map<String, Object> saveSaleRegistration(HttpServletRequest request, Map<
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
String userId = person.getUserId();
// 원본 데이터 조회
Map<String, Object> originalData = sqlSession.selectOne("salesNcollectMgmt.getContractByObjid", paramMap);
if(originalData == null) {
resultMap.put("result", false);
resultMap.put("msg", "원본 데이터를 찾을 수 없습니다.");
return resultMap;
}
// 분할 수량
int splitQuantity = Integer.parseInt(paramMap.get("splitQuantity").toString());
int originalQuantity = Integer.parseInt(paramMap.get("originalQuantity").toString());
// 원본 데이터의 단가 정보 가져오기
BigDecimal unitPrice = new BigDecimal(originalData.get("order_unit_price").toString());
BigDecimal exchangeRate = new BigDecimal(originalData.get("exchange_rate").toString());
// 단가/환율은 폼 hidden 필드에서 직접 가져옴 (프로젝트 기반, contract_mgmt 직접 조회 불필요)
String unitPriceStr = CommonUtils.checkNull(paramMap.get("orderUnitPrice"));
String exchangeRateStr = CommonUtils.checkNull(paramMap.get("exchangeRate"));
String contractCurrency = CommonUtils.checkNull(paramMap.get("contractCurrency"));
BigDecimal unitPrice = StringUtils.isNotBlank(unitPriceStr) ? new BigDecimal(unitPriceStr) : BigDecimal.ZERO;
BigDecimal exchangeRate = StringUtils.isNotBlank(exchangeRateStr) ? new BigDecimal(exchangeRateStr) : BigDecimal.ONE;
System.out.println("=== splitShipment 디버그 ===");
System.out.println("projectNo: " + paramMap.get("projectNo"));
System.out.println("unitPrice: " + unitPrice + ", exchangeRate: " + exchangeRate + ", currency: " + contractCurrency);
// 분할 금액 계산
BigDecimal splitSupplyPrice = unitPrice.multiply(new BigDecimal(splitQuantity));
@@ -527,19 +535,13 @@ public Map<String, Object> saveSaleRegistration(HttpServletRequest request, Map<
paramMap.put("salesSupplyPrice", splitSupplyPrice);
paramMap.put("salesVat", splitVat);
paramMap.put("salesTotalAmount", splitTotalAmount);
paramMap.put("salesCurrency", originalData.get("contract_currency"));
paramMap.put("salesCurrency", contractCurrency);
paramMap.put("salesExchangeRate", exchangeRate);
// 팝업에서 입력한 데이터 우선, 없으면 원본 데이터 사용
paramMap.put("shippingMethod",
StringUtils.isNotBlank((String)paramMap.get("shippingMethod")) ?
paramMap.get("shippingMethod") : originalData.get("shipping_method"));
paramMap.put("incoterms",
StringUtils.isNotBlank((String)paramMap.get("incoterms")) ?
paramMap.get("incoterms") : originalData.get("incoterms"));
paramMap.put("managerUserId",
StringUtils.isNotBlank((String)paramMap.get("manager")) ?
paramMap.get("manager") : originalData.get("pm_user_id"));
// 담당자 매핑 (폼 필드명 manager → SQL 파라미터명 managerUserId)
if(StringUtils.isNotBlank((String)paramMap.get("manager"))) {
paramMap.put("managerUserId", paramMap.get("manager"));
}
// 팝업에서 입력한 추가 정보
// serialNo, shippingDate, remark는 팝업에서만 입력 가능

View File

@@ -1728,7 +1728,15 @@ public class QualityService extends BaseService{
}
// ECR_NO 생성 (ECR-YYYYMM-순번) 예) ECR-202512-01
String yyyymm = new java.text.SimpleDateFormat("yyyyMM").format(new java.util.Date());
// 요청일 기준으로 YYYYMM 추출 (REQUEST_DATE 형식: yyyy-MM-dd)
String requestDate = CommonUtils.checkNull(paramMap.get("REQUEST_DATE"));
String yyyymm;
if(!requestDate.isEmpty() && requestDate.length() >= 7){
yyyymm = requestDate.substring(0, 4) + requestDate.substring(5, 7);
} else {
// 요청일이 없는 경우 현재 날짜로 대체
yyyymm = new java.text.SimpleDateFormat("yyyyMM").format(new java.util.Date());
}
paramMap.put("YYYYMM", yyyymm);
Integer seq = sqlSession.selectOne("quality.getEcrSeq", paramMap);
if(seq == null) seq = 1;