Merge remote-tracking branch 'origin/main' into main
This commit is contained in:
@@ -501,9 +501,25 @@
|
||||
,EST_PRICE
|
||||
,EST_SUPPLY_PRICE
|
||||
,(SELECT COUNT(1) FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID) AS EST_STATUS
|
||||
,(
|
||||
SELECT IS_SEND
|
||||
FROM MAIL_LOG
|
||||
WHERE MAIL_TYPE = 'CONTRACT_ESTIMATE'
|
||||
AND TITLE LIKE '%[OBJID:' || T.OBJID || ']%'
|
||||
ORDER BY LOG_TIME DESC
|
||||
LIMIT 1
|
||||
) AS MAIL_SEND_STATUS
|
||||
,(
|
||||
SELECT TO_CHAR(LOG_TIME, 'YYYY-MM-DD HH24:MI')
|
||||
FROM MAIL_LOG
|
||||
WHERE MAIL_TYPE = 'CONTRACT_ESTIMATE'
|
||||
AND TITLE LIKE '%[OBJID:' || T.OBJID || ']%'
|
||||
ORDER BY LOG_TIME DESC
|
||||
LIMIT 1
|
||||
) AS MAIL_SEND_DATE
|
||||
,A.APPR_STATUS
|
||||
,A.APPROVAL_OBJID
|
||||
,A.ROUTE_OBJID
|
||||
,A.ROUTE_OBJID
|
||||
FROM
|
||||
CONTRACT_MGMT AS T
|
||||
LEFT OUTER JOIN
|
||||
@@ -887,6 +903,11 @@
|
||||
,QUANTITY
|
||||
,CUSTOMER_REQUEST
|
||||
,EXCHANGE_RATE
|
||||
,ORDER_DATE
|
||||
,ORDER_UNIT_PRICE
|
||||
,ORDER_SUPPLY_PRICE
|
||||
,ORDER_VAT
|
||||
,ORDER_TOTAL_AMOUNT
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@@ -949,6 +970,11 @@
|
||||
,#{quantity}
|
||||
,#{customer_request}
|
||||
,#{exchange_rate}
|
||||
,#{order_date}
|
||||
,#{unit_price}
|
||||
,#{supply_price}
|
||||
,#{vat}
|
||||
,#{total_amount}
|
||||
)
|
||||
ON CONFLICT (OBJID) DO
|
||||
UPDATE
|
||||
@@ -1008,6 +1034,11 @@
|
||||
,QUANTITY = #{quantity}
|
||||
,CUSTOMER_REQUEST = #{customer_request}
|
||||
,EXCHANGE_RATE = #{exchange_rate}
|
||||
,ORDER_DATE = #{order_date}
|
||||
,ORDER_UNIT_PRICE = #{unit_price}
|
||||
,ORDER_SUPPLY_PRICE = #{supply_price}
|
||||
,ORDER_VAT = #{vat}
|
||||
,ORDER_TOTAL_AMOUNT = #{total_amount}
|
||||
</update>
|
||||
|
||||
<update id="saveContractMgmtInfo_old" parameterType="map">
|
||||
@@ -1389,6 +1420,11 @@
|
||||
,QUANTITY
|
||||
,CUSTOMER_REQUEST
|
||||
,EXCHANGE_RATE
|
||||
,ORDER_DATE
|
||||
,ORDER_UNIT_PRICE
|
||||
,ORDER_SUPPLY_PRICE
|
||||
,ORDER_VAT
|
||||
,ORDER_TOTAL_AMOUNT
|
||||
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt01' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT1
|
||||
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt02' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT2
|
||||
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt03' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT3
|
||||
@@ -3907,8 +3943,7 @@ ORDER BY ASM.SUPPLY_NAME
|
||||
CHG_USER_ID = #{chg_user_id},
|
||||
CHGDATE = NOW()
|
||||
WHERE
|
||||
CONTRACT_OBJID = #{objId}
|
||||
AND TEMPLATE_TYPE = #{template_type}
|
||||
OBJID = #{template_objid}
|
||||
</update>
|
||||
|
||||
<!-- 견적서 템플릿 품목 삭제 -->
|
||||
@@ -3963,8 +3998,208 @@ ORDER BY ASM.SUPPLY_NAME
|
||||
CHG_USER_ID = #{chg_user_id},
|
||||
CHGDATE = NOW()
|
||||
WHERE
|
||||
CONTRACT_OBJID = #{objId}
|
||||
AND TEMPLATE_TYPE = #{template_type}
|
||||
OBJID = #{template_objid}
|
||||
</update>
|
||||
|
||||
<!-- 최종 차수 견적서 조회 (메일 발송용) -->
|
||||
<select id="getLatestEstimateTemplate" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID AS "OBJID",
|
||||
CONTRACT_OBJID AS "CONTRACT_OBJID",
|
||||
TEMPLATE_TYPE AS "TEMPLATE_TYPE",
|
||||
EXECUTOR AS "EXECUTOR",
|
||||
RECIPIENT AS "RECIPIENT",
|
||||
ESTIMATE_NO AS "ESTIMATE_NO",
|
||||
CONTACT_PERSON AS "CONTACT_PERSON",
|
||||
GREETING_TEXT AS "GREETING_TEXT",
|
||||
MODEL_NAME AS "MODEL_NAME",
|
||||
MODEL_CODE AS "MODEL_CODE",
|
||||
EXECUTOR_DATE AS "EXECUTOR_DATE",
|
||||
NOTE1 AS "NOTE1",
|
||||
NOTE2 AS "NOTE2",
|
||||
NOTE3 AS "NOTE3",
|
||||
NOTE4 AS "NOTE4",
|
||||
WRITER AS "WRITER",
|
||||
TO_CHAR(REGDATE, 'YYYY-MM-DD HH24:MI') AS "REGDATE",
|
||||
CHG_USER_ID AS "CHG_USER_ID",
|
||||
TO_CHAR(CHGDATE, 'YYYY-MM-DD HH24:MI') AS "CHGDATE",
|
||||
CATEGORIES_JSON AS "CATEGORIES_JSON"
|
||||
FROM
|
||||
ESTIMATE_TEMPLATE
|
||||
WHERE
|
||||
CONTRACT_OBJID = #{objId}
|
||||
ORDER BY
|
||||
TEMPLATE_TYPE,
|
||||
REGDATE DESC
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<!-- 계약 정보 조회 (메일 발송용) -->
|
||||
<select id="getContractInfoForMail" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
T.OBJID,
|
||||
T.CUSTOMER_OBJID,
|
||||
(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER_NAME,
|
||||
(SELECT EMAIL FROM SUPPLY_MNG AS O WHERE O.OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER_EMAIL,
|
||||
T.CUSTOMER_PROJECT_NAME,
|
||||
T.CONTRACT_NO,
|
||||
T.PRODUCT,
|
||||
CODE_NAME(T.PRODUCT) AS PRODUCT_NAME,
|
||||
T.WRITER,
|
||||
(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER) AS WRITER_NAME,
|
||||
(SELECT EMAIL FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER) AS WRITER_EMAIL,
|
||||
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS REGDATE
|
||||
FROM
|
||||
CONTRACT_MGMT AS T
|
||||
WHERE
|
||||
OBJID::VARCHAR = #{objId}
|
||||
</select>
|
||||
|
||||
<!-- //주문서관리 리스트 -->
|
||||
<select id="orderMgmtGrodList" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
T.*
|
||||
FROM
|
||||
<include refid="contractBase"/> T
|
||||
WHERE 1=1
|
||||
<if test="Year !=null and Year != '' ">
|
||||
AND SUBSTR(CONTRACT_DATE,0,5) = #{Year}
|
||||
</if>
|
||||
|
||||
<if test="category_cd !=null and category_cd != '' ">
|
||||
AND category_cd = #{category_cd}
|
||||
</if>
|
||||
|
||||
<if test="customer_objid !=null and customer_objid != '' ">
|
||||
AND customer_objid = #{customer_objid}
|
||||
</if>
|
||||
|
||||
<if test="product != null and product !='' ">
|
||||
AND product = #{product}
|
||||
</if>
|
||||
|
||||
<if test="status_cd !=null and status_cd !=''">
|
||||
AND status_cd = #{status_cd}
|
||||
</if>
|
||||
|
||||
<if test="result_cd !=null and result_cd !=''">
|
||||
AND result_cd = #{result_cd}
|
||||
</if>
|
||||
<if test="contract_result !=null and contract_result !=''">
|
||||
AND contract_result = #{contract_result}
|
||||
</if>
|
||||
|
||||
<if test="contract_start_date != null and !''.equals(contract_start_date)">
|
||||
AND TO_DATE(CONTRACT_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{contract_start_date}, 'YYYY-MM-DD')
|
||||
</if>
|
||||
<if test="contract_end_date != null and !''.equals(contract_end_date)">
|
||||
AND TO_DATE(CONTRACT_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{contract_end_date}, 'YYYY-MM-DD')
|
||||
</if>
|
||||
|
||||
<if test="pm_user_id !=null and pm_user_id !=''">
|
||||
AND pm_user_id = #{pm_user_id}
|
||||
</if>
|
||||
<if test="contract_month != null and !''.equals(contract_month)">
|
||||
AND TO_DATE(TO_CHAR(TO_DATE(CONTRACT_DATE,'YYYY-MM-DD'),'YYYY-MM-DD'),'YYYY-MM') <![CDATA[ = ]]> TO_DATE(SUBSTRING(#{contract_month} FROM 1 FOR 4) || '-' || SUBSTRING(#{contract_month} FROM 5 FOR 2), 'YYYY-MM')
|
||||
</if>
|
||||
|
||||
<!-- 견적관리 추가 검색조건 -->
|
||||
<if test="appr_status !=null and appr_status != '' ">
|
||||
AND APPR_STATUS = #{appr_status}
|
||||
</if>
|
||||
|
||||
<if test="area_cd != null and area_cd !='' ">
|
||||
AND AREA_CD = #{area_cd}
|
||||
</if>
|
||||
|
||||
<if test="paid_type != null and paid_type !='' ">
|
||||
AND PAID_TYPE = #{paid_type}
|
||||
</if>
|
||||
|
||||
<if test="search_partNo != null and search_partNo != ''">
|
||||
AND UPPER(PART_NO) LIKE UPPER('%${search_partNo}%')
|
||||
</if>
|
||||
|
||||
<if test="search_partName != null and search_partName != ''">
|
||||
AND UPPER(PART_NAME) LIKE UPPER('%${search_partName}%')
|
||||
</if>
|
||||
|
||||
<if test="search_serialNo != null and search_serialNo != ''">
|
||||
AND UPPER(SERIAL_NO) LIKE UPPER('%${search_serialNo}%')
|
||||
</if>
|
||||
|
||||
<if test="receipt_start_date != null and !''.equals(receipt_start_date)">
|
||||
AND TO_DATE(RECEIPT_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{receipt_start_date}, 'YYYY-MM-DD')
|
||||
</if>
|
||||
<if test="receipt_end_date != null and !''.equals(receipt_end_date)">
|
||||
AND TO_DATE(RECEIPT_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{receipt_end_date}, 'YYYY-MM-DD')
|
||||
</if>
|
||||
|
||||
<if test="due_start_date != null and !''.equals(due_start_date)">
|
||||
AND TO_DATE(RECEIPT_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{due_start_date}, 'YYYY-MM-DD')
|
||||
</if>
|
||||
<if test="due_end_date != null and !''.equals(due_end_date)">
|
||||
AND TO_DATE(DUE_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{due_end_date}, 'YYYY-MM-DD')
|
||||
</if>
|
||||
ORDER BY REGDATE DESC
|
||||
</select>
|
||||
|
||||
<!-- 영업정보 조회 (수주등록용) -->
|
||||
<select id="getContractInfo" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
CONTRACT_NO,
|
||||
CONTRACT_CURRENCY,
|
||||
(SELECT CODE_NAME FROM TB_CODE WHERE CODE_ID = CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME,
|
||||
EXCHANGE_RATE,
|
||||
QUANTITY,
|
||||
PART_NO,
|
||||
PART_NAME,
|
||||
-- 수주정보 (기존 컬럼 활용)
|
||||
CONTRACT_RESULT,
|
||||
PO_NO,
|
||||
ORDER_DATE,
|
||||
ORDER_UNIT_PRICE,
|
||||
ORDER_SUPPLY_PRICE,
|
||||
ORDER_VAT,
|
||||
ORDER_TOTAL_AMOUNT
|
||||
FROM CONTRACT_MGMT
|
||||
WHERE OBJID = #{objId}
|
||||
</select>
|
||||
|
||||
<!-- 수주정보 조회 -->
|
||||
<select id="getOrderInfo" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
CONTRACT_NO,
|
||||
CONTRACT_RESULT,
|
||||
PO_NO,
|
||||
ORDER_DATE,
|
||||
QUANTITY,
|
||||
ORDER_UNIT_PRICE AS UNIT_PRICE,
|
||||
ORDER_SUPPLY_PRICE AS SUPPLY_PRICE,
|
||||
ORDER_VAT AS VAT,
|
||||
ORDER_TOTAL_AMOUNT AS TOTAL_AMOUNT,
|
||||
CONTRACT_CURRENCY AS CURRENCY,
|
||||
EXCHANGE_RATE
|
||||
FROM CONTRACT_MGMT
|
||||
WHERE OBJID = #{objId}
|
||||
</select>
|
||||
|
||||
<!-- 수주정보 업데이트 -->
|
||||
<update id="updateOrderInfo" parameterType="map">
|
||||
UPDATE CONTRACT_MGMT
|
||||
SET
|
||||
CONTRACT_RESULT = #{contract_result},
|
||||
PO_NO = #{po_no},
|
||||
ORDER_DATE = #{order_date},
|
||||
QUANTITY = #{quantity},
|
||||
ORDER_UNIT_PRICE = #{unit_price},
|
||||
ORDER_SUPPLY_PRICE = #{supply_price},
|
||||
ORDER_VAT = #{vat},
|
||||
ORDER_TOTAL_AMOUNT = #{total_amount},
|
||||
CONTRACT_CURRENCY = #{contract_currency},
|
||||
EXCHANGE_RATE = #{exchange_rate}
|
||||
WHERE OBJID = #{contractObjId}
|
||||
</update>
|
||||
</mapper>
|
||||
@@ -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>
|
||||
|
||||
|
||||
191
WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp
Normal file
191
WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp
Normal file
@@ -0,0 +1,191 @@
|
||||
<%@ 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">
|
||||
</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,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>
|
||||
@@ -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>
|
||||
@@ -2,24 +2,26 @@
|
||||
/* 깔끔하고 전문적인 업무용 시스템 디자인 */
|
||||
|
||||
:root {
|
||||
--primary-color: #3b82f6;
|
||||
--primary-hover: #2563eb;
|
||||
--primary-light: #dbeafe;
|
||||
--secondary-color: #64748b;
|
||||
--success-color: #10b981;
|
||||
--danger-color: #ef4444;
|
||||
--warning-color: #f59e0b;
|
||||
--background: #f8fafc;
|
||||
--primary-color: #1a73e8;
|
||||
--primary-hover: #1557b0;
|
||||
--primary-light: #d2e3fc;
|
||||
--secondary-color: #5f6368;
|
||||
--success-color: #34a853;
|
||||
--danger-color: #ea4335;
|
||||
--warning-color: #fbbc04;
|
||||
--background: #f5f5f5;
|
||||
--surface: #ffffff;
|
||||
--border-color: #e2e8f0;
|
||||
--text-primary: #1e293b;
|
||||
--text-secondary: #64748b;
|
||||
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
||||
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
||||
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
||||
--radius-sm: 6px;
|
||||
--border-color: #dadce0;
|
||||
--text-primary: #202124;
|
||||
--text-secondary: #5f6368;
|
||||
--label-bg: #f8f9fa;
|
||||
--input-bg: #f8f9fa;
|
||||
--shadow-sm: 0 1px 2px 0 rgba(60, 64, 67, 0.3);
|
||||
--shadow-md: 0 1px 3px 0 rgba(60, 64, 67, 0.3);
|
||||
--shadow-lg: 0 2px 6px 2px rgba(60, 64, 67, 0.15);
|
||||
--radius-sm: 4px;
|
||||
--radius-md: 8px;
|
||||
--radius-lg: 12px;
|
||||
--radius-lg: 8px;
|
||||
}
|
||||
|
||||
/* 기본 바디 스타일 - 깔끔한 배경 */
|
||||
@@ -52,8 +54,8 @@ section, aside {
|
||||
border-radius: var(--radius-lg);
|
||||
margin: 0 auto 20px;
|
||||
padding: 0;
|
||||
box-shadow: var(--shadow-sm);
|
||||
max-width: 1200px;
|
||||
box-shadow: 0 1px 3px rgba(60, 64, 67, 0.15);
|
||||
max-width: 1400px;
|
||||
animation: fadeIn 0.3s ease-out;
|
||||
}
|
||||
|
||||
@@ -70,7 +72,7 @@ section, aside {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* 페이지 제목 스타일 - 파란 배경 (모든 방식으로 최우선 적용) */
|
||||
/* 페이지 제목 스타일 - 진한 파란 배경 (모든 방식으로 최우선 적용) */
|
||||
html body section .plm_menu_name h2,
|
||||
html body .plm_menu_name h2,
|
||||
body section .plm_menu_name h2,
|
||||
@@ -79,24 +81,44 @@ section .plm_menu_name h2,
|
||||
div.plm_menu_name h2,
|
||||
.plm_menu_name > h2,
|
||||
.plm_menu_name h2 {
|
||||
background: #3b82f6 !important;
|
||||
background-color: #3b82f6 !important;
|
||||
background-image: linear-gradient(135deg, #4285f4 0%, #3b82f6 100%) !important;
|
||||
background: #1a73e8 !important;
|
||||
background-color: #1a73e8 !important;
|
||||
background-image: none !important;
|
||||
color: #ffffff !important;
|
||||
padding: 16px 24px !important;
|
||||
padding: 10px 16px !important;
|
||||
margin: 0 !important;
|
||||
font-size: 16px !important;
|
||||
font-weight: 600 !important;
|
||||
font-size: 14px !important;
|
||||
font-weight: 500 !important;
|
||||
border: none !important;
|
||||
border-bottom: none !important;
|
||||
border-top: none !important;
|
||||
border-left: none !important;
|
||||
border-right: none !important;
|
||||
border-radius: 12px 12px 0 0 !important;
|
||||
border-radius: 8px 8px 0 0 !important;
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
justify-content: space-between !important;
|
||||
position: relative !important;
|
||||
box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15) !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
/* 헤더 옵션 버튼 */
|
||||
.plm_menu_name .option-btn {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
color: white;
|
||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
padding: 6px 16px;
|
||||
border-radius: 6px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
.plm_menu_name .option-btn:hover {
|
||||
background: rgba(255, 255, 255, 0.3);
|
||||
border-color: rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
html body section .plm_menu_name h2 span,
|
||||
@@ -121,11 +143,11 @@ div.plm_menu_name h2 span,
|
||||
#businessPopupFormWrap h4 {
|
||||
background: white;
|
||||
color: var(--text-primary);
|
||||
padding: 8px 16px;
|
||||
margin: 0 0 8px 0;
|
||||
padding: 6px 12px;
|
||||
margin: 0;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
border-bottom: 1px solid #e2e8f0;
|
||||
font-weight: 500;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
border-left: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -140,7 +162,7 @@ div.plm_menu_name h2 span,
|
||||
}
|
||||
|
||||
#businessPopupFormWrap h4 span::before {
|
||||
content: '📎';
|
||||
content: '📋';
|
||||
font-size: 14px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
@@ -213,11 +235,11 @@ div.plm_menu_name h2 span,
|
||||
#EntirePopupFormWrap .form_popup_title {
|
||||
background: white;
|
||||
color: var(--text-primary);
|
||||
padding: 8px 28px;
|
||||
padding: 4px 14px;
|
||||
margin: 0;
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
border-bottom: 2px solid #e2e8f0;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
border-left: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -227,13 +249,13 @@ div.plm_menu_name h2 span,
|
||||
#EntirePopupFormWrap .form_popup_title span {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
gap: 6px;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
#EntirePopupFormWrap .form_popup_title span::before {
|
||||
content: '📋';
|
||||
font-size: 18px;
|
||||
font-size: 14px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
@@ -259,8 +281,8 @@ div.plm_menu_name h2 span,
|
||||
.pmsPopupForm td,
|
||||
.pmsPopuptable td {
|
||||
height: auto;
|
||||
font-size: 11px;
|
||||
padding: 6px 12px; /* 8px에서 6px로 더욱 압축 */
|
||||
font-size: 12px;
|
||||
padding: 3px 10px;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
vertical-align: middle;
|
||||
}
|
||||
@@ -272,21 +294,54 @@ div.plm_menu_name h2 span,
|
||||
|
||||
/* 라벨 셀 스타일 - 심플하고 읽기 쉽게 */
|
||||
.input_title {
|
||||
background: #f8fafc;
|
||||
background: var(--label-bg);
|
||||
color: var(--text-primary);
|
||||
border-right: 1px solid var(--border-color);
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
position: relative;
|
||||
padding: 20px 24px;
|
||||
padding: 4px 10px;
|
||||
vertical-align: middle !important;
|
||||
width: 140px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.input_title label {
|
||||
color: var(--text-primary);
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
font-size: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
/* 필수 항목 표시 */
|
||||
.input_title label::after {
|
||||
content: '';
|
||||
display: none;
|
||||
}
|
||||
|
||||
.input_title.required label::after {
|
||||
content: '*';
|
||||
color: var(--danger-color);
|
||||
margin-left: 4px;
|
||||
font-weight: 700;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
/* 서브 타이틀 (세로 섹션 제목) */
|
||||
.sub_title {
|
||||
background: linear-gradient(135deg, #4285f4 0%, #3b82f6 100%);
|
||||
color: white;
|
||||
font-weight: 700;
|
||||
font-size: 14px;
|
||||
display: block;
|
||||
text-align: center;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
padding: 20px 16px;
|
||||
border-right: 1px solid var(--border-color);
|
||||
writing-mode: vertical-rl;
|
||||
text-orientation: mixed;
|
||||
letter-spacing: 2px;
|
||||
min-width: 50px;
|
||||
}
|
||||
|
||||
/* 테이블 셀 세로 정렬 강제 적용 */
|
||||
@@ -310,9 +365,10 @@ div.plm_menu_name h2 span,
|
||||
|
||||
.input_sub_title {
|
||||
background: var(--surface);
|
||||
color: var(--text-secondary);
|
||||
font-weight: 500;
|
||||
font-size: 13px;
|
||||
color: var(--text-primary);
|
||||
font-weight: 400;
|
||||
font-size: 12px;
|
||||
padding: 3px 10px;
|
||||
}
|
||||
|
||||
.input_title_b {
|
||||
@@ -323,7 +379,7 @@ div.plm_menu_name h2 span,
|
||||
padding: 20px 24px;
|
||||
}
|
||||
|
||||
/* 입력 필드 스타일 - 최소 크기로 압축 (16px) */
|
||||
/* 입력 필드 스타일 - 컴팩트 크기 (22px = 32px의 70%) - 어두운 배경 */
|
||||
.pmsPopupForm input[type="text"],
|
||||
.pmsPopupForm input[type="number"],
|
||||
.pmsPopupForm select,
|
||||
@@ -331,17 +387,18 @@ div.plm_menu_name h2 span,
|
||||
.pmsPopuptable input[type="number"],
|
||||
.pmsPopuptable select {
|
||||
width: 100%;
|
||||
height: 16px !important; /* 20px에서 16px로 축소 */
|
||||
line-height: 14px !important; /* 텍스트 세로 정렬 */
|
||||
height: 22px !important;
|
||||
line-height: 20px !important;
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 4px;
|
||||
padding: 0 6px !important;
|
||||
font-size: 11px !important;
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0 8px !important;
|
||||
font-size: 12px !important;
|
||||
color: var(--text-primary);
|
||||
background: var(--surface);
|
||||
transition: all 0.2s ease;
|
||||
background: var(--input-bg);
|
||||
transition: all 0.15s ease;
|
||||
font-family: inherit;
|
||||
vertical-align: middle;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* 셀렉트 박스 전용 스타일 */
|
||||
@@ -364,8 +421,7 @@ div.plm_menu_name h2 span,
|
||||
.pmsPopuptable input[type="text"]:hover,
|
||||
.pmsPopuptable input[type="number"]:hover,
|
||||
.pmsPopuptable select:hover {
|
||||
border-color: var(--secondary-color);
|
||||
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.05);
|
||||
border-color: #80868b;
|
||||
}
|
||||
|
||||
.pmsPopupForm input[type="text"]:focus,
|
||||
@@ -376,8 +432,8 @@ div.plm_menu_name h2 span,
|
||||
.pmsPopuptable select:focus {
|
||||
border-color: var(--primary-color);
|
||||
outline: none;
|
||||
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1);
|
||||
background: var(--surface);
|
||||
box-shadow: 0 0 0 1px var(--primary-color);
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.pmsPopupForm input[type="text"]:disabled,
|
||||
@@ -397,13 +453,13 @@ div.plm_menu_name h2 span,
|
||||
width: 100%;
|
||||
min-height: 60px;
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 4px;
|
||||
padding: 8px;
|
||||
font-size: 11px;
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 8px 10px;
|
||||
font-size: 12px;
|
||||
color: var(--text-primary);
|
||||
background: var(--surface);
|
||||
background: var(--input-bg);
|
||||
resize: vertical;
|
||||
transition: all 0.2s ease;
|
||||
transition: all 0.15s ease;
|
||||
font-family: inherit;
|
||||
line-height: 1.5;
|
||||
}
|
||||
@@ -431,58 +487,108 @@ div.plm_menu_name h2 span,
|
||||
margin: 0 4px 0 0;
|
||||
}
|
||||
|
||||
/* 라디오 버튼 스타일 */
|
||||
.pmsPopupForm input[type="radio"],
|
||||
.pmsPopuptable input[type="radio"] {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
accent-color: var(--primary-color);
|
||||
cursor: pointer;
|
||||
margin: 0 6px 0 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.pmsPopupForm input[type="radio"] + label,
|
||||
.pmsPopuptable input[type="radio"] + label {
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: var(--text-primary);
|
||||
cursor: pointer;
|
||||
margin-right: 16px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/* 버튼 래퍼 */
|
||||
.btn_wrap {
|
||||
margin: 0;
|
||||
padding: 24px 32px;
|
||||
padding: 16px 24px;
|
||||
border-top: 1px solid var(--border-color);
|
||||
background: #fafbfc;
|
||||
background: #f8fafc;
|
||||
border-radius: 0 0 var(--radius-lg) var(--radius-lg);
|
||||
}
|
||||
|
||||
.plm_btn_wrap_center {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 12px;
|
||||
gap: 8px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
/* 버튼 스타일 - 깔끔하고 명확하게 */
|
||||
.plm_btns {
|
||||
height: 42px;
|
||||
border-radius: var(--radius-md);
|
||||
height: 28px;
|
||||
border-radius: var(--radius-sm);
|
||||
background: var(--primary-color);
|
||||
color: white;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
font-size: 13px;
|
||||
border: none;
|
||||
padding: 0 24px;
|
||||
font-weight: 600;
|
||||
transition: all 0.2s ease;
|
||||
box-shadow: var(--shadow-sm);
|
||||
padding: 0 16px;
|
||||
font-weight: 500;
|
||||
transition: background 0.15s ease;
|
||||
box-shadow: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
margin: 0;
|
||||
gap: 4px;
|
||||
margin: 0 4px;
|
||||
float: none;
|
||||
}
|
||||
|
||||
.plm_btns:hover {
|
||||
background: var(--primary-hover);
|
||||
box-shadow: var(--shadow-md);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.plm_btns:active {
|
||||
transform: translateY(0);
|
||||
box-shadow: var(--shadow-sm);
|
||||
background: #1346af;
|
||||
}
|
||||
|
||||
/* 세컨더리 버튼 (복사, 다시작성 등) */
|
||||
.plm_btns.secondary {
|
||||
background: white;
|
||||
color: var(--text-primary);
|
||||
border: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
.plm_btns.secondary:hover {
|
||||
background: var(--label-bg);
|
||||
}
|
||||
|
||||
/* 위험 버튼 (사용중단 등) */
|
||||
.plm_btns.danger {
|
||||
background: var(--danger-color);
|
||||
border: none;
|
||||
}
|
||||
|
||||
.plm_btns.danger:hover {
|
||||
background: #d33426;
|
||||
}
|
||||
|
||||
/* 성공 버튼 (재사용 등) */
|
||||
.plm_btns.success {
|
||||
background: var(--success-color);
|
||||
border: none;
|
||||
}
|
||||
|
||||
.plm_btns.success:hover {
|
||||
background: #2d8f47;
|
||||
}
|
||||
|
||||
/* 닫기 버튼은 세컨더리 스타일 */
|
||||
#btn_close {
|
||||
background: white;
|
||||
color: var(--text-primary);
|
||||
border: 1.5px solid var(--border-color);
|
||||
border: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
#btn_close:hover {
|
||||
@@ -615,49 +721,48 @@ div.plm_menu_name h2 span,
|
||||
background: var(--text-primary);
|
||||
}
|
||||
|
||||
/* Select2 스타일 조정 - 16px로 통일 */
|
||||
/* Select2 스타일 조정 - 22px로 통일 (70%) */
|
||||
.select2-container--default .select2-selection--single {
|
||||
border: 1px solid var(--border-color) !important;
|
||||
border-radius: 4px !important;
|
||||
height: 16px !important; /* 입력 필드와 동일하게 16px */
|
||||
border-radius: var(--radius-sm) !important;
|
||||
height: 22px !important;
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
background: var(--surface);
|
||||
transition: all 0.2s ease;
|
||||
background: var(--input-bg) !important;
|
||||
transition: border-color 0.15s ease;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--single:hover {
|
||||
border-color: var(--secondary-color) !important;
|
||||
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.05);
|
||||
border-color: #80868b !important;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--single:focus,
|
||||
.select2-container--default.select2-container--open .select2-selection--single {
|
||||
border-color: var(--primary-color) !important;
|
||||
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1) !important;
|
||||
box-shadow: 0 0 0 1px var(--primary-color) !important;
|
||||
outline: none !important;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--single .select2-selection__rendered {
|
||||
line-height: 14px !important; /* 텍스트 세로 정렬 */
|
||||
padding-left: 6px !important;
|
||||
line-height: 20px !important;
|
||||
padding-left: 8px !important;
|
||||
padding-right: 22px !important;
|
||||
color: var(--text-primary) !important;
|
||||
font-size: 11px !important;
|
||||
font-size: 12px !important;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--single .select2-selection__placeholder {
|
||||
color: var(--text-secondary) !important;
|
||||
color: #80868b !important;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--single .select2-selection__arrow {
|
||||
height: 14px !important;
|
||||
height: 20px !important;
|
||||
right: 4px !important;
|
||||
top: 1px !important;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--single .select2-selection__arrow b {
|
||||
border-color: var(--text-secondary) transparent transparent transparent !important;
|
||||
border-color: #5f6368 transparent transparent transparent !important;
|
||||
border-width: 3px 3px 0 3px !important;
|
||||
margin-left: -3px !important;
|
||||
margin-top: -1px !important;
|
||||
@@ -665,30 +770,31 @@ div.plm_menu_name h2 span,
|
||||
|
||||
/* Select2 드롭다운 스타일 */
|
||||
.select2-container--default .select2-results__option {
|
||||
padding: 4px 6px !important;
|
||||
font-size: 11px !important;
|
||||
padding: 6px 8px !important;
|
||||
font-size: 12px !important;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-results__option--highlighted[aria-selected] {
|
||||
background-color: var(--primary-light) !important;
|
||||
color: var(--primary-color) !important;
|
||||
color: var(--text-primary) !important;
|
||||
}
|
||||
|
||||
.select2-dropdown {
|
||||
border: 1px solid var(--border-color) !important;
|
||||
border-radius: 4px !important;
|
||||
box-shadow: var(--shadow-lg) !important;
|
||||
border-radius: var(--radius-sm) !important;
|
||||
box-shadow: 0 2px 8px rgba(60, 64, 67, 0.15) !important;
|
||||
}
|
||||
|
||||
.select2-search--dropdown .select2-search__field {
|
||||
border: 1px solid var(--border-color) !important;
|
||||
border-radius: 3px !important;
|
||||
padding: 3px 5px !important;
|
||||
font-size: 11px !important;
|
||||
border-radius: var(--radius-sm) !important;
|
||||
padding: 4px 8px !important;
|
||||
font-size: 12px !important;
|
||||
}
|
||||
|
||||
.select2-search--dropdown .select2-search__field:focus {
|
||||
border-color: var(--primary-color) !important;
|
||||
box-shadow: 0 0 0 1px var(--primary-color) !important;
|
||||
outline: none !important;
|
||||
}
|
||||
|
||||
@@ -1050,6 +1156,163 @@ div.plm_menu_name h2 span,
|
||||
border-color: var(--secondary-color);
|
||||
}
|
||||
|
||||
/* 탭 스타일 */
|
||||
.tab-container {
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
background: white;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.tab-list {
|
||||
display: flex;
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0 16px;
|
||||
gap: 0;
|
||||
}
|
||||
|
||||
.tab-item {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
.tab-button {
|
||||
display: block;
|
||||
padding: 12px 20px;
|
||||
background: transparent;
|
||||
border: none;
|
||||
border-bottom: 2px solid transparent;
|
||||
color: var(--text-secondary);
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
cursor: pointer;
|
||||
transition: all 0.15s ease;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.tab-button:hover {
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.tab-button.active {
|
||||
color: var(--primary-color);
|
||||
border-bottom-color: var(--primary-color);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* 탭 컨텐츠 */
|
||||
.tab-content {
|
||||
display: none;
|
||||
padding: 20px;
|
||||
animation: fadeIn 0.3s ease-out;
|
||||
}
|
||||
|
||||
.tab-content.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* 주소 검색 아이콘 버튼 및 기능 버튼 */
|
||||
.address-search-btn,
|
||||
.icon-btn,
|
||||
button.icon-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-width: 32px;
|
||||
height: 32px;
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: var(--radius-sm);
|
||||
background: white;
|
||||
cursor: pointer;
|
||||
transition: all 0.15s ease;
|
||||
margin-left: 4px;
|
||||
vertical-align: middle;
|
||||
padding: 0 8px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.address-search-btn:hover,
|
||||
.icon-btn:hover,
|
||||
button.icon-btn:hover {
|
||||
background: var(--primary-light);
|
||||
border-color: var(--primary-color);
|
||||
color: var(--primary-color);
|
||||
}
|
||||
|
||||
/* Fn 버튼 스타일 */
|
||||
.fn-btn {
|
||||
background: #f8fafc;
|
||||
border: 1px solid var(--border-color);
|
||||
padding: 0 8px;
|
||||
font-family: 'Courier New', monospace;
|
||||
font-weight: bold;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
/* 국기 아이콘 및 플래그 */
|
||||
.flag-icon {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
border-radius: 50%;
|
||||
overflow: hidden;
|
||||
margin-right: 6px;
|
||||
vertical-align: middle;
|
||||
border: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
/* 입력 필드 그룹 (아이콘 + 입력) */
|
||||
.input-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.input-group input {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.input-group .icon-btn {
|
||||
margin-left: 0;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* 버튼 그룹 스타일 */
|
||||
.button-group {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.button-group .plm_btns {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* 상태 배지 스타일 */
|
||||
.status-badge {
|
||||
display: inline-block;
|
||||
padding: 4px 12px;
|
||||
border-radius: 12px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.status-badge.active {
|
||||
background: #d1fae5;
|
||||
color: #065f46;
|
||||
}
|
||||
|
||||
.status-badge.inactive {
|
||||
background: #fee2e2;
|
||||
color: #991b1b;
|
||||
}
|
||||
|
||||
/* 프린트 스타일 */
|
||||
@media print {
|
||||
body {
|
||||
@@ -1065,11 +1328,16 @@ div.plm_menu_name h2 span,
|
||||
.plm_btns,
|
||||
.btns,
|
||||
.upload_btns,
|
||||
.delete_btn {
|
||||
.delete_btn,
|
||||
.tab-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dropzone {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.tab-content {
|
||||
display: block !important;
|
||||
}
|
||||
}
|
||||
114
WebContent/css/tabulator/tabulator.min.css
vendored
114
WebContent/css/tabulator/tabulator.min.css
vendored
@@ -1,10 +1,12 @@
|
||||
|
||||
.tabulator {
|
||||
position: relative;
|
||||
border: 1px solid #999;
|
||||
border: 1px solid #dadce0;
|
||||
background-color: white;
|
||||
font-size: 13px;
|
||||
font-size: 12px;
|
||||
text-align: left;
|
||||
overflow: hidden;
|
||||
border-radius: 8px;
|
||||
-webkit-transform: translateZ(0);
|
||||
-moz-transform: translateZ(0);
|
||||
-ms-transform: translateZ(0);
|
||||
@@ -29,10 +31,11 @@
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
border-bottom: 1px solid #999;
|
||||
background-color: #e6e6e6;
|
||||
color: #555;
|
||||
font-weight: 700;
|
||||
border-bottom: 2px solid #1a73e8;
|
||||
background-color: #f8f9fa;
|
||||
color: #202124;
|
||||
font-weight: 600;
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
-moz-user-select: none;
|
||||
@@ -61,10 +64,10 @@
|
||||
box-sizing: border-box;
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
border-right: 1px solid #aaa;
|
||||
background: #e6e6e6;
|
||||
text-align: left;
|
||||
vertical-align: bottom;
|
||||
border-right: 1px solid #dadce0;
|
||||
background: #f8f9fa;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
overflow: hidden
|
||||
}
|
||||
|
||||
@@ -78,7 +81,7 @@
|
||||
.tabulator .tabulator-header .tabulator-col .tabulator-col-content {
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
padding: 4px
|
||||
padding: 6px 8px
|
||||
}
|
||||
|
||||
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-header-popup-button
|
||||
@@ -187,7 +190,7 @@
|
||||
.tabulator .tabulator-header .tabulator-col.tabulator-sortable.tabulator-col-sorter-element:hover
|
||||
{
|
||||
cursor: pointer;
|
||||
background-color: #cdcdcd
|
||||
background-color: #e8f0fe
|
||||
}
|
||||
|
||||
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter
|
||||
@@ -378,10 +381,11 @@
|
||||
}
|
||||
|
||||
.tabulator .tabulator-footer {
|
||||
border-top: 1px solid #999;
|
||||
background-color: #e6e6e6;
|
||||
color: #555;
|
||||
font-weight: 700;
|
||||
border-top: 1px solid #dadce0;
|
||||
background-color: #f8f9fa;
|
||||
color: #202124;
|
||||
font-weight: 500;
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
user-select: none;
|
||||
-moz-user-select: none;
|
||||
@@ -438,7 +442,7 @@
|
||||
.tabulator .tabulator-footer .tabulator-paginator {
|
||||
flex: 1;
|
||||
text-align: right;
|
||||
color: #555;
|
||||
color: #202124;
|
||||
font-family: inherit;
|
||||
font-weight: inherit;
|
||||
font-size: inherit
|
||||
@@ -447,9 +451,11 @@
|
||||
.tabulator .tabulator-footer .tabulator-page-size {
|
||||
display: inline-block;
|
||||
margin: 0 5px;
|
||||
padding: 2px 5px;
|
||||
border: 1px solid #aaa;
|
||||
border-radius: 3px
|
||||
padding: 4px 8px;
|
||||
border: 1px solid #dadce0;
|
||||
border-radius: 4px;
|
||||
background: white;
|
||||
font-size: 12px
|
||||
}
|
||||
|
||||
.tabulator .tabulator-footer .tabulator-pages {
|
||||
@@ -459,24 +465,30 @@
|
||||
.tabulator .tabulator-footer .tabulator-page {
|
||||
display: inline-block;
|
||||
margin: 0 2px;
|
||||
padding: 2px 5px;
|
||||
border: 1px solid #aaa;
|
||||
border-radius: 3px;
|
||||
background: hsla(0, 0%, 100%, .2)
|
||||
padding: 4px 8px;
|
||||
border: 1px solid #dadce0;
|
||||
border-radius: 4px;
|
||||
background: white;
|
||||
font-size: 12px;
|
||||
transition: all 0.15s ease
|
||||
}
|
||||
|
||||
.tabulator .tabulator-footer .tabulator-page.active {
|
||||
color: #d00
|
||||
color: white;
|
||||
background: #1a73e8;
|
||||
border-color: #1a73e8;
|
||||
font-weight: 600
|
||||
}
|
||||
|
||||
.tabulator .tabulator-footer .tabulator-page:disabled {
|
||||
opacity: .5
|
||||
}
|
||||
|
||||
.tabulator .tabulator-footer .tabulator-page:not (.disabled ):hover {
|
||||
.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover {
|
||||
cursor: pointer;
|
||||
background: rgba(0, 0, 0, .2);
|
||||
color: #fff
|
||||
background: #e8f0fe;
|
||||
border-color: #1a73e8;
|
||||
color: #1a73e8
|
||||
}
|
||||
|
||||
.tabulator .tabulator-col-resize-handle {
|
||||
@@ -536,26 +548,25 @@
|
||||
.tabulator-row {
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
min-height: 22px;
|
||||
|
||||
min-height: 28px;
|
||||
background-color: #fff
|
||||
}
|
||||
|
||||
.tabulator-row.tabulator-row-even {
|
||||
background-color: #efefef
|
||||
background-color: #fafbfc
|
||||
}
|
||||
|
||||
.tabulator-row.tabulator-selectable:hover {
|
||||
background-color: #F69831;
|
||||
background-color: #e8f0fe;
|
||||
cursor: pointer
|
||||
}
|
||||
|
||||
.tabulator-row.tabulator-selected {
|
||||
background-color: #9abcea
|
||||
background-color: #d2e3fc
|
||||
}
|
||||
|
||||
.tabulator-row.tabulator-selected:hover {
|
||||
background-color: #769bcc;
|
||||
background-color: #aecbfa;
|
||||
cursor: pointer
|
||||
}
|
||||
|
||||
@@ -617,13 +628,15 @@
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
padding: 4px;
|
||||
border-right: 1px solid #aaa;
|
||||
padding: 4px 8px;
|
||||
border-right: 1px solid #dadce0;
|
||||
vertical-align: middle;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
height:30px;
|
||||
height: 28px;
|
||||
font-size: 12px;
|
||||
color: #202124;
|
||||
}
|
||||
|
||||
.tabulator-row .tabulator-cell.tabulator-frozen {
|
||||
@@ -643,9 +656,10 @@
|
||||
}
|
||||
|
||||
.tabulator-row .tabulator-cell.tabulator-editing {
|
||||
border: 1px solid #1d68cd;
|
||||
border: 1px solid #1a73e8;
|
||||
outline: none;
|
||||
padding: 0
|
||||
padding: 0;
|
||||
box-shadow: 0 0 0 1px #1a73e8
|
||||
}
|
||||
|
||||
.tabulator-row .tabulator-cell.tabulator-editing input, .tabulator-row .tabulator-cell.tabulator-editing select
|
||||
@@ -812,18 +826,19 @@
|
||||
|
||||
.tabulator-row.tabulator-group {
|
||||
box-sizing: border-box;
|
||||
border-bottom: 1px solid #999;
|
||||
border-right: 1px solid #aaa;
|
||||
border-top: 1px solid #999;
|
||||
padding: 5px 5px 5px 10px;
|
||||
background: #ccc;
|
||||
font-weight: 700;
|
||||
border-bottom: 1px solid #dadce0;
|
||||
border-right: 1px solid #dadce0;
|
||||
border-top: 1px solid #dadce0;
|
||||
padding: 6px 8px 6px 12px;
|
||||
background: #f8f9fa;
|
||||
font-weight: 600;
|
||||
font-size: 12px;
|
||||
min-width: 100%
|
||||
}
|
||||
|
||||
.tabulator-row.tabulator-group:hover {
|
||||
cursor: pointer;
|
||||
background-color: rgba(0, 0, 0, .1)
|
||||
background-color: #e8f0fe
|
||||
}
|
||||
|
||||
.tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow
|
||||
@@ -914,10 +929,9 @@
|
||||
opacity: .5
|
||||
}
|
||||
|
||||
.tabulator-menu .tabulator-menu-item:not (.tabulator-menu-item-disabled
|
||||
):hover {
|
||||
.tabulator-menu .tabulator-menu-item:not(.tabulator-menu-item-disabled):hover {
|
||||
cursor: pointer;
|
||||
background: #efefef
|
||||
background: #e8f0fe
|
||||
}
|
||||
|
||||
.tabulator-menu .tabulator-menu-item.tabulator-menu-item-submenu {
|
||||
@@ -1096,7 +1110,7 @@
|
||||
z-index: 10000
|
||||
}
|
||||
|
||||
body.tabulator-print-fullscreen-hide>:not (.tabulator-print-fullscreen ){
|
||||
body.tabulator-print-fullscreen-hide>:not(.tabulator-print-fullscreen) {
|
||||
display: none !important
|
||||
}
|
||||
|
||||
|
||||
@@ -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
74
rebuild-and-restart.sh
Executable 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
|
||||
|
||||
@@ -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>
|
||||
* 계약관리 목록 조회
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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
0
start-docker-linux.sh
Normal file → Executable file
Reference in New Issue
Block a user