Merge pull request '매출관리 페이지 완료' (#2) from V2025101501 into main

Reviewed-on: #2
This commit was merged in pull request #2.
This commit is contained in:
2025-10-17 03:09:53 +00:00
10 changed files with 991 additions and 154 deletions

View File

@@ -812,5 +812,188 @@
,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>

View File

@@ -0,0 +1,192 @@
<%@ 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>

View File

@@ -75,73 +75,88 @@ function openCollectFormPopup(rcptNo, orderNo){
</script>
</head>
<body class="backcolor">
<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 -->
<!--// btn_wrap -->
<div class="btn_wrap">
<div class="plm_btn_wrap">
<input type="button" value="등록" class="plm_btns" id="btnAccountReg">
<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>
</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>
</div>
</body>
</html>

View File

@@ -75,94 +75,109 @@ function openSalesFormPopup(saleNo, orderNo){
</script>
</head>
<body class="backcolor">
<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 -->
<!--// btn_wrap -->
<div class="btn_wrap">
<div class="plm_btn_wrap">
<input type="button" value="등록" class="plm_btns" id="btnDeliveryReg">
<div class="content-box">
<div class="content-box-s">
<div class="plm_menu_name_ieg">
<h2>
<span>영업관리> 매출관리> 매출등록</span>
</h2>
</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>
<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>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
</div>
<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>
</div>
<!--// 매출등록 리스트 -->
</form>
</div>
</body>
</html>

View File

@@ -15,9 +15,8 @@ services:
-DDB_PASSWORD=waceplm0909!!
volumes:
- wace-plm-project_data:/data_storage
- wace-plm-app_data:/path/inside/container
- ./WebContent:/usr/local/tomcat/webapps/ROOT
restart: unless-stopped
volumes:
wace-plm-project_data:
wace-plm-app_data:

74
rebuild-and-restart.sh Executable file
View File

@@ -0,0 +1,74 @@
#!/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

View File

@@ -29,6 +29,7 @@ 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>
@@ -63,6 +64,117 @@ 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>
* 계약관리 목록 조회

View File

@@ -812,5 +812,188 @@
,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>

View File

@@ -129,6 +129,70 @@ 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 Normal file → Executable file
View File