TsaOrderController.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. package com.style24.admin.biz.web;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5. import javax.servlet.http.HttpServletRequest;
  6. import org.apache.commons.collections4.CollectionUtils;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.core.env.Environment;
  9. import org.springframework.core.io.InputStreamResource;
  10. import org.springframework.http.ResponseEntity;
  11. import org.springframework.stereotype.Controller;
  12. import org.springframework.web.bind.annotation.GetMapping;
  13. import org.springframework.web.bind.annotation.PathVariable;
  14. import org.springframework.web.bind.annotation.PostMapping;
  15. import org.springframework.web.bind.annotation.RequestBody;
  16. import org.springframework.web.bind.annotation.RequestMapping;
  17. import org.springframework.web.bind.annotation.RequestParam;
  18. import org.springframework.web.bind.annotation.ResponseBody;
  19. import org.springframework.web.servlet.ModelAndView;
  20. import com.fasterxml.jackson.databind.ObjectMapper;
  21. import com.gagaframework.excel.GagaExcelUtil;
  22. import com.gagaframework.web.parameter.GagaMap;
  23. import com.gagaframework.web.rest.server.GagaResponse;
  24. import com.gagaframework.web.util.GagaDateUtil;
  25. import com.gagaframework.web.util.GagaFileUtil;
  26. import com.style24.admin.biz.service.TsaOrderService;
  27. import com.style24.admin.biz.service.TsaRendererService;
  28. import com.style24.admin.support.controller.TsaBaseController;
  29. import com.style24.admin.support.security.session.TsaSession;
  30. import com.style24.persistence.TsaPageRequest;
  31. import com.style24.persistence.domain.Order;
  32. import lombok.extern.slf4j.Slf4j;
  33. /**
  34. * 주문관리 Controller
  35. *
  36. * @author jsh77b
  37. * @since 2020. 11. 16
  38. */
  39. @Controller
  40. @RequestMapping("/order")
  41. @Slf4j
  42. public class TsaOrderController extends TsaBaseController {
  43. @Autowired
  44. private Environment env;
  45. @Autowired
  46. private TsaRendererService rendererService;
  47. @Autowired
  48. private TsaOrderService orderService;
  49. //@Autowired
  50. //private TsaMessageByLocale message;
  51. /**
  52. * 주문 조회 화면
  53. *
  54. * @return ModelAndView
  55. * @author jsh77b
  56. * @since 2020. 11. 16
  57. */
  58. @GetMapping("/list/form")
  59. public ModelAndView orderListForm() {
  60. ModelAndView mav = new ModelAndView();
  61. mav.addObject("siteCdList" , rendererService.getAvailCommonCodeList("G012")); // 사이트구분
  62. mav.addObject("mallGbList" , rendererService.getAvailCommonCodeList("G011")); // 몰구분
  63. mav.addObject("supplyCompList" , rendererService.getSupplyCompanyList()); // 공급업제목록
  64. mav.addObject("ordStatList" , rendererService.getAvailCommonCodeList("G012")); // 주문상태코드
  65. mav.addObject("ordDtlStatList" , rendererService.getAvailCommonCodeList("G013")); // 주문상세상태코드
  66. mav.addObject("chgStatList" , rendererService.getAvailCommonCodeList("G685")); // 주문변경요청상태코드
  67. mav.addObject("chgGbList" , rendererService.getAvailCommonCodeList("G680")); // 주문변경구분코드
  68. mav.addObject("payMeansList" , rendererService.getAvailCommonCodeList("G014")); // 결제수단
  69. mav.addObject("siteCdList" , rendererService.getAvailCommonCodeList("G000")); // 사이트구분
  70. mav.addObject("formalGbList" , rendererService.getAvailCommonCodeList("G009")); // 정상/이월
  71. mav.setViewName("order/OrderListForm");
  72. return mav;
  73. }
  74. /**
  75. * 주문 목록
  76. *
  77. * @param order - 주문정보
  78. * @return Collection<Order>
  79. * @author jsh77b
  80. * @since 2020. 11. 16
  81. */
  82. @PostMapping("/list")
  83. @ResponseBody
  84. public GagaMap getOrderList(@RequestBody Order order) throws Exception {
  85. GagaMap result = new GagaMap();
  86. order.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
  87. order.setPageable(new TsaPageRequest(order.getPageNo() - 1, order.getPageSize()));
  88. // 주문상태 CD_GB 변경
  89. if (order.getMultiOrdStat() != null) {
  90. for (int i=0 ; i<order.getMultiOrdStat().length ; i++) {
  91. String ordStat = order.getMultiOrdStat()[i].replace("G012", "G013");
  92. order.getMultiOrdStat()[i] = ordStat;
  93. }
  94. }
  95. // 주문취소상태 CD_GB 변경
  96. if (order.getChgGb() != null) {
  97. String chgDtlStat = order.getChgGb().replace("G680", "G685");
  98. order.setChgGb(chgDtlStat);
  99. }
  100. // 주문전체건수 조회
  101. int totalCount = orderService.getOrderListCount(order);
  102. order.getPageable().setTotalCount(totalCount);
  103. // 주문목록 페이지 조회
  104. Collection<Order> orderList = orderService.getOrderList(order);
  105. result.set("pageing" , order);
  106. result.set("orderList" , orderList);
  107. return result;
  108. }
  109. /**
  110. * 주문 목록 엑셀 조회
  111. *
  112. * @param order - 주문정보
  113. * @return Collection<Order>
  114. * @author jsh77b
  115. * @since 2020. 11. 16
  116. */
  117. @PostMapping("/excel/search")
  118. @ResponseBody
  119. public Collection<Order> getOrderListSearchExcel(@RequestBody Order order) throws Exception {
  120. ObjectMapper mapper = new ObjectMapper();
  121. // 1. 엑셀업로드경로설정
  122. String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "");
  123. String[] cellName = new String[1];
  124. // 2. DB 처리 시 사용되는 파라미터명(셀명) 설정
  125. cellName[0] = "ordNo";
  126. Collection<GagaMap> dataList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, order.getExcelFileNm()), 0, cellName);
  127. Order searchOrder = new Order();
  128. int[] ordNoList = new int[dataList.size()];
  129. int cnt = 0;
  130. for (GagaMap map : dataList) {
  131. Order tmpOrder = mapper.convertValue(map, Order.class);
  132. ordNoList[cnt] = tmpOrder.getOrdNo();
  133. cnt++;
  134. }
  135. // 3. 주문번호 배열에 담고 주문목록 조회
  136. searchOrder.setOrdNoList(ordNoList);
  137. Collection<Order> orderList = orderService.getOrderList(searchOrder);
  138. GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, order.getExcelFileNm()));
  139. return orderList;
  140. }
  141. /**
  142. * 주문 목록 데이타 합산
  143. *
  144. * @param order - 주문정보
  145. * @return Collection<Order>
  146. * @author jsh77b
  147. * @since 2020. 11. 16
  148. */
  149. @PostMapping("/list/sum/info")
  150. @ResponseBody
  151. public Order getOrderListSumInfo(@RequestBody Order order) {
  152. return orderService.getOrderListSumInfo(order);
  153. }
  154. /**
  155. * 주문상세 화면
  156. *
  157. * @param ordNo - 주문번호
  158. * @return ModelAndView
  159. * @author jsh77b
  160. * @since 2020. 11. 26
  161. */
  162. @GetMapping("/detail/info")
  163. @ResponseBody
  164. public ModelAndView orderDetailForm(@RequestParam(value = "ordNo") int ordNo) {
  165. ModelAndView mav = new ModelAndView();
  166. Order order = new Order();
  167. order.setOrdNo(ordNo);
  168. order.setDelYn("N");
  169. // 1. 주문기본정보
  170. mav.addObject("ordNo" , ordNo); // 주문번호
  171. mav.addObject("userNo" , TsaSession.getInfo().getUserNo()); // 관리자번호
  172. mav.addObject("orderInfo" , orderService.getOrderInfoList(order)); // 주문기본정보
  173. mav.addObject("orderGoodsInfo" , orderService.getOrderDetailList(order)); // 주문상품정보
  174. mav.addObject("orderFreeGiftInfo" , orderService.getOrderFreeGiftList(order)); // 주문사은품정보 2020.12.16 추가
  175. mav.addObject("orderDeliveryAddrInfo" , orderService.getDeliveryAddrList(order)); // 배송정보
  176. mav.addObject("orderPaymentInfo" , orderService.getOrderPaymentBasicInfoList(order)); // 결제정보
  177. mav.addObject("orderDeliveryFeeInfo" , orderService.getDeliveryFeeList(order)); // 배송비정보
  178. // 2. 클레임정보
  179. mav.addObject("orderChangeInfo" , orderService.getOrderChangeList(order)); // 취소/반품/교환요청 정보
  180. mav.addObject("orderRefundInfo" , orderService.orderRefundInfo(order)); // 환불정보
  181. // 3. 주문메모정보
  182. mav.addObject("orderCounselInfo" , orderService.orderCounselInfo(order)); // 상담내역
  183. mav.addObject("orderAdminMemoInfo" , orderService.getOrderTsainMemoList(order)); // 관리자메모
  184. mav.setViewName("order/OrderDetailForm");
  185. return mav;
  186. }
  187. /**
  188. * 입점업체미발주목록화면
  189. *
  190. * @return ModelAndView
  191. * @author jsh77b
  192. * @since 2020. 11. 30
  193. */
  194. @GetMapping("/seller/unorder/list/form")
  195. public ModelAndView orderSellerUnorderListForm() {
  196. ModelAndView mav = new ModelAndView();
  197. mav.addObject("supplyCompList" , rendererService.getSupplyCompanyList()); // 공급업제목록
  198. mav.addObject("ordStatList" , rendererService.getAvailCommonCodeList("G012")); // 주문상태코드
  199. mav.addObject("ordDtlStatList" , rendererService.getAvailCommonCodeList("G013")); // 주문상세상태코드
  200. mav.addObject("shipCompanyList" , rendererService.getShipCompanyList()); // 택배사 목록
  201. mav.setViewName("order/OrderSellerListForm");
  202. return mav;
  203. }
  204. /**
  205. * 입점업체미발주 주문목록 조회
  206. *
  207. * @param order - 주문정보
  208. * @return Collection<Order>
  209. * @author jsh77b
  210. * @since 2020. 11. 16
  211. */
  212. @PostMapping("/seller/unorder/list")
  213. @ResponseBody
  214. public Collection<Order> getOrderSellerUnorderList(@RequestBody Order order) throws Exception {
  215. Collection<Order> orderList = orderService.getOrderSellerUnorderList(order);
  216. return orderList;
  217. }
  218. /**
  219. * 입점업체미발주목록 - 엑셀다운로드시 주문상태값 변경(출고완료)
  220. *
  221. * @param orderList - 미발주목록
  222. * @return GagaResponse
  223. * @author jsh77b
  224. * @since 2020. 12. 01
  225. */
  226. @PostMapping("/seller/unorder/status/save")
  227. @ResponseBody
  228. public GagaResponse saveUnorderStatus(@RequestBody Collection<Order> orderList) {
  229. orderService.saveUnorderStatus(orderList);
  230. return super.ok("");
  231. }
  232. /**
  233. * 입점업체미발주목록 - 엑셀다운로드
  234. *
  235. * @param request - request
  236. * @return ResponseEntity<InputStreamResource>
  237. * @throws Exception - exception
  238. * @author jsh77b
  239. * @since 2020. 12. 01
  240. */
  241. @GetMapping("/seller/unorder/excel/list")
  242. public ResponseEntity<InputStreamResource> downloadPickingGoodsExcelList(HttpServletRequest request) throws Exception {
  243. String excelfileName = "입점출고목록_" + GagaDateUtil.getTodayDateTime() + ".xlsx";
  244. String excelFilePath = GagaFileUtil.getConcatenationPath(env.getProperty("download.path"), "excel", excelfileName);
  245. Order order = new Order();
  246. order.setRegNo(TsaSession.getInfo().getUserNo());
  247. order.setSearch("EXCEL");
  248. orderService.geSellerUnorderExcelList(order, excelFilePath);
  249. return GagaFileUtil.writeFile(request, excelFilePath);
  250. }
  251. /**
  252. * 입점 송장 엑셀 업로드
  253. *
  254. * @param order - 주문정보
  255. * @return GagaMap
  256. * @throws Exception - exception
  257. * @author jsh77b
  258. * @since 2020. 12. 01
  259. */
  260. @PostMapping("/seller/unorder/invoice/excelupload/save")
  261. @ResponseBody
  262. public GagaMap saveSellerUnorderInvoiceExcelupload(@RequestBody Order order) throws Exception {
  263. ObjectMapper mapper = new ObjectMapper();
  264. // 1. UPLOAD 경로 조회
  265. String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
  266. // 2. DB 처리 시 사용되는 파라미터명(셀명) 설정
  267. String[] cellName = {
  268. "ordNo"
  269. , "ordDtlNo"
  270. , "itemCd"
  271. , "optCd2"
  272. , "itemOrdQty"
  273. , "shipCompCd"
  274. , "invoiceNo"
  275. };
  276. Collection<GagaMap> ecxelList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, order.getExcelFileNm()), 0, cellName, 0);
  277. // 3. 주문목록 매퍼 등록
  278. Collection<Order> orderList = new ArrayList<>();
  279. for (GagaMap map : ecxelList) {
  280. Order tmpGoods = mapper.convertValue(map, Order.class);
  281. orderList.add(tmpGoods);
  282. }
  283. // 4. 업로드된 임시 엑셀파일 삭제
  284. if (CollectionUtils.isEmpty(orderList)) {
  285. try {
  286. GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, order.getExcelFileNm()));
  287. } catch (IOException e) {
  288. // Nothing Do
  289. }
  290. //throw new IllegalStateException(message.getMessage("FAIL_1001"));
  291. throw new IllegalStateException("실패 했습니다.");
  292. }
  293. // 4. 주문상세번호 기준으로 송장번호 등록
  294. String result = orderService.saveUnorderInvoice(orderList);
  295. GagaMap map = new GagaMap();
  296. map.set("msg", result);
  297. // 5. 파일 삭제 (중복처리?)
  298. GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, order.getExcelFileNm()));
  299. return map;
  300. }
  301. /**
  302. * 입점업체미발주목록 - 송장번호 입력(출고완료)
  303. *
  304. * @param orderList - 송방번호 입력된 주문리스트
  305. * @return GagaMap
  306. * @author jsh77b
  307. * @since 2020. 12. 01
  308. */
  309. @PostMapping(value = "/seller/unorder/invoice/save")
  310. @ResponseBody
  311. public GagaMap saveUnorderInvoice(@RequestBody Collection<Order> orderList) {
  312. // 1. 송장번호 개별 등록
  313. String result = orderService.saveUnorderInvoice(orderList);
  314. GagaMap map = new GagaMap();
  315. map.set("msg", result);
  316. return map;
  317. }
  318. /**
  319. * 주문상세 > 주문요청 관리자 메모 > 등록폼
  320. *
  321. * @param ordNo - 주문번호
  322. * @param seq - 시퀀스
  323. * @param mode - 신규/수정 구분
  324. * @return ModelAndView
  325. * @author jsh77b
  326. * @since 2020. 12. 16
  327. */
  328. @GetMapping("/memo/create/form")
  329. @ResponseBody
  330. public ModelAndView orderMemoCreateFrom(@RequestParam(value = "ordNo") int ordNo, @RequestParam(value = "seq") int seq, @RequestParam(value = "mode") String mode) {
  331. ModelAndView mav = new ModelAndView();
  332. int userNo = TsaSession.getInfo().getUserNo();
  333. String userNm = TsaSession.getInfo().getUserNm();
  334. if ("U".equals(mode)) {
  335. Order order = new Order();
  336. order.setSeq(seq);
  337. order.setOrdNo(ordNo);
  338. order.setDelYn("N");
  339. Order orderMemo = orderService.getOrderMemoInfo(order);
  340. mav.addObject("orderMemo", orderMemo);
  341. }
  342. mav.addObject("userNo" , userNo);
  343. mav.addObject("userNm" , userNm);
  344. mav.addObject("ordNo" , ordNo);
  345. mav.addObject("seq" , seq);
  346. mav.addObject("mode" , mode);
  347. mav.setViewName("order/OrderMemoRegistForm");
  348. return mav;
  349. }
  350. /**
  351. * 주문상세 > 주문요청 관리자 메모 > 메모저장
  352. *
  353. * @param order - 주문정보
  354. * @return GagaResponse
  355. * @author jsh77b
  356. * @since 2020. 12. 16
  357. */
  358. @PostMapping("/memo/save")
  359. @ResponseBody
  360. public GagaResponse createOrderMemo(@RequestBody Order order) {
  361. int userNo = TsaSession.getInfo().getUserNo();
  362. order.setRegNo(userNo);
  363. order.setUpdNo(userNo);
  364. // 신규
  365. if ("N".equals(order.getMode())) {
  366. orderService.createOrderMemo(order);
  367. }
  368. // 변경
  369. else if ("U".equals(order.getMode())) {
  370. orderService.updateOrderMemo(order);
  371. }
  372. return super.ok("저장이 완료되었습니다.");
  373. }
  374. /**
  375. * 주문상세 > 주문요청 관리자 메모 > 메모삭제
  376. *
  377. * @param order - 주문정보
  378. * @return GagaResponse
  379. * @author jsh77b
  380. * @since 2020. 12. 16
  381. */
  382. @PostMapping("memo/delete")
  383. @ResponseBody
  384. public GagaResponse deleteOrderMemo(@RequestBody Order order) {
  385. int userNo = TsaSession.getInfo().getUserNo();
  386. order.setRegNo(userNo);
  387. order.setUpdNo(userNo);
  388. orderService.deleteOrderMemo(order);
  389. return super.ok("저장이 완료되었습니다.");
  390. }
  391. /**
  392. * 주문상세 > 주문요청 관리자 메모 > 메모삭제 > 새로고침
  393. *
  394. * @param ordNo - 주문번호
  395. * @return Collection<TsaOrder>
  396. * @author jsh77b
  397. * @since 2020. 12. 16
  398. */
  399. @GetMapping("/admin/memo/list/{ordNo}")
  400. @ResponseBody
  401. public Collection<Order> getOrderTsainMemoList(@PathVariable(value = "ordNo") int ordNo) {
  402. Order order = new Order();
  403. order.setOrdNo(ordNo);
  404. return orderService.getOrderTsainMemoList(order);
  405. }
  406. /**
  407. * 주문상품 상세 변경 이력 화면
  408. *
  409. * @param ordDtlNo - 주문상세번호
  410. * @return ModelAndView
  411. * @author jsh77b
  412. * @since 2020. 12. 16
  413. */
  414. @GetMapping("/detail/change/hst/form/{ordDtlNo}")
  415. @ResponseBody
  416. public ModelAndView detailChangeHstFrom(@PathVariable(value = "ordDtlNo") int ordDtlNo) {
  417. Order order = new Order();
  418. ModelAndView mav = new ModelAndView();
  419. order.setOrdDtlNo(ordDtlNo);
  420. Collection<Order> orderDetailHstList = orderService.getOrderDetailHistoryList(order);
  421. mav.addObject("orderDetailHstList", orderDetailHstList);
  422. mav.setViewName("order/OrderDetailChangeHst");
  423. return mav;
  424. }
  425. /**
  426. * 쿠폰사용 내역 팝업 화면
  427. *
  428. * @param ordNo - 주문번호
  429. * @return ModelAndView
  430. * @author jsh77b
  431. * @since 2020. 12. 16
  432. */
  433. @GetMapping("/detail/coupon/hst/form/{ordNo}")
  434. @ResponseBody
  435. public ModelAndView detailCouponHstFrom(@PathVariable(value = "ordNo") int ordNo) {
  436. Order order = new Order();
  437. ModelAndView mav = new ModelAndView();
  438. order.setOrdNo(ordNo);
  439. Collection<Order> orderCouponHstList = orderService.getOrderDiscountCouponList(order);
  440. mav.addObject("orderCouponHstList", orderCouponHstList);
  441. mav.setViewName("order/OrderDetailCouponHst");
  442. return mav;
  443. }
  444. /**
  445. * 포인트사용 내역 팝업 화면
  446. *
  447. * @param ordNo - 주문번호
  448. * @return ModelAndView
  449. * @author jsh77b
  450. * @since 2020. 12. 16
  451. */
  452. @GetMapping("/detail/point/hst/form/{ordNo}")
  453. @ResponseBody
  454. public ModelAndView detailPointHstFrom(@PathVariable(value = "ordNo") int ordNo) {
  455. Order order = new Order();
  456. ModelAndView mav = new ModelAndView();
  457. order.setOrdNo(ordNo);
  458. Collection<Order> orderPointHstList = orderService.getOrderDiscountPointList(order);
  459. mav.addObject("orderPointHstList", orderPointHstList);
  460. mav.setViewName("order/OrderDetailPointHst");
  461. return mav;
  462. }
  463. /**
  464. * 상품권사용 내역 팝업 화면
  465. *
  466. * @param ordNo - 주문번호
  467. * @return ModelAndView
  468. * @author jsh77b
  469. * @since 2020. 12. 16
  470. */
  471. @GetMapping("/detail/giftcard/hst/form/{ordNo}")
  472. @ResponseBody
  473. public ModelAndView detailGiftcardHstFrom(@PathVariable(value = "ordNo") int ordNo) {
  474. Order order = new Order();
  475. ModelAndView mav = new ModelAndView();
  476. order.setOrdNo(ordNo);
  477. Collection<Order> orderGiftcardHstList = orderService.getOrderGiftcardHstList(order);
  478. mav.addObject("orderGiftcardHstList", orderGiftcardHstList);
  479. mav.setViewName("order/OrderDetailGiftcardHst");
  480. return mav;
  481. }
  482. /**
  483. * 다다익선적용 내역 팝업 화면
  484. *
  485. * @param ordNo - 주문번호
  486. * @return ModelAndView
  487. * @author jsh77b
  488. * @since 2020. 12. 16
  489. */
  490. @GetMapping("/detail/tmtb/hst/form/{ordNo}")
  491. @ResponseBody
  492. public ModelAndView detailTmtbHstFrom(@PathVariable(value = "ordNo") int ordNo) {
  493. Order order = new Order();
  494. ModelAndView mav = new ModelAndView();
  495. order.setOrdNo(ordNo);
  496. Collection<Order> orderTmtbHstList = orderService.getOrderTmtbHstList(order);
  497. mav.addObject("orderTmtbHstList", orderTmtbHstList);
  498. mav.setViewName("order/OrderDetailTmtbHst");
  499. return mav;
  500. }
  501. }