hyeonga_code

reProject_45_주문 상세페이지에서 상품 교환, 상품 반품 요청 기능 구현하기 본문

Project_WEATHERWEAR

reProject_45_주문 상세페이지에서 상품 교환, 상품 반품 요청 기능 구현하기

hyeonga 2024. 2. 9. 05:59
반응형

 

 

2024.02.08

-- 주문 상세페이지에서 상품 상태에 따라 취소요청/교환요청/환불요청/리뷰작성/리뷰 보기 버튼이 표시되게 작업

-- 상품 준비중, 배송 준비중, 배송 대기, 배송 보류 중일 경우 취소 요청 가능

-- 배송중, 배송 완료인 경우 교환 요청, 환불 요청이 가능하고 리뷰Id가 있는 경우 리뷰보기 버튼, 없는 경우 리뷰 작성 기능 작업

 

orderInfo.jsp 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WeatherWear 사용자</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=EB+Garamond:wght@400;500&amp;family=Inter:wght@400;500&amp;family=Playfair+Display:ital,wght@0,400;0,700;1,400;1,700&amp;display=swap" rel="stylesheet">
 
<!-- Vendor CSS Files -->
<link href="resources/client/ZenBlog/assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="resources/client/ZenBlog/assets/vendor/bootstrap-icons/bootstrap-icons.css" rel="stylesheet">
 
<!-- dropZone -->
<link rel="stylesheet" href="resources/util/plugins/dropzone/dist/dropzone.min.css"/>
<link rel="stylesheet" href="resources/util/plugins/dropzone/custom.css">
<link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" type="text/css" />
 
<!-- Swiper -->
<link href="https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.css" rel="stylesheet"/>
 
<!-- Template Main CSS Files -->
<link href="resources/client/ZenBlog/assets/css/main.css" rel="stylesheet">
<link href="resources/client/ZenBlog/assets/css/variables.css" rel="stylesheet">
 
<!-- 주소 검색 -->
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<style>
    .resultDiv{ height: 55px; font-size: larger !important; display: flex; align-items: center;}
    .inputLabel{ font-size: larger !important; display: flex; align-items: center; justify-content: center;}
    .resultInput{ font-size: larger !important; display: flex; align-items: center; justify-content: flex-end;}
    .selectOption{ border-radius:0; text-align: center; font-size: large;}
    .check {width:15px; height:15px;}
    .payBtn { width:100%; height:70px; font-size: x-large; background-color: black; color: white; border-radius: 0;}
    .deliDiv { display: flex; justify-content: space-between;}
    .confirmDiv {border-bottom:1px solid silver; margin-bottom:10px;}
    .info {font-size: large;}
    .imagePreviewDiv {
        padding: 5px 5px 5px 5px;
        button {display:none; position:relative;}
        &:hover {button{display:block;}}
    }
    #dropzone { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: center;}
    .previewImg { display: flex; flex-direction: column; align-content: center; justify-content: center;}
    .custom-radio { display:flex; justify-content: space-evenly;}
</style>
</head>
<body class="hold-transition sidebar-collapse layout-top-nav">
    <div class="wrapper">
        <%@ include file="../header.jsp" %>
 
        <main id="main">
            <section id="contact" class="contact mb-5">
                <div class="container aos-init aos-animate" data-aos="fade-up">
                    <div class="row">
                        <div class="col-lg-12 text-center mb-5">
                            <h1 class="page-title">Order Info</h1>
                        </div>
                    </div>
                    <!-- Modal -->
                    <div class="modal fade show" id="modal-default" style="display: none; padding-right: 17px;" aria-modal="true" role="dialog">
                    </div>
                    <div class="row gy-4">
                        <div class="col-md-6">
                            <div class="form mt-5">
                                <div class="php-email-form">
                                    <div class="form-group">
                                        <h3>주문자</h3>
                                    </div>
                                    <div class="form-group">
                                        <span class="info">주문자 : ${ orderInfo.clientName }</span>
                                    </div>
                                    <div class="form-group">
                                        <span class="info">이메일 : ${ orderInfo.orderEmail }</span>
                                    </div>
                                    <div class="form-group">
                                        <span class="info">연락처 : ${fn:substring(orderInfo.clientNum,0,3)}-${fn:substring(orderInfo.clientNum,3,7)}-${fn:substring(orderInfo.clientNum,7,12)}</span>
                                    </div>
                                </div><br>
                                <div class="php-email-form">
                                    <div class="form-group">
                                        <h3>배송지</h3>
                                    </div>
                                    <div class="form-group">
                                        <span class="info">받는 사람 : ${ orderInfo.addressName }</span>
                                    </div>
                                    <div class="form-group">
                                        <span class="info">우편번호 : ${ orderInfo.addressPostNum }</span>
                                    </div>
                                    <div class="form-group">
                                        <span class="info">기본주소 : ${ orderInfo.address1 }</span>
                                    </div>
                                    <div class="form-group">
                                        <span class="info">상세주소 : ${ orderInfo.address2 }</span>
                                    </div>
                                    <div class="form-group">
                                        <span class="info">연락처 : ${fn:substring(orderInfo.clientNum,0,3)}-${fn:substring(orderInfo.clientNum,3,7)}-${fn:substring(orderInfo.clientNum,7,12)}</span>
                                    </div>
                                    <div class="form-group" id="deliMsgDiv">
                                        <span class="info">배송메모 : ${ orderInfo.addressMemo }</span>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="form mt-5">
                                <div class="php-email-form">
                                    <div class="form-group">
                                        <h3>주문 상품</h3>
                                    </div>
                                    <c:forEach items="${ orderProductList }" var="pro">
                <!-- 상품마다 반복 시작 -->
                                    <div class="form-group" class="productDiv">
                                        <div class="row">
                                            <div class="col-md-4">
                                                <img class="product_image" src="${ pro.mainImage }" style="height:150px; width:150px;">
                                            </div>
                                            <div class="col-md-8">
                                                <h5>${ pro.productName }</h5>
                                                <span class="info">
                                                    ${ pro.optionColor } / ${ pro.optionSize } [수량: ${ pro.orderProCnt }]<br>
                                                    <fmt:formatNumber pattern="#,###,###" value="${ pro.orderTotal }" /><br>
                                                    주문상태 : ${ pro.orderStatus }
                                                </span><br>
                                                <c:choose>
                                                    <c:when test="${ pro.orderStatus=='상품준비중' || pro.orderStatus=='배송준비중' || pro.orderStatus=='배송보류' || pro.orderStatus=='배송대기'}">
                                                        <div class="row">
                                                            <div class="col-md-4">
                                                                <input type="button" value="취소요청" class="form-control" class="cancleBtn" id="cancleBtn" onclick="cancleOrder('${ pro.orderId }_${ pro.optionId }')">
                                                            </div>
                                                        </div>
                                                    </c:when>
                                                    <c:when test="${ pro.orderStatus=='배송중' || pro.orderStatus=='배송완료'}">
                                                        <div class="row">
                                                            <div class="col-md-4">
                                                                <input type="button" value="교환요청" class="form-control" class="swapBtn" id="swapBtn" onclick="swapOrder('${ pro.orderId }_${ pro.optionId }')">
                                                            </div>
                                                            <div class="col-md-4">
                                                                <input type="button" value="환불요청" class="form-control" class="refundBtn" id="refundBtn" onclick="refundOrder('${ pro.orderId }_${ pro.optionId }')">
                                                            </div>
                                                            <c:choose>
                                                                <c:when test="${ pro.reviewId == null}">
                                                                    <div class="col-md-4">
                                                                        <input type="button" value="리뷰작성" class="form-control" class="reviewWriteBtn" id="reviewWriteBtn" onclick="reviewWrite('${ pro.orderId }_${ pro.optionId }')">
                                                                    </div>
                                                                </c:when>
                                                                <c:when test="${ pro.reviewId != null}">
                                                                    <div class="col-md-4">
                                                                        <input type="button" value="리뷰보기" class="form-control" class="reviewWriteBtn" id="reviewViewBtn" onclick="reviewView('${ pro.reviewId }')">
                                                                    </div>
                                                                </c:when>
                                                            </c:choose>
                                                        </div>
                                                    </c:when>
                                                    <c:when test="${ pro.orderStatus=='교환중' || pro.orderStatus=='교환완료'}"></c:when>
                                                    <c:when test="${ pro.orderStatus=='환불중' || pro.orderStatus=='환불완료'}"></c:when>
                                                    <c:when test="${ pro.orderStatus=='취소요청' || pro.orderStatus=='취소완료'}"></c:when>
                                                </c:choose>
                                            </div>
                                        </div>
                                    </div>
                <!-- 상품마다 반복 끝 -->
                                    </c:forEach>
                                </div><br>
            <c:if test="${ userInfo != null }">
                                <div class="php-email-form">
                                    <div class="form-group">
                                        <h3>할인</h3>
                                    </div>
                                    <div class="row">
                                        <div class="form-group">
                                            <span class="info">포인트 : <fmt:formatNumber pattern="#,###,###" value="${ orderInfo.usedPoint }"/></span>
                                        </div>
                                    </div>
                                    <div class="row">
                                        <div class="form-group">
                                            <span class="info">쿠폰 : 
                                            <c:if test="${ orderInfo.couponId != null }">
                                            ${ orderInfo.couponName } [ <fmt:formatNumber pattern="#,###,###" value="${ orderInfo.couponPrice }"/> ]
                                            </c:if></span>
                                        </div>
                                    </div>
                                    <div class="row resultDiv" style="background-color:#F6F6F6;">
                                        <div class="form-group col-md-4 resultDiv">
                                            적용금액
                                        </div>
                                        <div class="form-group col-md-6 resultDiv"></div>
                                        <div class="form-group col-md-2 resultDiv" id="discountPrice"><fmt:formatNumber pattern="#,###,###" value="${ orderInfo.usedPoint + orderInfo.couponPrice }"/> </div>
                                    </div>
                                </div>
                </c:if>
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="form mt-5">
                            <div class="php-email-form">
                                <div class="form-group">
                                    <h3>결제 정보</h3>
                                </div>
                                <div class="row">
                                    <div class="form-group col-md-1"></div>
                                    <div class="form-group col-md-2 inputLabel">
                                        결제 일자
                                    </div>
                                    <div class="form-group col-md-5"></div>
                                    <div class="form-group col-md-3 resultInput" id="orderDate"><fmt:formatDate pattern="YYYY-mm-DD HH:MM:ss" value="${ orderInfo.orderDate }"/></div>
                                    <div class="form-group col-md-1"></div>
                                </div>
                                <div class="row">
                                    <div class="form-group col-md-1"></div>
                                    <div class="form-group col-md-2 inputLabel">
                                        결제 방법
                                    </div>
                                    <div class="form-group col-md-5"></div>
                                    <div class="form-group col-md-3 resultInput" id="paymentMethod">${ orderInfo.paymentMethod }</div>
                                    <div class="form-group col-md-1"><input type="hidden" value="${ orderInfo.paymentMethod }" id="paymentMethodInput"></div>
                                </div>
                                <div class="row">
                                    <div class="form-group col-md-1"></div>
                                    <div class="form-group col-md-2 inputLabel">
                                        결제 상태
                                    </div>
                                    <div class="form-group col-md-5"></div>
                                    <div class="form-group col-md-3 resultInput" id="paymentStatus">${ orderInfo.paymentStatus }</div>
                                    <div class="form-group col-md-1"></div>
                                </div>
                                <div class="row resultDiv" style="background-color:#F4F7FF;">
                                    <div class="form-group col-md-1 resultDiv"></div>
                                    <div class="form-group col-md-2 resultDiv">
                                        결제 금액
                                    </div>
                                    <div class="form-group col-md-7 resultDiv"></div>
                                    <div class="form-group col-md-2 resultDiv" id="totalPayPrice"><fmt:formatNumber pattern="#,###,###" value="${ orderInfo.orderPrice }"/></div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </section>
        </main>
        
        <%@ include file="../footer.jsp" %>
    </div>
    <div class="modal-backdrop fade" style="display:none"></div>
 
<script src="resources/client/ZenBlog/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<script  src="resources/util/plugins/sweetalert/jquery-lates.min.js"></script>
<script src="resources/util/plugins/sweetalert/sweetalert2.js"></script>
 
<!-- Template Main JS File -->
<script src="resources/client/ZenBlog/assets/js/main.js"></script>
<!-- sweetAlert (alert/confirm/toast) -->
<script src="resources/util/js/sweetalert.js"></script>
<!-- PortOne SDK -->
<script src="https://cdn.iamport.kr/v1/iamport.js"></script>
 
<script src="resources/util/js/modal.js"></script>
<!-- dropzone -->
<script src="resources/util/plugins/dropzone/dist/dropzone.min.js"></script>
 
<script src="resources/client/js/post.js"></script>
<script src="resources/client/js/orderInfo.js"></script>
 
<!-- 포스팅 - 이미지/동영상 dropzone 영역 -->
<div id="dropzone-preview" class="row" style="display:flex;">
    <div class="row imagePreviewDiv"style="width: 50%;">
        <div class="h-auto rounded-3 previewImg">
            <img data-dz-thumbnail="data-dz-thumbnail" class="w-full h-auto rounded-3 block" src="#" alt="Dropzone-Image"/>
            <button data-dz-remove="data-dz-remove" class="btn btn-sm btn-danger deleteBtn">삭제</button>
        </div>
    </div>
</div>
</body>
</html>

 

 

orderInfo.js 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
let orderList = [];
let orderStatus;
 
let id;                // 글 번호
let orderId;        // 주문번호
let optionId;        // 옵션번호
let reason;            // 사유
let image;            // 이미지
let email;            // 이메일
let regDate;        // 요청일자
let deliverWay;        // 수거 방식(직접발송/택배수거)
let cost;            // 택배비용
let costMtd;        // 택배에동봉, 무통장입금
let status;            // 상태(요청,진행,완료)
let bankId;            // 환불 은행
let refundBankNum;    // 환불 계좌
let requestWhat;    // 교환/환불
 
// 주문 취소
    function cancleOrder(target){
        orderId = target.split("_")[0];
        optionId = target.split("_")[1];
        orderStatus = "취소요청";
        
        Swal.fire({
            title: "주문을 취소하시겠습니까?",
            text: "주문 취소를 철회하고 싶은 경우 문의 바랍니다.",
            icon: "question",
              showCancelButton: true,
            confirmButtonColor: '#3085d6',
            cancelButtonColor: '#d33',
            confirmButtonText: "취소하기",
              cancelButtonText: "닫기",
            reverseButtons: true// 버튼 순서 거꾸로
        }).then((result) => {
            if(result.isConfirmed){    // 매개변수 list 안됨
                playAjax();
            }
        });
    }
 
// 교환 요청
function swapOrder(target){    
    orderId = target.split("_")[0];
    optionId = target.split("_")[1];
    status = "교환요청";
    orderStatus = "교환요청";
    requestWhat = "swap";
    
    let swapContent = "<div class='modal-dialog'><div class='modal-content'><div class='modal-header'><h4 class='modal-title'>교환 요청</h4>";
    swapContent += "<button type='button' class='close' data-dismiss='modal' aria-label='Close' onclick='closeModal()'><span aria-hidden='true'>×</span></button></div>";
    swapContent += "<div class='modal-body'>";
    swapContent += "<div class='modalDiv'><label for='content'><b>교환 요청 사유</b></label><div class='codeDiv'></div>";
    swapContent += "<div class='custom-control custom-radio'>";
    swapContent += "<input class='custom-control-input custom-control-input-danger' type='radio' id='오배송' name='radioCheck' onclick='setReason(this.id)'>";
    swapContent += "<label for='오배송' class='custom-control-label'>오배송</label>";
    swapContent += "<input class='custom-control-input custom-control-input-danger' type='radio' id='상품하자' name='radioCheck' onclick='setReason(this.id)'>";
    swapContent += "<label for='상품하자' class='custom-control-label'>상품하자</label>";
    swapContent += "<input class='custom-control-input custom-control-input-danger' type='radio' id='단순변심' name='radioCheck' onclick='setReason(this.id)'>";
    swapContent += "<label for='단순변심' class='custom-control-label'>단순변심</label>";
    swapContent += "<input class='custom-control-input custom-control-input-danger' type='radio' id='사이즈변경' name='radioCheck' onclick='setReason(this.id)'>";
    swapContent += "<label for='사이즈변경' class='custom-control-label'>사이즈변경</label></div>";
    swapContent += "<textarea class='form-control' name='content' id='content' placeholder='입력해주세요'></textarea></div><hr>";
    swapContent += "<div class='modalDiv' id='dropzone' style='width:100%'><div id='image' class='dz-message needsclick baseImgDiv'>";
    swapContent += "<span class='text' style='display:flex; align-items:center; flex-direction:column;' onclick='playDropzone()'>";
    // key값 // imageStatus 변경하기(교환/리뷰/환불/문의)
    swapContent += "<input type='hidden' id='key' value='client'><input type='hidden' id='imageStatus' value='교환'>";
    swapContent += "<img src='resources/util/image/dropzone_camera.png' alt='Camera' />";
    swapContent += "<code>이미지를 등록하시려면 클릭하세요</code><br></span>";
    swapContent += "</div></div><hr>";
    swapContent += "<div class='modalDiv'><label for='content'><b>교환 방법</b></label><div class='wayCodeDiv'></div>";
    swapContent += "<div class='custom-control custom-radio'><div class='costMtd'></div>";
    swapContent += "<div><input class='custom-control-input custom-control-input-danger' type='radio' id='직접발송' name='deliveryMtd' onclick='setDeliveryMtd(this.id)'>&nbsp;&nbsp;&nbsp;";
    swapContent += "<label for='직접발송' class='custom-control-label'>직접발송</label></div>";
    swapContent += "<div><input class='custom-control-input custom-control-input-danger' type='radio' id='택배수거' name='deliveryMtd' onclick='setDeliveryMtd(this.id)'>&nbsp;&nbsp;&nbsp;";
    swapContent += "<label for='택배수거' class='custom-control-label'>택배수거</label></div></div><div class='payMtd'></div></div>";
    swapContent += "<div class='modalDiv'><b>이메일</b><div class='emailDiv'></div>";
    swapContent += "<div class='custom-control custom-radio'>";
    swapContent += "<label for='email'></label><input type='email' class='form-control form-control-border border-width-2' name='email' id='email' placeholder='weatherwear@email.com'style='width:80%;'></div><br>";
    swapContent += "<div class='modal-footer justify-content-between'><button type='button' class='form-control' data-dismiss='modal' onclick='closeModal()' style='width:100px;'>취소하기</button>";
    swapContent += "<button type='button' class='btn btn-primary insertBtn' onclick='submit()' style='width:100px;'>등록하기</button></div></div></div>";
    
    openModel(swapContent);
}
 
// 환불 요청
    function refundOrder(target){    
        orderId = target.split("_")[0];
        optionId = target.split("_")[1];
        status = "환불요청";
        orderStatus = "환불요청";
        requestWhat = "refund";
        
        let refundContent = "<div class='modal-dialog'><div class='modal-content'><div class='modal-header'><h4 class='modal-title'>환불 요청</h4>";
        refundContent += "<button type='button' class='close' data-dismiss='modal' aria-label='Close' onclick='closeModal()'><span aria-hidden='true'>×</span></button></div>";
        refundContent += "<div class='modal-body'>";
        refundContent += "<div class='modalDiv'><label for='content'><b>환불 요청 사유</b></label><div class='codeDiv'></div>";
        refundContent += "<div class='custom-control custom-radio'>";
        refundContent += "<input class='custom-control-input custom-control-input-danger' type='radio' id='오배송' name='radioCheck' onclick='setReason(this.id)'>";
        refundContent += "<label for='오배송' class='custom-control-label'>오배송</label>";
        refundContent += "<input class='custom-control-input custom-control-input-danger' type='radio' id='상품하자' name='radioCheck' onclick='setReason(this.id)'>";
        refundContent += "<label for='상품하자' class='custom-control-label'>상품하자</label>";
        refundContent += "<input class='custom-control-input custom-control-input-danger' type='radio' id='단순변심' name='radioCheck' onclick='setReason(this.id)'>";
        refundContent += "<label for='단순변심' class='custom-control-label'>단순변심</label></div>";
        refundContent += "<textarea class='form-control' name='content' id='content' placeholder='입력해주세요'></textarea></div><hr>";
        refundContent += "<div class='modalDiv' id='dropzone' style='width:100%'><div id='image' class='dz-message needsclick baseImgDiv'>";
        refundContent += "<span class='text' style='display:flex; align-items:center; flex-direction:column;' onclick='playDropzone()'>";
        // key값 // imageStatus 변경하기(환불/리뷰/환불/문의)
        refundContent += "<input type='hidden' id='key' value='client'><input type='hidden' id='imageStatus' value='환불'>";
        refundContent += "<img src='resources/util/image/dropzone_camera.png' alt='Camera' />";
        refundContent += "<code>이미지를 등록하시려면 클릭하세요</code><br></span>";
        refundContent += "</div></div><hr>";
        refundContent += "<div class='modalDiv'><label for='content'><b>환불 방법</b></label><div class='wayCodeDiv'></div>";
        refundContent += "<div class='custom-control custom-radio'><div class='costMtd'></div>";
        refundContent += "<div><input class='custom-control-input custom-control-input-danger' type='radio' id='직접발송' name='deliveryMtd' onclick='setDeliveryMtd(this.id)'>&nbsp;&nbsp;&nbsp;";
        refundContent += "<label for='직접발송' class='custom-control-label'>직접발송</label></div>";
        refundContent += "<div><input class='custom-control-input custom-control-input-danger' type='radio' id='택배수거' name='deliveryMtd' onclick='setDeliveryMtd(this.id)'>&nbsp;&nbsp;&nbsp;";
        refundContent += "<label for='택배수거' class='custom-control-label'>택배수거</label></div></div><div class='payMtd'></div></div>";
        refundContent += "<div class='modalDiv'><b>이메일</b><div class='emailDiv'></div>";
        refundContent += "<div class='custom-control custom-radio'>";
        refundContent += "<label for='email'></label><input type='email' class='form-control form-control-border border-width-2' name='email' id='email' placeholder='weatherwear@email.com'style='width:80%;'></div><br>";    
        
        // 무통장 입금 시 
        if($("#paymentMethodInput").val() == "무통장입금"){
            refundContent += "<div class='modalDiv'><b>환불 계좌 입력</b><div class='bankDiv'></div>";
            refundContent += "<div class='custom-control custom-radio'>";
            refundContent += "<select class='select' id='bankId'><option value='001'>한국은행</option>";
            refundContent += "<option value='003'>기업은행</option><option value='004'>국민은행</option>";
            refundContent += "<option value='007'>수협은행</option><option value='011'>농협은행</option>";
            refundContent += "<option value='020'>우리은행</option><option value='023'>SC제일은행</option>";
            refundContent += "<option value='027'>씨티은행</option><option value='032'>부산은행</option>";
            refundContent += "<option value='035'>제주은행</option><option value='037'>전북은행</option>";
            refundContent += "<option value='039'>경남은행</option><option value='045'>새마을금고</option>";
            refundContent += "<option value='048'>신협은행</option><option value='050'>상호저축은행</option>";
            refundContent += "<option value='071'>우체국은행</option><option value='081'>하나은행</option>";
            refundContent += "<option value='088'>신한은행</option><option value='089'>케이뱅크</option>";
            refundContent += "<option value='090'>카카오뱅크</option><option value='092'>토스뱅크</option></select>";
            refundContent += "<label for='refundBankNum'></label><input type='text' class='form-control form-control-border border-width-2' name='refundBankNum' id='refundBankNum' style='width:80%;' placeholder='계좌번호'></div><br>";
        }
        refundContent += "<div class='modal-footer justify-content-between'><button type='button' class='form-control' data-dismiss='modal' onclick='closeModal()' style='width:100px;'>취소하기</button>";
        refundContent += "<button type='button' class='btn btn-primary insertBtn' onclick='submit()' style='width:100px;'>등록하기</button></div></div></div>";
        
        openModel(refundContent);
    }
    
// 배송 방법 설정(배송비 설정)
    function setDeliveryMtd(id){
        if(document.querySelector("input[name='radioCheck']:checked"== null){    return;    }
        switch(id){
        case "직접발송":
            if(document.querySelector("#단순변심:checked"|| document.querySelector("#사이즈변경:checked") ){    cost = 3000
            } else {    cost = 0;}
            break;
        case "택배수거":
            if(document.querySelector("#단순변심:checked"|| document.querySelector("#사이즈변경:checked") ){    cost = 6000
            } else {    cost = 0;}
            break;
        }
        setCost(cost);
    }
 
// 사유 선택(배송비 설정)
    function setReason(id){
        cost = 0;
        switch(id){
        case "오배송"case "상품하자": cost = 0break;
        case "단순변심"case "사이즈변경"
            if(document.querySelector("#직접발송:checked")){    cost = 3000;
            }else {        cost = 6000;     }
            break;
        }    
        setCost(cost);
    }
 
// 배송비 적용
function setCost(cost){
    let costContent = "<div class='modalDiv'><label for='content'><b>배송비 지불 방법</b></label><div class='payDiv'></div>";
    costContent += "<div class='custom-control custom-radio'><div class='costMtd'></div>";
    costContent += "<div><input class='custom-control-input custom-control-input-danger' type='radio' id='택배에동봉' name='payMtd'>&nbsp;&nbsp;&nbsp;";
    costContent += "<label for='택배에동봉' class='custom-control-label'>택배에동봉</label></div>";
    costContent += "<div><input class='custom-control-input custom-control-input-danger' type='radio' id='무통장입금' name='payMtd'>&nbsp;&nbsp;&nbsp;";
    costContent += "<label for='무통장입금' class='custom-control-label'>무통장입금</label></div>";
    if(requestWhat == "refund"){
        costContent += "<div><input class='custom-control-input custom-control-input-danger' type='radio' id='결제금액차감' name='payMtd'>&nbsp;&nbsp;&nbsp;";
        costContent += "<label for='결제금액차감' class='custom-control-label'>결제 금액에서 제외하고 차감</label></div></div></div><hr>";
    }
    if (cost >0){
        document.querySelector(".payMtd").innerHTML = costContent;
    } else {
        document.querySelector(".payMtd").innerHTML = "";
    }
    document.querySelector(".costMtd").innerHTML = "<b>택배비 : " + cost + "원</b><br>";
}
 
// 교환/환불 등록
function submit(){
    // 사유 선택 확인
    let radioCheck = document.querySelector("input[name='radioCheck']:checked");
    if(radioCheck == null){
        document.querySelector(".codeDiv").innerHTML = "<code>사유를 체크해주세요</code><br>";
        return;
    }        
    
    // 내용 확인
    reason = $("#content").val();
    if(reason == null || reason == '' || reason.length<10){
        document.querySelector(".codeDiv").innerHTML = "<code>사유를 10자 이상 입력해주세요</code><br>";
        $("#content").focus();
        return;
    }
    
    // 수거방법 확인
    deliverWay = document.querySelector("input[name='deliveryMtd']:checked");
    if(deliverWay == null){
        document.querySelector(".wayCodeDiv").innerHTML = "<code>수거 방법을 체크해주세요</code><br>";
        return;
    }
    
    // 이메일 확인
    email = $("#email").val();
    if(email == null || email == ''){
        document.querySelector(".emailDiv").innerHTML = "<code>이메일 주소를 입력해주세요</code><br>";
        $("#email").focus();
        return;
    }
    
    // 배송비 지불 방법 확인
    let costMethod = document.querySelector("input[name='payMtd']:checked");
    if(costMethod == null || costMethod == ''){
        if(cost>0){
            document.querySelector(".payDiv").innerHTML = "<code>배송비 지불 방법을 선택해주세요</code><br>";
            return;
        }
        costMtd = "무통장입금";
    } else {
        costMtd = costMethod.id;
    }
    
    // 계좌번호 확인
    if($("#paymentMethodInput").val() == "무통장입금"){
        bankId = $("#bankId").val();
        refundBankNum = $("#refundBankNum").val();
        if(refundBankNum == null || refundBankNum == ""){
            document.querySelector(".bankDiv").innerHTML = "<code>환불받을 계좌번호를 입력해주세요</code><br>";
            $("#refundBankNum").focus();
        }
    }
    
    $.ajax({
        url: "insertSwapRefund.do",
        type: "POST",
        async: true,
        dataType: "json",
        data: {
            requestWhat: requestWhat,
            orderId: orderId,
            optionId: optionId,
            reason: reason,
            email: email,
            deliverWay: deliverWay.id,
            cost: parseInt(cost),
            costMtd: costMtd,
            status: status,
            bankId: bankId,
            refundBankNum: refundBankNum
        },
        success: function(res){
            if(res.code == 1){
                playAjax();
            } else {
                playToast("오류가 발생했습니다. 다시 시도해주세요.""error");
            }
        },
        error : function(error){
            playToast("오류가 발생했습니다."'error');
        }
    });
}
 
// 주문 상태 변경(orders_info)
function playAjax(){
    $.ajax({
        url: "updateOrder.do",
        type: "POST",
        async: true,
        dataType: "json",
        data: {
            orderId: orderId,
            optionId: optionId,
            orderStatus: orderStatus
        },
        success: function(res){
            if(res.code == 1){
                playToast(res.message, "success");
                setTimeout(function(){
                    window.location.reload();
                }, 4000);
            } else {
                playToast("오류가 발생했습니다. 다시 시도해주세요.""error");
            }
        },
        error : function(error){
            playToast("오류가 발생했습니다."'error');
        }
    });
}
 
// 이미지 업로드
function playDropzone(){
     // 서버에 전송할 파일과 관련된 추가 정보
    var hiddenkey = $('#key').val();
    var imageStatus = $('#imageStatus').val();
    
     var dropzoneError = '';
     Dropzone.autoDiscover = false;
     const dropzone = new Dropzone('div#dropzone', {
         url: 'fileUpload.mdo',    // 파일 업로드 로직 호출
         method: 'post',    
        autoProcessQueue: false,        /** 자동 업로드 */
        autoQueue: true,                /** 파일 업로드시 큐에 자동 업로드 */ 
        clickable: true,                /** 클릭 가능 여부 */
        createImageThumbnails: true,    /** 이미지 미리보기 */
        thumbnailHeight: 150,            /** 이미지 크기 조절 */
        thumbnailWidth: 150,            /** 이미지 크기 조절 */
        paramName: 'images',            /** 서버로 전송될 파일의 파라미터 이름 */
        params: {                         /** 파일과 전송될 추가 정보 */
            key: hiddenkey,
            imageStatus: imageStatus,
            imageBy: orderId + "_" + optionId
         },
        addRemoveLinkes: true,            /** 삭제 버튼 표시 여부 */
        dicRemoveFile: 'X',                /** 삭제 버튼 텍스트 */
        parallelUploads: 10,            /** 동시 업로드가능한 파일 수 */
        uploadMultiple: true,            /** 다중 업로드 기능 */
        acceptedFiles: '.jpeg,.jpg,.png,.gif,.JPEG,.JPG,.PNG,.GIF',
        dictInvalidFileType: '이미지 파일만 업로드 가능합니다.',
         previewTemplate: document.querySelector('#dropzone-preview').innerHTML,
 
         /** 초기 설정 */
         init: function() {
            var myDropzone = this;
            document.querySelector(".baseImgDiv").style.display="none";
            document.querySelector("#dropzone").style.justifyContent = "";
            
            // 업로드 대기중인 파일 처리
            $('.insertBtn').on('click'function(e) {
                myDropzone.processQueue();    
            });
            
            // 업로드 대기중/업로드된 파일 모두 삭제
            $('.cancelBtn').on('click'function(e) {
                myDropzone.removeAllFiles(true);    
            });
            
            // maxfilesexceeded : 업로드 개수를 초과하는 경우
            this.on('maxfilesexceeded'function(file) {
                myDropzone.removeFile(file);
            });
 
            // sendingmultiple : 여러 파일을 동시에 업로드시, 첫 전송 직전에 발생
            this.on('sendingmultiple'function(file, xhr, formData) {
                console.log('보내는 중');
            });
            
            // successmultiple : 다중 파일 업로드 성공한 경우
            this.on('successmultiple'function(file, responseText) {
            });
            
            this.on('error'function(file, errorMessage) {
                console.log(errorMessage);
            });
            
            // queuecomplete : 이벤트 성공 여부 확인 로그
            this.on('queuecomplete'function(e) {
                console.log('queuecomplete');
            });
            
            // 업로드된 파일 삭제
            this.on('removedfile'function(data) {
                console.log("data : " + data.name);
            });
        }
     });
}
 
 
let reviewContent;
let reviewStar;
let reviewDate;
let reviewStatus;
let productId;

 

 

ClientOrderController.java 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package com.w2.client.controller;
 
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
import com.w2.cart.CartVO;
import com.w2.cart.service.CartService;
import com.w2.client.ClientVO;
import com.w2.client.service.ClientService;
import com.w2.clientAddress.service.ClientAddressService;
import com.w2.coupon.service.CouponService;
import com.w2.order.OrderInfoVO;
import com.w2.order.service.OrderService;
import com.w2.util.ClientCookie;
import com.w2.util.RandomString;
import com.w2.util.ResponseDTO;
 
@Controller
public class ClientOrderController {    
    @Autowired
    private BCryptPasswordEncoder passwordEncoder;
    
    @Autowired
    private ClientService clientService;
    
    @Autowired
    private CartService cartService;
    
    @Autowired
    private OrderService orderService;
    
    @Autowired
    private ClientAddressService addressService;
    
    @Autowired
    private CouponService couponService;
    
    /** 주문 수정 */
    @ResponseBody
    @PostMapping("updateOrder.do")
    public ResponseDTO<OrderInfoVO> updateOrder(OrderInfoVO order, String orderStatus, HttpSession session, HttpServletRequest request, HttpServletResponse response) {
        Integer statusCode = HttpStatus.OK.value();
        int code = 0;
        String resultCode;
        String msg;
        
        Map<String, Object> orderData = new HashMap<String, Object>();
        orderData.put("order", order);
        orderData.put("orderStatus", orderStatus);
        
        if(session.getAttribute("userInfo"== null) {
            orderData.put("cookieId", (String)session.getAttribute("cookieId"));
        } else {
            ClientVO client = (ClientVO) session.getAttribute("userInfo");
            orderData.put("clientId", client.getClientId());
        }
        
        System.err.println("orderData : " + orderData);
        
        try {
            int result = orderService.updateOrder(orderData);
            if(result > 0) {
                code = 1;
                resultCode = "success";
                msg = "주문 상태가 변경되었습니다.";
            } else {
                code = -1;
                resultCode = "fail";
                msg = "오류가 발생했습니다.";
            }
        } catch (Exception e) {
            code = -1;
            resultCode = "fail";
            msg = "오류가 발생했습니다.";
        }
        
        return new ResponseDTO<OrderInfoVO>(statusCode, code, resultCode, msg, order);
    }
 
    /** 교환, 환불 요청 */
    @ResponseBody
    @PostMapping("insertSwapRefund.do")
    public ResponseDTO<String> insertSwapRefund(String requestWhat, String orderId, String optionId, String reason, String email, 
                                                String deliverWay, int cost, String costMtd, String status, String bankId, String refundBankNum, 
                                                HttpSession session, HttpServletRequest request, HttpServletResponse response) {
        Integer statusCode = HttpStatus.OK.value();
        int code = 0;
        String resultCode;
        String msg;
        String id = "";
        
        Map<String, Object> requestInfo = new HashMap<String, Object>();
        requestInfo.put("requestWhat", requestWhat);
        requestInfo.put("orderId", orderId);
        requestInfo.put("reason", reason);
        requestInfo.put("email", email);
        requestInfo.put("deliverWay", deliverWay);
        requestInfo.put("cost", cost);
        requestInfo.put("costMtd", costMtd);
        requestInfo.put("status", status);
 
        if(requestWhat.equals("swap")) {
            id += "SW";
        } else if(requestWhat.equals("refund")) {
            id += "RF";
            requestInfo.put("bankId", bankId);
            requestInfo.put("refundBankNum", refundBankNum);
        }
        id += RandomString.createFileName() + RandomString.setRandomString(5"number");
        requestInfo.put("id", id);
        
        if(session.getAttribute("userInfo"!= null) {
            ClientVO client = (ClientVO) session.getAttribute("userInfo");
            requestInfo.put("clientId", client.getClientId());
        }
        
        System.err.println("requestInfo : " + requestInfo);
        
        try {
            int result = orderService.insertSwapRefund(requestInfo);
            if(result > 0) {
                code = 1;
                resultCode = "success";
                msg = "주문 상태가 변경되었습니다.";
            } else {
                code = -1;
                resultCode = "fail";
                msg = "오류가 발생했습니다.";
            }
        } catch (Exception e) {
            code = -1;
            resultCode = "fail";
            msg = "오류가 발생했습니다.";
        }
        
        return new ResponseDTO<String>(statusCode, code, resultCode, msg, id);
    }
}
 

 

 

OrderService.java 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.w2.order.service;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import com.w2.cart.CartVO;
import com.w2.client.ClientVO;
import com.w2.util.SearchOrderby;
 
public interface OrderService {
 
    List<HashMap<String, Object>> getOrderList(SearchOrderby search);    // 주문 목록 가져오기
    int getOrderListCnt(SearchOrderby search);                            // 주문 목록 개수 가져오기
    int updateOrderStatus(List<Map<StringString>> checkList);         // 주문 상태 수정
    int updateDeliverNum(List<Map<StringString>> checkList);            // 송장번호 수정
    
    // 사용자
    List<CartVO> getOrderProductList(Map<String, Object> orderMap);
    int insertOrder(Map<String, Object> data);                            // 주문 등록
    Map<String, Object> getOrderInfo(String orderId);                    // 주문 상세
    List<Map<String, Object>> getOrderInfoList(String orderId);            // 주문 상품 목록
    int updateOrder(Map<String, Object> orderData);                        // 주문 상태 수정
    int insertSwapRefund(Map<String, Object> requestInfo);                // 교환/환불 요청
}
 

 

 

OrderServiceImpl.java 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.w2.order.service;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import com.w2.cart.CartVO;
import com.w2.client.ClientVO;
import com.w2.order.OrderDAO;
import com.w2.util.SearchOrderby;
 
@Transactional(readOnly=true)
@Service("OrderService")
public class OrderServiceImpl implements OrderService {
 
    @Autowired
    private OrderDAO orderDAO;
    
    @Override
    public List<HashMap<String, Object>> getOrderList(SearchOrderby search) {
        return orderDAO.getOrderList(search);
    }
 
    @Override
    public int getOrderListCnt(SearchOrderby search) {
        return orderDAO.getOrderListCnt(search);
    }
 
    @Override
    public int updateOrderStatus(List<Map<StringString>> checkList) {
        return orderDAO.updateOrderStatus(checkList);
    }
 
    @Override
    public int updateDeliverNum(List<Map<StringString>> checkList) {
        return orderDAO.updateDeliverNum(checkList);
    }
 
    @Override
    public List<CartVO> getOrderProductList(Map<String, Object> orderMap) {
        return orderDAO.getOrderProductList(orderMap);
    }
 
    @Override
    @Transactional
    public int insertOrder(Map<String, Object> data) {
        int result = orderDAO.insertAddress(data);
        
        if(data.get("cookieId")== null) {
            if(data.get("addressBase").equals("Y")) {
                result = orderDAO.updateBaseAddress(data);
            }
            result = orderDAO.updateClientPoint(data);
        }
        
        result = orderDAO.insertOrder(data);
        result = orderDAO.insertOrderInfo(data);
        if(data.get("usedCouponInfo"!= null) {
            result = orderDAO.updateCouponList(data);
        }
        result = orderDAO.updateProductStock(data);
        result = orderDAO.insertPayment(data);
        result = orderDAO.deleteCart(data);
        return result;
    }
 
    @Override
    public Map<String, Object> getOrderInfo(String orderId) {
        return orderDAO.getOrderInfo(orderId);
    }
 
    @Override
    public List<Map<String, Object>> getOrderInfoList(String orderId) {
        return orderDAO.getOrderInfoList(orderId);
    }
 
    @Override
    public int updateOrder(Map<String, Object> orderData) {
        return orderDAO.updateOrderStatus(orderData);
    }
 
    @Override
    public int insertSwapRefund(Map<String, Object> requestInfo) {
        return orderDAO.insertSwapRefund(requestInfo);
    }
 
 
}
 

 

 

OrderDAO.java 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.w2.order;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
import com.w2.cart.CartVO;
import com.w2.client.ClientVO;
import com.w2.util.SearchOrderby;
 
@Repository
public class OrderDAO {
    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;
 
    public List<HashMap<String, Object>> getOrderList(SearchOrderby search) {
        return sqlSessionTemplate.selectList("OrderDAO.getOrderList", search);
    }
 
    public int getOrderListCnt(SearchOrderby search) {
        return sqlSessionTemplate.selectOne("OrderDAO.getOrderListCnt", search);
    }
 
    public int updateOrderStatus(List<Map<StringString>> checkList) {
        int result = -1;
        result = sqlSessionTemplate.update("OrderDAO.updateOrderStatus", checkList);
        return result;
    }
 
    public int updateDeliverNum(List<Map<StringString>> checkList) {
        int result = -1;
        result = sqlSessionTemplate.update("OrderDAO.updateDeliverNum", checkList);
        return result;
    }
 
    public List<CartVO> getOrderProductList(Map<String, Object> orderMap) {
        return sqlSessionTemplate.selectList("CartDAO.getOrderProductList", orderMap);
    }
 
    public ClientVO setClient(String clientId) {
        return sqlSessionTemplate.selectOne("ClientDAO.getClient", clientId);
    }
 
    public int insertAddress(Map<String, Object> data) {
        return sqlSessionTemplate.insert("OrderDAO.insertAddress", data);
    }
 
    public int updateBaseAddress(Map<String, Object> data) {
        return sqlSessionTemplate.update("OrderDAO.updateBaseAddress", data);
    }
 
    public int insertOrder(Map<String, Object> data) {
        return sqlSessionTemplate.insert("OrderDAO.insertOrder", data);
    }
 
    public int insertOrderInfo(Map<String, Object> data) {
        return sqlSessionTemplate.insert("OrderDAO.insertOrderInfo", data);
    }
 
    public int updateClientPoint(Map<String, Object> data) {
        System.err.println("updateClientPoint");
        return sqlSessionTemplate.update("OrderDAO.updateClientPoint", data);
    }
 
    public int updateCouponList(Map<String, Object> data) {
        System.err.println("updateCouponList");
        return sqlSessionTemplate.update("OrderDAO.updateCouponList", data);
    }
 
    public int insertPayment(Map<String, Object> data) {
        System.err.println("insertPayment");
        return sqlSessionTemplate.insert("OrderDAO.insertPayment", data);
    }
 
    public int deleteCart(Map<String, Object> data) {
        System.err.println("deleteCart");
        return sqlSessionTemplate.delete("OrderDAO.deleteCart", data);
    }
 
    public int updateProductStock(Map<String, Object> data) {
        return sqlSessionTemplate.update("OrderDAO.updateProductStock", data);
    }
    
    public Map<String, Object> getOrderInfo(String orderId) {
        return sqlSessionTemplate.selectOne("OrderDAO.getOrderInfo", orderId);
    }
    
    public List<Map<String, Object>> getOrderInfoList(String orderId) {
        return sqlSessionTemplate.selectList("OrderDAO.getOrderInfoList", orderId);
    }
 
    public int updateOrderStatus(Map<String, Object> orderData) {
        return sqlSessionTemplate.update("OrderDAO.updateOrderInfo", orderData);
    }
 
    public int insertSwapRefund(Map<String, Object> requestInfo) {
        return sqlSessionTemplate.insert("OrderDAO.insertSwapRefund", requestInfo);
    }
}
 

 

 

order-mapping.xml 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
                 
<mapper namespace="OrderDAO">    
    <select id="getOrderInfo" parameterType="hashMap" resultType="hashMap">
        SELECT od.*, ad.*, pi.*, cl.*, cp.*
        FROM orders od
        LEFT JOIN client_address ad ON (ad.addressId = od.addressId )
        LEFT JOIN payment_info pi ON (od.orderId = pi.orderId)
        LEFT JOIN client cl ON (cl.clientId = od.clientId)
        LEFT JOIN coupon_info cp ON(od.couponId = cp.couponId)
        WHERE od.orderId = #{ orderId }
    </select>
    
    <select id="getOrderInfoList" parameterType="hashMap" resultType="hashMap">
        SELECT oi.*, pro.productName, pro.productId, pri.productPrice, CONCAT(pm.imageDir, pm.imageName) AS mainImage, op.*, re.reviewId
        FROM orders_info oi
        LEFT JOIN product pro ON (SUBSTRING(oi.optionId, 1, 9)=pro.productId)
        LEFT JOIN product_price pri ON (pro.productId = pri.productId)
        LEFT JOIN product_image pm ON (pro.productId = pm.imageBy AND pm.imageStatus="대표")
        LEFT JOIN option_info op ON (oi.optionId = op.optionId)
        LEFT JOIN review re ON (oi.orderId = re.orderId AND oi.optionId = re.optionId)
        WHERE oi.orderId=#{ orderId }
    </select>
    
    <update id="updateProductStock" parameterType="hashMap">
        <foreach collection="orderInfoList" item="order" separator=";">
        UPDATE option_info
        SET stockCnt= stockCnt - #{ order.orderProCnt }
        WHERE optionId = #{ order.optionId }
        </foreach> 
    </update>
    
    <update id="updateOrderInfo" parameterType="hashMap">
        UPDATE orders_info
        SET orderStatus=#{ orderStatus }
        WHERE orderId=#{ order.orderId } AND optionId=#{ order.optionId }
    </update>
    
    <insert id="insertSwapRefund" parameterType="hashMap">
        INSERT INTO 
            <if test="requestWhat == 'refund'">refund(refundId, orderId, optionId, refundReason, refundWay, refundCost, refundCostMtd, refundStatus, refundEmail, refundRegDate, bankId, refundBankNum)</if>
            <if test="requestWhat == 'swap'">swap(swapId, orderId, optionId, swapReason, swapWay, swapCost, swapCostMtd, swapStatus, swapEmail, swapRegDate)</if>
        VALUES(#{ id }, #{ orderId }, #{ optionId }, #{ reason }, #{ deliverWay }, #{ cost }, #{ costMtd }, #{ status }, #{ email }, CURRENT_TIMESTAMP()
            <if test="requestWhat == 'refund'"> , #{ bankId }, #{ refundBankNum }</if>
        );
    </insert>
</mapper>

 

 

>> 실행 (상품 준비중인 경우)

 

>>> 취소 요청

 

>>> 취소 처리 후 페이지 다시 로드

 

 

>> 배송중인 경우

 

 

>>> 교환 요청

 

>>> 환불 요청

 

 

-- 오배송/상품 하자 선택시 배송비 0원

-- 단순변심/ 사이즈 변경 선택시 배송비 6000원

-- 등록 버튼 클릭시 필수 정보 누락된 경우 focus(), 경고 문구 표시

좌)  오배송 선택 우) 상품 하자 선택 >> 택배비 0원

 

좌)  단순 변심 선택 우) 사이즈 변경 선택 >> 택배비 6000원
좌)  직접 발송 선택시 택배비 3000원 우) 택배 수거 선택시 택배비 6000원

 

좌)  요청 사유 미선택시 우) 상세 사유 미 입력시(10자 이상)

 

좌) 상품 수거 방법 미선택시  우) 이메일 주소 미입력시

 

>>> 변경 후

 

-- 현재 로그인 세션이 오래 지속되지 않는 부분은 추후 수정할 예정이다

-- url로 접근이 가능한 부분을 세션과 비교하여 접근할 수 없도록 변경할 예정

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형