Compare commits
4 Commits
V202510150
...
fec51a86f3
| Author | SHA1 | Date | |
|---|---|---|---|
| fec51a86f3 | |||
| 5b12cccb77 | |||
| 4c84ae5db2 | |||
| e0d992eb64 |
121
README.md
121
README.md
@@ -1,21 +1,21 @@
|
||||
# PLM 솔루션 (ILSHIN)
|
||||
# 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 버전 관리 시스템 메타데이터 저장소.
|
||||
|
||||
@@ -812,188 +812,5 @@
|
||||
,editEmpNo = #{cretEmpNo} /* 수정자 */
|
||||
</update>
|
||||
|
||||
<!-- 매출관리 그리드 목록 -->
|
||||
<select id="getSalesMgmtGridList" parameterType="map" resultType="map">
|
||||
/* salesNcollectMgmt.getSalesMgmtGridList */
|
||||
SELECT
|
||||
B.OrderNo AS PROJECT_NO, /* 프로젝트번호를 계약번호로 우선 사용 */
|
||||
(SELECT CdNm FROM SWSA050A_TBL WHERE MajorCd = 'GE' AND MinorCd = B.SaleType) AS ORDER_TYPE,
|
||||
CASE WHEN C.c_class IS NOT NULL THEN
|
||||
CONCAT(
|
||||
(SELECT ltrim(rtrim(DTL_NM)) from SWSA999A_TBL where COMM_CD = 'S110' AND SUBSTRING(DTL_CD,1,1) = SUBSTRING(C.c_class,1,1)),
|
||||
'-',
|
||||
(SELECT ltrim(rtrim(DTL_NM)) from SWSA999A_TBL where COMM_CD = 'S120' AND SUBSTRING(DTL_CD,1,3) = SUBSTRING(C.c_class,1,3)),
|
||||
'-',
|
||||
(SELECT ltrim(rtrim(DTL_NM)) from SWSA999A_TBL where COMM_CD = 'S130' AND DTL_CD = C.c_class )
|
||||
)
|
||||
ELSE '' END AS PRODUCT_TYPE,
|
||||
(SELECT CdNm FROM SWSA050A_TBL WHERE MAjorCd = 'NA' AND MinorCd = B.nationGB) AS NATION,
|
||||
COALESCE(A.WrtYmd, B.OrderDate) AS RECEIPT_DATE,
|
||||
D.custNm AS CUSTOMER,
|
||||
(CASE B.freeyn WHEN 'Y' THEN '무상' ELSE '유상' END) AS PAYMENT_TYPE,
|
||||
C.GoodsCd AS PRODUCT_NO,
|
||||
C.GoodsNm AS PRODUCT_NAME,
|
||||
A.serialno AS SERIAL_NO,
|
||||
COALESCE(A.SupplyQty, B.goodsqty) AS QUANTITY,
|
||||
B.custreq AS REQUEST_DATE,
|
||||
COALESCE(A.Remark, B.bigo) AS CUSTOMER_REQUEST,
|
||||
(SELECT CdNm FROM SWSA050A_TBL WHERE MajorCd = 'SS' AND MinorCd = B.endsale) AS ORDER_STATUS,
|
||||
B.OrderNo AS PO_NO,
|
||||
B.OrderDate AS ORDER_DATE,
|
||||
B.orderattachpath AS ORDER_ATTACH,
|
||||
COALESCE(A.SupplyPrice, B.saleprice) AS UNIT_PRICE,
|
||||
COALESCE(A.SupplyAmt, B.saleamt) AS SUPPLY_PRICE,
|
||||
COALESCE(A.SupplyVat, B.vatamt) AS VAT,
|
||||
COALESCE((A.SupplyAmt + A.SupplyVat), (B.saleamt + B.vatamt)) AS TOTAL_AMOUNT,
|
||||
COALESCE(A.NoWonSymbol, B.nowonsymbol) AS CURRENCY,
|
||||
COALESCE(A.NoWonExChange, B.nowonexchange) AS EXCHANGE_RATE,
|
||||
B.shippingstatus AS SHIPPING_STATUS,
|
||||
B.shippingdate AS SHIPPING_DATE,
|
||||
B.shippingmethod AS SHIPPING_METHOD,
|
||||
(SELECT user_name FROM USER_INFO WHERE user_id = D.SalesMan) AS MANAGER,
|
||||
B.saleQty AS SALES_QUANTITY,
|
||||
(SELECT CdNm FROM SWSA050A_TBL WHERE MajorCd = 'IT' AND MinorCd = B.incoterms) AS INCOTERMS,
|
||||
B.salesstatus AS SALES_STATUS
|
||||
FROM SWSC110A_TBL B
|
||||
LEFT JOIN SWSD010A_TBL A ON A.orderNo = B.orderNo
|
||||
INNER JOIN SWSB110A_TBL C ON B.goodsCd = C.goodsCd
|
||||
INNER JOIN SWSB210A_TBL D ON B.custCd = D.custCd
|
||||
WHERE 1 = 1
|
||||
<if test="orderType != null and orderType != ''">
|
||||
AND B.SaleType = #{orderType}
|
||||
</if>
|
||||
<if test="productType != null and productType != ''">
|
||||
AND C.c_class = #{productType}
|
||||
</if>
|
||||
<if test="nation != null and nation != ''">
|
||||
AND B.nationGB = #{nation}
|
||||
</if>
|
||||
<if test="customer != null and customer != ''">
|
||||
AND D.custNm LIKE CONCAT('%', #{customer}, '%')
|
||||
</if>
|
||||
<if test="paymentType != null and paymentType != ''">
|
||||
AND B.freeyn = #{paymentType}
|
||||
</if>
|
||||
<if test="productNo != null and productNo != ''">
|
||||
AND C.GoodsCd LIKE CONCAT('%', #{productNo}, '%')
|
||||
</if>
|
||||
<if test="productName != null and productName != ''">
|
||||
AND C.GoodsNm LIKE CONCAT('%', #{productName}, '%')
|
||||
</if>
|
||||
<if test="serialNo != null and serialNo != ''">
|
||||
AND A.serialno LIKE CONCAT('%', #{serialNo}, '%')
|
||||
</if>
|
||||
<if test="orderStatus != null and orderStatus != ''">
|
||||
AND B.endsale = #{orderStatus}
|
||||
</if>
|
||||
<if test="poNo != null and poNo != ''">
|
||||
AND B.OrderNo LIKE CONCAT('%', #{poNo}, '%')
|
||||
</if>
|
||||
<if test="requestDateFrom != null and requestDateFrom != ''">
|
||||
AND B.custreq <![CDATA[>=]]> #{requestDateFrom}
|
||||
</if>
|
||||
<if test="requestDateTo != null and requestDateTo != ''">
|
||||
AND B.custreq <![CDATA[<=]]> #{requestDateTo}
|
||||
</if>
|
||||
<if test="orderDateFrom != null and orderDateFrom != ''">
|
||||
AND B.OrderDate <![CDATA[>=]]> #{orderDateFrom}
|
||||
</if>
|
||||
<if test="orderDateTo != null and orderDateTo != ''">
|
||||
AND B.OrderDate <![CDATA[<=]]> #{orderDateTo}
|
||||
</if>
|
||||
<if test="shippingStatus != null and shippingStatus != ''">
|
||||
AND B.shippingstatus = #{shippingStatus}
|
||||
</if>
|
||||
<if test="shippingDateFrom != null and shippingDateFrom != ''">
|
||||
AND B.shippingdate <![CDATA[>=]]> #{shippingDateFrom}
|
||||
</if>
|
||||
<if test="shippingDateTo != null and shippingDateTo != ''">
|
||||
AND B.shippingdate <![CDATA[<=]]> #{shippingDateTo}
|
||||
</if>
|
||||
<if test="shippingMethod != null and shippingMethod != ''">
|
||||
AND B.outGb = #{shippingMethod}
|
||||
</if>
|
||||
<if test="manager != null and manager != ''">
|
||||
AND B.bEmpNo = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
AND B.incoterms = #{incoterms}
|
||||
</if>
|
||||
ORDER BY B.CRET_DATE DESC
|
||||
LIMIT #{COUNT_PER_PAGE} OFFSET #{PAGE_START}
|
||||
</select>
|
||||
|
||||
<!-- 매출관리 그리드 목록 개수 -->
|
||||
<select id="getSalesMgmtGridListCount" parameterType="map" resultType="int">
|
||||
/* salesNcollectMgmt.getSalesMgmtGridListCount */
|
||||
SELECT
|
||||
COUNT(1)
|
||||
FROM SWSC110A_TBL B
|
||||
LEFT JOIN SWSD010A_TBL A ON A.orderNo = B.orderNo
|
||||
INNER JOIN SWSB110A_TBL C ON B.goodsCd = C.goodsCd
|
||||
INNER JOIN SWSB210A_TBL D ON B.custCd = D.custCd
|
||||
WHERE 1 = 1
|
||||
<if test="orderType != null and orderType != ''">
|
||||
AND B.SaleType = #{orderType}
|
||||
</if>
|
||||
<if test="productType != null and productType != ''">
|
||||
AND C.c_class = #{productType}
|
||||
</if>
|
||||
<if test="nation != null and nation != ''">
|
||||
AND B.nationGB = #{nation}
|
||||
</if>
|
||||
<if test="customer != null and customer != ''">
|
||||
AND D.custNm LIKE CONCAT('%', #{customer}, '%')
|
||||
</if>
|
||||
<if test="paymentType != null and paymentType != ''">
|
||||
AND B.freeyn = #{paymentType}
|
||||
</if>
|
||||
<if test="productNo != null and productNo != ''">
|
||||
AND C.GoodsCd LIKE CONCAT('%', #{productNo}, '%')
|
||||
</if>
|
||||
<if test="productName != null and productName != ''">
|
||||
AND C.GoodsNm LIKE CONCAT('%', #{productName}, '%')
|
||||
</if>
|
||||
<if test="serialNo != null and serialNo != ''">
|
||||
AND A.serialno LIKE CONCAT('%', #{serialNo}, '%')
|
||||
</if>
|
||||
<if test="orderStatus != null and orderStatus != ''">
|
||||
AND B.endsale = #{orderStatus}
|
||||
</if>
|
||||
<if test="poNo != null and poNo != ''">
|
||||
AND B.OrderNo LIKE CONCAT('%', #{poNo}, '%')
|
||||
</if>
|
||||
<if test="requestDateFrom != null and requestDateFrom != ''">
|
||||
AND B.custreq <![CDATA[>=]]> #{requestDateFrom}
|
||||
</if>
|
||||
<if test="requestDateTo != null and requestDateTo != ''">
|
||||
AND B.custreq <![CDATA[<=]]> #{requestDateTo}
|
||||
</if>
|
||||
<if test="orderDateFrom != null and orderDateFrom != ''">
|
||||
AND B.OrderDate <![CDATA[>=]]> #{orderDateFrom}
|
||||
</if>
|
||||
<if test="orderDateTo != null and orderDateTo != ''">
|
||||
AND B.OrderDate <![CDATA[<=]]> #{orderDateTo}
|
||||
</if>
|
||||
<if test="shippingStatus != null and shippingStatus != ''">
|
||||
AND B.shippingstatus = #{shippingStatus}
|
||||
</if>
|
||||
<if test="shippingDateFrom != null and shippingDateFrom != ''">
|
||||
AND B.shippingdate <![CDATA[>=]]> #{shippingDateFrom}
|
||||
</if>
|
||||
<if test="shippingDateTo != null and shippingDateTo != ''">
|
||||
AND B.shippingdate <![CDATA[<=]]> #{shippingDateTo}
|
||||
</if>
|
||||
<if test="shippingMethod != null and shippingMethod != ''">
|
||||
AND B.outGb = #{shippingMethod}
|
||||
</if>
|
||||
<if test="manager != null and manager != ''">
|
||||
AND B.bEmpNo = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
AND B.incoterms = #{incoterms}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
|
||||
@@ -1,20 +1,5 @@
|
||||
<frameset cols="197px,1px,*" border="0" id="parentsObj">
|
||||
|
||||
<frame src="/main/menu.do" name="menu_page"/>
|
||||
<frame src="/main/toggle.do" name="fToggle" style="border-right: 1px solid #b4b4b4;" scrolling="no"/>
|
||||
<frame src="/main/mainContents.do" name="contents_page" />
|
||||
<!--
|
||||
<frame src="/dashboard/dashboardMyTask.do" name="contents_page" />
|
||||
|
||||
<frame src="/dashboard/dashboard.do" name="contents_page" />
|
||||
<frameset cols="197px,14px,*" border="0" id="parentsObj">
|
||||
<frame src="/main/menu.do" name="menu_page">
|
||||
<frame src="/main/toggle.do" name="toggle_page"/>
|
||||
<frame src="/main/mainContents.do" name="contents_page"/>
|
||||
-->
|
||||
</frameset>
|
||||
|
||||
<!--
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
parent.frames["headerFS"].fn_goMyTask();
|
||||
});
|
||||
</script>
|
||||
-->
|
||||
@@ -11,7 +11,7 @@ ArrayList userMenuList = new ArrayList();
|
||||
userMenuList = (ArrayList)request.getAttribute("userMenuList");
|
||||
%>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<html style="height: 100%; overflow: hidden; margin: 0; padding: 0;">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title><%=Constants.SYSTEM_NAME %></title>
|
||||
@@ -26,17 +26,25 @@ userMenuList = (ArrayList)request.getAttribute("userMenuList");
|
||||
}
|
||||
*/
|
||||
.menu_off{
|
||||
color:#000;
|
||||
font-size:14px;
|
||||
font-weight:normal;
|
||||
color:#fff !important; padding: 2px 3px; font-size:9px; background-color:#0011ff; border-radius:2px;
|
||||
display: inline-block; min-width: 40px; text-align: center; margin: 0px;
|
||||
transition: all 0.3s ease; text-decoration: none !important; border: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
.menu_on{
|
||||
color:#B3A7A7;
|
||||
font-size:15px;
|
||||
font-weight:bold;
|
||||
color:#fff !important; padding: 2px 3px; font-size:9px; background-color:#c4c4f4; border-radius:2px;
|
||||
display: inline-block; min-width: 40px; text-align: center; margin: 0px;
|
||||
transition: all 0.3s ease; text-decoration: none !important; border: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
.menu_off:hover {
|
||||
background-color: #c4c4f4 !important;
|
||||
text-decoration: none !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
</style>
|
||||
<link rel="stylesheet" href="/css/basic.css">
|
||||
|
||||
<script src="/js/jquery-1.11.3.min.js"></script>
|
||||
<script src="/js/html5shiv.js"></script>
|
||||
<!-- //datepicker -->
|
||||
@@ -83,16 +91,51 @@ $(function(){
|
||||
fn_registDetailPopup(userId);
|
||||
});
|
||||
|
||||
$(".menu").click(function(){
|
||||
var menuObjid = $(this).attr("menuObjid");
|
||||
|
||||
$(".menu_on").removeClass('menu_on').addClass('menu_off'); //이전 클릭한 메뉴 원복
|
||||
$(this).removeClass('menu_off');
|
||||
$(this).addClass('menu_on');
|
||||
$(".menu").click(function(){
|
||||
// 모든 메뉴를 off 스타일로 변경
|
||||
$(".menu").css({
|
||||
'background-color': '#0011ff',
|
||||
'color': '#fff'
|
||||
}).removeClass('menu_on').addClass('menu_off');
|
||||
|
||||
// 클릭된 메뉴를 on 스타일로 변경
|
||||
$(this).css({
|
||||
'background-color': '#c4c4f4',
|
||||
'color': '#fff'
|
||||
}).removeClass('menu_off').addClass('menu_on');
|
||||
|
||||
var menuObjid = $(this).attr("menuObjId");
|
||||
|
||||
// 안전하게 메뉴 처리
|
||||
try {
|
||||
if(parent.frames["contentsFS"] && parent.frames["contentsFS"].frames["menu_page"]) {
|
||||
var menuFrame = parent.frames["contentsFS"].frames["menu_page"];
|
||||
if(menuFrame.fn_initMenuArea && menuFrame.add_menu) {
|
||||
menuFrame.fn_initMenuArea();
|
||||
menuFrame.add_menu(menuObjid);
|
||||
}
|
||||
}
|
||||
} catch(e) {
|
||||
console.log("Menu frame not ready:", e);
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
parent.frames["contentsFS"].frames["menu_page"].fn_initMenuArea();
|
||||
parent.frames["contentsFS"].frames["menu_page"].add_menu(menuObjid);
|
||||
});
|
||||
// 메뉴 hover 효과
|
||||
$(".menu").hover(
|
||||
function() {
|
||||
if (!$(this).hasClass('menu_on')) {
|
||||
$(this).css('background-color', '#E08550');
|
||||
}
|
||||
},
|
||||
function() {
|
||||
if (!$(this).hasClass('menu_on')) {
|
||||
$(this).css('background-color', '#F29661');
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
$(".btnApprovalList").click(function(){
|
||||
fn_goMyTaskMyApproval();
|
||||
@@ -162,7 +205,31 @@ function fn_goFirstMenu(){
|
||||
if($(".menu") && $(".menu").eq(0)){
|
||||
var menuObjId = $(".menu").eq(0).attr("menuObjId");
|
||||
//alert(menuObjId); -84984128(scm)
|
||||
fn_goMenu(menuObjId);
|
||||
|
||||
// 모든 메뉴를 off 스타일로 변경
|
||||
$(".menu").css({
|
||||
'background-color': '#0011ff',
|
||||
'color': '#fff'
|
||||
}).removeClass('menu_on').addClass('menu_off');
|
||||
|
||||
// 첫 번째 메뉴를 on 스타일로 변경
|
||||
$(".menu").eq(0).css({
|
||||
'background-color': '#c4c4f4',
|
||||
'color': '#fff'
|
||||
}).removeClass('menu_off').addClass('menu_on');
|
||||
|
||||
// 안전하게 메뉴 처리
|
||||
try {
|
||||
if(parent.frames["contentsFS"] && parent.frames["contentsFS"].frames["menu_page"]) {
|
||||
var menuFrame = parent.frames["contentsFS"].frames["menu_page"];
|
||||
if(menuFrame.fn_initMenuArea && menuFrame.add_menu) {
|
||||
menuFrame.fn_initMenuArea();
|
||||
menuFrame.add_menu(menuObjId);
|
||||
}
|
||||
}
|
||||
} catch(e) {
|
||||
console.log("Menu frame not ready:", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
function fn_goMyTask(subMenuObjid, onlyViewMenu){
|
||||
@@ -175,37 +242,43 @@ function fn_goDashboard(subMenuObjid, onlyViewMenu){
|
||||
fn_goMenu(menuobjid, subMenuObjid, onlyViewMenu);
|
||||
}
|
||||
function sel_menu(menuobjid, subMenuObjid, onlyViewMenu){
|
||||
parent.frames["contentsFS"].frames["menu_page"].sel_menu(menuobjid, subMenuObjid, onlyViewMenu);
|
||||
// 왼쪽 프레임 제거로 인해 더 이상 사용하지 않음
|
||||
// parent.frames["contentsFS"].frames["menu_page"].sel_menu(menuobjid, subMenuObjid, onlyViewMenu);
|
||||
console.log("sel_menu 호출됨 - 드롭다운 메뉴 방식으로 변경됨");
|
||||
}
|
||||
function fn_goMenu(menuobjid, subMenuObjid, onlyViewMenu){
|
||||
|
||||
if(fnc_isEmpty(menuobjid)){
|
||||
return;
|
||||
}
|
||||
//$(".menu[menuobjid="+menuobjid+"]").trigger("click");
|
||||
|
||||
fn_selTopMenu(menuobjid);
|
||||
|
||||
/*
|
||||
if(parent && parent.parent && parent.parent.frames["headerFS"] && typeof(parent.parent.frames["headerFS"].fn_goMyTask) == "function" ){
|
||||
parent.parent.frames["headerFS"].fn_goMyTask();
|
||||
}
|
||||
*/
|
||||
// 드롭다운 메뉴 방식으로 변경 - 왼쪽 프레임 제거됨
|
||||
// 메뉴 클릭시 해당 메뉴의 첫 번째 하위 메뉴로 이동하거나 기본 페이지로 이동
|
||||
$(".menu[menuObjId='" + menuobjid + "']").trigger("click");
|
||||
|
||||
/* 기존 왼쪽 프레임 방식 제거
|
||||
parent.frames["contentsFS"].frames["menu_page"].fn_initMenuArea();
|
||||
parent.frames["contentsFS"].frames["menu_page"].add_menu(menuobjid, subMenuObjid, onlyViewMenu);
|
||||
|
||||
//top.frames["contentsFS"].frames["menu_page"].fn_initMenuArea();
|
||||
//top.frames["contentsFS"].frames["menu_page"].add_menu(menuobjid, subMenuObjid, onlyViewMenu);
|
||||
*/
|
||||
}
|
||||
|
||||
var menuLoaded = false;
|
||||
|
||||
function fn_firstCallMenu(){
|
||||
if( parent
|
||||
&& parent.frames["contentsFS"]
|
||||
&& parent.frames["contentsFS"].frames["menu_page"]
|
||||
&& parent.frames["contentsFS"].frames["menu_page"].fn_initMenuArea ){
|
||||
//fn_goMyTask();
|
||||
//alert('1');
|
||||
fn_goFirstMenu();
|
||||
clearInterval(_intervalId);
|
||||
// 이미 로드되었으면 중복 실행 방지
|
||||
if(menuLoaded) return;
|
||||
|
||||
// 왼쪽 프레임이 복구되었으므로 기존 방식으로 첫 번째 메뉴 호출
|
||||
if(parent && parent.frames["contentsFS"] && parent.frames["contentsFS"].frames["menu_page"]){
|
||||
// 메뉴 프레임이 완전히 로드될 때까지 기다림
|
||||
var menuFrame = parent.frames["contentsFS"].frames["menu_page"];
|
||||
if(menuFrame.fn_initMenuArea && menuFrame.add_menu) {
|
||||
fn_goFirstMenu();
|
||||
clearInterval(_intervalId);
|
||||
menuLoaded = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,6 +332,7 @@ function openAdminMngPop(){
|
||||
window.open("/admin/adminMainFS.do","<%=Constants.SYSTEM_NAME %>","width=1630,height=950,menuBar=no,status=no");
|
||||
}
|
||||
|
||||
|
||||
//결재건수조회
|
||||
function fn_setApprovalCnt(){
|
||||
$.ajax({
|
||||
@@ -285,72 +359,63 @@ function fn_setApprovalCnt(){
|
||||
</script>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
</head>
|
||||
<body style="height:100%;overflow-y: hidden;">
|
||||
<body style="height:100%;overflow: hidden; margin: 0; padding: 0;">
|
||||
<form name="HeaderForm" action="" method="post">
|
||||
<input type="hidden" name="action" id="action">
|
||||
|
||||
<header>
|
||||
<div style="height:35px;">
|
||||
<header style="background-color: #fff; border-bottom: 1px solid #ddd; padding: 0; height: 50px; overflow: hidden;">
|
||||
<div style="height:50px; display: flex; align-items: center;">
|
||||
|
||||
<h1><a href="#" id="logo" class="mainLogo_new"></a></h1>
|
||||
<h1 style="margin: 0; padding: 0 20px;"><a href="#" id="logo" class="mainLogo_new"></a></h1>
|
||||
|
||||
<table>
|
||||
<table style="width: 100%; border-collapse: collapse;">
|
||||
<colgroup>
|
||||
<col width="*%"/>
|
||||
<col width="*%"/>
|
||||
<col width="*%"/>
|
||||
<col width="*%"/>
|
||||
<col width="*%"/>
|
||||
<col width="*"/>
|
||||
<col width="400px"/>
|
||||
</colgroup>
|
||||
<tr>
|
||||
<tr style="height: 50px; vertical-align: middle;">
|
||||
|
||||
<%
|
||||
for(int i=0;i<userMenuList.size();i++){
|
||||
HashMap menuMap = (HashMap)userMenuList.get(i);
|
||||
String menuDesc = CommonUtils.checkNull(menuMap.get("MENU_DESC"));
|
||||
String menuKorName = CommonUtils.checkNull(menuMap.get("MENU_NAME_KOR"));
|
||||
String menuObjid = CommonUtils.checkNull(menuMap.get("OBJID"));
|
||||
String parentObjid = CommonUtils.checkNull(menuMap.get("PARENT_OBJ_ID"));
|
||||
String menuUrl = CommonUtils.checkNull(menuMap.get("MENU_URL"));
|
||||
String lev = CommonUtils.checkNull(menuMap.get("LEV"));
|
||||
/* String menuSeq = CommonUtils.checkNull(menuMap.get("SEQ")); */
|
||||
/* String menuMaxSeq = CommonUtils.checkNull(menuMap.get("MAX_SEQ"));
|
||||
String menuMinSeq = CommonUtils.checkNull(menuMap.get("MIN_SEQ")); */
|
||||
|
||||
if("2".equals(lev)){
|
||||
%>
|
||||
<%--
|
||||
<td style=""><a href="#" style="" class="menu menu_off" menuObjId="<%=menuObjid%>"><%=menuKorName%></a></td>
|
||||
<div class="main_menu" menuObjId="<%=menuObjid%>"><span><a href="#" url="<%=menuUrl%>" objType="menuObj" menuObjId="<%=menuObjid%>"><%=menuKorName%></a></span></div>
|
||||
--%>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
|
||||
<td class="work_notice" style="position:relative;">
|
||||
<span id="blink" style="padding: 2px 10px 5px 10px;border-radius:0;" class="btnApprovalList blink_none">
|
||||
<span class="bell_back"><img src="" height='20' width='20' /></span>
|
||||
<label class="notice_no">0</label> 개의 결재가 있습니다.</span>
|
||||
</td>
|
||||
|
||||
<!--
|
||||
<td style="font-size:11px; "><a href="#" onclick="javascript:fn_openBoardList('notice');" style="color:#fff;background-color:#676868; border-radius:0; padding:4px 10px 5px 10px;">공지사항</a></td>
|
||||
-->
|
||||
<td style="font-size:11px; "><a href="#" onclick="javascript:fn_openBoardList('qna');" style="color:#fff;background-color:#676868; border-radius:0; padding:4px 10px 5px 10px;">Q&A</a></td>
|
||||
<td style="font-size:11px; "><a href="#" id="manualDownload" style="color:#fff;background-color:#676868; border-radius:0; padding:4px 10px 5px 10px;">Manual Download</a></td>
|
||||
<%--
|
||||
<td class="admin"><%if("plm_admin".equals(userId)){%><a href="#" onclick="javascript:openAdminMngPop();" style="color:#fff; padding: 5px 10px; font-size:11px; background-color:#75a0b6; border-radius:3px;">Admin</a><%}%></td>
|
||||
<td class="admin"><a href="#" class="" data-USER_ID="<%=userId %>"><img src="/images/top-icon05.png"><%=person.getDeptName() %> <%=person.getUserName() %> <%=person.getPositionName() %></a></td>
|
||||
--%>
|
||||
<td class="crew" style="">
|
||||
<a href="#" class="btnDetail" data-USER_ID="<%=userId %>">
|
||||
<span style=" color:#fff; padding: 4.5px 10px; font-size:11px; background-color:#676868; border-radius:0;">
|
||||
<!-- 메뉴 영역 -->
|
||||
<td style="text-align: left; padding-left: 10px;">
|
||||
<%
|
||||
for(int i=0;i<userMenuList.size();i++){
|
||||
HashMap menuMap = (HashMap)userMenuList.get(i);
|
||||
String menuDesc = CommonUtils.checkNull(menuMap.get("MENU_DESC"));
|
||||
String menuKorName = CommonUtils.checkNull(menuMap.get("MENU_NAME_KOR"));
|
||||
String menuObjid = CommonUtils.checkNull(menuMap.get("OBJID"));
|
||||
String parentObjid = CommonUtils.checkNull(menuMap.get("PARENT_OBJ_ID"));
|
||||
String menuUrl = CommonUtils.checkNull(menuMap.get("MENU_URL"));
|
||||
String lev = CommonUtils.checkNull(menuMap.get("LEV"));
|
||||
/* String menuSeq = CommonUtils.checkNull(menuMap.get("SEQ")); */
|
||||
/* String menuMaxSeq = CommonUtils.checkNull(menuMap.get("MAX_SEQ"));
|
||||
String menuMinSeq = CommonUtils.checkNull(menuMap.get("MIN_SEQ")); */
|
||||
|
||||
if("2".equals(lev)){
|
||||
%>
|
||||
<a href="#" class="menu menu_off" menuObjId="<%=menuObjid%>" style="background-color: #0015ff; color: #fff; padding: 3px 6px; font-size: 10px; border-radius: 3px; text-decoration: none; display: inline-block; min-width: 50px; text-align: center; margin-right: 4px;"><%=menuKorName%></a>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
</td>
|
||||
|
||||
<!-- 우측 버튼 영역 -->
|
||||
<td style="text-align: right; padding-right: 10px;">
|
||||
<span id="blink" style="padding: 3px 6px; border-radius:3px; font-size:10px; background-color:#ff6b35; color:#fff; cursor:pointer; margin-right: 5px;" class="btnApprovalList blink_none">
|
||||
결재 <label class="notice_no">0</label>건</span>
|
||||
|
||||
<a href="#" onclick="javascript:fn_openBoardList('qna');" style="color:#fff;background-color:#676868; border-radius:2px; padding:2px 4px; text-decoration: none; display: inline-block; font-size:9px; margin-right: 5px;">Q&A</a>
|
||||
|
||||
<a href="#" id="manualDownload" style="color:#fff;background-color:#676868; border-radius:2px; padding:2px 4px; text-decoration: none; display: inline-block; font-size:9px; margin-right: 5px;">Manual Download</a>
|
||||
|
||||
<a href="#" class="btnDetail" data-USER_ID="<%=userId %>" style="text-decoration: none; margin-right: 5px;">
|
||||
<span style="color:#fff; padding: 2px 4px; font-size:9px; background-color:#676868; border-radius:2px; display: inline-block;">
|
||||
<%=person.getDeptName() %> <%=person.getUserName() %> <%=person.getPositionName() %>
|
||||
</span>
|
||||
</a>
|
||||
</td>
|
||||
<td style=""><a href="#" style="color:#fff; padding: 4.5px 10px; font-size:11px; background-color:#676868; border-radius:0;" class="btnLogout">Logout</a></td>
|
||||
|
||||
<a href="#" style="color:#fff; padding: 2px 4px; font-size:9px; background-color:#676868; border-radius:2px; text-decoration: none; display: inline-block;" class="btnLogout">Logout</a>
|
||||
</td>
|
||||
<%--
|
||||
<td style=""><a href="#" id="manualDownload" style="color:#fff; padding: 5px 10px; font-size:11px; background-color:#38426b; border-radius:3px;">Manual Download</a></td>
|
||||
<td class="admin"><%if("plm_admin".equals(userId)){%><a href="#" onclick="javascript:openAdminMngPop();" style="color:#fff; padding: 5px 10px; font-size:11px; background-color:#75a0b6; border-radius:3px;">Admin</a><%}%></td>
|
||||
@@ -384,8 +449,10 @@ function fn_setApprovalCnt(){
|
||||
if("2".equals(lev)){
|
||||
%>
|
||||
<li class="" data-menu-id="417" data-menu-target="Current" data-menu-alias="" data-menu-alias2="" data-menu-url="">
|
||||
<a href="#" style="" class="menu menu_off" menuObjId="<%=menuObjid%>"><%=menuKorName%></a>
|
||||
<%-- <div class="main_menu" menuObjId="<%=menuObjid%>"><span><a href="#" url="<%=menuUrl%>" objType="menuObj" menuObjId="<%=menuObjid%>"><%=menuKorName%></a></span></div> --%>
|
||||
<a href="#" class="menu menu_off waves-effect waves-light" menuObjId="<%=menuObjid%>">
|
||||
<span><%=menuKorName%></span>
|
||||
</a>
|
||||
<%-- 하위 메뉴는 Materialize 드롭다운으로 동적 로드됨 --%>
|
||||
</li>
|
||||
<%
|
||||
}
|
||||
|
||||
@@ -28,13 +28,46 @@
|
||||
*/
|
||||
color:#373740; /* dark gray로 변경 */
|
||||
font-size:13px;
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
.menus_on{
|
||||
color:#B3A7A7;
|
||||
font-size:13.1px;
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
.smenu{
|
||||
font-weight:bold;
|
||||
font-weight:bold;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
/* 메뉴 hover 효과 */
|
||||
.main_menu:hover .smenu,
|
||||
.menu2:hover .smenu {
|
||||
color: #1159bc !important;
|
||||
background-color: rgba(17, 89, 188, 0.1);
|
||||
padding: 2px 5px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
/* 메뉴 컨테이너 스타일 */
|
||||
#menu {
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
/* 메뉴 아이템 애니메이션 */
|
||||
.main_menu, .menu2 {
|
||||
transition: all 0.3s ease;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.main_menu:hover, .menu2:hover {
|
||||
background-color: rgba(245, 245, 245, 0.8);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
/* 메뉴 영역 전체 스타일 */
|
||||
body {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -85,6 +118,31 @@ $(function(){
|
||||
//var firstLink = $('#menu a').first();
|
||||
fnm_changeContentsLocation($(this).attr("url"), $(this).attr("menuObjId"), this);
|
||||
});
|
||||
|
||||
// 메뉴 영역에서 마우스가 벗어났을 때 자동 숨김 (애니메이션 적용)
|
||||
var hideMenuTimer;
|
||||
$(document).mouseleave(function(e) {
|
||||
// 마우스가 메뉴 프레임을 벗어났을 때
|
||||
clearTimeout(hideMenuTimer);
|
||||
hideMenuTimer = setTimeout(function() {
|
||||
try {
|
||||
if(parent && parent.frames && parent.frames["toggle_page"]) {
|
||||
var toggleFrame = parent.frames["toggle_page"];
|
||||
if(toggleFrame.fntg_changeSizeWithAnimation) {
|
||||
toggleFrame.fntg_changeSizeWithAnimation();
|
||||
}
|
||||
}
|
||||
} catch(e) {
|
||||
console.log("Toggle frame not accessible:", e);
|
||||
}
|
||||
}, 500); // 1.5초 후 자동 숨김
|
||||
});
|
||||
|
||||
// 메뉴 영역에 마우스가 다시 들어왔을 때 타이머 취소
|
||||
$(document).mouseenter(function() {
|
||||
clearTimeout(hideMenuTimer);
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
@@ -121,9 +179,12 @@ function fnm_changeContentsLocation(url, menuObjId, obj){
|
||||
|
||||
function add_menu(objid, subMenuObjid, onlyViewMenu){
|
||||
//Swal.fire("add_menu : " + objid + ":" + subMenuObjid + ":" + onlyViewMenu);
|
||||
console.log("=== add_menu 함수 시작 ===");
|
||||
console.log("Parameters:", {objid: objid, subMenuObjid: subMenuObjid, onlyViewMenu: onlyViewMenu});
|
||||
|
||||
var menu ="";
|
||||
if(fnc_isNotEmpty(objid)){
|
||||
console.log("objid가 비어있지 않음, AJAX 호출 시작");
|
||||
$.ajax({
|
||||
url:"/main/getmenu.do",
|
||||
type:"POST",
|
||||
@@ -131,7 +192,9 @@ function add_menu(objid, subMenuObjid, onlyViewMenu){
|
||||
dataType:"json",
|
||||
async:false,
|
||||
success:function(data){
|
||||
if(data.RESULT.length>0){
|
||||
console.log("AJAX 응답 성공:", data);
|
||||
if(data.RESULT && data.RESULT.length>0){
|
||||
console.log("메뉴 아이템 개수:", data.RESULT.length);
|
||||
for(var i=0;i<data.RESULT.length;i++){
|
||||
//menu +="<div class='main_menu' menuObjId="+data.RESULT[i].OBJID+"><span><a href='javascript:fnm_changeContentsLocation(\""+data.RESULT[i].MENU_URL+"\",\""+data.RESULT[i].OBJID+"\")' url='"+data.RESULT[i].MENU_URL+"' objType='menuObj' menuObjId='"+data.RESULT[i].OBJID+"'>"+data.RESULT[i].MENU_NAME_KOR+"</a></span></div>";
|
||||
/*
|
||||
@@ -141,30 +204,137 @@ function add_menu(objid, subMenuObjid, onlyViewMenu){
|
||||
}else{
|
||||
*/
|
||||
var lev = data.RESULT[i].LEVEL;
|
||||
var menuClass = "main_menu";
|
||||
var menuClass = "main_menu"; // 모든 메뉴를 main_menu로 생성
|
||||
var menuUrl = fnc_checkNull(data.RESULT[i].MENU_URL);
|
||||
|
||||
//console.log(lev);
|
||||
|
||||
|
||||
if(fnc_isNotEmpty(lev) && Number(lev) < 2){
|
||||
menuClass = "main_menu";
|
||||
menu +="<div class='"+menuClass+"' menuObjId="+data.RESULT[i].OBJID+" parentObjid="+data.RESULT[i].PARENT_OBJ_ID+"><span><a href='javascript:fnm_changeContentsLocation(\""+data.RESULT[i].MENU_URL+"\",\""+data.RESULT[i].OBJID+"\", this)' class='smenu menus_off' url='"+data.RESULT[i].MENU_URL+"' objType='menuObj' menuObjId='"+data.RESULT[i].OBJID+"'>"+data.RESULT[i].MENU_NAME_KOR+"</a></span></div>";
|
||||
}else{
|
||||
menuClass = "menu2";
|
||||
menu +="<div class='"+menuClass+"' menuObjId="+data.RESULT[i].OBJID+" parentObjid="+data.RESULT[i].PARENT_OBJ_ID+"><span><a href='javascript:fnm_changeContentsLocation(\""+data.RESULT[i].MENU_URL+"\",\""+data.RESULT[i].OBJID+"\", this)' class='smenu menus_off' url='"+data.RESULT[i].MENU_URL+"' objType='menuObj' menuObjId='"+data.RESULT[i].OBJID+"'>"+data.RESULT[i].MENU_NAME_KOR+"</a></span></div>";
|
||||
menu +="<div class='"+menuClass+"' menuObjId="+data.RESULT[i].OBJID+" parentObjid="+data.RESULT[i].PARENT_OBJ_ID+"><span><a href='javascript:fnm_changeContentsLocation(\""+data.RESULT[i].MENU_URL+"\",\""+data.RESULT[i].OBJID+"\", this)' class='smenu menus_off' url='"+data.RESULT[i].MENU_URL+"' objType='menuObj' menuObjId='"+data.RESULT[i].OBJID+"'>"+data.RESULT[i].MENU_NAME_KOR+"</a></span></div>";
|
||||
}
|
||||
|
||||
console.log("메뉴 생성:", data.RESULT[i].MENU_NAME_KOR, "Level:", lev);
|
||||
//menu +="<div class='main_menu' menuObjId="+data.RESULT[i].OBJID+"><span><a href='' class='smenu menus_off' url='"+data.RESULT[i].MENU_URL+"' objType='menuObj' menuObjId='"+data.RESULT[i].OBJID+"'>"+data.RESULT[i].MENU_NAME_KOR+"</a></span></div>";
|
||||
//}
|
||||
}
|
||||
}
|
||||
console.log("생성된 메뉴 HTML 길이:", menu.length);
|
||||
console.log("생성된 메뉴 HTML:", menu.substring(0, 200) + "...");
|
||||
},
|
||||
error: function(jqxhr, status, error){
|
||||
console.log("AJAX 오류:", error);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.log("objid가 비어있음, sel_menu 호출");
|
||||
}
|
||||
|
||||
console.log("DOM 추가 전 - 메뉴 HTML 길이:", menu.length);
|
||||
$('#menu').addClass('clickable');
|
||||
$("#menu").append(menu);
|
||||
|
||||
// 메뉴를 강제로 표시 (원래 위치에 맞게)
|
||||
if(menu.length > 0) {
|
||||
// 기존 메뉴 프레임의 위치 정보 가져오기
|
||||
var menuFrame = window.frameElement;
|
||||
var frameRect = menuFrame ? menuFrame.getBoundingClientRect() : {left: 0, top: 0};
|
||||
|
||||
// body에 메뉴 추가 (원래 디자인에 맞게)
|
||||
$('body').append('<div id="forced-menu" style="position:absolute; top:10px; left:25px; background:white; padding:0; z-index:1000; width:170px; border:none;">' + menu + '</div>');
|
||||
|
||||
// 메뉴 아이템 스타일 적용 (원래 디자인)
|
||||
$('#forced-menu .main_menu').css({
|
||||
'display': 'block',
|
||||
'padding': '0',
|
||||
'margin': '0',
|
||||
'cursor': 'pointer',
|
||||
'border': 'none',
|
||||
'background': 'transparent',
|
||||
'width': '100%'
|
||||
});
|
||||
|
||||
// 메뉴 앞에 화살표 아이콘 추가
|
||||
$('#forced-menu .main_menu').each(function() {
|
||||
var $link = $(this).find('.smenu');
|
||||
var linkText = $link.text();
|
||||
$link.html('▶ ' + linkText);
|
||||
});
|
||||
|
||||
// 메뉴 링크 스타일 (원래 디자인)
|
||||
$('#forced-menu .main_menu .smenu').css({
|
||||
'display': 'block',
|
||||
'padding': '8px 10px',
|
||||
'color': '#373740',
|
||||
'font-size': '13px',
|
||||
'text-decoration': 'none',
|
||||
'border-bottom': '1px solid #eee',
|
||||
'transition': 'color 0.3s ease'
|
||||
});
|
||||
|
||||
// 메뉴 hover 효과 (원래 디자인)
|
||||
$('#forced-menu .main_menu').hover(
|
||||
function() {
|
||||
$(this).find('.smenu').css({
|
||||
'color': '#1159bc',
|
||||
'background-color': 'rgba(17, 89, 188, 0.1)'
|
||||
});
|
||||
},
|
||||
function() {
|
||||
$(this).find('.smenu').css({
|
||||
'color': '#373740',
|
||||
'background-color': 'transparent'
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
console.log("강제 메뉴 표시 완료");
|
||||
}
|
||||
|
||||
console.log("DOM 추가 완료");
|
||||
|
||||
// 메뉴 컨테이너도 보이도록 설정
|
||||
$('#menu').css({
|
||||
'display': 'block !important',
|
||||
'visibility': 'visible !important',
|
||||
'opacity': '1 !important',
|
||||
'position': 'static !important',
|
||||
'top': 'auto !important',
|
||||
'left': 'auto !important',
|
||||
'margin-top': '10px !important',
|
||||
'height': 'auto !important',
|
||||
'min-height': '200px !important',
|
||||
'overflow': 'visible !important',
|
||||
'z-index': '9999 !important'
|
||||
});
|
||||
console.log("메뉴 컨테이너 CSS 설정 완료");
|
||||
|
||||
// 메뉴가 그려진 후 main_menu는 보이게 하고, menu2는 숨김
|
||||
$(".main_menu").show().css({
|
||||
'display': 'block !important',
|
||||
'visibility': 'visible !important',
|
||||
'opacity': '1 !important',
|
||||
'position': 'relative !important',
|
||||
'margin': '2px 0 !important',
|
||||
'padding': '5px !important',
|
||||
'height': 'auto !important',
|
||||
'width': '100% !important',
|
||||
'cursor': 'pointer !important'
|
||||
});
|
||||
$(".menu2").hide();
|
||||
|
||||
console.log("메뉴 요소 개수 확인:");
|
||||
console.log("- #menu 요소:", $('#menu').length);
|
||||
console.log("- .main_menu 요소:", $('.main_menu').length);
|
||||
console.log("- .menu2 요소:", $('.menu2').length);
|
||||
console.log("메뉴 가시성 확인:");
|
||||
console.log("- #menu visible:", $('#menu').is(':visible'));
|
||||
console.log("- .main_menu visible:", $('.main_menu').is(':visible'));
|
||||
console.log("메뉴 위치 정보:", $('#menu').offset());
|
||||
console.log("메뉴 크기:", $('#menu').width(), "x", $('#menu').height());
|
||||
|
||||
//var firstLink = $('#menu a').first();
|
||||
//fnm_changeContentsLocation(firstLink.attr("url"));
|
||||
|
||||
@@ -191,13 +361,31 @@ function add_menu(objid, subMenuObjid, onlyViewMenu){
|
||||
fnm_changeContentsLocation(url, menuObjId, this);
|
||||
|
||||
if(url.toUpperCase().indexOf('/DASHBOARD.DO') > -1){ //대시보드 전체화면
|
||||
parent.frames["fToggle"].fntg_changeSizeS();
|
||||
try {
|
||||
if(parent && parent.frames && parent.frames["toggle_page"]) {
|
||||
parent.frames["toggle_page"].fntg_changeSizeS();
|
||||
}
|
||||
} catch(e) {
|
||||
console.log("Toggle frame error:", e);
|
||||
}
|
||||
}else{
|
||||
parent.frames["fToggle"].fntg_changeSizeM();
|
||||
try {
|
||||
if(parent && parent.frames && parent.frames["toggle_page"]) {
|
||||
parent.frames["toggle_page"].fntg_changeSizeM();
|
||||
}
|
||||
} catch(e) {
|
||||
console.log("Toggle frame error:", e);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
//alert('bb');
|
||||
parent.frames["fToggle"].fntg_changeSizeM();
|
||||
try {
|
||||
if(parent && parent.frames && parent.frames["toggle_page"]) {
|
||||
parent.frames["toggle_page"].fntg_changeSizeM();
|
||||
}
|
||||
} catch(e) {
|
||||
console.log("Toggle frame error:", e);
|
||||
}
|
||||
var menu2 = $("[parentObjid="+menuObjId+"]")[0];
|
||||
smenu = $(menu2).find(".smenu");
|
||||
$(menu2).trigger("click");
|
||||
@@ -232,8 +420,23 @@ function add_menu(objid, subMenuObjid, onlyViewMenu){
|
||||
}else{
|
||||
sel_menu(objid, subMenuObjid, onlyViewMenu);
|
||||
}
|
||||
|
||||
// 메뉴 그리기 완료 후 자동 숨김 처리 (애니메이션 적용)
|
||||
setTimeout(function() {
|
||||
try {
|
||||
if(parent && parent.frames && parent.frames["toggle_page"]) {
|
||||
var toggleFrame = parent.frames["toggle_page"];
|
||||
if(toggleFrame.fntg_changeSizeWithAnimation) {
|
||||
toggleFrame.fntg_changeSizeWithAnimation();
|
||||
}
|
||||
}
|
||||
} catch(e) {
|
||||
console.log("Toggle frame not accessible:", e);
|
||||
}
|
||||
}, 300);
|
||||
}
|
||||
|
||||
|
||||
function sel_menu(objid, subMenuObjid, onlyViewMenu){
|
||||
|
||||
//Swal.fire("sel_menu - " + objid + ":" + subMenuObjid + ":" + onlyViewMenu);
|
||||
@@ -254,6 +457,7 @@ function sel_menu(objid, subMenuObjid, onlyViewMenu){
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body id="menuback_w" style="height:100%;overflow-y: hidden;">
|
||||
@@ -276,31 +480,8 @@ function sel_menu(objid, subMenuObjid, onlyViewMenu){
|
||||
<div style="float:left;width:20px;height:100%;background:#606060;">
|
||||
</div>
|
||||
|
||||
<div id="menu" style="float:;width:100%;margin-left:5px">
|
||||
<%-- <%
|
||||
for(int i=0;i<userMenuList.size();i++){
|
||||
HashMap menuMap = (HashMap)userMenuList.get(i);
|
||||
String menuDesc = CommonUtils.checkNull(menuMap.get("menu_desc"));
|
||||
String menuKorName = CommonUtils.checkNull(menuMap.get("menu_name_kor"));
|
||||
String menuObjid = CommonUtils.checkNull(menuMap.get("objid"));
|
||||
String parentObjid = CommonUtils.checkNull(menuMap.get("parent_obj_id"));
|
||||
String menuUrl = CommonUtils.checkNull(menuMap.get("menu_url"));
|
||||
String lev = CommonUtils.checkNull(menuMap.get("lev"));
|
||||
/* String menuSeq = CommonUtils.checkNull(menuMap.get("SEQ")); */
|
||||
/* String menuMaxSeq = CommonUtils.checkNull(menuMap.get("MAX_SEQ"));
|
||||
String menuMinSeq = CommonUtils.checkNull(menuMap.get("MIN_SEQ")); */
|
||||
|
||||
if("2".equals(lev)){
|
||||
%>
|
||||
<div class="main_menu" menuObjId="<%=menuObjid%>"><span><a href="#" url="<%=menuUrl%>" objType="menuObj" menuObjId="<%=menuObjid%>"><%=menuKorName%></a></span></div>
|
||||
<%
|
||||
}else if("3".equals(lev)){
|
||||
%>
|
||||
<div class="menu2" parentObjid="<%=parentObjid%>" menuType="12"><a href="#" url="<%=menuUrl%>" objType="menuObj" menuObjId="<%=menuObjid%>"><%=menuKorName%></a></div>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%> --%>
|
||||
<div id="menu" style="float:left;width:100%;margin-left:5px">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -9,15 +9,45 @@
|
||||
<title><%=Constants.SYSTEM_NAME%></title>
|
||||
<script>
|
||||
function fntg_changeSize(){
|
||||
var frameset = parent.document.getElementById('parentsObj');
|
||||
var frameVal = frameset.cols;
|
||||
var animating = false;
|
||||
|
||||
var frameVal = parent.document.getElementById('parentsObj').cols;
|
||||
if (animating) return;
|
||||
animating = true;
|
||||
|
||||
if("0px,8px,*" == frameVal){
|
||||
parent.document.getElementById('parentsObj').cols = "197px,8px,*";
|
||||
}else{
|
||||
parent.document.getElementById('parentsObj').cols = "0px,8px,*";
|
||||
var startWidth, endWidth;
|
||||
if("0px,14px,*" == frameVal || "0px,8px,*" == frameVal){
|
||||
startWidth = 0;
|
||||
endWidth = 197;
|
||||
} else {
|
||||
startWidth = 197;
|
||||
endWidth = 0;
|
||||
}
|
||||
|
||||
var duration = 300;
|
||||
var startTime = Date.now();
|
||||
|
||||
function animate() {
|
||||
var elapsed = Date.now() - startTime;
|
||||
var progress = Math.min(elapsed / duration, 1);
|
||||
|
||||
// easeInOut 이징
|
||||
progress = progress < 0.5 ? 2 * progress * progress : 1 - Math.pow(-2 * progress + 2, 2) / 2;
|
||||
|
||||
var currentWidth = Math.round(startWidth + (endWidth - startWidth) * progress);
|
||||
var cols = currentWidth === 0 ? '0px,14px,*' : currentWidth + 'px,14px,*';
|
||||
|
||||
frameset.cols = cols;
|
||||
|
||||
if (progress < 1) {
|
||||
requestAnimationFrame(animate);
|
||||
} else {
|
||||
animating = false;
|
||||
}
|
||||
}
|
||||
|
||||
animate();
|
||||
}
|
||||
|
||||
function fntg_changeSizeS(){
|
||||
@@ -28,6 +58,86 @@
|
||||
parent.document.getElementById('parentsObj').cols = "197px,1px,*";
|
||||
}
|
||||
|
||||
// 애니메이션과 함께 메뉴 숨기기
|
||||
function fntg_changeSizeWithAnimation(){
|
||||
var frameset = parent.document.getElementById('parentsObj');
|
||||
var frameVal = frameset.cols;
|
||||
var animating = false;
|
||||
|
||||
if (animating) return;
|
||||
animating = true;
|
||||
|
||||
// 현재 메뉴가 보이는 상태라면 숨김
|
||||
if(frameVal !== "0px,14px,*" && frameVal !== "0px,1px,*") {
|
||||
var startWidth = 197;
|
||||
var endWidth = 0;
|
||||
|
||||
var duration = 400;
|
||||
var startTime = Date.now();
|
||||
|
||||
function animate() {
|
||||
var elapsed = Date.now() - startTime;
|
||||
var progress = Math.min(elapsed / duration, 1);
|
||||
|
||||
// easeInOut 이징
|
||||
progress = progress < 0.5 ? 2 * progress * progress : 1 - Math.pow(-2 * progress + 2, 2) / 2;
|
||||
|
||||
var currentWidth = Math.round(startWidth + (endWidth - startWidth) * progress);
|
||||
var cols = currentWidth === 0 ? '0px,14px,*' : currentWidth + 'px,14px,*';
|
||||
|
||||
frameset.cols = cols;
|
||||
|
||||
if (progress < 1) {
|
||||
requestAnimationFrame(animate);
|
||||
} else {
|
||||
animating = false;
|
||||
}
|
||||
}
|
||||
|
||||
animate();
|
||||
}
|
||||
}
|
||||
|
||||
// 애니메이션과 함께 메뉴 보이기
|
||||
function fntg_showMenuWithAnimation(){
|
||||
var frameset = parent.document.getElementById('parentsObj');
|
||||
var frameVal = frameset.cols;
|
||||
var animating = false;
|
||||
|
||||
if (animating) return;
|
||||
animating = true;
|
||||
|
||||
// 현재 메뉴가 숨겨진 상태라면 보임
|
||||
if(frameVal === "0px,14px,*" || frameVal === "0px,1px,*") {
|
||||
var startWidth = 0;
|
||||
var endWidth = 197;
|
||||
|
||||
var duration = 400;
|
||||
var startTime = Date.now();
|
||||
|
||||
function animate() {
|
||||
var elapsed = Date.now() - startTime;
|
||||
var progress = Math.min(elapsed / duration, 1);
|
||||
|
||||
// easeInOut 이징
|
||||
progress = progress < 0.5 ? 2 * progress * progress : 1 - Math.pow(-2 * progress + 2, 2) / 2;
|
||||
|
||||
var currentWidth = Math.round(startWidth + (endWidth - startWidth) * progress);
|
||||
var cols = currentWidth === 0 ? '0px,14px,*' : currentWidth + 'px,14px,*';
|
||||
|
||||
frameset.cols = cols;
|
||||
|
||||
if (progress < 1) {
|
||||
requestAnimationFrame(animate);
|
||||
} else {
|
||||
animating = false;
|
||||
}
|
||||
}
|
||||
|
||||
animate();
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
$("#side1 img").hover(function() {
|
||||
@@ -36,6 +146,24 @@
|
||||
$(this).css("opacity","1").stop().attr("src", "/images/toggle.png");
|
||||
});
|
||||
|
||||
// 토글 영역에 마우스 오버 시 메뉴 표시 (애니메이션 적용)
|
||||
$("#side1").mouseenter(function() {
|
||||
fntg_showMenuWithAnimation();
|
||||
});
|
||||
|
||||
// 메뉴 영역에서 마우스가 벗어났을 때 다시 숨김 (선택적)
|
||||
// 필요에 따라 주석 해제하여 사용
|
||||
/*
|
||||
$(document).mouseleave(function(e) {
|
||||
// 마우스가 메뉴 영역을 완전히 벗어났을 때 숨김
|
||||
if(e.pageX < 220) return; // 메뉴 영역 너비 고려
|
||||
|
||||
setTimeout(function() {
|
||||
fntg_changeSizeS();
|
||||
}, 1000); // 1초 후 자동 숨김
|
||||
});
|
||||
*/
|
||||
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<frameset rows="78px,*" border="0">
|
||||
<frame src="/main/header.do" id="headerFS" name="headerFS">
|
||||
<frame src="/main/contentsFS.do" id="contentsFS" name="contentsFS">
|
||||
<frameset rows="51px,*" border="0" frameborder="0" framespacing="0">
|
||||
<frame src="/main/header.do" id="headerFS" name="headerFS" frameborder="0" marginwidth="0" marginheight="0" scrolling="no">
|
||||
<frame src="/main/contentsFS.do" id="contentsFS" name="contentsFS" frameborder="0" marginwidth="0" marginheight="0">
|
||||
</frameset>
|
||||
|
||||
@@ -1,192 +0,0 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ page import="com.pms.common.utils.*"%>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ page import="java.util.*" %>
|
||||
<%@include file= "/init.jsp" %>
|
||||
<%
|
||||
PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN);
|
||||
String connector = person.getUserId();
|
||||
%>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title><%=Constants.SYSTEM_NAME%></title>
|
||||
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
fnc_datepick();
|
||||
//엔터키로 조회
|
||||
$("input").keyup(function(e){
|
||||
if(e.keyCode == 13){
|
||||
$("#page").val("1");
|
||||
fn_search();
|
||||
}
|
||||
});
|
||||
|
||||
$("#btnExcel").click(function() {
|
||||
fn_excel();
|
||||
});
|
||||
|
||||
$("#btnSearch").click(function(){
|
||||
$("#page").val("1");
|
||||
fn_search();
|
||||
});
|
||||
|
||||
fn_search();
|
||||
});
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var columns = [
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '프로젝트번호', field : 'PROJECT_NO'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '주문유형', field : 'ORDER_TYPE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '제품구분', field : 'PRODUCT_TYPE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '국내/해외', field : 'NATION'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '접수일', field : 'RECEIPT_DATE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'left', width : '150', title : '고객사', field : 'CUSTOMER'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '유/무상', field : 'PAYMENT_TYPE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '품번', field : 'PRODUCT_NO'},
|
||||
{headerHozAlign : 'center', hozAlign : 'left', width : '180', title : '품명', field : 'PRODUCT_NAME'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : 'S/N', field : 'SERIAL_NO'},
|
||||
{headerHozAlign : 'center', hozAlign : 'right', width : '80', title : '수량', field : 'QUANTITY'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '요청납기', field : 'REQUEST_DATE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'left', width : '150', title : '고객사요청사항', field : 'CUSTOMER_REQUEST'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '수주상태', field : 'ORDER_STATUS'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '발주번호', field : 'PO_NO'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '발주일', field : 'ORDER_DATE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '주문서첨부', field : 'ORDER_ATTACH'},
|
||||
{headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '단가', field : 'UNIT_PRICE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '공급가액', field : 'SUPPLY_PRICE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '부가세', field : 'VAT'},
|
||||
{headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '총액', field : 'TOTAL_AMOUNT'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '환종', field : 'CURRENCY'},
|
||||
{headerHozAlign : 'center', hozAlign : 'right', width : '80', title : '환율', field : 'EXCHANGE_RATE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '130', title : '출하대기 상태', field : 'SHIPPING_STATUS'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '출고일', field : 'SHIPPING_DATE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '출고방법', field : 'SHIPPING_METHOD'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '담당자', field : 'MANAGER'},
|
||||
{headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '판매수량', field : 'SALES_QUANTITY'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '인도조건', field : 'INCOTERMS'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '매출마감현황', field : 'SALES_STATUS'}
|
||||
];
|
||||
|
||||
function fn_search(){
|
||||
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/salesMgmt/salesMgmtGridList.do", columns, true);
|
||||
}
|
||||
|
||||
function fn_excel() {
|
||||
document.form1.actionType.value = "excel";
|
||||
var form = document.form1;
|
||||
form.action="/salesMgmt/salesMgmtList.do";
|
||||
form.submit();
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<form name="hiddenForm" id="hiddenForm">
|
||||
<input type="hidden" name="objid">
|
||||
<input type="hidden" name="actionType" id="actionType">
|
||||
</form>
|
||||
|
||||
<form name="form1" id="form1" method="post">
|
||||
<input type="hidden" name="actionType" id="actionType">
|
||||
<div class="min_part_enroll">
|
||||
<div class="content-box">
|
||||
<div class="content-box-s">
|
||||
<div class="plm_menu_name_gdnsi">
|
||||
<h2>
|
||||
<span>영업관리_매출관리</span>
|
||||
</h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" value="조회" class="plm_btns" id="btnSearch">
|
||||
<input type="button" value="매출마감" class="plm_btns" id="btnDeadline">
|
||||
<input type="button" value="Excel Download" class="plm_btns" id="btnExcel">
|
||||
</div>
|
||||
</div>
|
||||
<div id="plmSearchZon">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="120px">
|
||||
<col width="20%">
|
||||
<col width="120px">
|
||||
<col width="20%">
|
||||
<col width="120px">
|
||||
<col width="20%">
|
||||
<col width="120px">
|
||||
<col width="*">
|
||||
</colgroup>
|
||||
<tr>
|
||||
<td class="label"><label for="">주문유형</label></td>
|
||||
<td><select name="orderType" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.orderTypeList}</select></td>
|
||||
<td class="label"><label for="">제품구분</label></td>
|
||||
<td><select name="productType" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.productTypeList}</select></td>
|
||||
<td class="label"><label for="">국내/해외</label></td>
|
||||
<td><select name="nation" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.nationList}</select></td>
|
||||
<td class="label"><label for="">유/무상</label></td>
|
||||
<td>
|
||||
<select name="paymentType" class="select2" style="width:120px;">
|
||||
<option value="">전체</option>
|
||||
<option value="N">유상</option>
|
||||
<option value="Y">무상</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label"><label for="">고객사</label></td>
|
||||
<td><input type="text" name="customer" /></td>
|
||||
<td class="label"><label for="">품번</label></td>
|
||||
<td><input type="text" name="productNo" /></td>
|
||||
<td class="label"><label for="">품명</label></td>
|
||||
<td><input type="text" name="productName" /></td>
|
||||
<td class="label"><label for="">S/N</label></td>
|
||||
<td><input type="text" name="serialNo" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label"><label for="">수주상태</label></td>
|
||||
<td><select name="orderStatus" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.orderStatusList}</select></td>
|
||||
<td class="label"><label for="">발주번호</label></td>
|
||||
<td><input type="text" name="poNo" /></td>
|
||||
<td class="label"><label for="">담당자</label></td>
|
||||
<td><select name="manager" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.managerList}</select></td>
|
||||
<td class="label"><label for="">인도조건</label></td>
|
||||
<td>
|
||||
<select name="incoterms" class="select2" style="width:120px;">
|
||||
<option value="">전체</option>
|
||||
<option value="EXW">EXW</option>
|
||||
<option value="FOB">FOB</option>
|
||||
<option value="CIF">CIF</option>
|
||||
<option value="DDP">DDP</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label"><label for="">출하대기 상태</label></td>
|
||||
<td><select name="shippingStatus" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.shippingStatusList}</select></td>
|
||||
<td class="label"><label for="">출고방법</label></td>
|
||||
<td>
|
||||
<select name="shippingMethod" class="select2" style="width:120px;">
|
||||
<option value="">전체</option>
|
||||
<option value="DIRECT">직납</option>
|
||||
<option value="PARCEL">택배</option>
|
||||
</select>
|
||||
</td>
|
||||
<td class="label"><label for="">요청납기</label></td>
|
||||
<td colspan="3"><input type="date" name="requestDateFrom" /> ~ <input type="date" name="requestDateTo" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label"><label for="">발주일</label></td>
|
||||
<td colspan="3"><input type="date" name="orderDateFrom" /> ~ <input type="date" name="orderDateTo" /></td>
|
||||
<td class="label"><label for="">출고일</label></td>
|
||||
<td colspan="3"><input type="date" name="shippingDateFrom" /> ~ <input type="date" name="shippingDateTo" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
@@ -75,88 +75,73 @@ function openCollectFormPopup(rcptNo, orderNo){
|
||||
</script>
|
||||
</head>
|
||||
<body class="backcolor">
|
||||
<div class="content-box">
|
||||
<div class="content-box-s">
|
||||
<div class="plm_menu_name_ieg">
|
||||
<h2>
|
||||
<span>영업관리> 매출관리> 수금등록</span>
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<form name="collectForm" id="collectForm" method="get" onsubmit="return false;">
|
||||
<!--// tab_nav -->
|
||||
<div class="tab_nav">
|
||||
<a href="#tab1" onclick="tabClick('sales')">매출등록</a>
|
||||
<a href="#tab2" class="active">수금등록</a>
|
||||
</div>
|
||||
<!--// tab_nav -->
|
||||
|
||||
<!--// section -->
|
||||
<section class="contents_page_basic_margin">
|
||||
<h3 class="tit">수금 리스트</h3>
|
||||
<div class="btn_wrap">
|
||||
<div class="plm_btn_wrap">
|
||||
<input type="button" value="등록" class="plm_btns" id="btnAccountReg">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--// 수금등록 리스트 -->
|
||||
<div class="plm_table_wrap">
|
||||
<div>
|
||||
<table class="plm_table">
|
||||
<colgroup>
|
||||
<col width="10%" />
|
||||
<col width="10%" />
|
||||
<col width="10%" />
|
||||
<col width="10%" />
|
||||
<col width="10%" />
|
||||
<col width="10%" />
|
||||
<col width="30%" />
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr class="plm_thead">
|
||||
<td>수금번호</td>
|
||||
<td>수금일자</td>
|
||||
<td>계정과목</td>
|
||||
<td>수금금액</td>
|
||||
<td>자금구분</td>
|
||||
<td>자금유형</td>
|
||||
<td>비고</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<c:choose>
|
||||
<c:when test="${empty LIST}">
|
||||
<tr style="text-align:center;">
|
||||
<td align="center" colspan="7">조회된 데이터가 없습니다.</td>
|
||||
</tr>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<c:forEach var="item" items="${LIST}" varStatus="varStatus">
|
||||
<tr>
|
||||
<td><a href="javascript:;" onclick="openCollectFormPopup('${item.RCPTNO}', '${item.ORDERNO}')">${item.RCPTNO}</a></td>
|
||||
<td>
|
||||
<fmt:parseDate var="rcpYmd" value="${item.RCPTYMD}" pattern="yyyyMMdd"/>
|
||||
<fmt:formatDate value="${rcpYmd}" pattern="yyyy-MM-dd" />
|
||||
</td>
|
||||
<td>${item.ACCOUNTTYPENM}</td>
|
||||
<td><fmt:formatNumber value="${item.RCPTAMT}" type="number" maxFractionDigits="3" /></td>
|
||||
<td>${item.FUNDSTYPENM}</td>
|
||||
<td>${item.AOTYPENM}</td>
|
||||
<td>${item.REMARK}</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!--// 수금등록 리스트 -->
|
||||
</section>
|
||||
<!--// section -->
|
||||
</form>
|
||||
<form name="collectForm" id="collectForm" method="get" onsubmit="return false;">
|
||||
<!--// tab_nav -->
|
||||
<div class="tab_nav">
|
||||
<a href="#tab1" onclick="tabClick('sales')">매출등록</a>
|
||||
<a href="#tab2" class="active">수금등록</a>
|
||||
</div>
|
||||
</div>
|
||||
<!--// tab_nav -->
|
||||
|
||||
<!--// btn_wrap -->
|
||||
<div class="btn_wrap">
|
||||
<div class="plm_btn_wrap">
|
||||
<input type="button" value="등록" class="plm_btns" id="btnAccountReg">
|
||||
</div>
|
||||
</div>
|
||||
<!--// btn_wrap -->
|
||||
|
||||
<!--// 수금등록 리스트를 -->
|
||||
<div class="plm_table_wrap">
|
||||
<div>
|
||||
<table class="plm_table">
|
||||
<colgroup>
|
||||
<col width="10%" />
|
||||
<col width="10%" />
|
||||
<col width="10%" />
|
||||
<col width="10%" />
|
||||
<col width="10%" />
|
||||
<col width="10%" />
|
||||
<col width="30%" />
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr class="plm_thead">
|
||||
<td>수금번호</td>
|
||||
<td>수금일자</td>
|
||||
<td>계정과목</td>
|
||||
<td>수금금액</td>
|
||||
<td>자금구분</td>
|
||||
<td>자금유형</td>
|
||||
<td>비고</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<c:choose>
|
||||
<c:when test="${empty LIST}">
|
||||
<tr style="text-align:center;">
|
||||
<td align="center" colspan="7">조회된 데이터가 없습니다.</td>
|
||||
</tr>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<c:forEach var="item" items="${LIST}" varStatus="varStatus">
|
||||
<tr>
|
||||
<td><a href="javascript:;" onclick="openCollectFormPopup('${item.RCPTNO}', '${item.ORDERNO}')">${item.RCPTNO}</a></td>
|
||||
<td>
|
||||
<fmt:parseDate var="rcpYmd" value="${item.RCPTYMD}" pattern="yyyyMMdd"/>
|
||||
<fmt:formatDate value="${rcpYmd}" pattern="yyyy-MM-dd" />
|
||||
</td>
|
||||
<td>${item.ACCOUNTTYPENM}</td>
|
||||
<td><fmt:formatNumber value="${item.RCPTAMT}" type="number" maxFractionDigits="3" /></td>
|
||||
<td>${item.FUNDSTYPENM}</td>
|
||||
<td>${item.AOTYPENM}</td>
|
||||
<td>${item.REMARK}</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!--// 수금등록 리스트 -->
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
@@ -75,109 +75,94 @@ function openSalesFormPopup(saleNo, orderNo){
|
||||
</script>
|
||||
</head>
|
||||
<body class="backcolor">
|
||||
<div class="content-box">
|
||||
<div class="content-box-s">
|
||||
<div class="plm_menu_name_ieg">
|
||||
<h2>
|
||||
<span>영업관리> 매출관리> 매출등록</span>
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<form name="salesForm" id="salesForm" method="get" onsubmit="return false;">
|
||||
<!--// tab_nav -->
|
||||
<div class="tab_nav">
|
||||
<a href="#tab1" class="active">매출등록</a>
|
||||
<a href="#tab2" onclick="tabClick('collect')">수금등록</a>
|
||||
</div>
|
||||
<!--// tab_nav -->
|
||||
|
||||
<!--// section -->
|
||||
<section class="contents_page_basic_margin">
|
||||
<h3 class="tit">매출 리스트</h3>
|
||||
<div class="btn_wrap">
|
||||
<div class="plm_btn_wrap">
|
||||
<input type="button" value="등록" class="plm_btns" id="btnDeliveryReg">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--// 매출등록 리스트 -->
|
||||
<div class="plm_table_wrap">
|
||||
<div>
|
||||
<table class="plm_table">
|
||||
<colgroup>
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="*" />
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr class="plm_thead">
|
||||
<td rowspan="2">매출번호</td>
|
||||
<td rowspan="2">매출일자</td>
|
||||
<td rowspan="2">고객</td>
|
||||
<td rowspan="2">매출부서</td>
|
||||
<td rowspan="2">매출자</td>
|
||||
<td colspan="5">매출</td>
|
||||
<td rowspan="2">자동결의서</td>
|
||||
<td rowspan="2">과세유형</td>
|
||||
<td rowspan="2">비고</td>
|
||||
</tr>
|
||||
<tr class="plm_thead">
|
||||
<td>수량</td>
|
||||
<td>단가</td>
|
||||
<td>공급가</td>
|
||||
<td>부가세</td>
|
||||
<td>합계</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<c:choose>
|
||||
<c:when test="${empty LIST}">
|
||||
<tr style="text-align:center;">
|
||||
<td align="center" colspan="13">조회된 데이터가 없습니다.</td>
|
||||
</tr>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<c:forEach var="item" items="${LIST}" varStatus="varStatus">
|
||||
<tr>
|
||||
<td><a href="javascript:;" onclick="openSalesFormPopup('${item.SALENO}', '${item.ORDERNO}')">${item.SALENO}</a></td>
|
||||
<td>
|
||||
<fmt:parseDate var="wrtYmd" value="${item.WRTYMD}" pattern="yyyyMMdd"/>
|
||||
<fmt:formatDate value="${wrtYmd}" pattern="yyyy-MM-dd" />
|
||||
</td>
|
||||
<td>${item.CUSTNM}</td>
|
||||
<td>${item.DEPTNM}</td>
|
||||
<td>${item.SALESMANNM}</td>
|
||||
<td><fmt:formatNumber value="${item.SUPPLYQTY}" type="number" maxFractionDigits="3" /></td>
|
||||
<td><fmt:formatNumber value="${item.SUPPLYPRICE}" type="number" maxFractionDigits="3" /></td>
|
||||
<td><fmt:formatNumber value="${item.SUPPLYAMT}" type="number" maxFractionDigits="3" /></td>
|
||||
<td><fmt:formatNumber value="${item.SUPPLYVAT}" type="number" maxFractionDigits="3" /></td>
|
||||
<td><fmt:formatNumber value="${item.TOTSUPPLYAMT}" type="number" maxFractionDigits="3" /></td>
|
||||
<td>${item.RESOLUTIONNO}</td>
|
||||
<td>${item.TAXTYPENM}</td>
|
||||
<td>${item.REMARK}</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!--// 매출등록 리스트 -->
|
||||
</section>
|
||||
<!--// section -->
|
||||
</form>
|
||||
<form name="salesForm" id="salesForm" method="get" onsubmit="return false;">
|
||||
<!--// tab_nav -->
|
||||
<div class="tab_nav">
|
||||
<a href="#tab1" class="active">매출등록</a>
|
||||
<a href="#tab2" onclick="tabClick('collect')">수금등록</a>
|
||||
</div>
|
||||
</div>
|
||||
<!--// tab_nav -->
|
||||
|
||||
<!--// btn_wrap -->
|
||||
<div class="btn_wrap">
|
||||
<div class="plm_btn_wrap">
|
||||
<input type="button" value="등록" class="plm_btns" id="btnDeliveryReg">
|
||||
</div>
|
||||
</div>
|
||||
<!--// btn_wrap -->
|
||||
|
||||
<!--// 매출등록 리스트 -->
|
||||
<div class="plm_table_wrap">
|
||||
<div>
|
||||
<table class="plm_table">
|
||||
<colgroup>
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="7%" />
|
||||
<col width="*" />
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr class="plm_thead">
|
||||
<td rowspan="2">매출번호</td>
|
||||
<td rowspan="2">매출일자</td>
|
||||
<td rowspan="2">고객</td>
|
||||
<td rowspan="2">매출부서</td>
|
||||
<td rowspan="2">매출자</td>
|
||||
<td colspan="5">매출</td>
|
||||
<td rowspan="2">자동결의서</td>
|
||||
<td rowspan="2">과세유형</td>
|
||||
<td rowspan="2">비고</td>
|
||||
</tr>
|
||||
<tr class="plm_thead">
|
||||
<td>수량</td>
|
||||
<td>단가</td>
|
||||
<td>공급가</td>
|
||||
<td>부가세</td>
|
||||
<td>합계</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<c:choose>
|
||||
<c:when test="${empty LIST}">
|
||||
<tr style="text-align:center;">
|
||||
<td align="center" colspan="13">조회된 데이터가 없습니다.</td>
|
||||
</tr>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<c:forEach var="item" items="${LIST}" varStatus="varStatus">
|
||||
<tr>
|
||||
<td><a href="javascript:;" onclick="openSalesFormPopup('${item.SALENO}', '${item.ORDERNO}')">${item.SALENO}</a></td>
|
||||
<td>
|
||||
<fmt:parseDate var="wrtYmd" value="${item.WRTYMD}" pattern="yyyyMMdd"/>
|
||||
<fmt:formatDate value="${wrtYmd}" pattern="yyyy-MM-dd" />
|
||||
</td>
|
||||
<td>${item.CUSTNM}</td>
|
||||
<td>${item.DEPTNM}</td>
|
||||
<td>${item.SALESMANNM}</td>
|
||||
<td><fmt:formatNumber value="${item.SUPPLYQTY}" type="number" maxFractionDigits="3" /></td>
|
||||
<td><fmt:formatNumber value="${item.SUPPLYPRICE}" type="number" maxFractionDigits="3" /></td>
|
||||
<td><fmt:formatNumber value="${item.SUPPLYAMT}" type="number" maxFractionDigits="3" /></td>
|
||||
<td><fmt:formatNumber value="${item.SUPPLYVAT}" type="number" maxFractionDigits="3" /></td>
|
||||
<td><fmt:formatNumber value="${item.TOTSUPPLYAMT}" type="number" maxFractionDigits="3" /></td>
|
||||
<td>${item.RESOLUTIONNO}</td>
|
||||
<td>${item.TAXTYPENM}</td>
|
||||
<td>${item.REMARK}</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!--// 매출등록 리스트 -->
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -42,7 +42,6 @@ pageContext.setAttribute("newLineChar", "\n");
|
||||
<c:set var="isAdmin" value="<%=isAdmin%>" />
|
||||
<c:set var="menuObjId" value="${empty param.menuObjId?'':param.menuObjId}" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=11">
|
||||
|
||||
|
||||
<!-- //basic -->
|
||||
|
||||
@@ -15,8 +15,9 @@ services:
|
||||
-DDB_PASSWORD=waceplm0909!!
|
||||
volumes:
|
||||
- wace-plm-project_data:/data_storage
|
||||
- ./WebContent:/usr/local/tomcat/webapps/ROOT
|
||||
- wace-plm-app_data:/path/inside/container
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
wace-plm-project_data:
|
||||
wace-plm-app_data:
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 색상 정의
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo -e "${BLUE}================================${NC}"
|
||||
echo -e "${BLUE} 개발 환경 재빌드 & 재시작${NC}"
|
||||
echo -e "${BLUE}================================${NC}"
|
||||
echo ""
|
||||
|
||||
# 1단계: 컴파일
|
||||
echo -e "${YELLOW}[1/3] Java 소스 컴파일 중...${NC}"
|
||||
./compile_only.sh
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}✗ 컴파일 실패!${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✓ 컴파일 완료${NC}"
|
||||
echo ""
|
||||
|
||||
# 2단계: 도커 중지 및 삭제
|
||||
echo -e "${YELLOW}[2/3] 기존 도커 컨테이너 중지 및 삭제 중...${NC}"
|
||||
docker-compose -f docker-compose.dev.yml down 2>&1 | grep -v "level=warning"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}✗ 도커 중지 실패!${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✓ 기존 컨테이너 삭제 완료${NC}"
|
||||
echo ""
|
||||
|
||||
# 3단계: 도커 이미지 재빌드 및 시작
|
||||
echo -e "${YELLOW}[3/3] 도커 이미지 재빌드 및 시작 중...${NC}"
|
||||
docker-compose -f docker-compose.dev.yml build --no-cache 2>&1 | grep -v "level=warning" | tail -5
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}✗ 도커 빌드 실패!${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
docker-compose -f docker-compose.dev.yml up -d 2>&1 | grep -v "level=warning"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}✗ 도커 시작 실패!${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✓ 도커 컨테이너 시작 완료${NC}"
|
||||
echo ""
|
||||
|
||||
# Tomcat 시작 대기
|
||||
echo -e "${YELLOW}Tomcat 시작 대기 중...${NC}"
|
||||
sleep 10
|
||||
|
||||
# 상태 확인
|
||||
docker ps | grep wace-plm-dev > /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
echo ""
|
||||
echo -e "${GREEN}================================${NC}"
|
||||
echo -e "${GREEN} 🎉 재빌드 완료!${NC}"
|
||||
echo -e "${GREEN}================================${NC}"
|
||||
echo ""
|
||||
echo -e "${BLUE}서버 접속: ${NC}http://localhost:9090"
|
||||
echo ""
|
||||
|
||||
# 로그 확인 팁
|
||||
echo -e "${YELLOW}💡 로그 확인: ${NC}docker logs -f wace-plm-dev"
|
||||
echo -e "${YELLOW}💡 컨테이너 중지: ${NC}docker-compose -f docker-compose.dev.yml down"
|
||||
else
|
||||
echo -e "${RED}✗ 컨테이너가 실행되지 않았습니다!${NC}"
|
||||
echo -e "${YELLOW}로그 확인: ${NC}docker logs wace-plm-dev"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -29,7 +29,6 @@ import com.pms.common.utils.CommonUtils;
|
||||
import com.pms.salesmgmt.service.ContractMgmtService;
|
||||
import com.pms.salesmgmt.service.SalesMgmtCommonService;
|
||||
import com.pms.salesmgmt.service.SalesNcollectMgmtService;
|
||||
import com.pms.service.CommonService;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
@@ -64,117 +63,6 @@ public class SalesNcollectMgmtController {
|
||||
@Autowired
|
||||
private SalesMgmtCommonService salesMgmtCommonService;
|
||||
|
||||
@Autowired
|
||||
private CommonService commonService;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 매출관리 메인 페이지 (메뉴 진입점)
|
||||
* </pre>
|
||||
* @param request
|
||||
* @param paramMap - 검색 정보
|
||||
* @return String
|
||||
*
|
||||
* <pre>
|
||||
* << 개정 이력 >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ---------------- --------------------- ----------------------------------------------------------
|
||||
* 2025.10.15 수정 메뉴 URL 매핑 추가
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@RequestMapping(value = "/salesMgmt/salesMgmtList.do", method = RequestMethod.GET)
|
||||
public String salesMgmtList(HttpServletRequest request
|
||||
, @RequestParam Map<String, Object> paramMap) {
|
||||
// /salesNcollectMgmt/contractList.do로 리다이렉트
|
||||
return salesContractList(request, paramMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 매출관리 목록 페이지
|
||||
* </pre>
|
||||
* @param request
|
||||
* @param paramMap - 검색 정보
|
||||
* @return String
|
||||
*/
|
||||
@RequestMapping(value = "/contractMgmt/salesMgmtList.do", method = RequestMethod.GET)
|
||||
public String showSalesMgmtList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
|
||||
try {
|
||||
// 코드정보
|
||||
Map<String, Object> codeMap = new HashMap<String, Object>();
|
||||
|
||||
// 주문유형
|
||||
codeMap.put("orderTypeList",
|
||||
salesMgmtCommonService.bizMakeOptionList("GE", "", "salesMgmtCommon.getCodeList"));
|
||||
// 제품구분
|
||||
codeMap.put("productTypeList",
|
||||
salesMgmtCommonService.bizMakeOptionList("", "", "salesMgmtCommon.getGoodsList"));
|
||||
// 국내/해외
|
||||
codeMap.put("nationList",
|
||||
salesMgmtCommonService.bizMakeOptionList("AR", "", "salesMgmtCommon.getCodeList"));
|
||||
/*
|
||||
// 유/무상
|
||||
codeMap.put("paymentTypeList",
|
||||
salesMgmtCommonService.bizMakeOptionList("0000156", "", "salesMgmtCommon.getCodeList"));
|
||||
*/
|
||||
// 수주상태
|
||||
codeMap.put("orderStatusList",
|
||||
commonService.bizMakeOptionList("0000932", "", "common.getCodeselect"));
|
||||
// 출하대기 상태
|
||||
codeMap.put("shippingStatusList",
|
||||
salesMgmtCommonService.bizMakeOptionList("SH", "", "salesMgmtCommon.getCodeList"));
|
||||
/*
|
||||
// 출고방법
|
||||
codeMap.put("shippingMethodList",
|
||||
salesMgmtCommonService.bizMakeOptionList("SM", "", "salesMgmtCommon.getCodeList"));
|
||||
*/
|
||||
// 담당자
|
||||
codeMap.put("managerList",
|
||||
salesMgmtCommonService.bizMakeOptionList("", "", "salesMgmtCommon.getSalesmanList"));
|
||||
/*
|
||||
// 인도조건
|
||||
codeMap.put("incotermsList",
|
||||
salesMgmtCommonService.bizMakeOptionList("IT", "", "salesMgmtCommon.getCodeList"));
|
||||
*/
|
||||
|
||||
request.setAttribute("codeMap", codeMap);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return "/salesmgmt/salesMgmt/salesMgmtList";
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 매출관리 그리드 데이터 조회 (Tabulator용)
|
||||
* </pre>
|
||||
* @param request
|
||||
* @param paramMap - 검색 정보
|
||||
* @return Map
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping(value = "/salesMgmt/salesMgmtGridList.do", method = RequestMethod.POST)
|
||||
public Map<String, Object> salesMgmtGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
|
||||
try {
|
||||
List<Map<String, Object>> list = salseNcollectMgmtService.getSalesMgmtGridList(request, paramMap);
|
||||
int totalCount = salseNcollectMgmtService.getSalesMgmtGridListCount(paramMap);
|
||||
|
||||
resultMap.put("RESULTLIST", list);
|
||||
resultMap.put("last_page", (int) Math.ceil((double)totalCount / Integer.parseInt(CommonUtils.checkNull(request.getParameter("size"), "10"))));
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
// Tabulator는 에러 발생 시 빈 배열을 기대합니다.
|
||||
resultMap.put("RESULTLIST", new java.util.ArrayList<>());
|
||||
resultMap.put("last_page", 0);
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 계약관리 목록 조회
|
||||
|
||||
@@ -812,188 +812,5 @@
|
||||
,editEmpNo = #{cretEmpNo} /* 수정자 */
|
||||
</update>
|
||||
|
||||
<!-- 매출관리 그리드 목록 -->
|
||||
<select id="getSalesMgmtGridList" parameterType="map" resultType="map">
|
||||
/* salesNcollectMgmt.getSalesMgmtGridList */
|
||||
SELECT
|
||||
B.OrderNo AS PROJECT_NO, /* 프로젝트번호를 계약번호로 우선 사용 */
|
||||
(SELECT CdNm FROM SWSA050A_TBL WHERE MajorCd = 'GE' AND MinorCd = B.SaleType) AS ORDER_TYPE,
|
||||
CASE WHEN C.c_class IS NOT NULL THEN
|
||||
CONCAT(
|
||||
(SELECT ltrim(rtrim(DTL_NM)) from SWSA999A_TBL where COMM_CD = 'S110' AND SUBSTRING(DTL_CD,1,1) = SUBSTRING(C.c_class,1,1)),
|
||||
'-',
|
||||
(SELECT ltrim(rtrim(DTL_NM)) from SWSA999A_TBL where COMM_CD = 'S120' AND SUBSTRING(DTL_CD,1,3) = SUBSTRING(C.c_class,1,3)),
|
||||
'-',
|
||||
(SELECT ltrim(rtrim(DTL_NM)) from SWSA999A_TBL where COMM_CD = 'S130' AND DTL_CD = C.c_class )
|
||||
)
|
||||
ELSE '' END AS PRODUCT_TYPE,
|
||||
(SELECT CdNm FROM SWSA050A_TBL WHERE MAjorCd = 'NA' AND MinorCd = B.nationGB) AS NATION,
|
||||
COALESCE(A.WrtYmd, B.OrderDate) AS RECEIPT_DATE,
|
||||
D.custNm AS CUSTOMER,
|
||||
(CASE B.freeyn WHEN 'Y' THEN '무상' ELSE '유상' END) AS PAYMENT_TYPE,
|
||||
C.GoodsCd AS PRODUCT_NO,
|
||||
C.GoodsNm AS PRODUCT_NAME,
|
||||
A.serialno AS SERIAL_NO,
|
||||
COALESCE(A.SupplyQty, B.goodsqty) AS QUANTITY,
|
||||
B.custreq AS REQUEST_DATE,
|
||||
COALESCE(A.Remark, B.bigo) AS CUSTOMER_REQUEST,
|
||||
(SELECT CdNm FROM SWSA050A_TBL WHERE MajorCd = 'SS' AND MinorCd = B.endsale) AS ORDER_STATUS,
|
||||
B.OrderNo AS PO_NO,
|
||||
B.OrderDate AS ORDER_DATE,
|
||||
B.orderattachpath AS ORDER_ATTACH,
|
||||
COALESCE(A.SupplyPrice, B.saleprice) AS UNIT_PRICE,
|
||||
COALESCE(A.SupplyAmt, B.saleamt) AS SUPPLY_PRICE,
|
||||
COALESCE(A.SupplyVat, B.vatamt) AS VAT,
|
||||
COALESCE((A.SupplyAmt + A.SupplyVat), (B.saleamt + B.vatamt)) AS TOTAL_AMOUNT,
|
||||
COALESCE(A.NoWonSymbol, B.nowonsymbol) AS CURRENCY,
|
||||
COALESCE(A.NoWonExChange, B.nowonexchange) AS EXCHANGE_RATE,
|
||||
B.shippingstatus AS SHIPPING_STATUS,
|
||||
B.shippingdate AS SHIPPING_DATE,
|
||||
B.shippingmethod AS SHIPPING_METHOD,
|
||||
(SELECT user_name FROM USER_INFO WHERE user_id = D.SalesMan) AS MANAGER,
|
||||
B.saleQty AS SALES_QUANTITY,
|
||||
(SELECT CdNm FROM SWSA050A_TBL WHERE MajorCd = 'IT' AND MinorCd = B.incoterms) AS INCOTERMS,
|
||||
B.salesstatus AS SALES_STATUS
|
||||
FROM SWSC110A_TBL B
|
||||
LEFT JOIN SWSD010A_TBL A ON A.orderNo = B.orderNo
|
||||
INNER JOIN SWSB110A_TBL C ON B.goodsCd = C.goodsCd
|
||||
INNER JOIN SWSB210A_TBL D ON B.custCd = D.custCd
|
||||
WHERE 1 = 1
|
||||
<if test="orderType != null and orderType != ''">
|
||||
AND B.SaleType = #{orderType}
|
||||
</if>
|
||||
<if test="productType != null and productType != ''">
|
||||
AND C.c_class = #{productType}
|
||||
</if>
|
||||
<if test="nation != null and nation != ''">
|
||||
AND B.nationGB = #{nation}
|
||||
</if>
|
||||
<if test="customer != null and customer != ''">
|
||||
AND D.custNm LIKE CONCAT('%', #{customer}, '%')
|
||||
</if>
|
||||
<if test="paymentType != null and paymentType != ''">
|
||||
AND B.freeyn = #{paymentType}
|
||||
</if>
|
||||
<if test="productNo != null and productNo != ''">
|
||||
AND C.GoodsCd LIKE CONCAT('%', #{productNo}, '%')
|
||||
</if>
|
||||
<if test="productName != null and productName != ''">
|
||||
AND C.GoodsNm LIKE CONCAT('%', #{productName}, '%')
|
||||
</if>
|
||||
<if test="serialNo != null and serialNo != ''">
|
||||
AND A.serialno LIKE CONCAT('%', #{serialNo}, '%')
|
||||
</if>
|
||||
<if test="orderStatus != null and orderStatus != ''">
|
||||
AND B.endsale = #{orderStatus}
|
||||
</if>
|
||||
<if test="poNo != null and poNo != ''">
|
||||
AND B.OrderNo LIKE CONCAT('%', #{poNo}, '%')
|
||||
</if>
|
||||
<if test="requestDateFrom != null and requestDateFrom != ''">
|
||||
AND B.custreq <![CDATA[>=]]> #{requestDateFrom}
|
||||
</if>
|
||||
<if test="requestDateTo != null and requestDateTo != ''">
|
||||
AND B.custreq <![CDATA[<=]]> #{requestDateTo}
|
||||
</if>
|
||||
<if test="orderDateFrom != null and orderDateFrom != ''">
|
||||
AND B.OrderDate <![CDATA[>=]]> #{orderDateFrom}
|
||||
</if>
|
||||
<if test="orderDateTo != null and orderDateTo != ''">
|
||||
AND B.OrderDate <![CDATA[<=]]> #{orderDateTo}
|
||||
</if>
|
||||
<if test="shippingStatus != null and shippingStatus != ''">
|
||||
AND B.shippingstatus = #{shippingStatus}
|
||||
</if>
|
||||
<if test="shippingDateFrom != null and shippingDateFrom != ''">
|
||||
AND B.shippingdate <![CDATA[>=]]> #{shippingDateFrom}
|
||||
</if>
|
||||
<if test="shippingDateTo != null and shippingDateTo != ''">
|
||||
AND B.shippingdate <![CDATA[<=]]> #{shippingDateTo}
|
||||
</if>
|
||||
<if test="shippingMethod != null and shippingMethod != ''">
|
||||
AND B.outGb = #{shippingMethod}
|
||||
</if>
|
||||
<if test="manager != null and manager != ''">
|
||||
AND B.bEmpNo = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
AND B.incoterms = #{incoterms}
|
||||
</if>
|
||||
ORDER BY B.CRET_DATE DESC
|
||||
LIMIT #{COUNT_PER_PAGE} OFFSET #{PAGE_START}
|
||||
</select>
|
||||
|
||||
<!-- 매출관리 그리드 목록 개수 -->
|
||||
<select id="getSalesMgmtGridListCount" parameterType="map" resultType="int">
|
||||
/* salesNcollectMgmt.getSalesMgmtGridListCount */
|
||||
SELECT
|
||||
COUNT(1)
|
||||
FROM SWSC110A_TBL B
|
||||
LEFT JOIN SWSD010A_TBL A ON A.orderNo = B.orderNo
|
||||
INNER JOIN SWSB110A_TBL C ON B.goodsCd = C.goodsCd
|
||||
INNER JOIN SWSB210A_TBL D ON B.custCd = D.custCd
|
||||
WHERE 1 = 1
|
||||
<if test="orderType != null and orderType != ''">
|
||||
AND B.SaleType = #{orderType}
|
||||
</if>
|
||||
<if test="productType != null and productType != ''">
|
||||
AND C.c_class = #{productType}
|
||||
</if>
|
||||
<if test="nation != null and nation != ''">
|
||||
AND B.nationGB = #{nation}
|
||||
</if>
|
||||
<if test="customer != null and customer != ''">
|
||||
AND D.custNm LIKE CONCAT('%', #{customer}, '%')
|
||||
</if>
|
||||
<if test="paymentType != null and paymentType != ''">
|
||||
AND B.freeyn = #{paymentType}
|
||||
</if>
|
||||
<if test="productNo != null and productNo != ''">
|
||||
AND C.GoodsCd LIKE CONCAT('%', #{productNo}, '%')
|
||||
</if>
|
||||
<if test="productName != null and productName != ''">
|
||||
AND C.GoodsNm LIKE CONCAT('%', #{productName}, '%')
|
||||
</if>
|
||||
<if test="serialNo != null and serialNo != ''">
|
||||
AND A.serialno LIKE CONCAT('%', #{serialNo}, '%')
|
||||
</if>
|
||||
<if test="orderStatus != null and orderStatus != ''">
|
||||
AND B.endsale = #{orderStatus}
|
||||
</if>
|
||||
<if test="poNo != null and poNo != ''">
|
||||
AND B.OrderNo LIKE CONCAT('%', #{poNo}, '%')
|
||||
</if>
|
||||
<if test="requestDateFrom != null and requestDateFrom != ''">
|
||||
AND B.custreq <![CDATA[>=]]> #{requestDateFrom}
|
||||
</if>
|
||||
<if test="requestDateTo != null and requestDateTo != ''">
|
||||
AND B.custreq <![CDATA[<=]]> #{requestDateTo}
|
||||
</if>
|
||||
<if test="orderDateFrom != null and orderDateFrom != ''">
|
||||
AND B.OrderDate <![CDATA[>=]]> #{orderDateFrom}
|
||||
</if>
|
||||
<if test="orderDateTo != null and orderDateTo != ''">
|
||||
AND B.OrderDate <![CDATA[<=]]> #{orderDateTo}
|
||||
</if>
|
||||
<if test="shippingStatus != null and shippingStatus != ''">
|
||||
AND B.shippingstatus = #{shippingStatus}
|
||||
</if>
|
||||
<if test="shippingDateFrom != null and shippingDateFrom != ''">
|
||||
AND B.shippingdate <![CDATA[>=]]> #{shippingDateFrom}
|
||||
</if>
|
||||
<if test="shippingDateTo != null and shippingDateTo != ''">
|
||||
AND B.shippingdate <![CDATA[<=]]> #{shippingDateTo}
|
||||
</if>
|
||||
<if test="shippingMethod != null and shippingMethod != ''">
|
||||
AND B.outGb = #{shippingMethod}
|
||||
</if>
|
||||
<if test="manager != null and manager != ''">
|
||||
AND B.bEmpNo = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
AND B.incoterms = #{incoterms}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
|
||||
@@ -129,70 +129,6 @@ public class SalesNcollectMgmtService {
|
||||
return CommonUtils.toUpperCaseMapKey(resultMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 매출 목록 조회 (Tabulator Grid)
|
||||
* </pre>
|
||||
* @param request
|
||||
* @param paramMap - 매출관리 검색 정보
|
||||
* @return List<Map<String,Object>>
|
||||
*/
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
public List<Map<String,Object>> getSalesMgmtGridList(HttpServletRequest request
|
||||
, Map<String, Object> paramMap) {
|
||||
|
||||
List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>();
|
||||
SqlSession sqlSession = null;
|
||||
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
|
||||
// Tabulator는 page, size 파라미터를 사용
|
||||
String page = CommonUtils.checkNull(request.getParameter("page"), "1");
|
||||
String size = CommonUtils.checkNull(request.getParameter("size"), Constants.ADMIN_COUNT_PER_PAGE+"");
|
||||
int pageNum = Integer.parseInt(page);
|
||||
int sizeNum = Integer.parseInt(size);
|
||||
|
||||
paramMap.put("PAGE_START", (pageNum - 1) * sizeNum);
|
||||
paramMap.put("COUNT_PER_PAGE", sizeNum);
|
||||
|
||||
resultList = (ArrayList) sqlSession.selectList("salesNcollectMgmt.getSalesMgmtGridList", paramMap);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
return CommonUtils.toUpperCaseMapKey(resultList);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 매출 목록 카운트 조회 (Tabulator Grid)
|
||||
* </pre>
|
||||
* @param paramMap
|
||||
* @return int
|
||||
*/
|
||||
public int getSalesMgmtGridListCount(Map<String, Object> paramMap) {
|
||||
int totalCount = 0;
|
||||
SqlSession sqlSession = null;
|
||||
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
totalCount = sqlSession.selectOne("salesNcollectMgmt.getSalesMgmtGridListCount", paramMap);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
return totalCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 매출관리 등록
|
||||
|
||||
0
start-docker-linux.sh
Executable file → Normal file
0
start-docker-linux.sh
Executable file → Normal file
Reference in New Issue
Block a user