다양화: 530개 online/batch 프로그램을 모듈별 고유 실업무 로직으로 재작성
- 템플릿 클론(정규화 후 0줄 상이) → 전 코퍼스 530/530 고유 바디 - 11개 모듈(mg/au/ac/rc/vl/st/py/lg/mm/cm/cl) 각 파일이 distinct한 매입·대사·정산·수수료·지급·원장·마감·마스터·정합성·전문게이트웨이·공통 업무 - TxCore(ATMI 유사) + ECPG(EXEC SQL) 관용구, 프레임워크/헤더/DBIO API/파일ID·경로 유지 - 전체 docker make -j4 = EXIT 0, 958 오브젝트, 데모 바이너리 링크 - inventory.json loc 실측 갱신 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
b96cf702ee
commit
c3a0259e95
1027 changed files with 68915 additions and 40962 deletions
|
|
@ -1,9 +1,22 @@
|
|||
/* @tier hard @module rc @transform reconciliation-online */
|
||||
/*
|
||||
* rc_ol_0015.pgc - 대사 온라인 서비스 (RC_OL_0015) [tier=hard]
|
||||
* rc_ol_0015.pgc - 대사 결과 집계 조회 온라인 서비스 (RC_OL_0015)
|
||||
*
|
||||
* TxCore TX_SERVICE 엔트리. 요청 TXBUF 를 검증하고 rc 표준 DBIO 를
|
||||
* 통해 처리한 뒤 응답 TXBUF 를 구성한다. (ATMI void SVC(TPSVCINFO*) 대응)
|
||||
* 지정 영업일(BIZDATE) 의 대사 진행 현황을 상태코드별로 집계한다.
|
||||
* - rc_rec_count 로 접수(R)/매입확정(M)/불일치(U)/정산완료(S) 건수 집계
|
||||
* - rc_rec_sum 으로 당일 금액합계(SUMAMT) 산출
|
||||
* - totalcnt = R + M + U + S
|
||||
* 상태전이 없이 카운트/합계만 조회하는 대시보드용 서비스이다.
|
||||
*
|
||||
* 입력 TXBUF:
|
||||
* BIZDATE (필수) 집계 대상 영업일 YYYYMMDD
|
||||
* 출력 TXBUF:
|
||||
* BIZDATE / CNTR / CNTM / CNTU / CNTS / TOTALCNT / SUMAMT
|
||||
*
|
||||
* 진척도 해석:
|
||||
* 미처리 = CNTR (아직 접수 상태)
|
||||
* 처리진행 = CNTM + CNTU (대사 판정 완료)
|
||||
* 최종정산 = CNTS (정산까지 완료)
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
|
@ -16,83 +29,92 @@ EXEC SQL INCLUDE sqlca;
|
|||
|
||||
TX_SERVICE(RC_OL_0015, ctx)
|
||||
{
|
||||
rc_rec_t rec;
|
||||
char key[16], merch[16], bizdate[16], nextbiz[9];
|
||||
long amount = 0, daysum = 0;
|
||||
char bizdate[16];
|
||||
long cnt_r, cnt_m, cnt_u, cnt_s, totalcnt;
|
||||
long done_cnt; /* 판정완료(M+U) */
|
||||
long progress; /* 진척률(%) */
|
||||
long sumamt = 0;
|
||||
int rc;
|
||||
TXBUF *sub_in;
|
||||
TXBUF *sub_out;
|
||||
|
||||
tx_log(TX_LOG_INFO, "[RC_OL_0015] 대사 트랜잭션 오케스트레이션 진입");
|
||||
tx_log(TX_LOG_INFO, "[RC_OL_0015] 대사 결과 집계 조회 서비스 진입");
|
||||
|
||||
if (tx_buf_get(ctx->in, "KEY", key, sizeof(key)) != TX_OK ||
|
||||
tx_buf_get(ctx->in, "MERCHID", merch, sizeof(merch)) != TX_OK ||
|
||||
tx_buf_get(ctx->in, "BIZDATE", bizdate, sizeof(bizdate)) != TX_OK) {
|
||||
tx_log(TX_LOG_ERROR, "[RC_OL_0015] 필수 필드 누락");
|
||||
if (tx_buf_get(ctx->in, "BIZDATE", bizdate, sizeof(bizdate)) != TX_OK) {
|
||||
tx_log(TX_LOG_ERROR, "[RC_OL_0015] BIZDATE 누락");
|
||||
tx_return(ctx, TX_EINVAL, ctx->out);
|
||||
return;
|
||||
}
|
||||
tx_buf_getlong(ctx->in, "AMOUNT", &amount);
|
||||
|
||||
if (!amount_is_valid(amount) || !date_is_valid(bizdate)) {
|
||||
tx_log(TX_LOG_WARN, "[RC_OL_0015] 입력 검증 실패 amount=%ld date=%s",
|
||||
amount, bizdate);
|
||||
if (bizdate[0] == '\0') {
|
||||
tx_log(TX_LOG_ERROR, "[RC_OL_0015] BIZDATE 공백");
|
||||
tx_return(ctx, TX_EINVAL, ctx->out);
|
||||
return;
|
||||
}
|
||||
if (!date_is_valid(bizdate)) {
|
||||
tx_log(TX_LOG_WARN, "[RC_OL_0015] 영업일 형식 오류 date=%s", bizdate);
|
||||
tx_return(ctx, TX_EINVAL, ctx->out);
|
||||
return;
|
||||
}
|
||||
|
||||
/* 트랜잭션 시작 → 원장 반영 → 후속 서비스 연계 → 커밋 */
|
||||
if (tx_begin() != TX_OK) {
|
||||
tx_return(ctx, TX_FAIL, ctx->out);
|
||||
tx_log(TX_LOG_INFO, "[RC_OL_0015] 집계 대상 영업일 date=%s", bizdate);
|
||||
tx_log(TX_LOG_INFO, "[RC_OL_0015] 상태코드별 카운트 조회 시작");
|
||||
|
||||
/* 상태코드별 건수 집계 (-1 은 조회 오류) */
|
||||
cnt_r = rc_rec_count(bizdate, RC_ST_RECV);
|
||||
cnt_m = rc_rec_count(bizdate, RC_ST_DONE);
|
||||
cnt_u = rc_rec_count(bizdate, RC_ST_FAIL);
|
||||
cnt_s = rc_rec_count(bizdate, RC_ST_SETTLED);
|
||||
|
||||
if (cnt_r < 0 || cnt_m < 0 || cnt_u < 0 || cnt_s < 0) {
|
||||
tx_log(TX_LOG_ERROR,
|
||||
"[RC_OL_0015] 건수 집계 실패 R=%ld M=%ld U=%ld S=%ld",
|
||||
cnt_r, cnt_m, cnt_u, cnt_s);
|
||||
tx_return(ctx, TX_EDB, ctx->out);
|
||||
return;
|
||||
}
|
||||
|
||||
memset(&rec, 0, sizeof(rec));
|
||||
strncpy(rec.key, key, sizeof(rec.key) - 1);
|
||||
strncpy(rec.merch_id, merch, sizeof(rec.merch_id) - 1);
|
||||
strncpy(rec.biz_date, bizdate, sizeof(rec.biz_date) - 1);
|
||||
strncpy(rec.status, RC_ST_RECV, sizeof(rec.status) - 1);
|
||||
rec.amount = amount;
|
||||
rec.fee = amount / 100;
|
||||
tx_log(TX_LOG_INFO, "[RC_OL_0015] 접수(R) = %ld", cnt_r);
|
||||
tx_log(TX_LOG_INFO, "[RC_OL_0015] 매입확정(M) = %ld", cnt_m);
|
||||
tx_log(TX_LOG_INFO, "[RC_OL_0015] 불일치(U) = %ld", cnt_u);
|
||||
tx_log(TX_LOG_INFO, "[RC_OL_0015] 정산완료(S) = %ld", cnt_s);
|
||||
|
||||
rc = rc_rec_insert(&rec);
|
||||
totalcnt = cnt_r + cnt_m + cnt_u + cnt_s;
|
||||
done_cnt = cnt_m + cnt_u; /* 대사 판정이 끝난 건 */
|
||||
|
||||
/* 진척률 = (판정완료 + 정산완료) / 전체 * 100 */
|
||||
if (totalcnt > 0)
|
||||
progress = ((done_cnt + cnt_s) * 100L) / totalcnt;
|
||||
else
|
||||
progress = 0;
|
||||
tx_log(TX_LOG_INFO,
|
||||
"[RC_OL_0015] 판정완료=%ld 정산완료=%ld 진척률=%ld%%",
|
||||
done_cnt, cnt_s, progress);
|
||||
|
||||
/* 불일치 비중이 높으면 경보 로그(운영 모니터링용) */
|
||||
if (totalcnt > 0 && (cnt_u * 100L) / totalcnt >= 10)
|
||||
tx_log(TX_LOG_WARN,
|
||||
"[RC_OL_0015] 불일치 비중 경보 date=%s U=%ld/%ld",
|
||||
bizdate, cnt_u, totalcnt);
|
||||
|
||||
/* 당일 금액합계 (실패 시 0 으로 응답) */
|
||||
rc = rc_rec_sum(bizdate, &sumamt);
|
||||
if (rc != TX_OK) {
|
||||
tx_log(TX_LOG_ERROR, "[RC_OL_0015] 원장반영 실패 rc=%d", rc);
|
||||
tx_abort();
|
||||
tx_return(ctx, rc, ctx->out);
|
||||
return;
|
||||
tx_log(TX_LOG_WARN, "[RC_OL_0015] 금액합계 조회 경고 date=%s rc=%d",
|
||||
bizdate, rc);
|
||||
sumamt = 0;
|
||||
}
|
||||
|
||||
/* 정산 영업일 = 거래일의 다음 영업일 */
|
||||
if (date_next_business(bizdate, nextbiz) != 0) {
|
||||
memcpy(nextbiz, bizdate, 8);
|
||||
nextbiz[8] = '\0';
|
||||
}
|
||||
|
||||
/* 후속 정산집계 서비스 연계 (레지스트리 문자열 디스패치) */
|
||||
sub_in = tx_buf_alloc();
|
||||
sub_out = tx_buf_alloc();
|
||||
if (sub_in && sub_out) {
|
||||
tx_buf_sets(sub_in, "MERCHID", merch);
|
||||
tx_buf_sets(sub_in, "BIZDATE", nextbiz);
|
||||
tx_buf_setlong(sub_in, "AMOUNT", amount);
|
||||
rc = tx_call("RC_POST", sub_in, sub_out);
|
||||
if (rc != TX_OK)
|
||||
tx_log(TX_LOG_WARN, "[RC_OL_0015] 후속연계 경고 rc=%d", rc);
|
||||
}
|
||||
tx_buf_free(sub_in);
|
||||
tx_buf_free(sub_out);
|
||||
|
||||
/* 교차 검증: 당일 합계 재계산 */
|
||||
if (rc_rec_sum(bizdate, &daysum) != TX_OK)
|
||||
daysum = 0;
|
||||
|
||||
tx_commit();
|
||||
|
||||
tx_buf_reset(ctx->out);
|
||||
tx_buf_sets(ctx->out, "RESPCODE", RESP_OK);
|
||||
tx_buf_sets(ctx->out, "KEY", key);
|
||||
tx_buf_setlong(ctx->out, "DAYSUM", daysum);
|
||||
tx_log(TX_LOG_INFO, "[RC_OL_0015] 완료 key=%s 당일합계=%ld", key, daysum);
|
||||
tx_buf_sets(ctx->out, "BIZDATE", bizdate);
|
||||
tx_buf_setlong(ctx->out, "CNTR", cnt_r);
|
||||
tx_buf_setlong(ctx->out, "CNTM", cnt_m);
|
||||
tx_buf_setlong(ctx->out, "CNTU", cnt_u);
|
||||
tx_buf_setlong(ctx->out, "CNTS", cnt_s);
|
||||
tx_buf_setlong(ctx->out, "TOTALCNT", totalcnt);
|
||||
tx_buf_setlong(ctx->out, "SUMAMT", sumamt);
|
||||
if (totalcnt == 0)
|
||||
tx_log(TX_LOG_INFO,
|
||||
"[RC_OL_0015] 해당 영업일 원장 없음 date=%s", bizdate);
|
||||
tx_log(TX_LOG_INFO,
|
||||
"[RC_OL_0015] 집계완료 date=%s R=%ld M=%ld U=%ld S=%ld 합계=%ld",
|
||||
bizdate, cnt_r, cnt_m, cnt_u, cnt_s, sumamt);
|
||||
tx_return(ctx, TX_OK, ctx->out);
|
||||
}
|
||||
|
|
|
|||
Reference in a new issue