거래명세서 수정

This commit is contained in:
leeheejin
2025-11-13 17:52:46 +09:00
parent 08f5ba1cdb
commit f2627d9683
5 changed files with 158 additions and 33 deletions

View File

@@ -1892,5 +1892,19 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
AND IssueDt = #{issueDt}
</select>
<select id="getAllSerialNumbers" parameterType="map" resultType="string">
/* salesNcollectMgmt.getAllSerialNumbers - 프로젝트의 모든 S/N 조회 */
SELECT CIS.SERIAL_NO
FROM PROJECT_MGMT PM
JOIN CONTRACT_ITEM CI ON CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
AND CI.PART_OBJID = PM.PART_OBJID
AND CI.STATUS = 'ACTIVE'
JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
AND UPPER(CIS.STATUS) = 'ACTIVE'
WHERE PM.PROJECT_NO = #{projectNo}
AND CIS.SERIAL_NO IS NOT NULL
ORDER BY CIS.SERIAL_NO
</select>
</mapper>

View File

@@ -436,44 +436,99 @@ function fn_loadData() {
var gridData = JSON.parse(gridDataJson);
console.log("그리드 데이터:", gridData);
// 그리드 데이터를 거래명세서 형식으로 변환
var firstItem = gridData[0];
var statementData = {
success: true,
customerName: firstItem.CUSTOMER,
supplierName: "㈜알피에스",
supplierRegNo: "314-81-75146",
supplierAddress: "대전광역시 유성구 국제과학10로 8",
supplierBusiness: "제조",
supplierType: "금속절삭가공기계의",
supplierContact: "TEL:042-602-3300/FAX:042-672",
note: "아래와 같이 공급합니다.",
items: []
};
// 각 그리드 행을 품목으로 변환
for(var i = 0; i < gridData.length; i++) {
var row = gridData[i];
statementData.items.push({
productName: row.PRODUCT_NAME,
spec: row.PRODUCT_NO,
quantity: row.SALES_QUANTITY || 0,
unitPrice: row.SALES_UNIT_PRICE || 0,
supplyPrice: row.SALES_SUPPLY_PRICE || 0,
vat: row.SALES_VAT || 0
});
}
console.log("=== 변환된 거래명세서 데이터 ===");
console.log(statementData);
// 데이터 채우기
fn_fillData(statementData);
// S/N 정보 수집 (비고에 표시) - 비동기 처리
fn_collectSerialNumbers(gridData, function(serialNumbers) {
// 그리드 데이터를 거래명세서 형식으로 변환
var firstItem = gridData[0];
var statementData = {
success: true,
customerName: firstItem.CUSTOMER,
supplierName: "㈜알피에스",
supplierRegNo: "314-81-75146",
supplierAddress: "대전광역시 유성구 국제과학10로 8",
supplierBusiness: "제조",
supplierType: "금속절삭가공기계의",
supplierContact: "TEL:042-602-3300/FAX:042-672",
note: "아래와 같이 공급합니다.",
serialNote: serialNumbers.join("\n"), // S/N 정보
items: []
};
// 각 그리드 행을 품목으로 변환
for(var i = 0; i < gridData.length; i++) {
var row = gridData[i];
statementData.items.push({
productName: row.PRODUCT_NAME,
spec: row.PRODUCT_NO,
quantity: row.SALES_QUANTITY || 0,
unitPrice: row.SALES_UNIT_PRICE || 0,
supplyPrice: row.SALES_SUPPLY_PRICE || 0,
vat: row.SALES_VAT || 0
});
}
console.log("=== 변환된 거래명세서 데이터 ===");
console.log(statementData);
// 데이터 채우기
fn_fillData(statementData);
});
// localStorage 정리
localStorage.removeItem('transactionStatementData');
}
// S/N 정보 수집 함수 (비동기)
function fn_collectSerialNumbers(gridData, callback) {
var serialNumbers = [];
var pendingRequests = 0;
var completed = false;
for(var i = 0; i < gridData.length; i++) {
var row = gridData[i];
if(row.SERIAL_NO && row.SERIAL_NO.trim() !== '') {
var serialNo = row.SERIAL_NO.trim();
// "외 N건" 형식인 경우 서버에서 모든 S/N 조회
if(serialNo.includes('외') && serialNo.includes('건')) {
pendingRequests++;
$.ajax({
url: '/salesMgmt/getAllSerialNumbers.do',
type: 'POST',
data: { projectNo: row.PROJECT_NO },
async: false, // 동기 처리로 변경
success: function(response) {
if(response.success && response.serialNumbers && response.serialNumbers.length > 0) {
// 모든 S/N을 쉼표로 구분하여 한 줄로 표시
var snText = "Spindle S/N: " + response.serialNumbers.join(", ");
serialNumbers.push(snText);
}
},
error: function() {
console.error("S/N 조회 실패");
},
complete: function() {
pendingRequests--;
}
});
} else {
// 단일 S/N 또는 쉼표로 구분된 여러 S/N
if(serialNo.includes(',')) {
// 쉼표로 구분된 경우 한 줄로 표시
serialNumbers.push("Spindle S/N: " + serialNo);
} else {
serialNumbers.push("Spindle S/N: " + serialNo);
}
}
}
}
// 모든 요청 완료 후 콜백 실행
callback(serialNumbers);
}
function fn_fillData(data) {
console.log("=== fn_fillData 호출 ===");
console.log("customerName:", data.customerName);
@@ -572,6 +627,12 @@ function fn_fillData(data) {
$("#totalText").text(total.toString());
$("#totalNum").text(fn_num(total));
// 비고에 S/N 정보 표시
if(data.serialNote && data.serialNote.trim() !== '') {
$("#noteContent").text(data.serialNote);
console.log("비고에 S/N 표시:", data.serialNote);
}
// contenteditable 셀 변경 시 합계 자동 업데이트
fn_attachCellListeners();
}

View File

@@ -971,4 +971,22 @@ public class SalesNcollectMgmtController {
Map resultMap = salesNcollectMgmtService.salesDeadlineConfirm(request, paramMap);
return resultMap;
}
@RequestMapping(value = "/salesMgmt/getAllSerialNumbers.do", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> getAllSerialNumbers(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
List<String> serialNumbers = salesNcollectMgmtService.getAllSerialNumbers(paramMap);
resultMap.put("success", true);
resultMap.put("serialNumbers", serialNumbers);
} catch(Exception e) {
e.printStackTrace();
resultMap.put("success", false);
resultMap.put("message", e.getMessage());
}
return resultMap;
}
}

View File

@@ -1892,5 +1892,19 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
AND IssueDt = #{issueDt}
</select>
<select id="getAllSerialNumbers" parameterType="map" resultType="string">
/* salesNcollectMgmt.getAllSerialNumbers - 프로젝트의 모든 S/N 조회 */
SELECT CIS.SERIAL_NO
FROM PROJECT_MGMT PM
JOIN CONTRACT_ITEM CI ON CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
AND CI.PART_OBJID = PM.PART_OBJID
AND CI.STATUS = 'ACTIVE'
JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
AND UPPER(CIS.STATUS) = 'ACTIVE'
WHERE PM.PROJECT_NO = #{projectNo}
AND CIS.SERIAL_NO IS NOT NULL
ORDER BY CIS.SERIAL_NO
</select>
</mapper>

View File

@@ -1390,4 +1390,22 @@ public Map<String, Object> saveSaleRegistration(HttpServletRequest request, Map<
return resultMap;
}
public List<String> getAllSerialNumbers(Map<String, Object> paramMap) {
SqlSession sqlSession = null;
List<String> result = new ArrayList<String>();
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession();
result = sqlSession.selectList("salesNcollectMgmt.getAllSerialNumbers", paramMap);
} catch(Exception e) {
e.printStackTrace();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
return result;
}
}