TsfOrderService.java 83 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100
  1. package com.style24.front.biz.service;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStreamWriter;
  6. import java.io.Writer;
  7. import java.net.URL;
  8. import java.util.ArrayList;
  9. import java.util.Arrays;
  10. import java.util.Collection;
  11. import java.util.HashSet;
  12. import java.util.List;
  13. import javax.net.ssl.HttpsURLConnection;
  14. import javax.servlet.http.Cookie;
  15. import javax.servlet.http.HttpServletRequest;
  16. import javax.servlet.http.HttpServletResponse;
  17. import org.apache.commons.lang3.StringUtils;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.core.env.Environment;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import org.springframework.web.context.request.RequestContextHolder;
  23. import org.springframework.web.context.request.ServletRequestAttributes;
  24. import com.gagaframework.web.parameter.GagaMap;
  25. import com.kcp.J_PP_CLI_N;
  26. import com.style24.core.biz.dao.TscOrderDao;
  27. import com.style24.core.biz.service.TscKakaoPayService;
  28. import com.style24.core.biz.service.TscKcpService;
  29. import com.style24.core.biz.service.TscNaverPayService;
  30. import com.style24.core.biz.service.TscOrderService;
  31. import com.style24.core.support.env.TscConstants;
  32. import com.style24.front.biz.dao.TsfCartDao;
  33. import com.style24.front.biz.dao.TsfGoodsDao;
  34. import com.style24.front.biz.dao.TsfOrderDao;
  35. import com.style24.front.biz.dao.TsfRendererDao;
  36. import com.style24.front.support.security.session.TsfSession;
  37. import com.style24.persistence.domain.Cart;
  38. import com.style24.persistence.domain.Coupon;
  39. import com.style24.persistence.domain.Delivery;
  40. import com.style24.persistence.domain.GiftCard;
  41. import com.style24.persistence.domain.Goods;
  42. import com.style24.persistence.domain.GoodsStock;
  43. import com.style24.persistence.domain.KakaoPay;
  44. import com.style24.persistence.domain.NaverPay;
  45. import com.style24.persistence.domain.Order;
  46. import com.style24.persistence.domain.Payment;
  47. import com.usafe.guarantee.InsuranceInfo;
  48. import com.usafe.guarantee.InsuranceManager;
  49. import lombok.extern.slf4j.Slf4j;
  50. /**
  51. * 주문 Service
  52. *
  53. * @author gagamel
  54. * @since 2020. 12. 29
  55. */
  56. @Service
  57. @Slf4j
  58. public class TsfOrderService {
  59. @Autowired
  60. private TsfOrderDao orderDao;
  61. @Autowired
  62. private TscKcpService coreKcpService;
  63. @Autowired
  64. private TscOrderDao coreOrderDao;
  65. @Autowired
  66. private TscKakaoPayService coreKakaoPayService;
  67. @Autowired
  68. private TscNaverPayService coreNaverPayService;
  69. @Autowired
  70. private TsfGoodsService goodsService;
  71. @Autowired
  72. private TsfCartService cartService;
  73. @Autowired
  74. private TsfRendererDao rendererDao;
  75. @Autowired
  76. private TscOrderService coreOrderService;
  77. @Autowired
  78. private Environment env;
  79. @Autowired
  80. private TsfCartDao cartDao;
  81. @Autowired
  82. private TsfGoodsDao goodsDao;
  83. /**
  84. * 마이페이지 주문 정보 조회
  85. *
  86. * @param Order
  87. * @author card007
  88. * @since 2021. 02. 04
  89. */
  90. public Collection<GagaMap> getOrderListForMypage(Order order) {
  91. Collection<GagaMap> orderList = new ArrayList<>();
  92. Collection<Order> ordDtlList = new ArrayList<>();
  93. String allCanYn = "Y";
  94. String allDecideYn = "Y";
  95. int ordNo = 0;
  96. int index = 0;
  97. int ordReqChgQty = 0;
  98. for (Order tmpOrder : orderDao.getOrderListForMypage(order)) {
  99. // 세트상품 옵션별 배열로 담기
  100. if (tmpOrder.getItemNm().contains("!@!")) {
  101. tmpOrder.setItemNmArr(tmpOrder.getItemNm().split("!@!"));
  102. tmpOrder.setColorNmArr(tmpOrder.getColorNm().split(","));
  103. tmpOrder.setOptCd1Arr(tmpOrder.getOptCd1().split(","));
  104. tmpOrder.setOptCd2Arr(tmpOrder.getOptCd2().split(","));
  105. } else {
  106. String[] arr = {tmpOrder.getItemNm()}, arr2 = {tmpOrder.getColorNm()}, arr3 = {tmpOrder.getOptCd1()}, arr4 = {tmpOrder.getOptCd2()};
  107. tmpOrder.setItemNmArr(arr);
  108. tmpOrder.setColorNmArr(arr2);
  109. tmpOrder.setOptCd1Arr(arr3);
  110. tmpOrder.setOptCd2Arr(arr4);
  111. }
  112. // 주문 목록 데이터 설정
  113. if (index > 0 && ordNo != tmpOrder.getOrdNo()) {
  114. orderList.add(setOrderMap(ordDtlList, allCanYn, allDecideYn, ordReqChgQty));
  115. ordDtlList = new ArrayList<>();
  116. ordDtlList.add(tmpOrder);
  117. allCanYn = "Y";
  118. allDecideYn = "Y";
  119. ordReqChgQty = 0;
  120. } else {
  121. ordDtlList.add(tmpOrder);
  122. }
  123. // 전체취소 가능 여부 설정
  124. ordReqChgQty += tmpOrder.getOrdReqChgQty();
  125. if ("Y".equals(allCanYn)
  126. && !TscConstants.OrderDetailStat.DEPOSIT_WAIT.value().equals(tmpOrder.getOrdDtlStat())
  127. && !TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value().equals(tmpOrder.getOrdDtlStat())
  128. && !TscConstants.OrderDetailStat.GOODS_PREPARE.value().equals(tmpOrder.getOrdDtlStat())) {
  129. allCanYn = "N";
  130. }
  131. // 전체 구매확정 가능 여부 설정
  132. if ("Y".equals(allDecideYn)
  133. && (!TscConstants.OrderDetailStat.DELIVERY_COMPLETE.value().equals(tmpOrder.getOrdDtlStat()) || ordReqChgQty > 0)) {
  134. allDecideYn = "N";
  135. }
  136. ordNo = tmpOrder.getOrdNo();
  137. index++;
  138. }
  139. if (ordDtlList.size() > 0) {
  140. orderList.add(setOrderMap(ordDtlList, allCanYn, allDecideYn, ordReqChgQty));
  141. }
  142. return orderList;
  143. }
  144. private GagaMap setOrderMap(Collection<Order> ordDtlList, String allCanYn, String allDecideYn, int ordReqChgQty) {
  145. Order order = ordDtlList.iterator().next();
  146. GagaMap map = new GagaMap();
  147. map.set("giftPackYn", order.getGiftPackYn());
  148. map.set("ordNo", order.getOrdNo());
  149. map.set("ordDt", order.getOrdDt());
  150. map.set("freeGiftList", orderDao.getOrderFreeGiftListForMypage(order));
  151. map.set("allCanYn", allCanYn);
  152. map.set("allDecideYn", allDecideYn);
  153. map.set("ordReqChgQty", ordReqChgQty);
  154. map.set("oneData", order);
  155. map.set("ordDtlList", ordDtlList);
  156. return map;
  157. }
  158. public Collection<GagaMap> getOrderListForMypageBak(Order order) {
  159. Collection<GagaMap> mapList = new ArrayList<>();
  160. Collection<GagaMap> orderList = new ArrayList<>();
  161. List<Order> ordDtlList = new ArrayList<>();
  162. int ordNo = 0;
  163. String ordDt = "";
  164. String selfGoodsYn = "";
  165. String supplyCompCd = "";
  166. String shipCompNm = "";
  167. String shipCompCd = "";
  168. String invoiceNo = "";
  169. String giftPackYn = "";
  170. int index = 0;
  171. Boolean shotDelv = false;
  172. Boolean selfMall = false;
  173. Boolean supplyMall = false;
  174. Boolean review = true;
  175. for (Order tmpOrder : orderDao.getOrderListForMypage(order)) {
  176. if (ordNo != tmpOrder.getOrdNo()) {
  177. if (index > 0) {
  178. // 주문상세내역 목록 설정
  179. GagaMap ordDtlMap = new GagaMap();
  180. ordDtlMap.set("ordDtlList", ordDtlList);
  181. ordDtlMap.set("ordDtlStat", ordDtlList.iterator().next().getOrdDtlStat());
  182. ordDtlMap.set("shipCompCd", shipCompCd);
  183. ordDtlMap.set("shipCompNm", shipCompNm);
  184. ordDtlMap.set("invoiceNo", invoiceNo);
  185. ordDtlMap.set("recipBaseAddr", ordDtlList.iterator().next().getRecipBaseAddr());
  186. ordDtlMap.set("giftLimitDay", ordDtlList.iterator().next().getGiftLimitDay());
  187. ordDtlMap.set("recipNm", ordDtlList.iterator().next().getRecipNm());
  188. ordDtlMap.set("giftLimitDt", ordDtlList.iterator().next().getGiftLimitDt());
  189. ordDtlMap.set("purchaseConfirmDay", ordDtlList.iterator().next().getPurchaseConfirmDay());
  190. ordDtlMap.set("review", review);
  191. orderList.add(ordDtlMap);
  192. // 주문내역 목록 설정
  193. GagaMap map = new GagaMap();
  194. map.set("ordNo", ordNo); // 주문번호
  195. map.set("ordDt", ordDt); // 주문일시
  196. map.set("shotDelv", shotDelv); // 총알배송 아이콘
  197. map.set("selfMall", selfMall); // STYLE24 일반배송 아이콘
  198. map.set("supplyMall", supplyMall); // 업체직배송 아이콘
  199. map.set("giftPackYn", giftPackYn); // 선물하기여부
  200. map.set("orderList", orderList); // 주문내역
  201. mapList.add(map);
  202. }
  203. // 데이터 설정 후 초기화 진행
  204. ordNo = tmpOrder.getOrdNo();
  205. ordDt = tmpOrder.getOrdDt();
  206. selfGoodsYn = tmpOrder.getSelfGoodsYn();
  207. supplyCompCd = tmpOrder.getSupplyCompCd();
  208. giftPackYn = tmpOrder.getGiftPackYn();
  209. shotDelv = false;
  210. selfMall = false;
  211. supplyMall = false;
  212. ordDtlList = new ArrayList<>();
  213. orderList = new ArrayList<>();
  214. } else if (!selfGoodsYn.equals(tmpOrder.getSelfGoodsYn())
  215. || ("N".equals(tmpOrder.getSelfGoodsYn()) && !supplyCompCd.equals(tmpOrder.getSupplyCompCd()))) {
  216. // 주문내역 목록 설정
  217. GagaMap ordDtlMap = new GagaMap();
  218. ordDtlMap.set("ordDtlList", ordDtlList);
  219. ordDtlMap.set("ordDtlStat", ordDtlList.iterator().next().getOrdDtlStat());
  220. ordDtlMap.set("shipCompCd", shipCompCd);
  221. ordDtlMap.set("shipCompNm", shipCompNm);
  222. ordDtlMap.set("invoiceNo", invoiceNo);
  223. ordDtlMap.set("purchaseConfirmDay", ordDtlList.iterator().next().getPurchaseConfirmDay());
  224. ordDtlMap.set("recipBaseAddr", ordDtlList.iterator().next().getRecipBaseAddr());
  225. ordDtlMap.set("giftLimitDay", ordDtlList.iterator().next().getGiftLimitDay());
  226. ordDtlMap.set("recipNm", ordDtlList.iterator().next().getRecipNm());
  227. ordDtlMap.set("giftLimitDt", ordDtlList.iterator().next().getGiftLimitDt());
  228. ordDtlMap.set("review", review);
  229. orderList.add(ordDtlMap);
  230. // 상태 별 배너 설정 후 초기화 진행
  231. ordDtlList = new ArrayList<>();
  232. selfGoodsYn = tmpOrder.getSelfGoodsYn();
  233. supplyCompCd = tmpOrder.getSupplyCompCd();
  234. }
  235. // 주문내역 설정
  236. ordDtlList.add(tmpOrder);
  237. // 총알배송 아이콘 설정
  238. if (!shotDelv && "Y".equals(tmpOrder.getShotDelvYn())) {
  239. shotDelv = true;
  240. }
  241. // STYLE24 일반배송 아이콘 설정
  242. if (!selfMall && "Y".equals(tmpOrder.getSelfGoodsYn())) {
  243. selfMall = true;
  244. }
  245. // 업체직배송 아이콘 설정
  246. if (!supplyMall && "N".equals(tmpOrder.getSelfGoodsYn())) {
  247. supplyMall = true;
  248. }
  249. // 리뷰 작성 여부 설정
  250. if (review && tmpOrder.getReviewSq() == 0) {
  251. review = false;
  252. }
  253. // 배송정보 설정
  254. shipCompCd = tmpOrder.getShipCompCd();
  255. shipCompNm = tmpOrder.getShipCompNm();
  256. invoiceNo = tmpOrder.getInvoiceNo();
  257. // 인덱스 처리
  258. index++;
  259. }
  260. // 마지막 데이터 설정
  261. if (ordNo > 0) {
  262. // 주문상세내역 목록 설정
  263. GagaMap ordDtlMap = new GagaMap();
  264. ordDtlMap.set("ordDtlList", ordDtlList);
  265. ordDtlMap.set("ordDtlStat", ordDtlList.iterator().next().getOrdDtlStat());
  266. ordDtlMap.set("shipCompCd", shipCompCd);
  267. ordDtlMap.set("shipCompNm", shipCompNm);
  268. ordDtlMap.set("invoiceNo", invoiceNo);
  269. ordDtlMap.set("purchaseConfirmDay", ordDtlList.iterator().next().getPurchaseConfirmDay());
  270. ordDtlMap.set("recipBaseAddr", ordDtlList.iterator().next().getRecipBaseAddr());
  271. ordDtlMap.set("giftLimitDay", ordDtlList.iterator().next().getGiftLimitDay());
  272. ordDtlMap.set("recipNm", ordDtlList.iterator().next().getRecipNm());
  273. ordDtlMap.set("giftLimitDt", ordDtlList.iterator().next().getGiftLimitDt());
  274. ordDtlMap.set("review", review);
  275. orderList.add(ordDtlMap);
  276. // 주문내역 목록 설정
  277. GagaMap map = new GagaMap();
  278. map.set("ordNo", ordNo);
  279. map.set("ordDt", ordDt);
  280. map.set("shotDelv", shotDelv);
  281. map.set("selfMall", selfMall);
  282. map.set("supplyMall", supplyMall);
  283. map.set("giftPackYn", giftPackYn);
  284. map.set("orderList", orderList);
  285. mapList.add(map);
  286. }
  287. return mapList;
  288. }
  289. /**
  290. * PG 결제승인
  291. * @param param - 필수 : pgGb(결제수단 : KCP, KAKAO 등), payMeans(결제수단 : G014_30(신용카드) 등)
  292. * @param request
  293. * @param response
  294. * @return
  295. */
  296. @Transactional("shopTxnManager")
  297. public Payment orderPgPayResult(Payment param, HttpServletRequest request, HttpServletResponse response) {
  298. Payment result = new Payment();
  299. if(TscConstants.FrontGb.MOB.value().equals(TsfSession.getFrontGb()) && StringUtils.isEmpty(param.getPgGb())) {
  300. param.setPgGb(TscConstants.PgGb.KCP.value());
  301. param.setPayMeans(TscConstants.PayMeans.CREDIT_CARD.value());
  302. }
  303. try {
  304. if(StringUtils.isEmpty(param.getPgGb())) {
  305. throw new IllegalArgumentException("결제수단을 선택해주세요.");
  306. }
  307. if(TscConstants.PgGb.KCP.value().equals(param.getPgGb()) || TscConstants.PgGb.PAYCO.value().equals(param.getPgGb())) {
  308. if(TscConstants.PayMeans.GIFTCARD.value().equals(param.getPayMeans())) {
  309. // 상품권 100% 결제 (PG PASS)
  310. result.setPayAmt(0);
  311. result.setPgCpnAmt(0);
  312. result.setNpayPntAmt(0);
  313. result.setPayGb("O");
  314. result.setCardPcableYn("Y");
  315. result.setEscrowYn("N");
  316. result.setUpdNo(param.getCustNo());
  317. result.setRegNo(param.getCustNo());
  318. result.setPayStat(TscConstants.PaymentStat.PAYMENT_COMPLETE.value());
  319. result.setPgGb(TscConstants.PgGb.ISTYLE.value());
  320. result.setOrdNo(Integer.parseInt(request.getParameter("ordr_idxx")));
  321. result.setPayMeans(param.getPayMeans());
  322. } else {
  323. // 일반 KCP 결제
  324. result = coreKcpService.kcpPayRequest(param, request, response);
  325. }
  326. } else if (TscConstants.PgGb.KAKAO.value().equals(param.getPgGb())) {
  327. result = coreKakaoPayService.approveKakaoPayment(param);
  328. } else if (TscConstants.PgGb.NAVER.value().equals(param.getPgGb())) {
  329. result = coreNaverPayService.approveNaverPayment(param);
  330. } else {
  331. throw new IllegalArgumentException("결제 수단이 잘못 입력되었습니다. 새로고침 후 다시 시도해주세요.");
  332. }
  333. // 결제 수단이 없는 경우(KAKAO, NAVER) CARD로 세팅
  334. if(StringUtils.isEmpty(param.getPayMeans())) {
  335. result.setPayMeans(TscConstants.PayMeans.CREDIT_CARD.value());
  336. }
  337. // 모바일 주문의 경우 result에서 고객 번호 보유중.
  338. if(TscConstants.FrontGb.PC.value().equals(TsfSession.getFrontGb())) {
  339. result.setUpdNo(param.getCustNo());
  340. result.setRegNo(param.getCustNo());
  341. }
  342. // 결제구분 처리
  343. if (StringUtils.isBlank(param.getPayGb())) {
  344. result.setPayGb("O");
  345. } else {
  346. result.setPayGb(param.getPayGb());
  347. }
  348. // TB_PAYMENT 등록. 실패시 PG 환불.
  349. if(coreOrderDao.updatePaymentOrderComplete(result) < 1) {
  350. if(TscConstants.PgGb.KCP.value().equals(param.getPgGb()) || TscConstants.PgGb.PAYCO.value().equals(param.getPgGb())) {
  351. if(TscConstants.PayMeans.GIFTCARD.value().equals(param.getPayMeans())) {
  352. // 상품권 100% 결제 (PG PASS)
  353. result.setPayStat(TscConstants.PaymentStat.PAY_BEFORE_CANCEL.value());
  354. coreOrderDao.insertPayment(result);
  355. } else {
  356. coreKcpService.kcpCancel(result);
  357. }
  358. } else if (TscConstants.PgGb.KAKAO.value().equals(param.getPgGb())) {
  359. param.setLeftAmt(0);
  360. coreKakaoPayService.kakaoPayRollBack(param);
  361. } else if (TscConstants.PgGb.NAVER.value().equals(param.getPgGb())) {
  362. param.setLeftAmt(0);
  363. coreNaverPayService.naverPayRollBack(param);
  364. }
  365. throw new IllegalArgumentException("결제 정보 저장 실패. 새로고침 후 다시 시작해주세요.");
  366. }
  367. } catch(Exception e) {
  368. e.printStackTrace();
  369. throw new IllegalArgumentException(e.getMessage());
  370. }
  371. return result;
  372. }
  373. /**
  374. * 카카오페이 모바일 결제승인
  375. *
  376. * @param Payment
  377. * @return Payment
  378. * @author card007
  379. * @since 2021. 05. 20
  380. */
  381. @Transactional("shopTxnManager")
  382. public Payment kakaoPayResult(Payment payment) {
  383. Payment result;
  384. try {
  385. result = coreKakaoPayService.approveKakaoPayment(payment);
  386. // 결제 수단이 없는 경우(KAKAO, NAVER) CARD로 세팅
  387. if(StringUtils.isEmpty(result.getPayMeans())) {
  388. result.setPayMeans(TscConstants.PayMeans.CREDIT_CARD.value());
  389. }
  390. result.setPgGb(TscConstants.PgGb.KAKAO.value());
  391. result.setPayGb("O");
  392. // TB_PAYMENT 등록. 실패시 PG 환불.
  393. if(coreOrderDao.insertPayment(result) < 1) {
  394. payment.setLeftAmt(0);
  395. coreKakaoPayService.kakaoPayRollBack(payment);
  396. throw new IllegalArgumentException("결제 정보 저장 실패. 새로고침 후 다시 시작해주세요.");
  397. }
  398. } catch(Exception e) {
  399. e.printStackTrace();
  400. throw new IllegalArgumentException(e.getMessage());
  401. }
  402. return result;
  403. }
  404. /**
  405. * 네이버페이 모바일 결제승인
  406. *
  407. * @param Payment
  408. * @return Payment
  409. * @author card007
  410. * @since 2021. 05. 20
  411. */
  412. @Transactional("shopTxnManager")
  413. public Payment naverPayResult(Payment payment) {
  414. Payment result;
  415. try {
  416. result = coreNaverPayService.approveNaverPayment(payment);
  417. // 결제 수단이 없는 경우(KAKAO, NAVER) CARD로 세팅
  418. if(StringUtils.isEmpty(result.getPayMeans())) {
  419. result.setPayMeans(TscConstants.PayMeans.CREDIT_CARD.value());
  420. }
  421. result.setPgGb(TscConstants.PgGb.NAVER.value());
  422. result.setPayGb("O");
  423. // TB_PAYMENT 등록. 실패시 PG 환불.
  424. if(coreOrderDao.insertPayment(result) < 1) {
  425. payment.setLeftAmt(0);
  426. coreNaverPayService.naverPayRollBack(payment);
  427. throw new IllegalArgumentException("결제 정보 저장 실패. 새로고침 후 다시 시작해주세요.");
  428. }
  429. } catch(Exception e) {
  430. e.printStackTrace();
  431. throw new IllegalArgumentException(e.getMessage());
  432. }
  433. return result;
  434. }
  435. @Transactional("shopTxnManager")
  436. public int updatePaymentForOrderFinished(Payment param) {
  437. return orderDao.updatePaymentForOrderFinished(param);
  438. }
  439. /**
  440. * 마이페이지 주문목록 페이징 처리 주문번호 수 조회
  441. *
  442. * @param Order
  443. * @return int
  444. * @author card007
  445. * @since 2021. 03. 16
  446. */
  447. public int getPagingOrdNoListCount(Order order) { return orderDao.getPagingOrdNoListCount(order); }
  448. /**
  449. * 마이페이지 주문목록 페이징 처리 주문번호 조회
  450. *
  451. * @param Order
  452. * @return Collection<Order>
  453. * @author card007
  454. * @since 2021. 02. 18
  455. */
  456. public Collection<Order> getPagingOrdNoList(Order order) { return orderDao.getPagingOrdNoList(order); }
  457. /**
  458. * 마이페이지 주문상세 금액정보 조회
  459. *
  460. * @param Order
  461. * @return Order
  462. * @author card007
  463. * @since 2021. 02. 16
  464. */
  465. public Order getOrderAmtForMypage(Order order) { return orderDao.getOrderAmtForMypage(order); }
  466. /**
  467. * 마이페이지 주문상세 결제정보 조회
  468. *
  469. * @param Order
  470. * @return Order
  471. * @author card007
  472. * @since 2021. 02. 16
  473. */
  474. public Order getPaymentInfoForMypage(Order order) {
  475. order.setPayStat(TscConstants.PaymentStat.PAYMENT_COMPLETE.value());
  476. order.setPayGb(TscConstants.PaymentGb.ORDER.value());
  477. return orderDao.getPaymentInfoForMypage(order);
  478. }
  479. /**
  480. * 마이페이지 주문상세 배송지 정보 조회
  481. *
  482. * @param Order
  483. * @return Order
  484. * @author card007
  485. * @since 2021. 02. 16
  486. */
  487. public Order getOrderDeliveryAddrInfo(Order order) { return orderDao.getOrderDeliveryAddrInfo(order); }
  488. /**
  489. * 마이페이지 주문상세 주문내역삭제 처리
  490. *
  491. * @param Order
  492. * @return int
  493. * @author card007
  494. * @since 2021. 02. 17
  495. */
  496. public int updateOrderDisplayYn(Order order) { return orderDao.updateOrderDisplayYn(order); }
  497. public Payment setPgDataInfo(Order order) {
  498. // TB_PAYMENT 우선 입력
  499. Payment prePay = new Payment();
  500. prePay.setOrdNo(order.getOrdNo());
  501. prePay.setPayMeans(order.getPayMeans());
  502. prePay.setPayAmt(order.getPayAmt());
  503. prePay.setPayStat(TscConstants.PaymentStat.PAYMENT_WAIT.value());
  504. prePay.setPgGb(order.getPgGb());
  505. prePay.setCustNo(order.getCustNo());
  506. prePay.setRegNo(order.getCustNo());
  507. prePay.setUpdNo(order.getCustNo());
  508. // 상품권 100% 결제일 경우 PgGb STYLE24로 변경
  509. if(TscConstants.PayMeans.GIFTCARD.value().equals(order.getPayMeans())) {prePay.setPgGb(TscConstants.PgGb.ISTYLE.value());}
  510. // 주문데이터인지, 추가배송비 결제 데이터인지 확인
  511. if(order.getOrdChgSq() != null && order.getOrdChgSq() > 0) {
  512. prePay.setPayGb("D");
  513. prePay.setOrdChgSq(order.getOrdChgSq());
  514. } else {
  515. prePay.setPayGb("O");
  516. }
  517. coreOrderDao.insertPayment(prePay);
  518. // PG 송부 데이터 세팅
  519. Payment payment;
  520. order.setFrontGb(TsfSession.getFrontGb());
  521. if(TscConstants.PgGb.KAKAO.value().equals(order.getPgGb())) { // 카카오페이
  522. KakaoPay kakaoPay = coreKakaoPayService.kakaoPaymentReady(order);
  523. payment = coreKakaoPayService.setKakaoOrderData(kakaoPay, order);
  524. } else if(TscConstants.PgGb.NAVER.value().equals(order.getPgGb())) { // 네이버페이
  525. NaverPay naverPay = coreNaverPayService.naverPaymentReady(order);
  526. payment = coreNaverPayService.setNaverOrderData(naverPay);
  527. } else if(TscConstants.PgGb.KCP.value().equals(order.getPgGb()) || TscConstants.PgGb.PAYCO.value().equals(order.getPgGb())){ // KCP, PAYCO
  528. payment = coreKcpService.setKcpOrderData(order);
  529. } else {
  530. throw new IllegalArgumentException("결제타입이 잘못 선택되었습니다. 새로고침 후 다시 시도해주세요.");
  531. }
  532. payment.setPgGb(order.getPgGb());
  533. payment.setPayMeans(order.getPayMeans());
  534. return payment;
  535. }
  536. /**
  537. * 고객 특정기간 첫구매 여부
  538. *
  539. * @param coupon
  540. * @return int
  541. * @author eskim
  542. * @since 2021.03.12
  543. */
  544. public int getCustFirstOrderCount(Coupon coupon) { return orderDao.getCustFirstOrderCount(coupon); }
  545. /**
  546. * 주문정보유효성체크
  547. * @param Order
  548. * @return Order
  549. * @author jsh77b
  550. * @since 2021. 03. 09
  551. */
  552. public String orderValidationCheck(Order order) {
  553. String resultStr = "SUCCESS";
  554. // 1. 주문상세체크
  555. Collection<Order> orderDetailList = order.getOrderDetailList();
  556. // TODO 2021.05.07 1.1 장바구니 금액조회 정보
  557. order.setFrontGb(TsfSession.getFrontGb());
  558. Collection<Order> cartGoodsList = coreOrderService.getCartGoodsList(order);
  559. int orgGoodsSumAmt = 0;
  560. int cpn1DcSumAmt = 0;
  561. int tmtb1DcSumAmt = 0;
  562. int tmtb2DcSumAmt = 0;
  563. int goodsCpnDcSumAmt = 0;
  564. int cartCpnDcSumAmt = 0;
  565. int prePntDcSumAmt = 0;
  566. int pntDcSumAmt = 0;
  567. int gfcdUseSumAmt = 0;
  568. int realOrdSumAmt = 0;
  569. int cartOrgGoodsSumAmt = 0;
  570. // 주문서화면 금액정보 체크
  571. for (Order orderDetail : orderDetailList) {
  572. orgGoodsSumAmt = orgGoodsSumAmt + ((orderDetail.getCurrPrice() + orderDetail.getOptAddPrice()) * orderDetail.getGoodsQty());
  573. cpn1DcSumAmt = cpn1DcSumAmt + (orderDetail.getCpn1DcAmt() * orderDetail.getGoodsQty());
  574. tmtb1DcSumAmt = tmtb1DcSumAmt + orderDetail.getTmtb1DcAmt();
  575. tmtb2DcSumAmt = tmtb2DcSumAmt + orderDetail.getTmtb2DcAmt();
  576. goodsCpnDcSumAmt = goodsCpnDcSumAmt + orderDetail.getGoodsCpnDcAmt();
  577. cartCpnDcSumAmt = cartCpnDcSumAmt + orderDetail.getCartCpnDcAmt();
  578. prePntDcSumAmt = prePntDcSumAmt + orderDetail.getPrePntDcAmt();
  579. pntDcSumAmt = pntDcSumAmt + orderDetail.getPntDcAmt();
  580. gfcdUseSumAmt = gfcdUseSumAmt + orderDetail.getGfcdUseAmt();
  581. realOrdSumAmt = realOrdSumAmt + orderDetail.getRealOrdAmt();
  582. }
  583. realOrdSumAmt = realOrdSumAmt + order.getDelvSumAmt();
  584. if (orgGoodsSumAmt != order.getOrgGoodsSumAmt()) {
  585. resultStr = "판매가 금액정보가 잘못 되었습니다.";
  586. return resultStr;
  587. }
  588. if (cpn1DcSumAmt != order.getCpn1DcSumAmt()) {
  589. resultStr = "즉시할인 금액정보가 잘못 되었습니다.";
  590. return resultStr;
  591. }
  592. if (tmtb1DcSumAmt != order.getTmtb1DcSumAmt()) {
  593. resultStr = "수량다다익선 할인 금액정보가 잘못 되었습니다.";
  594. return resultStr;
  595. }
  596. if (tmtb2DcSumAmt != order.getTmtb2DcSumAmt()) {
  597. resultStr = "금액다다익선 할인 금액정보가 잘못 되었습니다.";
  598. return resultStr;
  599. }
  600. if (goodsCpnDcSumAmt != order.getGoodsCpnDcSumAmt()) {
  601. resultStr = "상품쿠폰 할인 금액정보가 잘못 되었습니다.";
  602. return resultStr;
  603. }
  604. if (cartCpnDcSumAmt != order.getCartCpnDcSumAmt()) {
  605. resultStr = "장바구니쿠폰 할인 금액정보가 잘못 되었습니다.";
  606. return resultStr;
  607. }
  608. if (prePntDcSumAmt != order.getPrePntDcSumAmt()) {
  609. resultStr = "선포인트 할인 금액정보가 잘못 되었습니다.";
  610. return resultStr;
  611. }
  612. if (pntDcSumAmt != order.getPntDcSumAmt()) {
  613. resultStr = "포인트 할인 금액정보가 잘못 되었습니다.";
  614. return resultStr;
  615. }
  616. if (gfcdUseSumAmt != order.getGfcdUseSumAmt()) {
  617. resultStr = "상품권 사용 금액정보가 잘못 되었습니다.";
  618. return resultStr;
  619. }
  620. if (realOrdSumAmt != order.getRealOrdSumAmt()) {
  621. resultStr = "실결제 금액정보가 잘못 되었습니다.";
  622. return resultStr;
  623. }
  624. // 장바구니 금액정보 체크
  625. for (Order orderDetail : cartGoodsList) {
  626. cartOrgGoodsSumAmt = cartOrgGoodsSumAmt + ((orderDetail.getOrgCurrPrice() + orderDetail.getOptAddPrice()) * orderDetail.getGoodsQty());
  627. }
  628. // 판매가비교
  629. if (orgGoodsSumAmt != cartOrgGoodsSumAmt) {
  630. resultStr = "금액정보가 잘못 되었습니다.";
  631. return resultStr;
  632. }
  633. int custCpnSq = 0;
  634. int usPntAmt = 0;
  635. int usGfcdAmt = 0;
  636. for (Order orderDetail : orderDetailList) {
  637. // TODO
  638. // 2.1 상품 재고 확인 (상품정보유효성체크)
  639. Collection<Cart> params = new ArrayList<Cart>();
  640. Cart cart = new Cart();
  641. cart.setGoodsCd(orderDetail.getGoodsCd());
  642. cart.setGoodsType(orderDetail.getGoodsType());
  643. cart.setGoodsQty(orderDetail.getGoodsQty());
  644. cart.setCheckGb("O");
  645. // 세트상품
  646. if ("G056_S".equals(orderDetail.getGoodsType())) {
  647. Collection<Cart> cartCompsList = new ArrayList<Cart>();
  648. // 세트상품일때 구성상품정보 추가
  649. for (int i=0 ; i<orderDetail.getItemCdArr().length ; i++) {
  650. Cart itemCart = new Cart();
  651. itemCart.setGoodsCd(orderDetail.getGoodsCd());
  652. itemCart.setGoodsType(orderDetail.getGoodsType());
  653. itemCart.setItemCd(orderDetail.getItemCdArr()[i]);
  654. itemCart.setOptCd(orderDetail.getOptCdArr()[i]);
  655. itemCart.setGoodsQty(orderDetail.getGoodsQty());
  656. itemCart.setCartGb("O");
  657. cartCompsList.add(itemCart);
  658. }
  659. // 구성상품정보추가
  660. cart.setCartCompsList(cartCompsList);
  661. }
  662. else {
  663. cart.setItemCd(orderDetail.getItemCdArr()[0]);
  664. cart.setOptCd(orderDetail.getOptCdArr()[0]);
  665. cart.setGoodsQty(orderDetail.getGoodsQty());
  666. cart.setCartGb("O");
  667. }
  668. // 유효성체크 목록 담기 1개 기준 체크
  669. params.add(cart);
  670. GagaMap resultMap = cartService.saveCartInfo(params);
  671. if (!"SUCCESS".equals(resultMap.get("message").toString())) {
  672. resultStr = resultMap.get("message").toString();
  673. return resultStr;
  674. }
  675. // 2.2 보유 상품쿠폰체크
  676. custCpnSq = orderDetail.getGoodsCpnSq();
  677. if (custCpnSq > 0) {
  678. orderDetail.setCustCpnSq(custCpnSq);
  679. orderDetail.setCustNo(order.getCustNo());
  680. if (orderDao.getCheckCustCpnSq(orderDetail) < 1) {
  681. resultStr = "보유하신 상품쿠폰이 존재하지 않습니다.";
  682. return resultStr;
  683. }
  684. }
  685. // 2.3 보유 장바구니쿠폰체크
  686. custCpnSq = orderDetail.getCartCpnSq();
  687. if (custCpnSq > 0) {
  688. orderDetail.setCustCpnSq(custCpnSq);
  689. orderDetail.setCustNo(order.getCustNo());
  690. if (orderDao.getCheckCustCpnSq(orderDetail) < 1) {
  691. resultStr = "보유하신 장바구니쿠폰이 존재하지 않습니다.";
  692. return resultStr;
  693. }
  694. }
  695. // 2.4 사용포인트금액등록(구매사용포인트)
  696. usPntAmt = usPntAmt + orderDetail.getPntDcAmt();
  697. // 2.5 상품권사용금액등록
  698. usGfcdAmt = usGfcdAmt + orderDetail.getGfcdUseAmt();
  699. }
  700. // 2.6 사용포인트금액등록(사은품사용포인트)
  701. int usePoint = 0;
  702. if (order.getFreegiftUsePointArr().length > 0) {
  703. for (int i=0 ; i<order.getFreegiftUsePointArr().length ; i++) {
  704. if (order.getFreegiftUsePointArr()[i] != null && order.getFreegiftUsePointArr()[i] != "") {
  705. usePoint = Integer.parseInt(order.getFreegiftUsePointArr()[i]);
  706. if (usePoint > 0) {
  707. usPntAmt = usPntAmt + usePoint;
  708. }
  709. }
  710. }
  711. }
  712. // 3. 보유포인트금액 > 포인트사용금액 체크
  713. int rmPntAmt = coreOrderDao.getCustPointInfo(order);
  714. if (rmPntAmt < usPntAmt) {
  715. resultStr = "보유하신 포인트 금액이 부족합니다.";
  716. return resultStr;
  717. }
  718. // 4. 보유상품권금액 > 상품권사용금액 체크
  719. int rmGfcdAmt = coreOrderDao.getGiftcardInfo(order);
  720. if (rmGfcdAmt < usGfcdAmt) {
  721. resultStr = "보유하신 상품권 금액이 부족합니다.";
  722. return resultStr;
  723. }
  724. // 5. 장바구니 보유쿠폰 체크 (배송목록체크)
  725. Collection<Order> delvFeeCdList = order.getDelvFeeCdList();
  726. for (Order delvFeeCd : delvFeeCdList) {
  727. if (delvFeeCd.getDelvCpnSq() > 0) {
  728. custCpnSq = delvFeeCd.getDelvCpnSq();
  729. if (custCpnSq > 0) {
  730. delvFeeCd.setCustCpnSq(custCpnSq);
  731. delvFeeCd.setCustNo(order.getCustNo());
  732. if (orderDao.getCheckCustCpnSq(delvFeeCd) < 1) {
  733. resultStr = "보유하신 배송비쿠폰이 존재하지 않습니다.";
  734. return resultStr;
  735. }
  736. }
  737. }
  738. }
  739. // 6. 사은품채고체크
  740. int rtnCnt = orderDao.getCheckFreegiftVal(order);
  741. if (rtnCnt > 0) {
  742. resultStr = "선택하신 사은품의 재고가 부족 합니다.";
  743. return resultStr;
  744. }
  745. // 7. 상품금액체크
  746. return resultStr;
  747. }
  748. /**
  749. * KCP 현금영수증 신청
  750. * param.setTradeTime("20210422200347"); // 결제시각 : YYYYMMDDHH24MISS 형식
  751. * param.setOrdPhnno("01011111111"); // 현금영수증 대상 휴대폰번호
  752. * param.setUsGfcdAmt(10000); // 현금영수증 신청 금액
  753. * param.setOrdNo(211); // 주문번호
  754. * param.setGoodsNm("보라색 원피스"); // 상품명 (“7. 현금영수증 매출전표 연동” 을 통해 고객이 직접 전표를 확인코자 한다면 상품명을 넘겨주지 않았을 경우 구매자 인증 시 인증오류가 발생할 수 있습니다.)
  755. * param.setOrdNm("구매자"); // 구매자명
  756. * param.setOrdEmail("xxxx@xxxx.com"); // 구매자이메일 (“7. 현금영수증 매출전표 연동” 을 통해 고객이 직접 전표를 확인코자 한다면 메일주소를 넘겨주지 않았을 경우 구매자 인증 시 인증오류가 발생할 수 있습니다.)
  757. * @param param
  758. * @return
  759. * @author xodud1202
  760. * @since 2021. 04. 23
  761. */
  762. @Transactional("shopTxnManager")
  763. public GiftCard kcpCashReceiptsRequest(GiftCard param) {
  764. GiftCard result = new GiftCard();
  765. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
  766. String cust_ip = request.getRemoteAddr();
  767. String reqTx = "pay"; // 현금영수증 신청
  768. String txCd = "07010000"; // 현금영수증 등록 요청
  769. String ordPhnno = "";
  770. if(!StringUtils.isEmpty(param.getOrdPhnno())) {
  771. ordPhnno = param.getOrdPhnno().replaceAll("-", "");
  772. }
  773. J_PP_CLI_N c_PayPlus = new J_PP_CLI_N();
  774. c_PayPlus.mf_init( "", env.getProperty("pg.kcp.gw.url"), env.getProperty("pg.kcp.gw.port"), Integer.parseInt(env.getProperty("pg.kcp.tx.mode")), env.getProperty("pg.kcp.log.dir"));
  775. c_PayPlus.mf_init_set();
  776. int rcpt_data_set = c_PayPlus.mf_add_set( "rcpt_data" ) ;
  777. int ordr_data_set = c_PayPlus.mf_add_set( "ordr_data" ) ;
  778. int corp_data_set = c_PayPlus.mf_add_set( "corp_data" ) ;
  779. // 현금영수증 정보
  780. c_PayPlus.mf_set_us( rcpt_data_set, "user_type", "PGNW") ;
  781. c_PayPlus.mf_set_us( rcpt_data_set, "trad_time", param.getTradeTime()) ;
  782. c_PayPlus.mf_set_us( rcpt_data_set, "tr_code" , "0") ; // 0 : 소득공제용(개인), 1 : 지출증빙용(기업)
  783. c_PayPlus.mf_set_us( rcpt_data_set, "id_info" , ordPhnno) ; // 발급 대상이 개인인 경우에는 주민번호, 휴대폰번호,현금영수증 카드를 세팅하며, 기업인 경우에는 대상 사업자 번호를 입력. 자진발급으로 등록 시, “0100001234” 으로 입력.
  784. c_PayPlus.mf_set_us( rcpt_data_set, "amt_tot" , param.getUsGfcdAmt() + "") ; // 현금영수증 금액 (공급가액 + 부가가치세 + 봉사료)
  785. c_PayPlus.mf_set_us( rcpt_data_set, "amt_sup" , (param.getUsGfcdAmt() - ((int)(param.getUsGfcdAmt() / 11))) + "") ; // 공급가액
  786. c_PayPlus.mf_set_us( rcpt_data_set, "amt_svc" , "0") ; // 봉사료
  787. c_PayPlus.mf_set_us( rcpt_data_set, "amt_tax" , ((int)(param.getUsGfcdAmt() / 11)) + "") ; // 부가가치세 (공급가액의 10%)
  788. c_PayPlus.mf_set_us( rcpt_data_set, "pay_type" , "PAXX") ;
  789. // 주문 정보
  790. c_PayPlus.mf_set_us( ordr_data_set, "ordr_idxx", param.getOrdNo() + "") ; // 주문번호
  791. c_PayPlus.mf_set_us( ordr_data_set, "good_name", param.getGoodsNm()); // 상품명
  792. c_PayPlus.mf_set_us( ordr_data_set, "buyr_name", param.getOrdNm());
  793. c_PayPlus.mf_set_us( ordr_data_set, "buyr_tel1", ordPhnno);
  794. c_PayPlus.mf_set_us( ordr_data_set, "buyr_mail", param.getOrdEmail());
  795. // 가맹점 정보
  796. c_PayPlus.mf_set_us( corp_data_set, "corp_type", "0"); // 사업장 구분 (직접 판매 : 0, 입점몰 판매 : 1)
  797. // 실행
  798. c_PayPlus.mf_do_tx(env.getProperty("pg.kcp.site.cd"), "", txCd, cust_ip, String.valueOf(param.getOrdNo()), env.getProperty("pg.kcp.log.level"), "0");
  799. // 결과
  800. result.setResultCd(c_PayPlus.m_res_cd);
  801. result.setResultMsg(c_PayPlus.m_res_msg);
  802. result.setOrdNo(param.getOrdNo());
  803. result.setUsGfcdAmt(param.getUsGfcdAmt());
  804. if("0000".equals(result.getResultCd())) {
  805. result.setTradeNo(c_PayPlus.mf_get_res("cash_no"));
  806. result.setAuthNo(c_PayPlus.mf_get_res("receipt_no"));
  807. // 성공시 TB_GIFTCARD_RECEIPT INSERT
  808. orderDao.createGiftcartReceipt(result);
  809. }
  810. // 성공이든 실패이든 로그성 데이터 TB_GIFTCARD_RECEIPT_API INSERT
  811. coreOrderDao.createGiftcartReceiptApi(result);
  812. return result;
  813. }
  814. /**
  815. * USAFE 보증보험 신청
  816. * temp.setItemNmArr(goodsNameArr); // 상품명 배열
  817. * temp.setGoodsPriceArr(goodsPriceArr); // 상품별 가격 배열
  818. * temp.setItemQtyArr(goodsQuantityArr); // 상품별 수량 배열
  819. * temp.setOrdNo(1); // 주문번호
  820. * temp.setRealOrdAmt(32000); // 결제금액
  821. * temp.setBirthYmd("198912021"); // 생년월일 + 성별(남자 : 1, 여자 : 2)
  822. * temp.setPayMeans(TscConstants.PayMeans.ACCOUNT_TRANSFER.value()); // 무통장입금 or 계좌이체
  823. * temp.setBankNm("신한은행"); // 은행명 >> PG 송부 후 result에서 값 입력하면됨
  824. * temp.setOrdNm("이태영"); // 주문자명
  825. * temp.setOrdTelno(""); // 주문자전화1 ("-" 포함)
  826. * temp.setOrdPhnno("010-7111-4489"); // 주문자전화2 ("-" 포함)
  827. * temp.setRecipZipcode("08755"); // 주문자우편번호
  828. * temp.setRecipAddr("서울시 관악구 신림동 1414-26 해피타워 501호"); // 주문자주소
  829. * temp.setOrdEmail("xodud1202@naver.com"); // 주문자이메일
  830. * temp.setRecipNm("이태영"); // 수령인명
  831. * temp.setRecipTelno(""); // 수령인전화번호
  832. * temp.setRecipPhnno("010-7111-4489"); // 수령인휴대폰번호
  833. * temp.setCustNo(100010); // 고객번호
  834. *
  835. * * 계좌이체 : pgTid, 무통장입금 : 가상계좌번호 *
  836. * temp.setPgTid("20210423952698"); // temp.setVaNo("110242222222"); >> PG 송부 후 result에서 값 입력하면됨
  837. *
  838. * @param param
  839. * @author xodud1202
  840. * @since 2021. 04. 26
  841. */
  842. @Transactional("shopTxnManager")
  843. public String uSafeGuaranteeInsurance(Order param) {
  844. InsuranceManager manager = new InsuranceManager(env.getProperty("usafe.guarantee.send.url") , null );
  845. InsuranceInfo dInfo = new InsuranceInfo();
  846. String gubun = "A0"; // 고정
  847. String payMethod = "";
  848. String payInfo2 = "";
  849. String sign = "YYY";
  850. if(TscConstants.PayMeans.ACCOUNT_TRANSFER.value().equals(param.getPayMeans())) {
  851. payMethod = "BMC";
  852. payInfo2 = param.getPgTid();
  853. param.setIfYn("Y"); // 인터페이스 송부 완료(입금확인)
  854. } else if (TscConstants.PayMeans.BANK_DEPOSIT.value().equals(param.getPayMeans())) {
  855. payMethod = "CAS";
  856. payInfo2 = param.getVaNo();
  857. param.setIfYn("N"); // 인터페이스 송부 완료X (입금확인시 Y로 UPDATE 예정)
  858. }
  859. if(StringUtils.isEmpty(param.getOrdTelno())) { param.setOrdTelno(param.getOrdPhnno()); }
  860. if(StringUtils.isEmpty(param.getRecipTelno())) { param.setRecipTelno(param.getRecipPhnno()); }
  861. param.setRecipZipcode(param.getRecipZipcode().replaceAll("-", ""));
  862. if(param.getRecipZipcode().length() < 6) {
  863. param.setRecipZipcode(param.getRecipZipcode() + "X");
  864. }
  865. param.setGoodsCnt(String.valueOf(param.getItemNmArr().length));
  866. dInfo.setGubun(gubun);
  867. dInfo.setMallId(env.getProperty("usafe.guarantee.mall.id"));
  868. dInfo.setOId(String.valueOf(param.getOrdNo()));
  869. dInfo.setTotalMoney(String.valueOf(param.getRealOrdAmt()));
  870. dInfo.setPId(param.getBirthYmd());
  871. dInfo.setPayMethod(payMethod);
  872. dInfo.setPayInfo1(param.getBankNm());
  873. dInfo.setPayInfo2(payInfo2);
  874. dInfo.setOrderNm(param.getOrdNm());
  875. dInfo.setOrderHomeTel(param.getOrdTelno());
  876. dInfo.setOrderHpTel(param.getOrdPhnno());
  877. dInfo.setOrderZip(param.getRecipZipcode());
  878. dInfo.setOrderAddress(param.getRecipAddr());
  879. dInfo.setOrderEmail(param.getOrdEmail());
  880. dInfo.setGoodsCount(param.getGoodsCnt());
  881. dInfo.setAcceptor(param.getRecipNm());
  882. dInfo.setDeliveryTel1(param.getRecipTelno());
  883. dInfo.setDeliveryTel2(param.getRecipPhnno());
  884. dInfo.setGoodsNameArr(param.getItemNmArr());
  885. dInfo.setGoodsPriceArr(param.getGoodsPriceArr());
  886. dInfo.setGoodsQuantityArr(param.getItemQtyArr());
  887. dInfo.setSign(sign);
  888. String result = manager.contractInsurance(dInfo);
  889. // result : 0|주문번호 , 성공시
  890. // result : 1|Error Message , 실패시
  891. String[] rtnResult = result.split("[\u007C]");
  892. param.setResultCd(rtnResult[0]);
  893. param.setResultMsg(rtnResult[1]);
  894. if("0".equals(param.getResultCd())) {
  895. param.setInsNo(param.getResultMsg());
  896. } else {
  897. param.setIfYn("F"); // 인터페이스 송부 실패
  898. }
  899. coreOrderDao.updateInsurance(param);
  900. return "SUCCESS";
  901. }
  902. /**
  903. * USAFE 보증보험 입금 확인(보증보험 신청 완료 > 완료 후 취소안됨 주의)
  904. * temp.setOrdNo(111); // 주문번호
  905. * @param param
  906. * @author xodud1202
  907. * @since 2021. 04. 26
  908. */
  909. @Transactional("shopTxnManager")
  910. public String uSafeGuaranteeDepositCompleted(Order param) {
  911. // 보증보험 정보 조회
  912. Order insurance = coreOrderDao.getInsuranceInfo(param);
  913. // 보증보험 신청 이력이 없으면 완료안됨
  914. if(insurance != null) {
  915. // 보증보험 입금 완료 정보 송부
  916. InsuranceManager manager = new InsuranceManager(env.getProperty("usafe.guarantee.send.url"), null);
  917. String result = manager.confirmPayment(env.getProperty("usafe.guarantee.mall.id"), String.valueOf(param.getOrdNo()), insurance.getInsNo());
  918. // 송부 결과
  919. String rtnResult[] = result.split("[\u007C]");
  920. param.setResultCd(rtnResult[0]);
  921. param.setResultMsg(rtnResult[1]);
  922. if("0".equals(param.getResultCd())) {
  923. param.setIfYn("Y");
  924. } else {
  925. param.setIfYn("F");
  926. }
  927. coreOrderDao.updateInsuranceInfo(param);
  928. }
  929. return "SUCCESS";
  930. }
  931. /**
  932. * 네이버페이 주문 정보 생성 및 송부
  933. * @param param
  934. * @param request
  935. * @param response
  936. * @author xodud1202
  937. * @since 2021. 05. 12
  938. */
  939. @Transactional("shopTxnManager")
  940. public GagaMap nPayReq50(Order param, HttpServletRequest request, HttpServletResponse response) {
  941. GagaMap result = new GagaMap();
  942. // 로그인 정보 조회
  943. if(TsfSession.isLogin()) {
  944. param.setCustNo(TsfSession.getInfo().getCustNo());
  945. } else {
  946. param.setCustNo(0);
  947. param.setJsessionId(TsfSession.getSessionId());
  948. }
  949. try {
  950. param.setSiteCd(TscConstants.Site.STYLE24.value());
  951. param.setFrontGb(TsfSession.getFrontGb()); // 디바이스 정보
  952. param.setPrePntDcAmtYn("N"); // 네이버페이 : 선포인트 사용하지 않음으로 강제 지정
  953. param.setShotDelvYn("N"); // 네이버페이 : 총알배송 여부 설정 N
  954. param.setInsuranceYn("N"); // 네이버페이 : 보증보험 신청 여부 N
  955. // 장바구니 등록된 주문 정보 조회
  956. Collection<Order> cartList = coreOrderService.getCartGoodsList(param);
  957. // 주문 상세 정보 세팅
  958. for(Order item : cartList) {
  959. item.setSavePntAmt(0);
  960. item.setOrdAmt((item.getCurrPrice() + item.getOptAddPrice()) * item.getGoodsQty()); // ordAmt = (즉시할인가 + 옵션가) * 수량
  961. item.setRealOrdAmt(item.getOrdAmt()); // 네이버페이는 할인 없으므로 ordAmt와 동일
  962. item.setShotDelvYn("N");
  963. item.setGiftPackYn("N");
  964. item.setRegNo(param.getCustNo());
  965. item.setOrgDelvFee(item.getDelvFee());
  966. }
  967. param.setOrderDetailList(cartList);
  968. // 배송비 정보 조회
  969. GagaMap delvMap = coreOrderService.getCartDelvGoodsCntList(cartList, param);
  970. param.setDelvFeeCdList((Collection<Order>) delvMap.get("delvFeeCdList"));
  971. // 주문 정보 등록
  972. coreOrderService.createPreOrder(param);
  973. int ordNo = param.getOrdNo();
  974. int custNo = param.getCustNo();
  975. // 네이버페이 기본정보
  976. String shopId = env.getProperty("naverPay.shop.id"); // shopId
  977. String certificationKey = env.getProperty("naverPay.certification.key"); // 네이버페이 인증키
  978. String cpaInflowCode = getCookieValue(request, "CPAValidator");
  979. String naverInflowCode = getCookieValue(request, "NA_CO");
  980. String saClickId = getCookieValue(request, "NVADID");
  981. String domain = env.getProperty("domain.front"); // 도메인 주소
  982. String staticUrl = "/resources";
  983. String goodsImgUrl = env.getProperty("upload.goods.view"); // 상품 이미지 경로
  984. int totPrice = 0; // 전체 주문 금액
  985. // 네이버페이 송부용 xml 작성
  986. StringBuilder sb = new StringBuilder();
  987. sb.append("<order>\n");
  988. sb.append("\t<merchantId>").append(shopId).append("</merchantId>\n"); //<!-- 상점ID -->
  989. sb.append("\t<certiKey>").append(certificationKey).append("</certiKey>\n"); //<!-- 인증키 -->
  990. sb.append("\t<backUrl>").append("<![CDATA[").append(param.getBackUrl()).append("]]>").append("</backUrl>\n"); //<!-- 이전페이지 -->
  991. sb.append("\t<merchantCustomCode1>").append(param.getOrdNo()).append("</merchantCustomCode1>\n");
  992. sb.append("\t<interface>\n");
  993. sb.append("\t\t<cpaInflowCode>").append(cpaInflowCode).append("</cpaInflowCode>\n");
  994. sb.append("\t\t<naverInflowCode>").append(naverInflowCode).append("</naverInflowCode>\n");
  995. sb.append("\t\t<saClickId>").append(saClickId).append("</saClickId>\n");
  996. sb.append("\t</interface>\n");
  997. for(Order item : param.getOrderDetailList()) {
  998. //<!-- 상품정보 -->
  999. sb.append("\t<product>\n");
  1000. sb.append("\t\t<id>").append(item.getGoodsCd()).append("</id>\n"); //<!-- 상품코드 -->
  1001. sb.append("\t\t<ecMallProductId>").append(item.getGoodsCd()).append("</ecMallProductId>\n"); //<!-- 상품코드 -->
  1002. sb.append("\t\t<name>").append("<![CDATA[").append(item.getGoodsNm()).append("]]>").append("</name>\n"); //<!-- 상품명 -->
  1003. sb.append("\t\t<basePrice>").append(item.getCurrPrice()).append("</basePrice>\n"); //<!-- 상품금액 -->
  1004. // TODO http: 부분 운영 프로토콜 확인 후 수정 필요(운영 상품상세가 HTTPS일 경우 분기처리 필요(개발서버, 운영 구분))
  1005. sb.append("\t\t<infoUrl>").append("<![CDATA[https:").append(param.getGoodsUrl()).append(item.getGoodsCd()).append("]]>").append("</infoUrl>\n"); //<!-- 상품상세페이지 URL -->
  1006. sb.append("\t\t<imageUrl>").append("<![CDATA[https:").append(goodsImgUrl).append("/").append(item.getSysImgNm()).append("]]>").append("</imageUrl>\n"); //<!-- 상품원본이미지 URL -->
  1007. if(TscConstants.GoodsType.SET.value().equals(item.getGoodsType())) { // 세트상품
  1008. // 세트상품 manageCode 정렬 (optCd ASC)
  1009. Goods option = new Goods();
  1010. option.setArrGoodsCd(item.getItemCd().split(","));
  1011. option.setSizeArr(item.getOptCd().split(","));
  1012. List<Goods> optionList = (ArrayList<Goods>) goodsDao.getOrderGoodsOptionList(option);
  1013. StringBuilder manageCode = new StringBuilder();
  1014. int k = 0;
  1015. for(Goods opt : optionList) {
  1016. if(k++ > 0) manageCode.append("/");
  1017. manageCode.append(opt.getOptCd());
  1018. }
  1019. // 옵션 정보
  1020. sb.append("\t\t<option>\n");
  1021. sb.append("\t\t\t<quantity>").append(item.getGoodsQty()).append("</quantity>\n"); //<!-- 옵션수량-->
  1022. sb.append("\t\t\t<price>").append(item.getOptAddPrice()).append("</price>\n"); //<!-- 옵션금액 -->
  1023. sb.append("\t\t\t<manageCode>").append(manageCode).append("</manageCode>\n"); //<!-- 옵션관리코드 -->
  1024. // 구성상품별 옵션 세팅
  1025. int i = 1;
  1026. for(Goods opt : optionList) {
  1027. // 상품명, 컬러, 사이즈 확인(최대 50자) ==> 20200517 정지혜과장님 확인 :: 상품명=25,OPT1=13,OPT2=12 글자. 넘어갈경우 뒤에 ".." 붙여서 글자수 맞출것.
  1028. // 상품명/컬러/사이즈 이므로 가운데 / 를 위해 24, 12, 12로 진행
  1029. if(opt.getGoodsNm().length() > 24) {opt.setGoodsNm(opt.getGoodsNm().substring(0, 21) + "..");}
  1030. if(opt.getOptCd2().length() > 12) {opt.setOptCd2(opt.getOptCd2().substring(0, 9) + "..");}
  1031. if(opt.getColorNm().length() > 12) {opt.setColorNm(opt.getColorNm().substring(0, 9) + "..");}
  1032. sb.append("\t\t\t<selectedItem>\n");
  1033. sb.append("\t\t\t\t<type>SELECT</type>\n"); //<!-- 옵션유형 -->
  1034. sb.append("\t\t\t\t<name>구성상품").append(i++).append("</name>\n"); //<!-- 옵션명 -->
  1035. sb.append("\t\t\t\t<value>\n");
  1036. sb.append("\t\t\t\t\t<id>").append(opt.getOptCd()).append("</id>\n"); //<!-- 옵션 -->
  1037. sb.append("\t\t\t\t\t<text>").append(opt.getGoodsNm()).append("/").append(opt.getColorNm()).append("/").append(opt.getOptCd2()).append("</text>\n");//<!-- 옵션명 -->
  1038. sb.append("\t\t\t\t</value>\n");
  1039. sb.append("\t\t\t</selectedItem>\n");
  1040. }
  1041. sb.append("\t\t</option>\n");
  1042. } else if("Y".equals(item.getSelfGoodsYn())) { // 세트상품 제외 자사상품
  1043. // 옵션 정보
  1044. sb.append("\t\t<option>\n");
  1045. sb.append("\t\t\t<quantity>").append(item.getGoodsQty()).append("</quantity>\n"); //<!-- 옵션수량-->
  1046. sb.append("\t\t\t<price>").append(item.getOptAddPrice()).append("</price>\n"); //<!-- 옵션금액 -->
  1047. sb.append("\t\t\t<manageCode>").append(item.getOptCd()).append("</manageCode>\n"); //<!-- 옵션관리코드 -->
  1048. // 칼라코드
  1049. sb.append("\t\t\t<selectedItem>\n");
  1050. sb.append("\t\t\t\t<type>SELECT</type>\n");//<!-- 옵션유형 -->
  1051. sb.append("\t\t\t\t<name>색상</name>\n");//<!-- 옵션명 -->
  1052. sb.append("\t\t\t\t<value>\n");
  1053. sb.append("\t\t\t\t\t<id>").append(item.getOptCd1()).append("</id>\n");//<!-- 칼라코드 -->
  1054. sb.append("\t\t\t\t\t<text>").append(item.getColorNm()).append("</text>\n");//<!-- 칼라명 -->
  1055. sb.append("\t\t\t\t</value>\n");
  1056. sb.append("\t\t\t</selectedItem>\n");
  1057. // 사이즈코드
  1058. sb.append("\t\t\t<selectedItem>\n");
  1059. sb.append("\t\t\t\t<type>SELECT</type>\n");//<!-- 옵션유형 -->
  1060. sb.append("\t\t\t\t<name>사이즈</name>\n");//<!-- 옵션명 -->
  1061. sb.append("\t\t\t\t<value>\n");
  1062. sb.append("\t\t\t\t\t<id>").append(item.getOptCd2()).append("</id>\n");//<!-- 사이즈코드 -->
  1063. sb.append("\t\t\t\t\t<text>").append(item.getOptCd2()).append("</text>\n");//<!-- 사이즈명 -->
  1064. sb.append("\t\t\t\t</value>\n");
  1065. sb.append("\t\t\t</selectedItem>\n");
  1066. sb.append("\t\t</option>\n");
  1067. } else { // 세트상품 제외 입점업체 상품
  1068. // 옵션 정보
  1069. sb.append("\t\t<option>\n");
  1070. sb.append("\t\t\t<quantity>").append(item.getGoodsQty()).append("</quantity>\n"); //<!-- 옵션수량-->
  1071. sb.append("\t\t\t<price>").append(item.getOptAddPrice()).append("</price>\n"); //<!-- 옵션금액 -->
  1072. sb.append("\t\t\t<manageCode>").append(item.getOptCd()).append("</manageCode>\n"); //<!-- 옵션관리코드 -->
  1073. // 칼라코드
  1074. sb.append("\t\t\t<selectedItem>\n");
  1075. sb.append("\t\t\t\t<type>SELECT</type>\n");//<!-- 옵션유형 -->
  1076. sb.append("\t\t\t\t<name>옵션</name>\n");//<!-- 옵션명 -->
  1077. sb.append("\t\t\t\t<value>\n");
  1078. sb.append("\t\t\t\t\t<id>").append(item.getOptCd()).append("</id>\n");//<!-- 칼라코드 -->
  1079. sb.append("\t\t\t\t\t<text>").append(item.getOptCd1()).append("/").append(item.getOptCd2()).append("</text>\n");//<!-- 칼라명 -->
  1080. sb.append("\t\t\t\t</value>\n");
  1081. sb.append("\t\t\t</selectedItem>\n");
  1082. sb.append("\t\t</option>\n");
  1083. }
  1084. // 배송비 판단 후 배송비유형 선택 (추가 기본배송비, 무료배송비 기준 조회후 등록)
  1085. //<!-- 배송정보 -->
  1086. String delvFeeCrite = "CHARGE";
  1087. int delvFee = item.getOrgDelvFee();
  1088. String feePayType = "PREPAYED";
  1089. // 배송비 조건
  1090. if(TscConstants.DelvFeeCrite.NORMAL.value().equals(item.getDelvFeeCrite())) {
  1091. delvFeeCrite = "CONDITIONAL_FREE"; // 조건부 무료(배송비 조건이 무료이거나 배송 방법이 착불일때만 배송비는 0원으로 변경)
  1092. } else if(TscConstants.DelvFeeCrite.FREE.value().equals(item.getDelvFeeCrite())) {
  1093. delvFeeCrite = "FREE";
  1094. feePayType = "FREE";
  1095. delvFee = 0;
  1096. }
  1097. sb.append("\t\t<shippingPolicy>\n");
  1098. sb.append("\t\t\t<groupId>").append(item.getDelvFeeCd()).append("</groupId>\n"); //<!-- 배송비묶음그룹ID -->
  1099. sb.append("\t\t\t<method>DELIVERY</method>\n"); //<!-- 배송방법 : 택배,소포,등기 -->
  1100. sb.append("\t\t\t<feeType>").append(delvFeeCrite).append("</feeType>\n"); //<!-- 배송비유형 : 유료 -->
  1101. sb.append("\t\t\t<feePayType>").append(feePayType).append("</feePayType>\n"); //<!-- 배송비결제방법 : 선불 -->
  1102. sb.append("\t\t\t<feePrice>").append(delvFee).append("</feePrice>\n"); //<!-- 기본배송비 -->
  1103. // 조건부 무료일경우에만 송부
  1104. if(TscConstants.DelvFeeCrite.NORMAL.value().equals(item.getDelvFeeCrite())) {
  1105. sb.append("\t\t\t<conditionalFree>\n");
  1106. sb.append("\t\t\t\t<basePrice>").append(item.getMinOrdAmt()).append("</basePrice>\n"); //<!-- 무료배송비기준 -->
  1107. sb.append("\t\t\t</conditionalFree>\n");
  1108. }
  1109. sb.append("\t\t</shippingPolicy>\n");
  1110. sb.append("\t</product>\n");
  1111. totPrice = totPrice + ((item.getCurrPrice() + item.getOptAddPrice()) * item.getGoodsQty());
  1112. }
  1113. sb.append("</order>");
  1114. log.info("CHECK NAVER PAY SB_LENGTH ::::: \n{}", sb.length());
  1115. log.info("CHECK NAVER PAY SB ::::: \n{}", sb.toString());
  1116. result = sendOrderInfoToNC(sb);
  1117. // 네이버 페이 주문번호 저장
  1118. param.setNpayOrdNo(Integer.parseInt(result.get("resultNo").toString()));
  1119. // 3.주문정보 저장
  1120. param.setOrdNo(ordNo);
  1121. param.setUpdNo(custNo);
  1122. coreOrderDao.updateNaverPayOrderNo(param);
  1123. if(TscConstants.FrontGb.PC.value().equals(TsfSession.getFrontGb())) {
  1124. result.put("npayOrderUrl", env.getProperty("naverPay.order.pc.url"));
  1125. } else {
  1126. result.put("npayOrderUrl", env.getProperty("naverPay.order.mobile.url"));
  1127. }
  1128. result.put("orderkey", param.getNpayOrdNo());
  1129. result.put("resultNo", result.get("resultNo").toString());
  1130. result.put("state", "sucess");
  1131. } catch(Exception e) {
  1132. result.put("state", "fail");
  1133. result.put("message", "주문실패");
  1134. e.printStackTrace();
  1135. }
  1136. return result;
  1137. }
  1138. private String getCombinationXml(String manageCode, int addPrice, int stockQty, int size) {
  1139. String[] optCd = manageCode.split("/");
  1140. StringBuilder sb = new StringBuilder();
  1141. sb.append("\t\t\t<combination>\n");
  1142. sb.append("\t\t\t\t<manageCode>").append(manageCode).append("</manageCode>\n");
  1143. sb.append("\t\t\t\t<price>").append(addPrice).append("</price>\n");
  1144. sb.append("\t\t\t\t<stockQuantity>").append(stockQty).append("</stockQuantity>\n");
  1145. sb.append("\t\t\t\t<status>true</status>\n");
  1146. log.info("CHECK size / optCd.length / optCd ::::: {} / {} / {}", size, optCd.length, Arrays.toString(optCd));
  1147. // 옵션 옵션조합정보 색상
  1148. for(int i = 0 ; i < size ; i++) {
  1149. sb.append("\t\t\t\t<options>\n");
  1150. sb.append("\t\t\t\t\t<name>구성상품").append(i + 1).append("</name>\n");
  1151. sb.append("\t\t\t\t\t<id>").append(optCd[i]).append("</id>\n");
  1152. sb.append("\t\t\t\t</options>\n");
  1153. }
  1154. sb.append("\t\t\t</combination>\n");
  1155. return sb.toString();
  1156. }
  1157. /**
  1158. * 네이버페이 주문 정보 송부
  1159. * @param sb
  1160. * @author xodud1202
  1161. * @since 2021. 05. 12
  1162. */
  1163. private GagaMap sendOrderInfoToNC(StringBuilder sb) throws IOException {
  1164. GagaMap resultMap = new GagaMap();
  1165. // 1.0, 2.0 일때 구분값 처리
  1166. URL _url = new URL(env.getProperty("naverPay.order.api.url"));
  1167. String ENCODING = "UTF-8";
  1168. HttpsURLConnection conn = (HttpsURLConnection)_url.openConnection();
  1169. conn.setDoInput(true);
  1170. conn.setDoOutput(true);
  1171. conn.setUseCaches(false);
  1172. conn.setRequestMethod("POST");
  1173. conn.addRequestProperty("Content-Type", "application/xml; charset=UTF-8");
  1174. // 주문 등록 API 호출
  1175. Writer writer = new OutputStreamWriter(conn.getOutputStream(), ENCODING);
  1176. writer.write(sb.toString());
  1177. writer.flush();
  1178. writer.close();
  1179. int respCode = conn.getResponseCode();
  1180. log.info("CHECK RESP CODE ::::: {}", respCode);
  1181. if (respCode != 200) {
  1182. throw new RuntimeException(String.format("NC Response fail : %d %s", respCode, conn.getResponseMessage()));
  1183. }
  1184. BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
  1185. String[] arr = reader.readLine().split(":");
  1186. log.info("CHECK RESULT ARR ::::: {} / {} / {}", arr[0], arr[1], arr[2]);
  1187. if ("SUCCESS".equals(arr[0])) {
  1188. resultMap.put("state", arr[0]);
  1189. resultMap.put("orderKey", arr[1]);
  1190. resultMap.put("resultNo", arr[2]);
  1191. } else {
  1192. throw new IllegalStateException(String.format("NC Response fail : %d %s", reader.readLine().toString()));
  1193. }
  1194. conn.disconnect();
  1195. return resultMap;
  1196. }
  1197. /*
  1198. * 쿠키값 가져오기
  1199. */
  1200. private String getCookieValue(HttpServletRequest request, String name) {
  1201. if (name == null || request == null) {
  1202. return "";
  1203. }
  1204. Cookie[] cookies = request.getCookies();
  1205. if (cookies != null) {
  1206. for (int i = 0; i < cookies.length; i++) {
  1207. if (name.equals(cookies[i].getName())) {
  1208. return cookies[i].getValue();
  1209. }
  1210. }
  1211. }
  1212. return "";
  1213. }
  1214. /**
  1215. * 네이버페이 상품 정보 생성 및 송부
  1216. * @param request
  1217. * @param response
  1218. * @author xodud1202
  1219. * @since 2021. 05. 12
  1220. */
  1221. public void createNpayGoodsXml50(HttpServletRequest request, HttpServletResponse response) throws Exception {
  1222. StringBuilder sb = new StringBuilder();
  1223. // http://ldfront.style24.com/pg/create/npay/goodsxml?product%5B0%5D%5Bid%5D=A83F-DP568S&product%5B0%5D%5BoptionManageCodes%5D=14019445-2&supplementSearch=true&optionSearch=true
  1224. // product%5B0%5D%5Bid%5D=A83F-DP568S&product%5B0%5D%5BoptionManageCodes%5D=14019445-2&supplementSearch=true&optionSearch=true
  1225. // 이스케이프코드 : %5B = [ , %5D = ]
  1226. try {
  1227. String goodsCdStr = "";
  1228. String optionManageCodesStr = "";
  1229. String queryStr = request.getQueryString();
  1230. String[] arr1 = queryStr.split("product");
  1231. for (int i=0 ; i<arr1.length; i++) {
  1232. String[] arr2 = arr1[i].split("&");
  1233. for (int j=0 ; j<arr2.length ; j++) {
  1234. String[] arr3 = arr2[j].split("=");
  1235. if (arr3.length > 1) {
  1236. if (arr3[0].contains("id")) {
  1237. if ("".equals(goodsCdStr)) {
  1238. goodsCdStr = goodsCdStr + arr3[1];
  1239. } else {
  1240. goodsCdStr = goodsCdStr + "," + arr3[1];
  1241. }
  1242. } else if (arr3[0].contains("optionManageCodes")) {
  1243. if ("".equals(optionManageCodesStr)) {
  1244. optionManageCodesStr = optionManageCodesStr + arr3[1];
  1245. } else {
  1246. optionManageCodesStr = optionManageCodesStr + "," + arr3[1];
  1247. }
  1248. }
  1249. }
  1250. }
  1251. }
  1252. String[] goodsCdArr = goodsCdStr.split(",");
  1253. String[] optionManageCodesArr = optionManageCodesStr.split(",");
  1254. // 네이버페이 기본정보
  1255. String shopId = env.getProperty("naverPay.shop.id"); // shopId
  1256. String certificationKey = env.getProperty("naverPay.certification.key"); // 네이버페이 인증키
  1257. String cpaInflowCode = getCookieValue(request, "CPAValidator");
  1258. String naverInflowCode = getCookieValue(request, "NA_CO");
  1259. String saClickId = getCookieValue(request, "NVADID");
  1260. String domain = env.getProperty("domain.front"); // 도메인 주소
  1261. String staticUrl = "/resources";
  1262. String goodsImgUrl = env.getProperty("upload.goods.view"); // 상품 이미지 경로
  1263. int totPrice = 0; // 전체 주문 금액
  1264. sb.append("<?xml version='1.0' encoding='utf-8'?>\n");
  1265. sb.append("<products>\n");
  1266. for (int i=0; i<goodsCdArr.length; i++) {
  1267. Order item = new Order();
  1268. item.setGoodsCd(goodsCdArr[i]); // 상품코드
  1269. String optionManageCode = coreOrderService.simpleDecode(optionManageCodesArr[i]);
  1270. item.setOptCd(optionManageCode); // 상품 옵션
  1271. // 이 포인트에서 세트상품, 일반 상품 분리 조회 필요 (재고 파악 로직이 다름)
  1272. Goods simpleInfo = new Goods();
  1273. simpleInfo.setGoodsCd(item.getGoodsCd());
  1274. simpleInfo = goodsDao.getGoodsSimpleInfo(simpleInfo);
  1275. // 세트상품일 경우
  1276. if(TscConstants.GoodsType.SET.value().equals(simpleInfo.getGoodsType())) {
  1277. // 주문 상품 정보 조회
  1278. Goods goods = new Goods();
  1279. goods.setGoodsCd(item.getGoodsCd());
  1280. goods.setOptCd(item.getOptCd());
  1281. goods.setFrontGb(TsfSession.getFrontGb());
  1282. goods.setSiteCd(TscConstants.Site.STYLE24.value());
  1283. goods.setAdminYn("Y"); // 상품 상태에 관계 없이 조회하기 위함
  1284. goods = goodsDao.getGoodsInfo(goods);
  1285. // 상품 상태 확인
  1286. String goodsStat = "";
  1287. if(TscConstants.GoodsStat.APPR.value().equals(goods.getGoodsStat())) {
  1288. goodsStat = "ON_SALE"; // 판매중
  1289. } else if (TscConstants.GoodsStat.SOLDOUT.value().equals(goods.getGoodsStat())) {
  1290. goodsStat = "SOLD_OUT"; // 품절
  1291. } else {
  1292. goodsStat = "NOT_SALE"; // 구매불가
  1293. }
  1294. // 반송지 정보
  1295. Delivery rtnInfo = goodsDao.getGoodsDeliveryInfo(goods.getGoodsCd());
  1296. sb.append("\t<product>\n");
  1297. sb.append("\t\t<id>").append(item.getGoodsCd()).append("</id>\n");
  1298. sb.append("\t\t<merchantProductId>").append(item.getGoodsCd()).append("</merchantProductId>\n");
  1299. sb.append("\t\t<ecMallProductId>").append(item.getGoodsCd()).append("</ecMallProductId>\n");
  1300. sb.append("\t\t<name>").append(goods.getGoodsNm()).append("</name>\n");
  1301. sb.append("\t\t<status>").append(goodsStat).append("</status>\n");
  1302. sb.append("\t\t<basePrice>").append(goods.getCurrPrice()).append("</basePrice>\n");
  1303. // TODO http: 부분 운영 프로토콜 확인 후 수정 필요(운영 상품상세가 HTTPS일 경우 분기처리 필요(개발서버, 운영 구분))
  1304. sb.append("\t\t<infoUrl>").append("http:" + domain + "/goods/detail/form?goodsCd=" + goods.getGoodsCd()).append("</infoUrl>\n");
  1305. sb.append("\t\t<imageUrl>").append("http:" + goodsImgUrl + "/" + goods.getSysImgNm()).append("</imageUrl>\n");
  1306. // 12.반품주소
  1307. if (rtnInfo != null && rtnInfo.getRtnLocZipcode() != null && !"".equals(rtnInfo.getRtnLocZipcode())) {
  1308. // 2.1 반품정보
  1309. sb.append("\t\t<returnInfo>\n");
  1310. sb.append("\t\t\t<zipcode>").append(rtnInfo.getRtnLocZipcode()).append("</zipcode>\n");
  1311. sb.append("\t\t\t<address1>").append(rtnInfo.getRtnLocBaseAddr()).append("</address1>\n");
  1312. sb.append("\t\t\t<address2>").append(rtnInfo.getRtnLocDtlAddr()).append("</address2>\n");
  1313. sb.append("\t\t\t<sellername>").append(rtnInfo.getRtnLocNm()).append("</sellername>\n");
  1314. sb.append("\t\t\t<contact1>").append(rtnInfo.getRtnLocTelno()).append("</contact1>\n");
  1315. sb.append("\t\t</returnInfo>\n");
  1316. // 반품배송비, 교환배송비
  1317. sb.append("\t\t<returnShippingFee>").append(goods.getRtnDelvFee()).append("</returnShippingFee>\n");
  1318. sb.append("\t\t<exchangeShippingFee>").append(goods.getDelvFee() + goods.getRtnDelvFee()).append("</exchangeShippingFee>\n");
  1319. }
  1320. // 옵션정보 지원여부 true
  1321. sb.append("\t\t<optionSupport>true</optionSupport>\n");
  1322. // 세트상품 정보 getGoodsSetComposeList
  1323. goods.setSiteCd(TscConstants.Site.STYLE24.value());
  1324. Collection<Goods> compsInfoList = goodsDao.getCompsGoodsList(goods);
  1325. // 옵션 정보
  1326. sb.append("\t\t<option>\n");
  1327. int combCnt = 0; // 옵션 조합 총 수량
  1328. // 옵션 아이템정보 구성상품
  1329. for (Goods comps : compsInfoList) {
  1330. sb.append("\t\t\t<optionItem>\n");
  1331. sb.append("\t\t\t\t<type>SELECT</type>\n");
  1332. sb.append("\t\t\t\t<name>구성상품").append(comps.getRnum()).append("</name>\n");
  1333. // 구성상품별 옵션 정보
  1334. String[] optCds = comps.getOptCd().split(",");
  1335. String[] optCd2s = comps.getOptCd2().split(",");
  1336. String[] colorNms = comps.getColorNm().split(",");
  1337. combCnt *= optCds.length;
  1338. for(int j = 0 ; j < optCds.length ; j++) {
  1339. if(comps.getGoodsNm().length() > 24) {comps.setGoodsNm(comps.getGoodsNm().substring(0, 21) + "..");}
  1340. if(optCd2s[j].length() > 12) {optCd2s[j] = optCd2s[j].substring(0, 9) + "..";}
  1341. if(colorNms[j].length() > 12) {colorNms[j] = colorNms[j].substring(0, 9) + "..";}
  1342. sb.append("\t\t\t\t<value>\n");
  1343. sb.append("\t\t\t\t\t<id>").append(optCds[j]).append("</id>\n");
  1344. sb.append("\t\t\t\t\t<text>").append(comps.getGoodsNm()).append("/").append(colorNms[j]).append("/").append(optCd2s[j]).append("</text>\n");//<!-- 옵션명 -->
  1345. sb.append("\t\t\t\t</value>\n");
  1346. }
  1347. sb.append("\t\t\t</optionItem>\n");
  1348. }
  1349. // 세트 구성상품 모든 옵션 경우의 수 조회 > 상품코드 오름차순, OPTCD 오름차순으로 정확히 보낼것 > 주문요청된 manageCode가 같아야함.
  1350. for (Goods comps1 : compsInfoList) {
  1351. if(comps1.getRnum() == 1) {
  1352. // 구성상품별 옵션 정보
  1353. String[] goods1optCds = comps1.getOptCd().split(",");
  1354. String[] goods1addPrices = comps1.getItemPrices().split(",");
  1355. String[] goods1stockQty = comps1.getItemStockQty().split(",");
  1356. for(int g1 = 0 ; g1 < goods1optCds.length ; g1++) {
  1357. StringBuilder manageCode = new StringBuilder(goods1optCds[g1]); // 옵션코드 조합
  1358. int addPrice = Integer.parseInt(goods1addPrices[g1]); // 추가금액 합계
  1359. int stockQty = Integer.parseInt(goods1stockQty[g1]); // 상품 주문 최소 재고(구성상품 최소)
  1360. log.info("MAKE new StringBuilder(goods1optCds[g1]) :::: {}", goods1optCds[g1]);
  1361. log.info("MAKE MANAGECODE :::: {}", manageCode);
  1362. if(compsInfoList.size() > 1) { // 조합 상품 최대치 계산 (세트상품은 최대 5개까지 등록 가능)
  1363. for (Goods comps2 : compsInfoList) {
  1364. if(comps2.getRnum() == 2) {
  1365. // 구성상품별 옵션 정보
  1366. String[] goods2optCds = comps2.getOptCd().split(",");
  1367. String[] goods2addPrices = comps2.getItemPrices().split(",");
  1368. String[] goods2stockQty = comps2.getItemStockQty().split(",");
  1369. // 기존 정보 저장 (다시 돌아올 경우 이전 번호까지의 정보로 리셋하기 위함)
  1370. String manageCodeSave2 = manageCode.toString();
  1371. int addPriceSave2 = Integer.parseInt(goods1addPrices[g1]);
  1372. int stockQtySave2 = Integer.parseInt(goods1stockQty[g1]);
  1373. for(int g2 = 0 ; g2 < goods2optCds.length ; g2++) {
  1374. manageCode = new StringBuilder(manageCodeSave2); // String 참조변수 인식 방지(사라지지 않음)를 위한 객체 재생성
  1375. manageCode.append("/").append(goods2optCds[g2]);
  1376. addPrice = addPriceSave2 + Integer.parseInt(goods2addPrices[g2]);
  1377. if(stockQtySave2 < Integer.parseInt(goods2stockQty[g2])) stockQty = Integer.parseInt(goods2stockQty[g2]);
  1378. log.info("MAKE new StringBuilder(manageCodeSave2); :::: {}", manageCodeSave2);
  1379. log.info("MAKE MANAGECODE :::: {}", manageCode);
  1380. if(compsInfoList.size() > 2) { // 조합 상품 최대치 계산 (세트상품은 최대 5개까지 등록 가능)
  1381. for (Goods comps3 : compsInfoList) {
  1382. if (comps3.getRnum() == 3) {
  1383. // 구성상품별 옵션 정보
  1384. String[] goods3optCds = comps3.getOptCd().split(",");
  1385. String[] goods3addPrices = comps3.getItemPrices().split(",");
  1386. String[] goods3stockQty = comps3.getItemStockQty().split(",");
  1387. // 기존 정보 저장 (다시 돌아올 경우 이전 번호까지의 정보로 리셋하기 위함)
  1388. String manageCodeSave3 = manageCode.toString();
  1389. int addPriceSave3 = addPriceSave2;
  1390. int stockQtySave3 = stockQtySave2;
  1391. for(int g3 = 0 ; g3 < goods3optCds.length ; g3++) {
  1392. manageCode = new StringBuilder(manageCodeSave3); // String 참조변수 인식 방지(사라지지 않음)를 위한 객체 재생성
  1393. manageCode.append("/").append(goods3optCds[g3]);
  1394. addPrice = addPriceSave3 + Integer.parseInt(goods3addPrices[g3]);
  1395. if(stockQtySave3 < Integer.parseInt(goods3stockQty[g3])) stockQty = Integer.parseInt(goods3stockQty[g3]);
  1396. log.info("MAKE new StringBuilder(manageCodeSave3); :::: {}", manageCodeSave3);
  1397. log.info("MAKE MANAGECODE :::: {}", manageCode);
  1398. if(compsInfoList.size() > 3) { // 조합 상품 최대치 계산 (세트상품은 최대 5개까지 등록 가능)
  1399. for (Goods comps4 : compsInfoList) {
  1400. if (comps4.getRnum() == 4) {
  1401. // 구성상품별 옵션 정보
  1402. String[] goods4optCds = comps4.getOptCd().split(",");
  1403. String[] goods4addPrices = comps4.getItemPrices().split(",");
  1404. String[] goods4stockQty = comps4.getItemStockQty().split(",");
  1405. // 기존 정보 저장 (다시 돌아올 경우 이전 번호까지의 정보로 리셋하기 위함)
  1406. String manageCodeSave4 = manageCode.toString();
  1407. int addPriceSave4 = addPriceSave3;
  1408. int stockQtySave4 = stockQtySave3;
  1409. for(int g4 = 0 ; g4 < goods4optCds.length ; g4++) {
  1410. manageCode = new StringBuilder(manageCodeSave4); // String 참조변수 인식 방지(사라지지 않음)를 위한 객체 재생성
  1411. manageCode.append("/").append(goods4optCds[g4]);
  1412. addPrice = addPriceSave4 + Integer.parseInt(goods4addPrices[g4]);
  1413. if(stockQtySave4 < Integer.parseInt(goods4stockQty[g4])) stockQty = Integer.parseInt(goods4stockQty[g4]);
  1414. if(compsInfoList.size() > 4) { // 조합 상품 최대치 계산 (세트상품은 최대 5개까지 등록 가능)
  1415. for (Goods comps5 : compsInfoList) {
  1416. if (comps5.getRnum() == 5) {
  1417. // 구성상품별 옵션 정보
  1418. String[] goods5optCds = comps5.getOptCd().split(",");
  1419. String[] goods5addPrices = comps5.getItemPrices().split(",");
  1420. String[] goods5stockQty = comps5.getItemStockQty().split(",");
  1421. // 기존 정보 저장 (다시 돌아올 경우 이전 번호까지의 정보로 리셋하기 위함)
  1422. String manageCodeSave5 = manageCode.toString();
  1423. int addPriceSave5 = addPriceSave4;
  1424. int stockQtySave5 = stockQtySave4;
  1425. for(int g5 = 0 ; g5 < goods5optCds.length ; g5++) {
  1426. manageCode = new StringBuilder(manageCodeSave5); // String 참조변수 인식 방지(사라지지 않음)를 위한 객체 재생성
  1427. manageCode.append("/").append(goods5optCds[g5]);
  1428. addPrice = addPriceSave5 + Integer.parseInt(goods5addPrices[g5]);
  1429. if (stockQtySave5 < Integer.parseInt(goods5stockQty[g5])) stockQty = Integer.parseInt(goods5stockQty[g5]);
  1430. // 세트상품은 최대 5개이므로 마무리.
  1431. sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
  1432. }
  1433. }
  1434. }
  1435. } else {
  1436. sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
  1437. }
  1438. }
  1439. }
  1440. }
  1441. } else {
  1442. sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
  1443. }
  1444. }
  1445. }
  1446. }
  1447. } else {
  1448. sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
  1449. }
  1450. }
  1451. }
  1452. }
  1453. } else {
  1454. sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
  1455. }
  1456. }
  1457. }
  1458. }
  1459. sb.append("\t\t</option>\n");
  1460. // 10. 배송정보조회
  1461. // 5.2.1 업체별 기본배송비, 무료배송비
  1462. String delvFeeCd = "";
  1463. if("Y".equals(goods.getSelfGoodsYn())) {
  1464. delvFeeCd = "WMS";
  1465. } else {
  1466. delvFeeCd = goods.getDelvFeeCd();
  1467. }
  1468. String delvFeeCrite = "CHARGE";
  1469. int delvFee = goods.getDelvFee();
  1470. String feePayType = "PREPAYED";
  1471. // 배송비 조건
  1472. if(TscConstants.DelvFeeCrite.NORMAL.value().equals(goods.getDelvFeeCrite())) {
  1473. delvFeeCrite = "CONDITIONAL_FREE"; // 조건부 무료(배송비 조건이 무료이거나 배송 방법이 착불일때만 배송비는 0원으로 변경)
  1474. } else if(TscConstants.DelvFeeCrite.FREE.value().equals(goods.getDelvFeeCrite())) {
  1475. delvFeeCrite = "FREE";
  1476. feePayType = "FREE";
  1477. delvFee = 0;
  1478. }
  1479. sb.append("\t\t<shippingPolicy>\n");
  1480. sb.append("\t\t\t<groupId>").append(delvFeeCd).append("</groupId>\n");
  1481. sb.append("\t\t\t<method>").append("DELIVERY").append("</method>\n");
  1482. sb.append("\t\t\t<feeType>").append(delvFeeCrite).append("</feeType>\n");
  1483. sb.append("\t\t\t<feePayType>").append(feePayType).append("</feePayType>\n");
  1484. sb.append("\t\t\t<feePrice>").append(delvFee).append("</feePrice>\n");
  1485. if(!"FREE".equals(delvFeeCrite)) {
  1486. sb.append("\t\t\t<conditionalFree>\n");
  1487. sb.append("\t\t\t\t<basePrice>").append(goods.getMinOrdAmt()).append("</basePrice>\n");
  1488. sb.append("\t\t\t</conditionalFree>\n");
  1489. }
  1490. sb.append("\t\t</shippingPolicy>\n");
  1491. sb.append("\t</product>\n");
  1492. } else {
  1493. // 주문 상품 옵션 정보 조회
  1494. GoodsStock opt = new GoodsStock();
  1495. opt.setGoodsCd(item.getGoodsCd());
  1496. opt.setOptCd(item.getOptCd());
  1497. opt = goodsDao.getGoodsStockInfo(opt);
  1498. // 주문 상품 정보 조회
  1499. Goods goods = new Goods();
  1500. goods.setGoodsCd(item.getGoodsCd());
  1501. goods.setOptCd(item.getOptCd());
  1502. goods.setColorCd(opt.getOptCd1());
  1503. goods.setFrontGb(TsfSession.getFrontGb());
  1504. goods.setSiteCd(TscConstants.Site.STYLE24.value());
  1505. goods.setAdminYn("Y"); // 상품 상태에 관계 없이 조회하기 위함
  1506. goods = goodsDao.getGoodsInfo(goods);
  1507. // 상품 상태 확인
  1508. String goodsStat = "";
  1509. if(TscConstants.GoodsStat.APPR.value().equals(goods.getGoodsStat())) {
  1510. goodsStat = "ON_SALE"; // 판매중
  1511. } else if (TscConstants.GoodsStat.SOLDOUT.value().equals(goods.getGoodsStat())) {
  1512. goodsStat = "SOLD_OUT"; // 품절
  1513. } else {
  1514. goodsStat = "NOT_SALE"; // 구매불가
  1515. }
  1516. // 반송지 정보
  1517. Delivery rtnInfo = goodsDao.getGoodsDeliveryInfo(goods.getGoodsCd());
  1518. sb.append("\t<product>\n");
  1519. sb.append("\t\t<id>").append(goodsCdArr[i]).append("</id>\n");
  1520. sb.append("\t\t<merchantProductId>").append(goodsCdArr[i]).append("</merchantProductId>\n");
  1521. sb.append("\t\t<ecMallProductId>").append(goodsCdArr[i]).append("</ecMallProductId>\n");
  1522. sb.append("\t\t<name>").append(goods.getGoodsNm()).append("</name>\n");
  1523. sb.append("\t\t<status>").append(goodsStat).append("</status>\n");
  1524. sb.append("\t\t<basePrice>").append(goods.getCurrPrice()).append("</basePrice>\n");
  1525. // TODO http: 부분 운영 프로토콜 확인 후 수정 필요(운영 상품상세가 HTTPS일 경우 분기처리 필요(개발서버, 운영 구분))
  1526. sb.append("\t\t<infoUrl>").append("http:" + domain + "/goods/detail/form?goodsCd=" + goods.getGoodsCd()).append("</infoUrl>\n");
  1527. sb.append("\t\t<imageUrl>").append("http:" + goodsImgUrl + "/" + goods.getSysImgNm()).append("</imageUrl>\n");
  1528. // 12.반품주소
  1529. if (rtnInfo != null && rtnInfo.getRtnLocZipcode() != null && !"".equals(rtnInfo.getRtnLocZipcode())) {
  1530. // 2.1 반품정보
  1531. sb.append("\t\t<returnInfo>\n");
  1532. sb.append("\t\t\t<zipcode>").append(rtnInfo.getRtnLocZipcode()).append("</zipcode>\n");
  1533. sb.append("\t\t\t<address1>").append(rtnInfo.getRtnLocBaseAddr()).append("</address1>\n");
  1534. sb.append("\t\t\t<address2>").append(rtnInfo.getRtnLocDtlAddr()).append("</address2>\n");
  1535. sb.append("\t\t\t<sellername>").append(rtnInfo.getRtnLocNm()).append("</sellername>\n");
  1536. sb.append("\t\t\t<contact1>").append(rtnInfo.getRtnLocTelno()).append("</contact1>\n");
  1537. sb.append("\t\t</returnInfo>\n");
  1538. // 반품배송비, 교환배송비
  1539. sb.append("\t\t<returnShippingFee>").append(goods.getRtnDelvFee()).append("</returnShippingFee>\n");
  1540. sb.append("\t\t<exchangeShippingFee>").append(goods.getDelvFee() + goods.getRtnDelvFee()).append("</exchangeShippingFee>\n");
  1541. }
  1542. // 옵션정보 지원여부 true
  1543. sb.append("\t\t<optionSupport>true</optionSupport>\n");
  1544. // 옵션 정보
  1545. sb.append("\t\t<option>\n");
  1546. // 상품 옵션 전체 정보 조회
  1547. List<GoodsStock> optList = (ArrayList<GoodsStock>) goodsDao.getGoodsOptionInfoList(opt);
  1548. String[] colorNmList = new String[optList.size()];
  1549. String[] sizeList = new String[optList.size()];
  1550. int count = 0;
  1551. // 중복제거
  1552. for(GoodsStock optInfo : optList) {
  1553. colorNmList[count] = optInfo.getOptCd1() + "/" + optInfo.getColorNm();
  1554. sizeList[count++] = optInfo.getOptCd2();
  1555. }
  1556. colorNmList = new HashSet<String>(Arrays.asList(colorNmList)).toArray(new String[0]);
  1557. sizeList = new HashSet<String>(Arrays.asList(sizeList)).toArray(new String[0]);
  1558. if("Y".equals(goods.getSelfGoodsYn())) {
  1559. // 자사 일반 상품 정보
  1560. // 옵션 아이템정보 색상
  1561. sb.append("\t\t\t<optionItem>\n");
  1562. sb.append("\t\t\t\t<type>SELECT</type>\n");
  1563. sb.append("\t\t\t\t<name>색상</name>\n");
  1564. for (String color : colorNmList) {
  1565. String[] optCd1Info = color.split("/");
  1566. sb.append("\t\t\t\t<value>\n");
  1567. sb.append("\t\t\t\t\t<id>").append(optCd1Info[0]).append("</id>\n");
  1568. sb.append("\t\t\t\t\t<text>").append(optCd1Info[1]).append("</text>\n");
  1569. sb.append("\t\t\t\t</value>\n");
  1570. }
  1571. sb.append("\t\t\t</optionItem>\n");
  1572. // 옵션 아이템정보 사이즈
  1573. sb.append("\t\t\t<optionItem>\n");
  1574. sb.append("\t\t\t\t<type>SELECT</type>\n");
  1575. sb.append("\t\t\t\t<name>사이즈</name>\n");
  1576. for (String size : sizeList) {
  1577. sb.append("\t\t\t\t<value>\n");
  1578. sb.append("\t\t\t\t\t<id>").append(size).append("</id>\n");
  1579. sb.append("\t\t\t\t\t<text>").append(size).append("</text>\n");
  1580. sb.append("\t\t\t\t</value>\n");
  1581. }
  1582. sb.append("\t\t\t</optionItem>\n");
  1583. // 옵션 옵션조합정보
  1584. for(GoodsStock optInfo : optList) {
  1585. sb.append("\t\t\t<combination>\n");
  1586. sb.append("\t\t\t\t<manageCode>").append(optInfo.getOptCd()).append("</manageCode>\n");
  1587. sb.append("\t\t\t\t<price>").append(optInfo.getAddPrice()).append("</price>\n");
  1588. sb.append("\t\t\t\t<stockQuantity>").append(optInfo.getStockQty()).append("</stockQuantity>\n");
  1589. sb.append("\t\t\t\t<status>true</status>\n");
  1590. // 옵션 옵션조합정보 색상
  1591. sb.append("\t\t\t\t<options>\n");
  1592. sb.append("\t\t\t\t\t<name>색상</name>\n");
  1593. sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd1()).append("</id>\n");
  1594. sb.append("\t\t\t\t</options>\n");
  1595. // 옵션 옵션조합정보 사이즈
  1596. sb.append("\t\t\t\t<options>\n");
  1597. sb.append("\t\t\t\t\t<name>사이즈</name>\n");
  1598. sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd2()).append("</id>\n");
  1599. sb.append("\t\t\t\t</options>\n");
  1600. sb.append("\t\t\t</combination>\n");
  1601. }
  1602. } else {// 입점업체 상품 정보
  1603. // 옵션 아이템정보 색상
  1604. sb.append("\t\t\t<optionItem>\n");
  1605. sb.append("\t\t\t\t<type>SELECT</type>\n");
  1606. sb.append("\t\t\t\t<name>옵션</name>\n");
  1607. for(GoodsStock optInfo : optList) {
  1608. sb.append("\t\t\t\t<value>\n");
  1609. sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd()).append("</id>\n");
  1610. sb.append("\t\t\t\t\t<text>").append(optInfo.getOptCd1()).append("/").append(optInfo.getOptCd2()).append("</text>\n");
  1611. sb.append("\t\t\t\t</value>\n");
  1612. }
  1613. sb.append("\t\t\t</optionItem>\n");
  1614. // 옵션 옵션조합정보
  1615. for(GoodsStock optInfo : optList) {
  1616. sb.append("\t\t\t<combination>\n");
  1617. sb.append("\t\t\t\t<manageCode>").append(optInfo.getOptCd()).append("</manageCode>\n");
  1618. sb.append("\t\t\t\t<price>").append(optInfo.getAddPrice()).append("</price>\n");
  1619. sb.append("\t\t\t\t<stockQuantity>").append(optInfo.getStockQty()).append("</stockQuantity>\n");
  1620. sb.append("\t\t\t\t<status>true</status>\n");
  1621. sb.append("\t\t\t\t<options>\n");
  1622. sb.append("\t\t\t\t\t<name>옵션</name>\n");
  1623. sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd()).append("</id>\n");
  1624. sb.append("\t\t\t\t</options>\n");
  1625. sb.append("\t\t\t</combination>\n");
  1626. }
  1627. }
  1628. sb.append("\t\t</option>\n");
  1629. // 10. 배송정보조회
  1630. // 5.2.1 업체별 기본배송비, 무료배송비
  1631. String delvFeeCd = "";
  1632. if("Y".equals(goods.getSelfGoodsYn())) {
  1633. delvFeeCd = "WMS";
  1634. } else {
  1635. delvFeeCd = goods.getDelvFeeCd();
  1636. }
  1637. String delvFeeCrite = "CHARGE";
  1638. int delvFee = goods.getDelvFee();
  1639. String feePayType = "PREPAYED";
  1640. // 배송비 조건
  1641. if(TscConstants.DelvFeeCrite.NORMAL.value().equals(goods.getDelvFeeCrite())) {
  1642. delvFeeCrite = "CONDITIONAL_FREE"; // 조건부 무료(배송비 조건이 무료이거나 배송 방법이 착불일때만 배송비는 0원으로 변경)
  1643. } else if(TscConstants.DelvFeeCrite.FREE.value().equals(goods.getDelvFeeCrite())) {
  1644. delvFeeCrite = "FREE";
  1645. feePayType = "FREE";
  1646. delvFee = 0;
  1647. }
  1648. sb.append("\t\t<shippingPolicy>\n");
  1649. sb.append("\t\t\t<groupId>").append(delvFeeCd).append("</groupId>\n");
  1650. sb.append("\t\t\t<method>").append("DELIVERY").append("</method>\n");
  1651. sb.append("\t\t\t<feeType>").append(delvFeeCrite).append("</feeType>\n");
  1652. sb.append("\t\t\t<feePayType>").append(feePayType).append("</feePayType>\n");
  1653. sb.append("\t\t\t<feePrice>").append(delvFee).append("</feePrice>\n");
  1654. if(!"FREE".equals(delvFeeCrite)) {
  1655. sb.append("\t\t\t<conditionalFree>\n");
  1656. sb.append("\t\t\t\t<basePrice>").append(goods.getMinOrdAmt()).append("</basePrice>\n");
  1657. sb.append("\t\t\t</conditionalFree>\n");
  1658. }
  1659. sb.append("\t\t</shippingPolicy>\n");
  1660. sb.append("\t</product>\n");
  1661. }
  1662. }
  1663. sb.append("</products>\n");
  1664. //for end
  1665. } catch (Exception e) {
  1666. e.printStackTrace();
  1667. } finally {
  1668. log.info("CHECK CREATE NAVERPAY GOODS XML ::::: \n{}", sb.toString());
  1669. // log.info("CHECK NAVERPAY XML LENGTH ::::: {}", sb.length());
  1670. write(response, sb);
  1671. }
  1672. }
  1673. /**
  1674. * Write XML Data and flush
  1675. * @param response - HttpServletResponse
  1676. * @param result - 결과
  1677. * @author xodud1202
  1678. * @since 2021. 05. 13
  1679. */
  1680. public void write(HttpServletResponse response, StringBuilder result) throws Exception {
  1681. Writer writer = null;
  1682. try {
  1683. response.setContentType("text/xml; charset=utf-8");
  1684. response.setHeader("Cache-Control", "no-cache");
  1685. writer = response.getWriter();
  1686. writer.write(result.toString());
  1687. writer.flush();
  1688. } catch(Exception e) {
  1689. e.printStackTrace();
  1690. throw new IllegalStateException("상품 정보 등록 실패");
  1691. } finally {
  1692. if (writer != null) writer.close();
  1693. }
  1694. }
  1695. /**
  1696. * 장바구니정보 주문번호 이력 등록
  1697. * @param param
  1698. * @author xodud1202
  1699. * @since 2021. 05. 10
  1700. */
  1701. @Transactional("shopTxnManager")
  1702. public String insertCartHstOrdNo(Order order) {
  1703. // cartsq
  1704. for (int i=0 ; i<order.getCartSqArr().length ; i++) {
  1705. Cart cart = new Cart();
  1706. cart.setOrdNo(order.getOrdNo());
  1707. cart.setCartSq(order.getCartSqArr()[i]);
  1708. cart.setRegNo(order.getCustNo());
  1709. // 장바구니 이력등록
  1710. cartDao.insertCartHst(cart);
  1711. }
  1712. return "SUCCESS";
  1713. }
  1714. /**
  1715. * 장바구니정보 주문번호 삭제
  1716. * @param param
  1717. * @author xodud1202
  1718. * @since 2021. 05. 10
  1719. */
  1720. @Transactional("shopTxnManager")
  1721. public String deleteCartOrdNo(Order order) {
  1722. // 주문번호 존재할때만 실행
  1723. if (order.getOrdNo() > 0) {
  1724. // 장바구니 이력등록
  1725. Cart cart = new Cart();
  1726. cart.setOrdNo(order.getOrdNo());
  1727. // 2021.05.10 주문완료 주문번호로 장바구니정보 삭제
  1728. cartDao.deleteCartOrdNo(cart);
  1729. // 2021.05.10 주문완료 주문번호로 장바구니상세정보 삭제
  1730. cartDao.deleteCartDetailOrdNo(cart);
  1731. }
  1732. return "SUCCESS";
  1733. }
  1734. /**
  1735. * 보증보험정보 update
  1736. * @param param
  1737. * @author xodud1202
  1738. * @since 2021. 05. 10
  1739. */
  1740. @Transactional("shopTxnManager")
  1741. public String updateInsurance(Order order) {
  1742. // 주문번호 존재할때만 실행
  1743. if (order.getOrdNo() > 0) {
  1744. // 보증보험 API 연동위한 정보조회
  1745. Collection<Order> goodsInfoList = orderDao.getGoodsInfoForInsurance(order);
  1746. if (goodsInfoList.size() > 0) {
  1747. String[] goodsNameArr = new String[goodsInfoList.size()];
  1748. String[] goodsPriceArr = new String[goodsInfoList.size()];
  1749. String[] goodsQuantityArr = new String[goodsInfoList.size()];
  1750. int realOrdAmt = 0;
  1751. int index = 0;
  1752. for (Order goodsInfo : goodsInfoList) {
  1753. goodsNameArr[index] = goodsInfo.getGoodsNm();
  1754. goodsPriceArr[index] = String.valueOf(goodsInfo.getRealOrdAmt());
  1755. goodsQuantityArr[index] = String.valueOf(goodsInfo.getOrdQty());
  1756. realOrdAmt = realOrdAmt + goodsInfo.getRealOrdAmt();
  1757. if (index == 0) {
  1758. order.setBirthYmd(goodsInfo.getBirthGen()); // 생년월일 + 성별(남자 : 1, 여자 : 2)
  1759. order.setPayMeans(goodsInfo.getPayMeans()); // 무통장입금 or 계좌이체
  1760. order.setBankNm(goodsInfo.getBankNm()); // 은행명 >> PG 송부 후 result에서 값 입력하면됨
  1761. order.setOrdNm(goodsInfo.getOrdNm()); // 주문자명
  1762. order.setVaNo(goodsInfo.getVaNo()); // 가상계좌번호
  1763. order.setOrdPhnno(goodsInfo.getOrdPhnno()); // 주문자전화2 ("-" 포함)
  1764. order.setOrdEmail(goodsInfo.getOrdEmail()); // 주문자이메일
  1765. order.setRecipNm(goodsInfo.getRecipNm()); // 수령인명
  1766. order.setRecipPhnno(goodsInfo.getRecipPhnno()); // 수령인휴대폰번호
  1767. order.setRecipZipcode(goodsInfo.getRecipZipcode()); // 주문자우편번호
  1768. order.setRecipAddr(goodsInfo.getRecipBaseAddr() + goodsInfo.getRecipDtlAddr()); // 주문자주소
  1769. order.setCustNo(order.getCustNo()); // 고객번호
  1770. }
  1771. index++;
  1772. }
  1773. order.setItemNmArr(goodsNameArr); // 상품명 배열
  1774. order.setGoodsPriceArr(goodsPriceArr); // 상품별 가격 배열
  1775. order.setItemQtyArr(goodsQuantityArr); // 상품별 수량 배열
  1776. order.setOrdNo(order.getOrdNo()); // 주문번호
  1777. order.setRealOrdAmt(realOrdAmt); // 결제금액
  1778. if (TscConstants.PayMeans.ACCOUNT_TRANSFER.value().equals(order.getPayMeans()) || TscConstants.PayMeans.BANK_DEPOSIT.value().equals(order.getPayMeans())) {
  1779. uSafeGuaranteeInsurance(order);
  1780. }
  1781. }
  1782. }
  1783. return "SUCCESS";
  1784. }
  1785. /**
  1786. * 비회원 주문 여부 정보 조회
  1787. *
  1788. * @param Order
  1789. * @return int
  1790. * @author card007
  1791. * @since 2021. 05. 26
  1792. */
  1793. public int getNoMemberOrderInfo(Order order) {
  1794. return orderDao.getNoMemberOrderInfo(order);
  1795. }
  1796. }