Compare commits

...

218 Commits

Author SHA1 Message Date
11638ac43c 일반견적서 pdf 변환 메일 첨부 수정 2025-11-04 09:46:17 +09:00
50baa3d75e 일반견적서 템플릿 변경, 견적서 pdf 변환하여 메일 첨부 2025-11-03 17:11:32 +09:00
399062a9a0 Merge remote-tracking branch 'origin/main' into feature/new-work 2025-11-03 17:09:23 +09:00
ded4a70b01 Merge pull request 'V20251023001' (#52) from V20251023001 into main
Reviewed-on: #52
2025-11-03 02:37:14 +00:00
Johngreen
44b43df82b Merge branch 'main' into V20251023001 2025-11-03 11:36:53 +09:00
f26e92d9e3 Merge pull request '커넥션설정 보완작업' (#51) from V20251023001 into main
Reviewed-on: #51
2025-11-03 02:36:49 +00:00
Johngreen
4ca4bd2227 커넥션설정 보완작업 2025-11-03 11:34:48 +09:00
0dd9b8ab6d Merge pull request 'V20251023001' (#50) from V20251023001 into main
Reviewed-on: #50
2025-10-31 03:00:56 +00:00
Johngreen
37980f8565 Merge branch 'main' into V20251023001 2025-10-31 12:00:40 +09:00
7558206e8b Merge pull request '파트등록, 파트 조회 메뉴에도 도면 업로드 기능 추가' (#49) from V20251023001 into main
Reviewed-on: #49
2025-10-31 03:00:36 +00:00
Johngreen
1ad393e939 파트등록, 파트 조회 메뉴에도 도면 업로드 기능 추가 2025-10-31 12:00:17 +09:00
f9b20817a3 Merge pull request 'V20251023001' (#48) from V20251023001 into main
Reviewed-on: #48
2025-10-31 02:18:04 +00:00
Johngreen
49dd4b7c88 Merge branch 'main' into V20251023001 2025-10-31 11:17:41 +09:00
Johngreen
37285fbce6 Merge branch 'main' into V20251023001 2025-10-31 11:17:34 +09:00
e29305c1dc Merge pull request 'V20251023001' (#47) from V20251023001 into main
Reviewed-on: #47
2025-10-31 02:17:31 +00:00
Johngreen
a41c75c0f8 품번.확장자” 로 했을경우 업로드시 정확한 위치 업로드 버그수정 2025-10-31 11:17:05 +09:00
d4500e3f0b Merge pull request 'feature/new-work' (#46) from feature/new-work into main
Reviewed-on: #46
2025-10-31 01:29:55 +00:00
b5e50366d4 Merge branch 'main' into feature/new-work 2025-10-31 10:29:16 +09:00
8bb05b060c Merge branch 'main' into feature/new-work 2025-10-31 10:28:55 +09:00
21652fc0d1 Merge pull request 'e-bom 팝업창 항목수량(part_mng.qty -> bom_part_qty.item_qty)' (#45) from feature/new-work into main
Reviewed-on: #45
2025-10-31 01:28:45 +00:00
590ab6531b Merge pull request 'V20251023001' (#44) from V20251023001 into main
Reviewed-on: #44
2025-10-31 01:24:46 +00:00
Johngreen
b58b021dc9 Merge branch 'main' into V20251023001 2025-10-31 10:23:51 +09:00
Johngreen
eef76746ac Merge branch 'main' into V20251023001 2025-10-31 10:19:51 +09:00
a0acfc8067 Merge pull request 'V20251023001' (#43) from V20251023001 into main
Reviewed-on: #43
2025-10-31 01:19:43 +00:00
Johngreen
37d5427236 Merge branch 'main' into V20251023001 2025-10-31 10:19:19 +09:00
5d07b23098 Merge pull request 'V20251023001' (#42) from V20251023001 into main
Reviewed-on: #42
2025-10-31 01:19:07 +00:00
Johngreen
3f15362325 Merge branch 'main' into V20251023001 2025-10-31 10:18:40 +09:00
ee0389ad8a Merge pull request 'V20251023001' (#41) from V20251023001 into main
Reviewed-on: #41
2025-10-31 01:18:10 +00:00
87d6e0db0f e-bom 팝업창 항목수량(part_mng.qty -> bom_part_qty.item_qty) 2025-10-31 10:17:22 +09:00
Johngreen
7fa815a0cc Merge branch 'main' into V20251023001 2025-10-31 10:17:11 +09:00
aa7b03c959 Merge pull request 'V20251023001' (#40) from V20251023001 into main
Reviewed-on: #40
2025-10-31 01:13:34 +00:00
Johngreen
81d4b5a169 Merge branch 'main' into V20251023001 2025-10-31 10:12:59 +09:00
5cf3394df8 Merge pull request '한글, 특수문자버그수정' (#39) from V20251023001 into main
Reviewed-on: #39
2025-10-31 01:12:40 +00:00
Johngreen
0ac007eeb7 한글, 특수문자버그수정 2025-10-31 10:12:02 +09:00
50ed8a4ee1 Merge pull request 'V20251023001' (#38) from V20251023001 into main
Reviewed-on: #38
2025-10-31 00:32:24 +00:00
Johngreen
79ed8ee646 Merge branch 'main' into V20251023001 2025-10-31 09:31:33 +09:00
Johngreen
8645e74168 Merge branch 'main' into V20251023001 2025-10-31 09:31:23 +09:00
d61856111f Merge pull request '품번, 품명만 입력하고 저장시 빈 내용으로 이봄 리스트 생성(완료)' (#37) from V20251023001 into main
Reviewed-on: #37
2025-10-31 00:31:02 +00:00
Johngreen
5e92d29028 품번, 품명만 입력하고 저장시 빈 내용으로 이봄 리스트 생성(완료) 2025-10-31 09:30:26 +09:00
56d4387519 Merge pull request 'V20251023001' (#36) from V20251023001 into main
Reviewed-on: #36
2025-10-30 09:20:19 +00:00
Johngreen
f6d26de480 Merge branch 'main' into V20251023001 2025-10-30 18:20:04 +09:00
Johngreen
1d3d8f53e7 Merge branch 'main' into V20251023001 2025-10-30 18:20:01 +09:00
75febfdddb Merge pull request 'V20251023001' (#35) from V20251023001 into main
Reviewed-on: #35
2025-10-30 09:19:59 +00:00
Johngreen
c600012172 Merge branch 'main' into V20251023001 2025-10-30 18:19:46 +09:00
7256f40e0f Merge pull request '수정' (#34) from V20251023001 into main
Reviewed-on: #34
2025-10-30 09:19:32 +00:00
8c9ec367af Merge branch 'main' of https://g.wace.me/chpark/wace_plm 2025-10-30 18:11:58 +09:00
d1a3ae950d Revert: PDF 변환 기능 되돌림 (4a9577c) 2025-10-30 18:11:45 +09:00
7b4167d483 Revert: PDF 관련 커밋 2개 되돌림 (4a9577c, 4d56d64) 2025-10-30 18:06:45 +09:00
4d56d649e1 Merge branch 'main' of https://g.wace.me/chpark/wace_plm 2025-10-30 17:41:30 +09:00
Johngreen
6e7bdbf284 수정 2025-10-30 17:40:22 +09:00
25293d9273 Merge pull request 'V20251023001' (#33) from V20251023001 into main
Reviewed-on: #33
2025-10-30 05:49:53 +00:00
Johngreen
5ce29bf7b9 Merge branch 'main' into V20251023001 2025-10-30 14:49:25 +09:00
Johngreen
42bb799b73 이봄리스트>이봄등록 csv 업로드시 항목수량 컬럼 업로드 안되는 버그수정 2025-10-30 14:49:20 +09:00
643ece2589 Merge pull request 'V20251023001' (#32) from V20251023001 into main
Reviewed-on: #32
2025-10-30 04:15:56 +00:00
Johngreen
d09ae17a85 Merge branch 'main' into V20251023001 2025-10-30 13:15:42 +09:00
Johngreen
30b341753c Merge branch 'main' into V20251023001 2025-10-30 13:15:28 +09:00
c8cf1be26b Merge pull request 'M-BOM관리페이지 업데이트' (#31) from V20251023001 into main
Reviewed-on: #31
2025-10-30 04:15:24 +00:00
Johngreen
cfa031b20b M-BOM관리페이지 업데이트 2025-10-30 12:27:47 +09:00
4a9577c554 일반견적서 템플릿 변경, 견적서 pdf 변환하여 메일 첨부 2025-10-29 17:59:19 +09:00
128c3102c5 Merge pull request 'V20251023001' (#30) from V20251023001 into main
Reviewed-on: #30
2025-10-29 03:34:39 +00:00
Johngreen
56ee15565f Merge branch 'main' into V20251023001 2025-10-29 12:34:19 +09:00
Johngreen
7a718f9fe7 Merge branch 'main' into V20251023001 2025-10-29 12:34:12 +09:00
0c44d19201 Merge pull request 'V20251023001' (#29) from V20251023001 into main
Reviewed-on: #29
2025-10-29 03:34:01 +00:00
Johngreen
d4da64ddfb (RPS)E-BOM List 상태 Y 인경우 클릭후 E-BOM등록 누르면 에러가 뜨면서 수정이 안되지만 E-BOM 아이콘을 눌러서 part 조회에서 << >> 로 변경하면 수정이 됨. 안되도록 막아야 함 2025-10-29 12:33:32 +09:00
33f4327726 컬럼 너비 수정 2025-10-29 12:13:00 +09:00
Johngreen
8954ae559e 생산관리_M-BOM관리쪽 e-bom팝업완성 2025-10-29 11:58:56 +09:00
39593ab3bc csv만 업로드, csv 특수문자 2025-10-29 11:53:03 +09:00
c27a20012a Merge branch 'main' of https://g.wace.me/chpark/wace_plm 2025-10-29 11:24:10 +09:00
29989da63e Merge pull request 'V20251023001' (#28) from V20251023001 into main
Reviewed-on: #28
2025-10-29 02:15:08 +00:00
Johngreen
91b97be376 생산관리_M-BOM관리페이지 e-bom까지 완료 2025-10-29 11:14:13 +09:00
c7b4238a54 part, bom 공급업체 선택->입력으로 수정 2025-10-29 11:11:21 +09:00
Johngreen
7a37d6efd0 Merge branch 'main' into V20251023001 2025-10-28 18:05:14 +09:00
Johngreen
84b4984112 Merge branch 'main' into V20251023001 2025-10-28 18:05:10 +09:00
2998a7609d Merge pull request '대소문자 구분 없이 검색가능하게 수정' (#27) from V20251023001 into main
Reviewed-on: #27
2025-10-28 08:34:00 +00:00
Johngreen
3c1a16f43c 대소문자 구분 없이 검색가능하게 수정 2025-10-28 17:33:27 +09:00
523ad33216 Merge pull request 'V20251023001' (#26) from V20251023001 into main
Reviewed-on: #26
2025-10-28 08:27:58 +00:00
Johngreen
9ff43f0781 Merge branch 'main' into V20251023001 2025-10-28 17:27:35 +09:00
Johngreen
775d56a7f9 Merge branch 'main' into V20251023001 2025-10-28 17:27:29 +09:00
1d72f21e15 Merge pull request 'V20251023001' (#25) from V20251023001 into main
Reviewed-on: #25
2025-10-28 08:27:18 +00:00
Johngreen
697dbe84a8 Merge branch 'main' into V20251023001 2025-10-28 17:26:42 +09:00
3c1c27c119 Merge pull request '생산관리_M-BOM관리 생성' (#24) from V20251023001 into main
Reviewed-on: #24
2025-10-28 08:26:39 +00:00
Johngreen
318e371249 생산관리_M-BOM관리 생성 2025-10-28 17:26:18 +09:00
5613e3bd54 Merge pull request 'V20251023001' (#23) from V20251023001 into main
Reviewed-on: #23
2025-10-28 05:12:58 +00:00
Johngreen
661e1df716 Merge branch 'main' into V20251023001 2025-10-28 14:12:42 +09:00
Johngreen
e8650f058d E-BOM 확인/수정쪽 검색시 품목데이터 표현 2025-10-28 14:12:39 +09:00
104378e52f Merge pull request 'V20251023001' (#22) from V20251023001 into main
Reviewed-on: #22
2025-10-28 04:35:48 +00:00
Johngreen
59359559a6 Merge branch 'main' into V20251023001 2025-10-28 13:33:26 +09:00
Johngreen
a297e660d4 E-BOM 확인/수정쪽 속도개선 2025-10-28 13:33:21 +09:00
08d58ec68e Merge remote-tracking branch 'origin/main' 2025-10-28 13:15:13 +09:00
ace0e3c35f 개발 수정 2025-10-28 13:08:26 +09:00
Johngreen
2feeb8c341 Merge branch 'main' into V20251023001 2025-10-28 11:13:53 +09:00
Johngreen
e149bc99f1 Merge branch 'main' into V20251023001 2025-10-28 11:13:48 +09:00
1db4c83499 Merge pull request '제품관리_PART 등록 데이터 select 속도개선' (#21) from V20251023001 into main
Reviewed-on: #21
2025-10-28 02:13:35 +00:00
Johngreen
c793cd05ae 제품관리_PART 등록 데이터 select 속도개선 2025-10-28 11:13:11 +09:00
e95d38cff6 Merge pull request 'V20251023001' (#20) from V20251023001 into main
Reviewed-on: #20
2025-10-28 02:03:14 +00:00
Johngreen
f944e754b6 E-BOM List, 제품관리_PART 등록페이지 속도개선 2025-10-28 11:02:44 +09:00
Johngreen
c46f118f58 Merge branch 'main' into V20251023001 2025-10-27 21:52:55 +09:00
Johngreen
e2c60f4d63 Merge branch 'main' into V20251023001 2025-10-27 21:52:46 +09:00
7ae55dfa1f Merge pull request '3D, 2D, PDF 아이콘 눌려서 파일 개별 첨부하는 곳 첨부 안되는부분수정완료' (#19) from V20251023001 into main
Reviewed-on: #19
2025-10-27 12:50:07 +00:00
Johngreen
caa19e50d1 3D, 2D, PDF 아이콘 눌려서 파일 개별 첨부하는 곳 첨부 안되는부분수정완료 2025-10-27 21:48:26 +09:00
5f7b435c70 Merge pull request 'E-BOM 확인/수정 파일업로드기능추가' (#18) from V20251023001 into main
Reviewed-on: #18
2025-10-27 12:03:57 +00:00
Johngreen
657a8d3234 E-BOM 확인/수정 파일업로드기능추가 2025-10-27 21:03:21 +09:00
9c3bea7e95 Merge pull request 'V20251023001' (#17) from V20251023001 into main
Reviewed-on: #17
2025-10-27 08:17:19 +00:00
Johngreen
ff74ac99ca Merge branch 'main' into V20251023001 2025-10-27 17:15:35 +09:00
Johngreen
d69dfe8d95 Remove build artifact: partMng.xml from classes directory 2025-10-27 17:15:10 +09:00
Johngreen
01ebc04dfd Merge branch 'main' into V20251023001 2025-10-27 17:12:43 +09:00
37702b64eb Merge pull request 'E-BOM 확인/수정 품목추가로직수정' (#16) from V20251023001 into main
Reviewed-on: #16
2025-10-27 08:12:22 +00:00
Johngreen
af1c73345d E-BOM 확인/수정 품목추가로직수정 2025-10-27 17:11:57 +09:00
15af60c44e Merge remote-tracking branch 'origin/main' 2025-10-27 16:30:01 +09:00
6969e469dc E-BOM 조회 정전개, 역전개 2025-10-27 16:27:17 +09:00
bff85e1da5 Merge pull request 'V20251023001' (#15) from V20251023001 into main
Reviewed-on: #15
2025-10-27 05:30:19 +00:00
Johngreen
588fef91ce Update structurePopupLeft.jsp 2025-10-27 14:29:56 +09:00
Johngreen
df0a534f0e dd 2025-10-27 14:05:40 +09:00
Johngreen
bc6a7dcf7e Update partMng.xml 2025-10-27 14:04:06 +09:00
934c220abc Merge branch 'main' of https://g.wace.me/chpark/wace_plm 2025-10-27 13:41:53 +09:00
a802714411 E-BOM List, part 등록 수정 2025-10-27 13:38:51 +09:00
13164de870 Merge pull request 'V20251023001' (#14) from V20251023001 into main
Reviewed-on: #14
2025-10-27 04:15:01 +00:00
Johngreen
a19388eb1c 상단 E-BOM 품명 안나오는문제 수정 2025-10-27 13:14:32 +09:00
Johngreen
1d93f6ef3a 상단 E-BOM 품명 안나오는문제 해결 2025-10-27 12:09:22 +09:00
ba7edde4da Merge remote-tracking branch 'origin/main' 2025-10-24 17:49:22 +09:00
709f2b4d4b 봄 등록, csv 적용, 모품번 없이 저장 기능 개발, 엑셀 새로 업로드 기능 추가 2025-10-24 17:47:21 +09:00
5514ab3bb7 Merge pull request 'V20251023001' (#13) from V20251023001 into main
Reviewed-on: #13
2025-10-24 07:56:48 +00:00
Johngreen
63043f6909 E-BOM 확인/수정 완료 2025-10-24 16:56:00 +09:00
Johngreen
2b12fc3f6e E-BOM 확인/수정 2025-10-24 15:52:14 +09:00
23ebcd3b88 봄 복사기능 추가 2025-10-24 15:25:54 +09:00
967b8b6529 디자인 변경 2025-10-24 15:24:39 +09:00
b463ab84e3 봄 구조등록 수정. 봄 복사 개발 전 2025-10-24 14:26:55 +09:00
09d225803d Merge pull request '프로젝트일정관리 업데이트' (#12) from V20251023001 into main
Reviewed-on: #12
2025-10-23 08:41:01 +00:00
Johngreen
9c8d71c924 프로젝트일정관리 업데이트 2025-10-23 17:39:47 +09:00
daf5d9bce4 Merge pull request 'V20251023001' (#11) from V20251023001 into main
Reviewed-on: #11
2025-10-23 07:21:42 +00:00
Johngreen
1185aa491f 프로젝트관리_일정관리(WBS)3페이지 출하일 추가 2025-10-23 16:20:00 +09:00
Johngreen
dff92cedf7 프로젝트관리_일정관리업데이트 2025-10-23 15:52:53 +09:00
3a72111b20 Merge pull request '판매관리 검색필터부분 매출관리랑 맞춤' (#10) from V2025101701 into main
Reviewed-on: #10
2025-10-23 04:30:34 +00:00
Johngreen
fc2448eb6b 판매관리 검색필터부분 매출관리랑 맞춤 2025-10-23 13:30:12 +09:00
a4d1af4d91 Merge pull request 'V2025101701' (#9) from V2025101701 into main
Reviewed-on: #9
2025-10-23 04:19:22 +00:00
Johngreen
109d5b0501 판매 등록디자인일관성 수정 2025-10-23 13:18:54 +09:00
Johngreen
1890cb992d 판매관리페이지에서 고객사 요청사항 버그 수정 2025-10-23 13:10:17 +09:00
5d288975ae Merge pull request '판매관리, 매출관리 업데이트' (#8) from V2025101701 into main
Reviewed-on: #8
2025-10-23 02:31:28 +00:00
Johngreen
de875a207b 판매관리, 매출관리 업데이트 2025-10-23 11:30:46 +09:00
f00462ed70 Merge remote-tracking branch 'origin/main' 2025-10-23 09:54:13 +09:00
42d1cd4cd0 주문서첨부파일, 견적관리 틀고정 수정 2025-10-23 09:50:58 +09:00
Johngreen
f171212092 ㄹㄹ 2025-10-22 21:14:01 +09:00
221a2a3f8a Merge pull request 'V2025101701' (#7) from V2025101701 into main
Reviewed-on: #7
2025-10-22 12:06:26 +00:00
Johngreen
f8ef97bb3c Merge branch 'main' into V2025101701 2025-10-22 21:05:10 +09:00
Johngreen
d45261788c 수주/매출 관리 기능 수정 - ORDER_DATE 필드 추가 및 수주 합계 정보 수정 2025-10-22 21:04:55 +09:00
Johngreen
a3dd839b34 partMng.xml 수정 2025-10-22 21:02:31 +09:00
Johngreen
92860f134f 수주/매출 관리 기능 수정 - ORDER_DATE 필드 추가 및 수주 합계 정보 수정 2025-10-22 21:00:17 +09:00
d2e495c8cd Merge origin/main - 원격 변경사항 병합 2025-10-22 21:00:12 +09:00
bed767994e 영업 수정 커밋 2025-10-22 20:53:46 +09:00
f524e06fe7 Merge pull request '판매관리 리스트의 요청납기, 고객사요청사항, 발주일, 주문서 컬럼의 내용넘어오게 수정' (#6) from V2025101701 into main
Reviewed-on: #6
2025-10-22 10:38:23 +00:00
Johngreen
6bc7a84135 판매관리 리스트의 요청납기, 고객사요청사항, 발주일, 주문서 컬럼의 내용넘어오게 수정 2025-10-22 19:37:35 +09:00
05507eed03 주문서첨부 2종류 변경, 버튼css 수정 2025-10-22 18:30:30 +09:00
39543cec75 E-BOM 등록 수정중 2025-10-22 17:52:00 +09:00
5fb059b3fd Merge pull request 'V2025101701' (#5) from V2025101701 into main
Reviewed-on: #5
2025-10-22 08:31:55 +00:00
Johngreen
637d68548c Update salesRegForm.jsp 2025-10-22 17:31:23 +09:00
Johngreen
bbf91df26e 영업관리_판매관리업데이트 2025-10-22 17:22:02 +09:00
10c5a67b05 fix: Select2 이벤트를 change에서 select2:select로 변경하여 같은 값 재선택 시에도 이벤트 발생하도록 수정
- estimateRegistFormPopup.jsp: 품번/품명 셀렉트박스 이벤트 수정
- estimateTemplate1.jsp: 품명 셀렉트박스 이벤트 수정 및 select2:clear 이벤트 추가
- common.js: initPartSelect2Ajax 함수의 품번/품명 이벤트 핸들러 수정
- ContractMgmtController.java: 견적서 신규 작성 시 품목 데이터 로드 주석처리
2025-10-22 17:08:11 +09:00
2fafff5ee5 견적관리, 주문서관리 수정 2025-10-22 16:18:07 +09:00
4ba30255ba Merge remote-tracking branch 'origin/main' 2025-10-22 10:04:17 +09:00
7f67967add 환율 저장 시 , 제거 2025-10-22 09:54:56 +09:00
8e2af98873 Merge pull request '프로젝트관리 초기커밋' (#4) from V2025101701 into main
Reviewed-on: #4
2025-10-21 07:39:43 +00:00
Johngreen
dbc26fb35b 프로젝트관리 초기커밋 2025-10-21 16:39:00 +09:00
07b147ff9e Merge remote-tracking branch 'origin/main' 2025-10-21 16:30:12 +09:00
5794895dcb feat: PART 관리 기능 개선 및 Excel 업로드 수정
- PART 관리 목록에 열처리경도, 열처리방법, 표면처리, 공급업체 필드 추가
- Excel 업로드 시 공급업체 및 범주 이름 검증 로직 추가 (띄어쓰기 무시)
- partMng.xml: SUPPLY_CODE 중복 제거 및 쿼리 최적화
- PartMngController: sup_code 코드맵 활성화
- common.js: jqGrid 호환성 개선 (getRows 에러 수정)
- header.jsp, menu.jsp: 메뉴 UI 개선
- CSS: 로고 및 메뉴 스타일 조정
2025-10-21 16:23:07 +09:00
Johngreen
bb5013a619 xml변경사항커밋 2025-10-21 09:55:19 +09:00
3350bf5d07 Merge pull request 'V2025101701' (#3) from V2025101701 into main
Reviewed-on: #3
2025-10-21 00:26:58 +00:00
Johngreen
6af7fb6b6d 판매관리, 매출관리완성 2025-10-20 23:04:30 +09:00
ca25e0de56 feat: 품번/품명 Select2 AJAX 검색 기능 추가
- common.js에 initPartSelect2Ajax 함수 추가 (기존 select2 영향 없음)
- estimateList_new.jsp: 품번/품명 AJAX 검색 적용
- orderMgmtList.jsp: 품번/품명 AJAX 검색 적용
- 디버깅 로그 추가로 문제 해결 용이
2025-10-20 15:55:15 +09:00
889231ae27 feat: 견적서 합계 및 수주 관리 기능 추가
- 견적서(estimateTemplate1.jsp)에 합계 및 원화환산 공급가액 표시 추가
- ESTIMATE_TEMPLATE 테이블에 TOTAL_AMOUNT, TOTAL_AMOUNT_KRW 컬럼 추가
- 견적관리 목록에 최신 차수 견적 합계 표시
- 수주등록 화면(orderRegistFormPopup.jsp) 개선: 품목별 수주 정보 입력
- CONTRACT_ITEM 테이블에 수주 관련 컬럼 추가 (ORDER_QUANTITY, ORDER_UNIT_PRICE 등)
- CONTRACT_ITEM UPSERT 방식으로 변경하여 품목 OBJID 유지 (수주 정보 연결 유지)
- 수주관리 목록에 수주 합계 정보 표시 (공급가액, 부가세, 총액, 원화총액)
- 품목 수정 시 기존 OBJID 유지로 데이터 무결성 확보
2025-10-19 21:58:41 +09:00
038f64cc9f Merge remote-tracking branch 'origin/main'
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2025-10-18 23:18:50 +09:00
f47b091dca 견적요청등록화면 수정 2025-10-18 22:51:59 +09:00
Johngreen
d9e06fe95d 매출관리 신규생성 2025-10-17 17:18:05 +09:00
a555f27987 머지 커밋 2025-10-17 16:28:00 +09:00
f28af78a49 Merge branch 'main' of https://g.wace.me/chpark/wace_plm 2025-10-17 16:26:56 +09:00
2aaf24348e 디자인 수정 커밋밋 2025-10-17 16:26:45 +09:00
df30332a49 Merge remote-tracking branch 'origin/main' into main 2025-10-17 15:33:38 +09:00
34f5207ded feat: 견적/주문서 관리 기능 개선
- 견적등록 유/무상 select 박스에 selected 속성 추가
- 주문서 목록 페이지 업데이트
- 수주 관련 컬럼 추가 SQL 스크립트 추가 (add_order_columns.sql)
- estimate_template_tables.sql 업데이트
- contractMgmt.xml 쿼리 개선
2025-10-17 14:24:23 +09:00
7a57faa87b 이카운트 적용 2025-10-17 14:18:22 +09:00
7db28addf7 디자인 수정 2025-10-17 14:09:21 +09:00
Johngreen
7e740bf487 Update salesMgmtList.jsp 2025-10-17 13:39:03 +09:00
Johngreen
d9160990de Update contractMgmt.xml 2025-10-17 12:11:48 +09:00
3ad134fc04 Merge pull request '매출관리 페이지 완료' (#2) from V2025101501 into main
Reviewed-on: #2
2025-10-17 03:09:53 +00:00
Johngreen
018688520d 매출관리 페이지 완료 2025-10-17 12:09:17 +09:00
141ef2c580 feat: 주문서관리 수주등록 기능 구현 및 Admin 버튼 UI 개선
- 주문서관리 목록 페이지 추가 (orderMgmtList.jsp)
- 수주등록 팝업 기능 구현 (orderRegistFormPopup.jsp)
  * 영업정보 선택 후 수주 정보 입력
  * 환종/환율 자동 로드 및 금액 자동 계산
  * 단가×수량 → 공급가액, 부가세, 총액 자동 계산
- Controller: orderRegistFormPopup, saveOrderInfo 메서드 추가
- Service: getContractInfo, getOrderInfo, saveOrderInfo 메서드 추가
- Mapper: 수주 정보 조회/저장 쿼리 추가 (updateOrderInfo)
- CONTRACT_MGMT 테이블의 수주 관련 컬럼 활용
- Header Admin 버튼 UI 개선 (인라인 표시)
2025-10-17 10:00:18 +09:00
546e8e8e02 feat: 견적관리 메일 발송 기능 추가 및 UI 개선
- 견적서 메일 발송 API 추가 (ContractMgmtController, ContractMgmtService)
- 견적관리 리스트에 메일 발송 상태 및 발송일시 컬럼 추가
- 메일 내용을 견적서 형식과 동일하게 변경 (품목 테이블 포함)
- 메일 제목에 영업번호 및 OBJID 포함하여 발송 이력 추적 가능
- 견적서 템플릿: 단가/금액 콤마 표시 기능 추가
- 견적서 템플릿: 비고 컬럼 너비 확대
- S/N 모달창 텍스트 색상 개선 (가독성 향상)
- 견적서 수정 시 특정 템플릿만 업데이트되도록 SQL 쿼리 수정
2025-10-16 13:24:08 +09:00
1b84bee342 merge: origin/main의 디자인 수정 내용 반영 2025-10-16 10:28:34 +09:00
81f071cc34 fix: 견적서 저장/조회 버그 수정 및 여러 차수 작성 기능 추가
- 견적현황 undefined 문제 해결 (EST_STATUS 필드 추가)
- 견적서 목록 팝업 대문자 키 이름 강제
- 견적서 데이터 로드 엔드포인트 추가 (getEstimateTemplateDataByObjId)
- 한 영업번호에 여러 견적서 작성 가능하도록 수정
- PostgreSQL 타입 캐스팅 에러 수정
- 품목 저장 시 서브쿼리 다중 행 에러 수정
2025-10-16 10:27:23 +09:00
8f515c0780 수정 디자인 수정정 2025-10-15 18:47:59 +09:00
c322b62e17 추가 반영 2025-10-15 18:22:21 +09:00
f7ccb78b31 디자인 적용 2025-10-15 18:19:04 +09:00
c26013bb81 디자인및 오류 수정 2025-10-15 16:12:03 +09:00
8a4aa8875f Merge branch 'main' of https://g.wace.me/chpark/wace_plm 2025-10-15 16:03:25 +09:00
eb715b8e1b 자동 컴파일 내용 추가 2025-10-15 16:02:42 +09:00
b0383d3479 auto commit 2025-10-15 16:00:50 +09:00
2f20549444 Merge remote-tracking branch 'origin/main' into main 2025-10-15 15:58:08 +09:00
60356f886c feat: 견적서 작성 기능 추가 (일반 견적서, 장비 견적서)
- 견적서 템플릿 2종 추가 (estimateTemplate1.jsp, estimateTemplate2.jsp)
- 견적서 작성 팝업 기능 구현 (estimateList_new.jsp)
- 견적서 템플릿 컨트롤러 및 서비스 메서드 추가
- 견적서 템플릿용 DB 테이블 스키마 생성 스크립트 추가
- 회사 직인 이미지 추가
- 견적서 양식: A4 인쇄 최적화, 동적 품목 추가/수정, 자동 금액 계산
2025-10-15 15:45:34 +09:00
0be0790e03 변경 내용 커밋 로그인 화면 2025-10-15 15:24:21 +09:00
fec51a86f3 Merge branch 'main' of https://g.wace.me/chpark/wace_plm into main
- ?먭꺽 ?€?μ냼??.gitignore 諛?.class ?뚯씪 ?뺣━ 蹂€寃쎌궗??蹂묓빀
- PartMngController.class 異⑸룎 ?닿껐 (??젣)
2025-10-15 14:51:33 +09:00
5b12cccb77 硫붾돱 ?먮룞 ?④?/蹂댁엫 湲곕뒫 諛??ㅻ뜑 ?됱긽 蹂€寃?
- header.jsp: 硫붾돱 ?됱긽???뚮???#0011ff) 湲곕낯, ?섎뒛??#c4c4f4) ?좏깮?쇰줈 蹂€寃?- menu.jsp: 硫붾돱 ?먮룞 ?④?/蹂댁엫 湲곕뒫 異붽?, ?좊땲硫붿씠???④낵 ?곸슜
- toggle.jsp: ?좊땲硫붿씠???⑥닔 異붽? (fntg_changeSizeWithAnimation, fntg_showMenuWithAnimation)
- 留덉슦???대깽?몃줈 硫붾돱 ?먮룞 ?④?/蹂댁엫 ?쒖뼱
2025-10-15 14:50:51 +09:00
4c84ae5db2 디자인 수정 반영 2025-10-15 14:43:56 +09:00
c3c86ae9cf feat: 견적관리 기능 추가 및 검색조건 확장
- 견적요청등록 팝업 신규 개발 (estimateRegistFormPopup.jsp)
  * S/N 관리 기능 (개별 추가, 연속번호 생성)
  * 유/무상, 품번, 품명, 수량, 환율 등 필드 추가
  * actionType=view 시 닫기 버튼만 표시
- 견적관리 리스트 검색조건 추가
  * 주문유형, 제품구분, 국내/해외, 고객사
  * 유/무상, 품번, 품명, S/N
  * 접수일, 요청납기일 기간 검색
  * 결재상태
- 결재상신 버튼 기능 수정
- 결재 상태 컬럼 추가 및 결재 상세 팝업 연동
- contractBase SQL에 견적관리 필드 추가
2025-10-15 14:28:20 +09:00
e0d992eb64 Merge pull request 'Remove binary .class files from Git and add .gitignore' (#1) from V2025101501 into main
Reviewed-on: #1
2025-10-15 01:17:08 +00:00
Johngreen
9be8e365e6 Remove binary .class files from Git and add .gitignore 2025-10-15 10:16:01 +09:00
Johngreen
213f9a5c84 auto commit 2025-10-15 10:06:05 +09:00
a95069a5cd bom list 수정 반영 2025-10-13 19:44:37 +09:00
a47b1f1ff6 BOM조회 수정정 2025-10-13 17:04:41 +09:00
8e9c6170bb auto commit 2025-09-15 20:30:37 +09:00
b60a9efd5a auto commit 2025-09-12 09:45:39 +09:00
757e88f296 auto commit 2025-09-12 09:42:36 +09:00
97c522508e 파일 수정정 2025-09-12 09:38:06 +09:00
438adc1b7c auto commit 2025-08-30 11:54:41 +09:00
8197ec8782 수정정 2025-08-30 11:47:03 +09:00
26d0247810 로그및 설정 변경경 2025-08-30 11:31:02 +09:00
7f0dcc8922 도커파일 수정정 2025-08-30 02:18:54 +09:00
28d54d620d 구동 오류 수정 2025-08-30 01:47:43 +09:00
c11eed1a5c 설정 파일 커밋밋 2025-08-30 01:33:34 +09:00
6e7ca86285 설정 수정정 2025-08-30 01:07:38 +09:00
e920e5de88 설정파일 커밋밋 2025-08-29 16:43:17 +09:00
224 changed files with 49966 additions and 11458 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -1,96 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/aopalliance-1.0.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/aspectjrt-1.8.4.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/aspectjweaver-1.8.4.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/cglib-3.1.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-beanutils-1.9.1.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-codec-1.9.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-collections-3.2.1.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-digester-1.8.1.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-httpclient-3.1.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-io-2.2.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-lang3-3.1.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-logging-1.1.3.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-net-3.3.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/cos.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/egovframework.rte.ptl.mvc-3.1.0.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/external-debug.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/ezmorph-1.0.6.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/fontbox-2.0.6.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/gson-2.3.1.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/INICrypto_v3.1.6_signed.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/IntegratedCadServer.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jackson-core-asl-1.9.13.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jackson-mapper-asl-1.9.13.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/json-lib-2.2.2-jdk15.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/json-lib-ext-spring-1.0.2.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/json-simple-1.1.1.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jstl-1.2.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jxl.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/log4j-1.2.17.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/log4jdbc-remix-0.2.7.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/mail.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/mybatis-3.2.3.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/mybatis-spring-1.2.1.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/NETSSSOScriptAgent.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/nls-debug.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/ojdbc5.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/pdfbox-2.0.6.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/poi-3.11.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/poi-ooxml-3.11.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/poi-ooxml-schemas-3.11.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/scsl.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/slf4j-api-1.7.7.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/slf4j-log4j12-1.7.7.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-aop-3.2.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-beans-3.2.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-context-3.2.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-core-3.2.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-expression-3.2.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-jdbc-3.2.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-oxm-3.2.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-test-3.2.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-tx-3.2.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-web-3.2.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-webmvc-3.2.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-ws-core-2.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-xml-2.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/stax-api-1.0-2.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-api-3.0.5.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-autotag-core-runtime-1.1.0.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-core-3.0.5.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-el-3.0.5.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-extras-3.0.5.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-jsp-3.0.5.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-request-api-1.0.6.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-request-jsp-1.0.6.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-request-servlet-1.0.6.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-request-servlet-wildcard-1.0.6.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-servlet-3.0.5.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/tiles-template-3.0.5.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/wsdl4j-1.6.1.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/xercesImpl-2.11.0.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/xml-apis-1.4.01.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/xmlbeans-2.6.0.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/xmlpull-1.1.3.1.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/xpp3_min-1.1.4c.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/xstream-1.4.5.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/postgresql-42.2.16.jre7.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jsoup-1.14.3-sources.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jsoup-1.14.3.jar"/>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/woosung">
<attributes>
<attribute name="owner.project.facets" value="jst.web"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre7">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib"/>
<classpathentry kind="output" path="WebContent/WEB-INF/classes"/>
</classpath>
</classpath>

View File

@@ -1,30 +1,22 @@
# PLM WACE 운영환경 설정
# App Service Configuration
# Note: These keys (DB_URL, DB_USER, DB_PASSWORD) might need adjustment
# based on how the actual Java application reads them (e.g., from System.getenv()).
# The JNDI approach suggested earlier might ignore these direct env vars.
# DB_URL=jdbc:postgresql://plm-ilshin-db:5432/ilshin
# DB_USER=postgres
# DB_PASSWORD=ilshin0909!!
# 애플리케이션 환경
NODE_ENV=production
# 데이터베이스 설정
DB_URL=jdbc:postgresql://localhost:5432/waceplm
DB_USERNAME=postgres
DB_PASSWORD=waceplm0909!!
# PostgreSQL 환경 변수
# DB Service Configuration
POSTGRES_DB=waceplm
POSTGRES_USER=postgres
POSTGRES_PASSWORD=waceplm0909!!
# JVM 옵션 (운영환경용)
JAVA_OPTS=-Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m
# 로그 레벨
LOG_LEVEL=INFO
# 개발 모드 플래그
DEBUG=false
# SSL 설정
SSL_ENABLED=true
# 도메인 설정
DOMAIN=waceplm.esgrin.com
ALT_DOMAIN=autoclave.co.kr
# You can add other environment-specific variables here
# Example: TOMCAT_JAVA_OPTS="-Xmx512m -Xms256m"
DB_URL=jdbc:postgresql://wace-plm-db:5432/waceplm
DB_USERNAME=postgres
DB_PASSWORD=waceplm0909!!
DB_DRIVER_CLASS_NAME=org.postgresql.Driver
DB_MAX_TOTAL=200
DB_MAX_IDLE=50
DB_MAX_WAIT_MILLIS=-1

82
.gitignore vendored
View File

@@ -1,67 +1,35 @@
# 환경 설정 파일
.env.*
!.env.*.example
!.env.production
# Compiled class files
*.class
# 로그 파일
logs/
# Build directories
WebContent/WEB-INF/classes/
# Log files
*.log
logs/
# 백업 파일
backup_*.sql
*.bak
# IDE 설정
.vscode/
.idea/
*.swp
*.swo
# OS 생성 파일
# OS files
.DS_Store
Thumbs.db
# 빌드 결과물
target/
build/
dist/
# IDE files
.settings/
.classpath
.project
# 임시 파일
# Environment files (보안상 제외)
.env
.env.development
.env.production
# Temporary files
*.tmp
*.temp
*.bak
*.swp
*~
# Docker 볼륨 데이터
postgres_data/
# Docker volumes
.docker/
# 컴파일된 클래스 파일
*.class
# 패키지 파일
*.jar
*.war
*.ear
# Maven
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
# 대용량 파일 (필요시 Git LFS 사용)
# db/dbexport.pgsql
# 쿠키 파일
cookies.txt
# 압축 파일
*.zip
*.tar.gz
*.rar
# 문서 임시 파일
~$*
# SVN 파일들
.svn/
# Cursor files
.cursor/

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 KiB

View File

@@ -1,41 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>samduck</name>
<name>wace-plm</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
<filteredResources>
<filter>
<id>1756446253951</id>
<id>1754642369857</id>
<name></name>
<type>30</type>
<matcher>

View File

@@ -1,183 +0,0 @@
# WACE PLM 데이터베이스 초기화 가이드
## 개요
WACE PLM 시스템의 데이터베이스를 초기화하는 방법을 설명합니다. `db/dbexport.pgsql` 파일을 사용하여 PostgreSQL 데이터베이스에 초기 데이터를 임포트할 수 있습니다.
## 방법 1: 독립실행환경 (Standalone) - 권장
로컬 PostgreSQL 컨테이너를 포함한 완전한 독립실행환경입니다. 데이터베이스가 자동으로 초기화됩니다.
### 사용법
```bash
# 독립실행환경으로 시작 (로컬 DB 포함)
./start-docker-linux.sh -e standalone
# 또는 Docker 정리 후 시작
./start-docker-linux.sh -e standalone -c
```
### 특징
- 로컬 PostgreSQL 컨테이너 자동 생성
- `dbexport.pgsql` 파일 자동 임포트
- 외부 데이터베이스 의존성 없음
- 접속 정보:
- 애플리케이션: http://localhost:8090
- 데이터베이스: localhost:5432
- 사용자: postgres
- 비밀번호: waceplm0909!!
## 방법 2: 기존 환경에서 데이터베이스 초기화
기존 개발환경이나 운영환경에서 외부 데이터베이스에 초기 데이터를 임포트합니다.
### 사용법
```bash
# 개발환경 데이터베이스 초기화
./start-docker-linux.sh -e dev -i
# 운영환경 데이터베이스 초기화
./start-docker-linux.sh -e prod -i
# 데이터베이스 초기화만 실행 (컨테이너 시작 안함)
./start-docker-linux.sh -i
```
### 특징
- 기존 데이터 자동 백업 생성
- 연결 테스트 후 임포트 실행
- 임포트 결과 검증
- Docker를 사용한 안전한 임포트
## 방법 3: 수동 스크립트 사용
### PostgreSQL 클라이언트 직접 사용
```bash
# 기본 설정으로 초기화
./init-db.sh
# 사용자 정의 설정으로 초기화
./init-db.sh dev 211.115.91.141 11132 waceplm postgres waceplm0909!!
```
### Docker를 사용한 초기화
```bash
# 기본 설정으로 초기화
./init-db-docker.sh
# 사용자 정의 설정으로 초기화
./init-db-docker.sh 211.115.91.141 11132 waceplm postgres waceplm0909!!
```
## 파일 구조
```
db/
├── 00-create-roles.sh # 데이터베이스 역할 생성 스크립트
└── dbexport.pgsql # 데이터베이스 덤프 파일 (200MB+)
# 새로 추가된 파일들
├── docker-compose.standalone.yml # 독립실행환경 설정
├── init-db.sh # 수동 DB 초기화 스크립트
├── init-db-docker.sh # Docker 기반 DB 초기화 스크립트
└── start-docker-linux.sh # 통합 실행 스크립트 (업데이트됨)
```
## 환경별 설정
### 개발환경 (dev)
- Docker Compose: `docker-compose.dev.yml`
- 환경 변수: `.env.development`
- 외부 DB: 211.115.91.141:11132
### 운영환경 (prod)
- Docker Compose: `docker-compose.prod.yml`
- 환경 변수: `.env.production`
- 외부 DB: 설정에 따라
### 독립실행환경 (standalone)
- Docker Compose: `docker-compose.standalone.yml`
- 로컬 PostgreSQL 컨테이너 사용
- 자동 DB 초기화
## 주의사항
1. **대용량 파일**: `dbexport.pgsql` 파일이 200MB 이상이므로 임포트에 시간이 걸릴 수 있습니다.
2. **백업**: 기존 데이터가 있는 경우 자동으로 백업이 생성됩니다.
- 백업 파일명: `backup_YYYYMMDD_HHMMSS.sql`
3. **권한**: 스크립트 실행 전 권한을 확인하세요.
```bash
chmod +x *.sh
```
4. **연결 테스트**: 임포트 전에 데이터베이스 연결을 테스트합니다.
5. **에러 처리**: 임포트 실패 시 백업 파일을 사용하여 복원할 수 있습니다.
## 트러블슈팅
### 연결 실패
```bash
# 데이터베이스 서비스 상태 확인
docker ps | grep postgres
# 네트워크 연결 확인
telnet [DB_HOST] [DB_PORT]
```
### 임포트 실패
```bash
# 로그 확인
./start-docker-linux.sh -l
# 수동 복원
psql -h [HOST] -p [PORT] -U [USER] -d [DB] < backup_YYYYMMDD_HHMMSS.sql
```
### 권한 문제
```bash
# 스크립트 권한 확인
ls -la *.sh
# 권한 부여
chmod +x *.sh
```
## 예시 사용 시나리오
### 최초 설치 시
```bash
# 1. 독립실행환경으로 시작 (권장)
./start-docker-linux.sh -e standalone
# 2. 또는 개발환경에서 DB 초기화 후 시작
./start-docker-linux.sh -e dev -i
```
### 데이터 리셋 시
```bash
# 1. 컨테이너 중지
./start-docker-linux.sh -s
# 2. Docker 정리 후 재시작
./start-docker-linux.sh -e standalone -c
```
### 운영환경 배포 시
```bash
# 1. 데이터베이스 초기화
./start-docker-linux.sh -e prod -i
# 2. 애플리케이션 시작
./start-docker-linux.sh -e prod
```
이 가이드를 통해 WACE PLM 시스템의 데이터베이스를 안전하고 효율적으로 초기화할 수 있습니다.

View File

@@ -146,7 +146,6 @@ chmod +x start-docker-linux.sh
### 운영환경
- 애플리케이션: https://waceplm.esgrin.com
- 대체 도메인: https://autoclave.co.kr
## 트러블슈팅

View File

@@ -17,4 +17,4 @@ COPY ./tomcat-conf/context.xml /usr/local/tomcat/conf/context.xml
EXPOSE 8080
# Start Tomcat
CMD ["catalina.sh", "run"]
CMD ["catalina.sh", "run"]

View File

@@ -10,6 +10,9 @@ COPY src /usr/local/tomcat/webapps/ROOT/WEB-INF/src
# Copy custom Tomcat context configuration for JNDI
COPY ./tomcat-conf/context.xml /usr/local/tomcat/conf/context.xml
# Copy custom Tomcat server configuration for URIEncoding
COPY ./tomcat-conf/server.xml /usr/local/tomcat/conf/server.xml
# Copy database driver if needed (PostgreSQL driver is already in WEB-INF/lib)
# COPY path/to/postgresql-driver.jar /usr/local/tomcat/lib/

125
README.md
View File

@@ -1,21 +1,21 @@
# PLM 솔루션 (WACE PLM)
# RPS 업무관리 시스템
## 프로젝트 개요
본 프로젝트는 제품 수명 주기 관리(PLM - Product Lifecycle Management) 솔루션입니다. 제품 개발 초기 단계부터 설계, 생산, 유통, 유지보수 및 폐기에 이르기까지 제품과 관련된 모든 데이터와 프로세스를 통합적으로 관리하는 것을 목표로 합니다.
본 프로젝트는 RPS(Resource Planning System) 업무관리 시스템입니다. 기업의 자원 계획 및 업무 프로세스를 통합적으로 관리하여 효율적인 업무 처리와 자원 최적화를 목표로 합니다.
## 주요 기능 (예상)
## 주요 기능
소스 코드 분석 및 일반적인 PLM 솔루션의 기능을 바탕으로 다음과 같은 메뉴/기능을 포함할 것으로 예상됩니다. 실제 메뉴는 애플리케이션 실행 후 확인해야 합니다.
RPS 업무관리 시스템의 주요 기능은 다음과 같습니다:
- **제품 정보 관리:** 제품 분류, 속성, 사양 등 관리
- **BOM (Bill of Materials) 관리:** 부품 목록, 계층 구조 관리 (eBOM, mBOM 등)
- **설계 변경 관리 (ECO/ECR):** 설계 변경 요청, 검토, 승인 프로세스 관리
- **문서 관리:** CAD 데이터, 도면, 기술 문서 등의 버전 관리 및 접근 제어
- **프로젝트/일정 관리:** 개발 프로젝트 일정, 리소스, 산출물 관리
- **사용자 및 권한 관리:** 역할 기반 접근 제어
- **워크플로우 관리:** 표준 프로세스 자동화 및 추적
- **데이터 시각화/리포트:** 다양한 형식의 보고서 생성 (데이터 표시는 `jqGrid` 활용할 것으로 보입니다.)
- **자원 관리:** 인적 자원, 물적 자원, 시설 등의 통합 관리
- **업무 프로세스 관리:** 업무 흐름 정의, 승인 프로세스, 워크플로우 관리
- **프로젝트 관리:** 프로젝트 계획, 일정 관리, 진행 상황 추적
- **문서 관리:** 업무 문서의 생성, 수정, 승인, 보관 및 검색
- **보고서 및 분석:** 업무 현황 분석, KPI 관리, 대시보드 제공
- **사용자 및 권한 관리:** 역할 기반 접근 제어 및 권한 관리
- **알림 및 메시징:** 업무 관련 알림, 메시지 전송 기능
- **데이터 시각화:** 차트, 그래프를 통한 데이터 시각화 (jqGrid, Tabulator 등 활용)
## 기술 스택
@@ -25,8 +25,8 @@
- MyBatis (v3.2.3) - 데이터베이스 연동
- **Frontend:**
- JSP (JavaServer Pages)
- JavaScript (jQuery v1.11.3 / v2.1.4, jqGrid v4.7.1 확인)
- CSS
- JavaScript (jQuery v1.11.3 / v2.1.4, jqGrid v4.7.1, Tabulator 확인)
- CSS (basic.css - 메인 스타일시트, 드롭다운 메뉴 및 반응형 디자인 포함)
- Apache Tiles (v3.0.5) - 페이지 레이아웃/템플릿
- **Database:**
- PostgreSQL (연결 정보 및 드라이버 확인)
@@ -44,6 +44,99 @@
- `pdfbox` (PDF 처리)
- 기타 다수 (`WebContent/WEB-INF/lib` 디렉토리 참조)
## UI 구조 및 메뉴 시스템
### 메뉴 구조
- **상단 네비게이션:** 메인 메뉴가 상단 헤더에 위치
- **드롭다운 메뉴:** 상단 메뉴 클릭 시 하위 메뉴가 드롭다운으로 표시
- **전체 화면 활용:** 왼쪽 프레임을 제거하고 컨텐츠 영역을 전체 화면으로 확대
- **반응형 디자인:** 다양한 화면 크기에 대응하는 반응형 레이아웃
### 주요 파일
- **header.jsp:** 상단 메뉴 및 네비게이션 구조 정의
- **basic.css:** 메인 스타일시트, 드롭다운 메뉴 스타일 포함
- **메뉴 관련 JavaScript:** jQuery 기반 메뉴 인터랙션 처리
## Materialize CSS 드롭다운 시스템
본 시스템은 [Materialize CSS](https://materializecss.com/dropdown.html) 프레임워크의 드롭다운 컴포넌트를 활용하여 현대적이고 사용자 친화적인 메뉴 시스템을 구현합니다.
### Materialize CSS 드롭다운 특징
#### 기본 구조
```html
<!-- 드롭다운 트리거 -->
<a class='dropdown-trigger btn' href='#' data-target='dropdown1'>Drop Me!</a>
<!-- 드롭다운 구조 -->
<ul id='dropdown1' class='dropdown-content'>
<li><a href="#!">one</a></li>
<li><a href="#!">two</a></li>
<li class="divider" tabindex="-1"></li>
<li><a href="#!">three</a></li>
<li><a href="#!"><i class="material-icons">view_module</i>four</a></li>
<li><a href="#!"><i class="material-icons">cloud</i>five</a></li>
</ul>
```
#### JavaScript 초기화
```javascript
// DOM 로드 완료 후 초기화
document.addEventListener('DOMContentLoaded', function() {
var elems = document.querySelectorAll('.dropdown-trigger');
var instances = M.Dropdown.init(elems, options);
});
// jQuery 방식
$('.dropdown-trigger').dropdown();
```
#### 주요 옵션
| 옵션명 | 타입 | 기본값 | 설명 |
|--------|------|--------|------|
| alignment | String | 'left' | 메뉴 정렬 방향 정의 |
| autoTrigger | Boolean | true | 키보드 포커스 자동 설정 |
| constrainWidth | Boolean | true | 드롭다운 너비를 트리거 크기에 맞춤 |
| container | Element | null | 드롭다운의 경계 컨테이너 지정 |
| coverTrigger | Boolean | true | false시 트리거 아래에 드롭다운 표시 |
| closeOnClick | Boolean | true | 항목 클릭시 드롭다운 닫기 |
| hover | Boolean | false | 호버시 드롭다운 열기 |
| inDuration | Number | 150 | 열림 애니메이션 지속시간 (ms) |
| outDuration | Number | 250 | 닫힘 애니메이션 지속시간 (ms) |
#### 주요 메서드
- **`.open()`**: 드롭다운 열기
- **`.close()`**: 드롭다운 닫기
- **`.recalculateDimensions()`**: 내용 변경시 크기 재계산
- **`.destroy()`**: 인스턴스 제거
#### 인스턴스 속성
- **`el`**: 초기화된 DOM 엘리먼트
- **`options`**: 초기화 옵션 객체
- **`id`**: 드롭다운 엘리먼트 ID
- **`dropdownEl`**: 드롭다운 DOM 엘리먼트
- **`isOpen`**: 드롭다운 열림 상태
- **`isScrollable`**: 드롭다운 스크롤 가능 여부
- **`focusedIndex`**: 포커스된 항목 인덱스
### 시스템 적용 방식
본 RPS 시스템에서는 Materialize CSS 드롭다운을 다음과 같이 활용합니다:
1. **CDN 라이브러리 로드**
```html
<!-- Materialize CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<!-- Material Icons -->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!-- Materialize JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
```
2. **동적 메뉴 로딩**: AJAX를 통해 서버에서 메뉴 데이터를 가져와 동적으로 드롭다운 생성
3. **Material Design 아이콘**: 메뉴 항목에 Material Icons 적용으로 시각적 향상
4. **커스텀 스타일링**: basic.css를 통해 기존 시스템 디자인과 조화로운 스타일 적용
## 프로젝트 구조 (폴더별 역할)
- **`.git/`**: Git 버전 관리 시스템 메타데이터 저장소.
@@ -66,7 +159,7 @@
이 프로젝트는 제공된 `Dockerfile` 및 `docker-compose.yml` 파일을 사용하여 Docker 컨테이너 환경에서 실행할 수 있습니다.
1. **Docker 및 Docker Compose 설치:** 시스템에 Docker와 Docker Compose가 설치되어 있어야 합니다.
2. **데이터베이스 파일 준비:** `waceplm.pgsql` 파일이 프로젝트 루트 디렉토리에 있는지 확인합니다. (필요시 `docker-compose.yml`에서 파일 경로 수정)
2. **데이터베이스 파일 준비:** `ilshin.pgsql` 파일이 프로젝트 루트 디렉토리에 있는지 확인합니다. (필요시 `docker-compose.yml`에서 파일 경로 수정)
3. **Docker Compose 실행:** 프로젝트 루트 디렉토리에서 다음 명령어를 실행합니다.
```bash
docker-compose up --build -d
@@ -77,4 +170,4 @@
**참고:**
- 애플리케이션이 데이터베이스 연결 정보를 읽는 방식 (예: JNDI, 환경 변수, 설정 파일)에 따라 `docker-compose.yml`의 `app` 서비스 환경 변수 또는 Tomcat 설정 파일 (`context.xml` 등) 수정이 필요할 수 있습니다.
- `SETTING_GUIDE.txt`에 명시된 Tomcat 컨텍스트 경로 (`/waceplm`)를 사용하려면 `Dockerfile`에서 `WebContent`를 `/usr/local/tomcat/webapps/waceplm`로 복사하거나 Tomcat 설정을 변경해야 할 수 있습니다. 현재 설정은 `/` (ROOT) 경로로 배포됩니다.
- `SETTING_GUIDE.txt`에 명시된 Tomcat 컨텍스트 경로 (`/ilshin`)를 사용하려면 `Dockerfile`에서 `WebContent`를 `/usr/local/tomcat/webapps/ilshin`로 복사하거나 Tomcat 설정을 변경해야 할 수 있습니다. 현재 설정은 `/` (ROOT) 경로로 배포됩니다.

View File

@@ -1,3 +1,3 @@
<Context docBase="woosung" path="/" reloadable="true" source="org.eclipse.jst.jee.server:woosung">
<Resource auth="Container" driverClassName="org.postgresql.Driver" maxActive="100" maxIdle="10" maxWait="-1" name="plm" password="admin0909!!" type="javax.sql.DataSource" url="jdbc:postgresql://211.224.136.4:5432/woosung" username="postgres"/>
<Context docBase="ilshin" path="/" reloadable="true" source="org.eclipse.jst.jee.server:ilshin">
<Resource auth="Container" driverClassName="org.postgresql.Driver" maxActive="100" maxIdle="10" maxWait="-1" name="plm" password="admin0909!!" type="javax.sql.DataSource" url="jdbc:postgresql://211.224.136.4:5432/ilshin" username="postgres"/>
</Context>

File diff suppressed because it is too large Load Diff

View File

@@ -2869,4 +2869,138 @@
</if>
ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC
</select>
<!-- M-BOM 관리 목록 조회 -->
<select id="mBomMgmtGridList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
PM.OBJID,
PM.CONTRACT_OBJID,
PM.PROJECT_NO,
CM.CATEGORY_CD,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.CATEGORY_CD LIMIT 1),
''
) AS CATEGORY_NAME,
CM.PRODUCT,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.PRODUCT LIMIT 1),
''
) AS PRODUCT_NAME,
CM.AREA_CD,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.AREA_CD LIMIT 1),
''
) AS AREA_NAME,
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS RECEIPT_DATE,
CM.CUSTOMER_OBJID,
COALESCE(
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID = CM.CUSTOMER_OBJID::NUMERIC LIMIT 1),
''
) AS CUSTOMER_NAME,
CM.PAID_TYPE,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.PAID_TYPE LIMIT 1),
CASE
WHEN CM.PAID_TYPE = 'paid' THEN '유상'
WHEN CM.PAID_TYPE = 'free' THEN '무상'
ELSE ''
END
) AS PAID_TYPE_NAME,
COALESCE(PM.PART_NO, '') AS PART_NO,
COALESCE(PM.PART_NAME, '') AS PART_NAME,
-- S/N: CONTRACT_ITEM_SERIAL에서 조회
(SELECT
CASE
WHEN COUNT(*) = 0 THEN ''
WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO)
ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건'
END
FROM CONTRACT_ITEM CI
LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID AND UPPER(CIS.STATUS) = 'ACTIVE'
WHERE CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
AND CI.PART_OBJID = PM.PART_OBJID
AND CI.STATUS = 'ACTIVE'
AND CIS.SERIAL_NO IS NOT NULL) AS SERIAL_NO,
COALESCE(PM.QUANTITY::numeric, 0) AS QUANTITY,
-- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT
COALESCE(
(SELECT CI.DUE_DATE
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
AND CI.PART_OBJID = PM.PART_OBJID
AND CI.STATUS = 'ACTIVE' LIMIT 1),
PM.DUE_DATE,
CM.req_del_date
) AS REQ_DEL_DATE,
-- 고객요청사항: CONTRACT_ITEM에서 가져옴
COALESCE(
(SELECT CI.CUSTOMER_REQUEST
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
AND CI.PART_OBJID = PM.PART_OBJID
AND CI.STATUS = 'ACTIVE' LIMIT 1),
''
) AS CUSTOMER_REQUEST,
-- E-BOM 정보: PM.PART_OBJID가 E-BOM OBJID를 직접 가리킴
PM.PART_OBJID AS BOM_REPORT_OBJID,
COALESCE(
(SELECT PBR.STATUS
FROM PART_BOM_REPORT PBR
WHERE PBR.OBJID::VARCHAR = PM.PART_OBJID
LIMIT 1),
''
) AS EBOM_STATUS,
COALESCE(
(SELECT TO_CHAR(PBR.REGDATE, 'YYYY-MM-DD')
FROM PART_BOM_REPORT PBR
WHERE PBR.OBJID::VARCHAR = PM.PART_OBJID
LIMIT 1),
''
) AS EBOM_REGDATE,
COALESCE(PM.MBOM_STATUS, '') AS MBOM_STATUS,
'1.0' AS MBOM_VERSION,
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS MBOM_REGDATE
FROM
PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
WHERE 1=1
AND PM.PROJECT_NO IS NOT NULL
AND PM.PROJECT_NO != ''
<!-- 품번 검색 (대소문자 구분 없음) -->
<if test="search_part_no != null and search_part_no != ''">
AND UPPER(PM.PART_NO) LIKE '%' || UPPER(#{search_part_no}) || '%'
</if>
<!-- 품명 검색 (대소문자 구분 없음) -->
<if test="search_part_name != null and search_part_name != ''">
AND UPPER(PM.PART_NAME) LIKE '%' || UPPER(#{search_part_name}) || '%'
</if>
ORDER BY PM.REGDATE DESC
</select>
<!-- E-BOM을 PROJECT_MGMT에 할당 -->
<update id="assignEbomToProject" parameterType="map">
UPDATE PROJECT_MGMT
SET
PART_OBJID = #{bomReportObjid}
WHERE OBJID = #{projectMgmtObjid}
</update>
<!-- E-BOM 정보 조회 -->
<select id="getEbomInfo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
T.OBJID,
T.PRODUCT_CD,
CODE_NAME(T.PRODUCT_CD) as PRODUCT_NAME,
T.PART_NO,
T.PART_NAME,
T.STATUS,
T.REVISION,
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS REG_DATE,
UI.USER_NAME AS WRITER_NAME,
UI.DEPT_NAME
FROM
PART_BOM_REPORT T
LEFT JOIN USER_INFO UI ON UI.USER_ID = T.WRITER
WHERE T.OBJID::VARCHAR = #{objid}
</select>
</mapper>

View File

@@ -3907,8 +3907,55 @@
,CODE_NAME(MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,CONTRACT_RESULT
,CODE_NAME(CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,(SELECT
CASE
WHEN O.PAID_TYPE = 'paid' THEN '유상'
WHEN O.PAID_TYPE = 'free' THEN '무상'
ELSE O.PAID_TYPE
END
FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS FREE_OF_CHARGE
,COALESCE(T.QUANTITY::numeric, 0) AS CONTRACT_QTY
,T.PART_NO AS PRODUCT_ITEM_CODE
,T.PART_NAME AS PRODUCT_ITEM_NAME
-- S/N: 해당 품목의 시리얼 번호 (여러 개일 경우 "S/N 외 N건" 형식)
,(SELECT
CASE
WHEN COUNT(*) = 0 THEN ''
WHEN COUNT(*) = 1 THEN MIN(S.SERIAL_NO)
ELSE MIN(S.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건'
END
FROM CONTRACT_ITEM AS I
LEFT JOIN CONTRACT_ITEM_SERIAL AS S ON S.ITEM_OBJID = I.OBJID AND S.STATUS = 'ACTIVE'
WHERE I.CONTRACT_OBJID = T.CONTRACT_OBJID
AND I.PART_OBJID = T.PART_OBJID
AND S.SERIAL_NO IS NOT NULL) AS SERIAL_NO
-- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT.DUE_DATE, 없으면 CONTRACT_MGMT.due_date
,COALESCE(
(SELECT CI.DUE_DATE
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CI.PART_OBJID = T.PART_OBJID
AND CI.STATUS = 'ACTIVE'),
T.DUE_DATE,
(SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)
) AS REQ_DEL_DATE
-- 영업관리_주문서관리_수주등록
,EBOM_STATUS
,MBOM_STATUS
-- 발주일: CONTRACT_MGMT 테이블에서 가져오기 (영업관리_주문서관리와 동일)
,(SELECT O.ORDER_DATE FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS ORDER_DATE
,RECEIVING_RATE
,PRODUCTION_TEAM_12
,PRODUCTION_TEAM_3
-- 출하일: sales_registration 테이블에서 가져오기 (영업관리_판매관리와 동일)
,COALESCE(
(SELECT TO_CHAR(SR.shipping_date, 'YYYY-MM-DD')
FROM sales_registration SR
WHERE SR.project_no = T.PROJECT_NO),
''
) AS SHIPMENT_DATE
,(((SELECT SUM(COALESCE(DESIGN_RATE,'0')::INTEGER) / COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID)
+(SELECT SUM(COALESCE(PURCHASE_RATE,'0')::INTEGER) / COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID)
+(SELECT SUM(COALESCE(PRODUCE_RATE,'0')::INTEGER) / COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID)
@@ -7362,16 +7409,20 @@ SELECT
,EST_USER_ID
,EST_COMP_DATE
,EST_RESULT_CD
,AREA_CD
,MECHANICAL_TYPE
,OVERHAUL_ORDER
,IS_TEMP
)
,AREA_CD
,MECHANICAL_TYPE
,OVERHAUL_ORDER
,IS_TEMP
,PART_OBJID
,PART_NO
,PART_NAME
,QUANTITY
)
(
SELECT
#{OBJID}
,#{objId}
,#{objId}
,CATEGORY_CD
,CUSTOMER_OBJID
,PRODUCT
@@ -7390,29 +7441,71 @@ SELECT
,CHG_USER_ID
,PLAN_DATE
,COMPLETE_DATE
,RESULT_CD
<choose>
<when test="overhaul_project_no != null and overhaul_project_no !='' ">
,#{overhaul_project_no}<!-- || '_' || #{overhaul_order} -->
</when>
<otherwise>
,MECHANICAL_TYPE || '-' ||
<!--
(SELECT (SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1))::integer+1 FROM PROJECT_MGMT WHERE PROJECT_NO NOT LIKE '%\_%' ESCAPE '\' ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC LIMIT 1)
-->
(SELECT CASE
WHEN PROJECT_NO ~ '[-\s][0-9]+$'
THEN REGEXP_REPLACE(PROJECT_NO, '.*[-\s]([0-9]+)$', '\1')::integer+1
ELSE NULL
END AS extracted_number
FROM PROJECT_MGMT
WHERE PROJECT_NO NOT LIKE '%\_%' ESCAPE '\'
ORDER BY extracted_number DESC NULLS LAST
LIMIT 1)
</otherwise>
</choose>
<!-- ,#{project_no} -->
<!-- ,(SELECT TITLE FROM PMS_WBS_TEMPLATE PWT WHERE PWT.OBJID = #{mechanical_type}) || '-' || (SELECT (SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1))::integer+1 FROM PROJECT_MGMT ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC LIMIT 1) -->
,RESULT_CD
<!-- 기존 PROJECT_NO 자동생성 로직 (주석처리)
<choose>
<when test="overhaul_project_no != null and overhaul_project_no !='' ">
,#{overhaul_project_no}
</when>
<otherwise>
,MECHANICAL_TYPE || '-' ||
(SELECT CASE
WHEN PROJECT_NO ~ '[-\s][0-9]+$'
THEN REGEXP_REPLACE(PROJECT_NO, '.*[-\s]([0-9]+)$', '\1')::integer+1
ELSE NULL
END AS extracted_number
FROM PROJECT_MGMT
WHERE PROJECT_NO NOT LIKE '%\_%' ESCAPE '\'
ORDER BY extracted_number DESC NULLS LAST
LIMIT 1)
</otherwise>
</choose>
-->
<!-- 신규 PROJECT_NO 생성 로직: 주문유형-제품구분-날짜-순번 형식 (예: R-AS-250302-001) -->
,(
SELECT
-- 주문유형 코드 (CATEGORY_CD를 영문 약어로 매핑)
CASE CODE_NAME(CATEGORY_CD)
WHEN '오버홀' THEN 'O'
WHEN '개조' THEN 'M'
WHEN '개발' THEN 'D'
WHEN '견적' THEN 'Q'
WHEN '수리' THEN 'R'
WHEN '판매' THEN 'S'
ELSE 'T'
END || '-' ||
-- 제품구분 코드 (PRODUCT의 CODE_NAME에서 슬래시 제거)
REPLACE(CODE_NAME(PRODUCT), '/', '') || '-' ||
-- 날짜 (YYMMDD)
TO_CHAR(CURRENT_DATE, 'YYMMDD') || '-' ||
-- 순번 (001, 002, ...)
LPAD(
COALESCE(
(
SELECT MAX(SUBSTRING(PROJECT_NO FROM '\d{3}$')::INTEGER) + 1
FROM PROJECT_MGMT
WHERE PROJECT_NO LIKE
CASE CODE_NAME(CATEGORY_CD)
WHEN '오버홀' THEN 'O'
WHEN '개조' THEN 'M'
WHEN '개발' THEN 'D'
WHEN '견적' THEN 'Q'
WHEN '수리' THEN 'R'
WHEN '판매' THEN 'S'
ELSE 'T'
END || '-' ||
REPLACE(CODE_NAME(PRODUCT), '/', '') || '-' ||
TO_CHAR(CURRENT_DATE, 'YYMMDD') || '-%'
),
1
)::TEXT,
3,
'0'
)
FROM CONTRACT_MGMT
WHERE OBJID = #{objId}
)
,PM_USER_ID
,#{contract_price}
,#{contract_price_currency}
@@ -7437,12 +7530,16 @@ SELECT
,EST_USER_ID
,EST_COMP_DATE
,EST_RESULT_CD
,AREA_CD
,MECHANICAL_TYPE
,#{overhaul_order}
,#{is_temp}
FROM CONTRACT_MGMT
WHERE OBJID=#{objId}
,AREA_CD
,MECHANICAL_TYPE
,#{overhaul_order}
,#{is_temp}
,#{part_objid}
,#{part_no}
,#{part_name}
,#{quantity}
FROM CONTRACT_MGMT
WHERE OBJID=#{objId}
)
</insert>
@@ -7549,7 +7646,12 @@ SELECT
,REQ_DEL_DATE = #{req_del_date}
,CONTRACT_COMPANY = #{contract_company}
,MANUFACTURE_PLANT = #{manufacture_plant}
,PART_OBJID = #{part_objid}
,PART_NO = #{part_no}
,PART_NAME = #{part_name}
,QUANTITY = #{quantity}
WHERE CONTRACT_OBJID = #{objId}
AND PART_OBJID = #{part_objid}
</update>
<delete id="deleteProjectMngInfo" parameterType="map">

View File

@@ -812,5 +812,586 @@
,editEmpNo = #{cretEmpNo} /* 수정자 */
</update>
<!-- 매출관리 그리드 목록 - project_mgmt 테이블 기반 조회 (S/N, 유무상 포함) -->
<select id="getSalesMgmtGridList" parameterType="map" resultType="map">
/* salesNcollectMgmt.getSalesMgmtGridList - sales_registration LEFT JOIN으로 최적화 */
SELECT
T.OBJID,
T.PROJECT_NO,
T.CONTRACT_OBJID,
CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE,
CODE_NAME(T.PRODUCT) AS PRODUCT_TYPE,
CODE_NAME(T.AREA_CD) AS NATION,
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS RECEIPT_DATE,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER,
(SELECT
CASE
WHEN CM.PAID_TYPE = 'paid' THEN '유상'
WHEN CM.PAID_TYPE = 'free' THEN '무상'
ELSE CM.PAID_TYPE
END
FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PAYMENT_TYPE,
T.PART_NO AS PRODUCT_NO,
T.PART_NAME AS PRODUCT_NAME,
-- S/N: 해당 품목의 시리얼 번호 (여러 개일 경우 "S/N 외 N건" 형식)
(SELECT
CASE
WHEN COUNT(*) = 0 THEN ''
WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO)
ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건'
END
FROM CONTRACT_ITEM CI
LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID AND UPPER(CIS.STATUS) = 'ACTIVE'
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CI.PART_OBJID = T.PART_OBJID
AND CI.STATUS = 'ACTIVE'
AND CIS.SERIAL_NO IS NOT NULL) AS SERIAL_NO,
COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY,
-- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT
COALESCE(
(SELECT CI.DUE_DATE
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CI.PART_OBJID = T.PART_OBJID
AND CI.STATUS = 'ACTIVE'),
T.DUE_DATE,
(SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)
) AS REQUEST_DATE,
-- 고객요청사항: CONTRACT_ITEM에서만 가져옴 (견적관리와 완전히 동일)
(SELECT CI.CUSTOMER_REQUEST
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CI.PART_OBJID = T.PART_OBJID
AND CI.STATUS = 'ACTIVE') AS CUSTOMER_REQUEST,
CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS,
T.PO_NO,
COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE,
CASE WHEN EXISTS(
SELECT 1 FROM ATTACH_FILE_INFO
WHERE TARGET_OBJID = T.CONTRACT_OBJID
AND DOC_TYPE='ORDER_DOC'
AND UPPER(STATUS) = 'ACTIVE'
) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH,
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
-- 판매 관련 필드들 (sales_registration 테이블에서 한 번에 가져오기)
COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS,
COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY,
COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE,
COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE,
COALESCE(SR.sales_vat, 0) AS SALES_VAT,
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT,
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW,
COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY,
CODE_NAME(COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY)) AS SALES_CURRENCY_NAME,
COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE,
COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE,
COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD,
COALESCE(
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = SR.manager_user_id),
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.PM_USER_ID)
) AS MANAGER,
COALESCE(SR.incoterms, '') AS INCOTERMS,
T.SALES_STATUS,
T.OBJID::VARCHAR AS SALE_NO,
'ORIGINAL' AS RECORD_TYPE,
'' AS SPLIT_LOG_ID
FROM PROJECT_MGMT AS T
LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no
WHERE 1 = 1
AND T.PROJECT_NO IS NOT NULL
AND T.PROJECT_NO != ''
<if test="orderType != null and orderType != ''">
AND T.CATEGORY_CD = #{orderType}
</if>
<if test="productType != null and productType != ''">
AND T.PRODUCT = #{productType}
</if>
<if test="nation != null and nation != ''">
AND T.AREA_CD = #{nation}
</if>
<if test="customer != null and customer != ''">
AND EXISTS (
SELECT 1 FROM SUPPLY_MNG
WHERE OBJID = T.CUSTOMER_OBJID::NUMERIC
AND SUPPLY_NAME LIKE CONCAT('%', #{customer}, '%')
)
</if>
<if test="customer_objid != null and customer_objid != ''">
AND T.CUSTOMER_OBJID = #{customer_objid}
</if>
<if test="paymentType != null and paymentType != ''">
AND EXISTS (
SELECT 1 FROM CONTRACT_MGMT CM
WHERE CM.OBJID = T.CONTRACT_OBJID
AND (
(#{paymentType} = 'N' AND CM.PAID_TYPE = 'paid') OR
(#{paymentType} = 'Y' AND CM.PAID_TYPE = 'free')
)
)
</if>
<if test="productNo != null and productNo != ''">
AND T.PART_NO LIKE CONCAT('%', #{productNo}, '%')
</if>
<if test="productName != null and productName != ''">
AND T.PART_NAME LIKE CONCAT('%', #{productName}, '%')
</if>
<if test="serialNo != null and serialNo != ''">
AND EXISTS (
SELECT 1 FROM CONTRACT_ITEM CI
JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CIS.SERIAL_NO LIKE CONCAT('%', #{serialNo}, '%')
AND UPPER(CIS.STATUS) = 'ACTIVE'
)
</if>
<if test="orderStatus != null and orderStatus != ''">
AND T.CONTRACT_RESULT = #{orderStatus}
</if>
<if test="poNo != null and poNo != ''">
AND T.PO_NO LIKE CONCAT('%', #{poNo}, '%')
</if>
<if test="requestDateFrom != null and requestDateFrom != ''">
AND T.DUE_DATE <![CDATA[>=]]> #{requestDateFrom}
</if>
<if test="requestDateTo != null and requestDateTo != ''">
AND T.DUE_DATE <![CDATA[<=]]> #{requestDateTo}
</if>
<if test="orderDateFrom != null and orderDateFrom != ''">
AND T.CONTRACT_DATE <![CDATA[>=]]> #{orderDateFrom}
</if>
<if test="orderDateTo != null and orderDateTo != ''">
AND T.CONTRACT_DATE <![CDATA[<=]]> #{orderDateTo}
</if>
<if test="shippingStatus != null and shippingStatus != ''">
/* SALES_STATUS 필드 없음 - 검색 조건 무시 */
</if>
<if test="shippingDateFrom != null and shippingDateFrom != ''">
/* SHIPPING_DATE 필드 없음 - 검색 조건 무시 */
</if>
<if test="shippingDateTo != null and shippingDateTo != ''">
/* SHIPPING_DATE 필드 없음 - 검색 조건 무시 */
</if>
<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
</select>
<!-- 매출관리 그리드 목록 개수 - project_mgmt 테이블 기반 -->
<select id="getSalesMgmtGridListCount" parameterType="map" resultType="map">
/* salesNcollectMgmt.getSalesMgmtGridListCount - project_mgmt 테이블 기반 */
SELECT
CEIL(COUNT(1)::float / #{COUNT_PER_PAGE}::float)::numeric::integer AS MAX_PAGE_SIZE,
COUNT(1)::integer AS TOTAL_CNT
FROM PROJECT_MGMT AS T
WHERE 1 = 1
AND T.PROJECT_NO IS NOT NULL
AND T.PROJECT_NO != ''
<if test="orderType != null and orderType != ''">
AND T.CATEGORY_CD = #{orderType}
</if>
<if test="productType != null and productType != ''">
AND T.PRODUCT = #{productType}
</if>
<if test="nation != null and nation != ''">
AND T.AREA_CD = #{nation}
</if>
<if test="customer != null and customer != ''">
AND EXISTS (
SELECT 1 FROM SUPPLY_MNG
WHERE OBJID = T.CUSTOMER_OBJID::NUMERIC
AND SUPPLY_NAME LIKE CONCAT('%', #{customer}, '%')
)
</if>
<if test="customer_objid != null and customer_objid != ''">
AND T.CUSTOMER_OBJID = #{customer_objid}
</if>
<if test="paymentType != null and paymentType != ''">
AND EXISTS (
SELECT 1 FROM CONTRACT_MGMT CM
WHERE CM.OBJID = T.CONTRACT_OBJID
AND (
(#{paymentType} = 'N' AND CM.PAID_TYPE = 'paid') OR
(#{paymentType} = 'Y' AND CM.PAID_TYPE = 'free')
)
)
</if>
<if test="productNo != null and productNo != ''">
AND T.PART_NO LIKE CONCAT('%', #{productNo}, '%')
</if>
<if test="productName != null and productName != ''">
AND T.PART_NAME LIKE CONCAT('%', #{productName}, '%')
</if>
<if test="serialNo != null and serialNo != ''">
AND EXISTS (
SELECT 1 FROM CONTRACT_ITEM CI
JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CIS.SERIAL_NO LIKE CONCAT('%', #{serialNo}, '%')
AND UPPER(CIS.STATUS) = 'ACTIVE'
)
</if>
<if test="orderStatus != null and orderStatus != ''">
AND T.CONTRACT_RESULT = #{orderStatus}
</if>
<if test="poNo != null and poNo != ''">
AND T.PO_NO LIKE CONCAT('%', #{poNo}, '%')
</if>
<if test="requestDateFrom != null and requestDateFrom != ''">
AND T.DUE_DATE <![CDATA[>=]]> #{requestDateFrom}
</if>
<if test="requestDateTo != null and requestDateTo != ''">
AND T.DUE_DATE <![CDATA[<=]]> #{requestDateTo}
</if>
<if test="orderDateFrom != null and orderDateFrom != ''">
AND T.CONTRACT_DATE <![CDATA[>=]]> #{orderDateFrom}
</if>
<if test="orderDateTo != null and orderDateTo != ''">
AND T.CONTRACT_DATE <![CDATA[<=]]> #{orderDateTo}
</if>
<if test="shippingStatus != null and shippingStatus != ''">
/* SALES_STATUS 필드 없음 - 검색 조건 무시 */
</if>
<if test="shippingDateFrom != null and shippingDateFrom != ''">
/* SHIPPING_DATE 필드 없음 - 검색 조건 무시 */
</if>
<if test="shippingDateTo != null and shippingDateTo != ''">
/* SHIPPING_DATE 필드 없음 - 검색 조건 무시 */
</if>
<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>
<!-- 매출관리 합계 조회 (Total 공급가액, 부가세, 총액) -->
<select id="getSalesMgmtTotals" parameterType="map" resultType="map">
/* salesNcollectMgmt.getSalesMgmtTotals */
SELECT
COALESCE(SUM(COALESCE(A.order_supply_price, '0')::numeric), 0)::numeric AS TOTAL_SUPPLY_PRICE, /* Total 공급가액 */
COALESCE(SUM(COALESCE(A.order_vat, '0')::numeric), 0)::numeric AS TOTAL_VAT, /* Total 부가세 */
COALESCE(SUM(COALESCE(A.order_total_amount, '0')::numeric), 0)::numeric AS TOTAL_AMOUNT /* Total 총액 */
FROM contract_mgmt A
LEFT JOIN supply_mng SUP ON SUP.objid::varchar = A.customer_objid
WHERE 1 = 1
<if test="orderType != null and orderType != ''">
AND A.category_cd = #{orderType}
</if>
<if test="productType != null and productType != ''">
AND A.product = #{productType}
</if>
<if test="nation != null and nation != ''">
AND A.area_cd = #{nation}
</if>
<if test="customer != null and customer != ''">
AND SUP.supply_name LIKE CONCAT('%', #{customer}, '%')
</if>
<if test="paymentType != null and paymentType != ''">
AND A.paid_type = #{paymentType}
</if>
<if test="productNo != null and productNo != ''">
AND A.part_no LIKE CONCAT('%', #{productNo}, '%')
</if>
<if test="productName != null and productName != ''">
AND A.part_name LIKE CONCAT('%', #{productName}, '%')
</if>
<if test="serialNo != null and serialNo != ''">
AND A.serial_no LIKE CONCAT('%', #{serialNo}, '%')
</if>
<if test="orderStatus != null and orderStatus != ''">
AND A.status_cd = #{orderStatus}
</if>
<if test="poNo != null and poNo != ''">
AND A.po_no LIKE CONCAT('%', #{poNo}, '%')
</if>
<if test="requestDateFrom != null and requestDateFrom != ''">
AND A.req_del_date <![CDATA[>=]]> #{requestDateFrom}
</if>
<if test="requestDateTo != null and requestDateTo != ''">
AND A.req_del_date <![CDATA[<=]]> #{requestDateTo}
</if>
<if test="orderDateFrom != null and orderDateFrom != ''">
AND A.order_date <![CDATA[>=]]> #{orderDateFrom}
</if>
<if test="orderDateTo != null and orderDateTo != ''">
AND A.order_date <![CDATA[<=]]> #{orderDateTo}
</if>
<if test="shippingStatus != null and shippingStatus != ''">
/* shippingStatus 필드가 contract_mgmt에 없어서 주석 처리 */
</if>
<if test="shippingDateFrom != null and shippingDateFrom != ''">
/* shippingDate 조인 안됨 */
</if>
<if test="shippingDateTo != null and shippingDateTo != ''">
/* shippingDate 조인 안됨 */
</if>
<if test="shippingMethod != null and shippingMethod != ''">
/* shippingMethod 필드가 contract_mgmt에 없어서 주석 처리 */
</if>
<if test="manager != null and manager != ''">
AND A.pm_user_id = #{manager}
</if>
<if test="incoterms != null and incoterms != ''">
/* incoterms 필드가 contract_mgmt에 없어서 주석 처리 */
</if>
</select>
<!--
/**
* 분할출하 - 원본 데이터 조회
* @since 2025.10.20
* @author system
* @version 1.0
**/
-->
<select id="getContractByObjid" parameterType="map" resultType="map">
/* salesNcollectMgmt.getContractByObjid */
SELECT
*
FROM contract_mgmt
WHERE objid = #{objid}
</select>
<!--
/**
* 분할출하 로그 저장 (로그 기반 방식)
* @since 2025.10.20
* @author system
* @version 1.0
**/
-->
<insert id="insertSplitShipmentLog" parameterType="map">
/* salesNcollectMgmt.insertSplitShipmentLog */
INSERT INTO shipment_log (
target_objid,
log_type,
log_message,
split_quantity,
original_quantity,
shipping_status,
sales_unit_price,
sales_supply_price,
sales_vat,
sales_total_amount,
sales_currency,
sales_exchange_rate,
serial_no,
shipping_date,
shipping_method,
manager_user_id,
incoterms,
remark,
is_split_record,
reg_date,
reg_user_id
) VALUES (
#{objid},
#{logType},
#{logMessage},
#{splitQuantity}::integer,
#{originalQuantity}::integer,
'PENDING',
#{salesUnitPrice}::numeric,
#{salesSupplyPrice}::numeric,
#{salesVat}::numeric,
#{salesTotalAmount}::numeric,
#{salesCurrency},
#{salesExchangeRate}::numeric,
#{serialNo},
<choose>
<when test="shippingDate != null and shippingDate != ''">
TO_DATE(#{shippingDate}, 'YYYY-MM-DD'),
</when>
<otherwise>
NULL,
</otherwise>
</choose>
#{shippingMethod},
#{managerUserId},
#{incoterms},
#{remark},
true,
NOW(),
#{userId}
)
</insert>
<!--
/**
* 판매 등록 저장 (sales_registration 테이블 사용)
* INSERT 또는 UPDATE (ON CONFLICT로 중복 방지)
* @since 2025.10.22
* @author johngreen
* @version 1.1
**/
-->
<insert id="insertSaleRegistration" parameterType="map">
/* salesNcollectMgmt.insertSaleRegistration - sales_registration에 판매 데이터 저장 */
INSERT INTO sales_registration (
project_no,
shipping_order_status,
serial_no,
sales_quantity,
sales_unit_price,
sales_supply_price,
sales_vat,
sales_total_amount,
sales_currency,
sales_exchange_rate,
shipping_date,
shipping_method,
manager_user_id,
incoterms,
reg_user_id
) VALUES (
#{orderNo},
<choose>
<when test="shippingOrderStatus != null and shippingOrderStatus != ''">
#{shippingOrderStatus},
</when>
<otherwise>
'',
</otherwise>
</choose>
#{serialNo},
#{salesQuantity}::integer,
#{salesUnitPrice}::numeric,
#{salesSupplyPrice}::numeric,
#{salesVat}::numeric,
#{salesTotalAmount}::numeric,
#{salesCurrency},
#{salesExchangeRate}::numeric,
<choose>
<when test="shippingDate != null and shippingDate != ''">
TO_DATE(#{shippingDate}, 'YYYY-MM-DD'),
</when>
<otherwise>
NULL,
</otherwise>
</choose>
#{shippingMethod},
#{manager},
#{incoterms},
#{cretEmpNo}
)
ON CONFLICT (project_no)
DO UPDATE SET
shipping_order_status = EXCLUDED.shipping_order_status,
serial_no = EXCLUDED.serial_no,
sales_quantity = EXCLUDED.sales_quantity,
sales_unit_price = EXCLUDED.sales_unit_price,
sales_supply_price = EXCLUDED.sales_supply_price,
sales_vat = EXCLUDED.sales_vat,
sales_total_amount = EXCLUDED.sales_total_amount,
sales_currency = EXCLUDED.sales_currency,
sales_exchange_rate = EXCLUDED.sales_exchange_rate,
shipping_date = EXCLUDED.shipping_date,
shipping_method = EXCLUDED.shipping_method,
manager_user_id = EXCLUDED.manager_user_id,
incoterms = EXCLUDED.incoterms,
upd_date = NOW(),
upd_user_id = EXCLUDED.reg_user_id
</insert>
<!--
/**
* 판매 정보 조회 - 판매등록 팝업에서 사용
* PROJECT_NO 또는 SALE_NO로 조회
* @since 2025.10.22
* @author johngreen
* @version 1.0
**/
-->
<select id="getSaleInfo" parameterType="map" resultType="map">
/* salesNcollectMgmt.getSaleInfo - 판매등록 팝업용 프로젝트 정보 조회 (sales_registration 테이블 사용) */
SELECT
T.PROJECT_NO,
CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE,
CODE_NAME(T.PRODUCT) AS PRODUCT_TYPE,
CODE_NAME(T.AREA_CD) AS NATION,
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS RECEIPT_DATE,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER,
(SELECT
CASE
WHEN CM.PAID_TYPE = 'paid' THEN '유상'
WHEN CM.PAID_TYPE = 'free' THEN '무상'
ELSE CM.PAID_TYPE
END
FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PAYMENT_TYPE,
T.PART_NO AS PRODUCT_NO,
T.PART_NAME AS PRODUCT_NAME,
-- S/N: 해당 품목의 시리얼 번호 (여러 개일 경우 "S/N 외 N건" 형식)
(SELECT
CASE
WHEN COUNT(*) = 0 THEN ''
WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO)
ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건'
END
FROM CONTRACT_ITEM CI
LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID AND UPPER(CIS.STATUS) = 'ACTIVE'
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CI.PART_OBJID = T.PART_OBJID
AND CI.STATUS = 'ACTIVE'
AND CIS.SERIAL_NO IS NOT NULL) AS SERIAL_NO,
COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY,
-- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT
COALESCE(
(SELECT CI.DUE_DATE
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CI.PART_OBJID = T.PART_OBJID
AND CI.STATUS = 'ACTIVE'),
T.DUE_DATE,
(SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)
) AS REQUEST_DATE,
-- 고객요청사항: CONTRACT_ITEM에서만 가져옴 (견적관리와 완전히 동일)
(SELECT CI.CUSTOMER_REQUEST
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CI.PART_OBJID = T.PART_OBJID
AND CI.STATUS = 'ACTIVE') AS CUSTOMER_REQUEST,
CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS,
T.PO_NO,
COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE,
CASE WHEN EXISTS(
SELECT 1 FROM ATTACH_FILE_INFO
WHERE TARGET_OBJID = T.CONTRACT_OBJID
AND DOC_TYPE='ORDER_DOC'
AND UPPER(STATUS) = 'ACTIVE'
) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH,
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
-- 판매 관련 필드들 (sales_registration 테이블에서 가져오기)
COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS,
COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY,
COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE,
COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE,
COALESCE(SR.sales_vat, 0) AS SALES_VAT,
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT,
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW,
COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY) AS SALES_CURRENCY,
CODE_NAME(COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY)) AS SALES_CURRENCY_NAME,
COALESCE(NULLIF(SR.sales_exchange_rate, 0), CM.EXCHANGE_RATE::numeric, 0) AS SALES_EXCHANGE_RATE,
COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE,
COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD,
COALESCE(SR.manager_user_id, T.PM_USER_ID) AS MANAGER,
COALESCE(SR.incoterms, '') AS INCOTERMS
FROM PROJECT_MGMT AS T
LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID::VARCHAR = T.CONTRACT_OBJID
WHERE T.PROJECT_NO = #{orderNo}
</select>
</mapper>

View File

@@ -42,6 +42,7 @@
<property name="suffix" value=".jsp"/>
<property name="order" value="1"/>
</bean>
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More