본문 바로가기
JAVA

[Java] 자동 계약/청구 번호/주문번호 생성 방법!!!

by GoodDayDeveloper 2021. 2. 23.
반응형

 

 

오늘은 자바 및 쿼리에서 등록을 할때마다 번호를 자동생성하는 방법에 대해 이야기해보려합니다.

 

보통은 계약서나 청구번호를 구현하려할때 많이 사용되곤 하죠!

 

손쉽게 구현할 수 있는 방법을 정리해보았습니다.

 

 

 

 

 

 

저의 번호생성로직은 시작날짜 년월 - 각 회사이름 - 번호 로 구현할 예정입니다.

 

예를들면...처음 등록했을 경우 2102-samsung-001  이렇게 되겠네요!

 

구현화면입니다... 머 이렇게 시작년월에 회사이름의 데이터가 없으면 001, 있으면 +1이 되는 형식입니다.

 

 

 

[Java] 자동 계약/청구 번호/주문번호 생성 방법!!!

 

 

 

Controller

 

1
2
3
4
5
BoardVO view = boardService.boardInfo(searchVO.getBoard_idx());
 
String year = view.getBoard_sdate().replace("-""").substring(26); 
view.setBoard_year(year);            
String serialNo = boardService.getBoardSerialNo(view);        
cs

 

 

우선은 board_idx를 통해서 정보를 빼옵니다.

 

그리고 String  year을 선언한 다음 여기에

 

board_sdate에서 replace을 통해서 년의 2째자리와 월의 2째짜리를 넣어주려합니다.

 

 

(예를들어 board_sdate 값이 2021-02-23 이라면, replace을 통해서 하이픈(-)과 빈칸("")을 빼주면 20210223 이 됩니다.

여기서 substring에서 2,6은 2번째부터 6번째자리 전까지를 말하므로 2102 가 나오게 되는거죠!)

 

그리고 값을 view의 board_year에 넣은 다음, getBoardSerialNo에 view을 넣어서 구현을 해줍니다.

 

 

 

 

Service

 

1
2
String getBoardSerialNo(BoardVO searchVO) throws Exception;
 
cs

 

 

 

 

ServiceImpl

 

1
2
3
4
@Override
    public String getBoardSerialNo(BoardVO searchVO) throws Exception {
        return dao.getBoardSerialNo(searchVO);
    }
cs

 

 

 

 

DAO

 

1
2
3
public String getBoardSerialNo(BoardVO searchVO) {
        return selectOne("getBoardSerialNo", searchVO);        
    }
cs

 

여기서는  selectOne으로 해주시면 됩니다.

 

 

 

XML

 

1
2
3
4
5
6
7
8
<select id="getBoardSerialNo" parameterType="BoardVO" resultType="string">
SELECT 
   CONCAT(#{board_year},'-',#{board_label},'-',RIGHT(CONCAT('000',IFNULL(CAST(MAX(right(board_serial_no,3)) as unsigned),0)+1),3)) AS board_serial_no
FROM 
    tbl_contract
WHERE 
    SUBSTRING_INDEX(board_serial_no, '-', 2)= CONCAT(#{board_year},'-',#{board_label})
</select>
cs

 

가장 중요한 부분인 xml입니다...하나하나 뜯어보도록하죠!

 

 

 

CONCAT

CONCAT 함수는 문자열을 합쳐주는 함수입니다.

위에서 Substring으로 짜른 년월과 회사이름, 그리고 부여할 번호를 000-000-000 형토로 CONCAT함수를 이용하여 붙일 예정입니다.

 

 

RIGHT

RIGHT함수는 문자에 오른쪽을 기준으로 일정한 갯수를 가져옵니다.

결국 마지막 부여할 번호 000 의 3자리를 가져온다는 말인거죠

 

 

IFNULL

IFNULL은 해당필드의 값이 NULL일 경우, 다른 값으로 출력하는 함수입니다.

즉 board_serial_no가 null일 경우 0을 출력하란 말입니다.

 

 

CAST

CAST는 전달받은 값을 다른 타입으로 변환해줍니다.

제가 사용한 unsigned는 Integer, 즉 숫자로 변환해준다는 겁니다.

 

 

MAX

MAX는 항목의 데이터의 최대값을 가져오는 함수입니다.

 

 

반응형

 

 

SELECT절

 

1
CONCAT(#{board_year},'-',#{board_label},'-',RIGHT(CONCAT('000',IFNULL(CAST(MAX(right(board_serial_no,3)) as unsigned),0)+1),3)) AS board_serial_no
cs

 

 

concat으로 문자열을 붙여줍니다.

 

마지막 부여할 번호에 right로 3자리만 가져옵니다.


concat으로 +1을 합쳐주는데

 

ifnull을 통해서 만약에 기존 board_serial_no의 최대값이 있으면 숫자형태로 변환해주고, 없으면 0을 반환시킵니다.

 

별칭은 as를 통해서 컬럼값과 동일한 board_serial_no로 설정합니다.

 

 

 

 

 

WHERE 절

 

1
SUBSTRING_INDEX(board_serial_no, '-', 2)= CONCAT(#{board_year},'-',#{board_label})
cs

 

 

 

substring_index

 

substring_index는 문자열을 자르고 인덱스에 맞게 가져오는 방법입니다. 2102-samsung-001를 예시로 들면...

 

subString_Index를 통해서 2번째 인덱스까지 가져오면 2102-samsung 이런 모양이 나옵니다.

 

그리고 concat으로 데이터를 붙여보면 이또한 2102-samsung 이모양이 나옵니다.

 

 

즉, 기존 board_serial_no 컬럼의 데이터와 현재 만들어낼 board_serial_no 의 앞 인덱스 2자리가 같다는 조건하에,

 

concat으로 컬럼값 세개를 붙일건데 마지막 부여번호에서 기존 board_serial_no 의 부여번호가 있으면

 

숫자로 변환해서 +1을 하고, 없으면 0에 +1을 한다는 내용입니다.

 

 

 

 

 

Controller

 

1
2
3
view.setBoard_Serial_no(nextSerialNo);
 
boardService.insertBoardVO(view);
cs

 

 

마지막으로  board_serial_no에 넣은 다음 insert 시켜주면 됩니다.

 

 

 

반응형

댓글