TsaGoodsService.java 125 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031
  1. package com.style24.admin.biz.service;
  2. import java.io.IOException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.ArrayList;
  5. import java.util.Collection;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.core.env.Environment;
  9. import org.springframework.stereotype.Service;
  10. import org.springframework.transaction.annotation.Transactional;
  11. import com.fasterxml.jackson.core.type.TypeReference;
  12. import com.fasterxml.jackson.databind.ObjectMapper;
  13. import com.style24.admin.biz.dao.TsaGoodsDao;
  14. import com.style24.admin.support.env.TsaConstants;
  15. import com.style24.admin.support.security.session.TsaSession;
  16. import com.style24.core.biz.service.TscCommonService;
  17. import com.style24.core.biz.thirdparty.NaverLowestPriceApi;
  18. import com.style24.core.biz.thirdparty.SafetyKoreaApi;
  19. import com.style24.core.support.message.TscMessageByLocale;
  20. import com.style24.persistence.domain.AdKeyword;
  21. import com.style24.persistence.domain.AdKeywordGoods;
  22. import com.style24.persistence.domain.Brand;
  23. import com.style24.persistence.domain.Color;
  24. import com.style24.persistence.domain.CommonCode;
  25. import com.style24.persistence.domain.DelvFeePolicy;
  26. import com.style24.persistence.domain.FreeGoods;
  27. import com.style24.persistence.domain.Goods;
  28. import com.style24.persistence.domain.GoodsCategory;
  29. import com.style24.persistence.domain.GoodsCompose;
  30. import com.style24.persistence.domain.GoodsDesc;
  31. import com.style24.persistence.domain.GoodsEpSkip;
  32. import com.style24.persistence.domain.GoodsHst;
  33. import com.style24.persistence.domain.GoodsImg;
  34. import com.style24.persistence.domain.GoodsMass;
  35. import com.style24.persistence.domain.GoodsNaverLowestPrice;
  36. import com.style24.persistence.domain.GoodsNotiInfo;
  37. import com.style24.persistence.domain.GoodsPriceRes;
  38. import com.style24.persistence.domain.GoodsResSell;
  39. import com.style24.persistence.domain.GoodsSafeNo;
  40. import com.style24.persistence.domain.GoodsSearch;
  41. import com.style24.persistence.domain.GoodsSupplyPrice;
  42. import com.style24.persistence.domain.GoodsTnmRes;
  43. import com.style24.persistence.domain.GoodsVideo;
  44. import com.style24.persistence.domain.IfIncomelot;
  45. import com.style24.persistence.domain.IfProductSku;
  46. import com.style24.persistence.domain.Itemkind;
  47. import com.style24.persistence.domain.NaverLowestPrice;
  48. import com.style24.persistence.domain.NotiInfo;
  49. import com.style24.persistence.domain.Notice;
  50. import com.style24.persistence.domain.NoticeGoods;
  51. import com.style24.persistence.domain.Option;
  52. import com.style24.persistence.domain.ReinboundInform;
  53. import com.style24.persistence.domain.SearchData;
  54. import com.style24.persistence.domain.SizeInfo;
  55. import com.style24.persistence.domain.SupplyCompany;
  56. import com.style24.persistence.domain.WmsColorMapping;
  57. import com.style24.persistence.domain.WmsGoods;
  58. import com.style24.persistence.domain.WmsSeasonMapping;
  59. import com.style24.persistence.domain.WmsStyleYearMapping;
  60. import io.netty.util.internal.StringUtil;
  61. import lombok.extern.slf4j.Slf4j;
  62. import com.gagaframework.excel.GagaExcelUtil;
  63. import com.gagaframework.excel.env.GagaExcelConstants;
  64. import com.gagaframework.web.parameter.GagaMap;
  65. import com.gagaframework.web.util.GagaDateUtil;
  66. import com.gagaframework.web.util.GagaFileUtil;
  67. import com.gagaframework.web.util.GagaStringUtil;
  68. /**
  69. *상품관리 Service
  70. *
  71. * @author eskim
  72. * @since 2020. 10. 16
  73. */
  74. @Service
  75. @Slf4j
  76. public class TsaGoodsService {
  77. @Autowired
  78. private TscMessageByLocale message;
  79. @Autowired
  80. private Environment env;
  81. @Autowired
  82. private TsaGoodsDao goodsDao;
  83. @Autowired
  84. private TsaBusinessService businessService;
  85. @Autowired
  86. private TsaCommonService commonService;
  87. @Autowired
  88. private TscCommonService tscCommonService;
  89. @Autowired
  90. private TsaNoticeService noticeService;
  91. @Autowired
  92. private TsaDisplayService displayService;
  93. @Autowired
  94. private TsaRendererService rendererService;
  95. @Autowired
  96. private SafetyKoreaApi safetyKoreaApi;
  97. @Autowired
  98. private NaverLowestPriceApi naverLowestPriceApi;
  99. @Autowired
  100. private TsaWmsGoodsService wmsGoodsService;
  101. @Autowired
  102. private ObjectMapper mapper;
  103. private static final String NUMBER_PATTERN = "^[0-9]+$";
  104. private static final String UPDATE_NO_PATTERN = "X";
  105. private static final String SELF_GOOODS_AFTER = "STY";
  106. private static final int EXCEL_ROW_COUNT = 500;
  107. /**
  108. * 상품 할인율 계산
  109. *
  110. * @param value
  111. * @param len
  112. * @param pad
  113. * @return
  114. */
  115. private long getDcRate(int listPrice, int currPrice) {
  116. double rate = (double)(currPrice) / (double)(listPrice);
  117. return 100 - (long)((Math.round(rate * 100) / 100.0) * 100);
  118. }
  119. /**
  120. * 품목 목록
  121. * @param itemkind
  122. * @return
  123. * @author eskim
  124. * @since 2020. 10. 16
  125. */
  126. public Collection<Itemkind> getItemkindList(Itemkind itemkind) {
  127. return goodsDao.getItemkindList(itemkind);
  128. }
  129. /**
  130. * 품목 저장
  131. *
  132. * @param itemkindList - 품목 정보 목록
  133. * @author eskim
  134. * @since 2020. 10. 16
  135. */
  136. @Transactional("shopTxnManager")
  137. public void saveItemkindInfo(Collection<Itemkind> itemkindList) {
  138. for (Itemkind itemkind : itemkindList) {
  139. itemkind.setRegNo(TsaSession.getInfo().getUserNo());
  140. itemkind.setUpdNo(TsaSession.getInfo().getUserNo());
  141. itemkind.setItemkindNm(GagaStringUtil.replace(GagaStringUtil.replace(itemkind.getItemkindNm(), "&lt;", "<"), "&gt;", ">"));
  142. //itemkind.setItemkindEnm(GagaStringUtil.replace(GagaStringUtil.replace(itemkind.getItemkindEnm(), "&lt;", "<"),"&gt;", ">"));
  143. goodsDao.saveItemkindInfo(itemkind);
  144. }
  145. }
  146. /**
  147. * 품목 삭제
  148. *
  149. * @param itemkindList - 품목 정보 목록
  150. * @author eskim
  151. * @since 2020. 10. 16
  152. */
  153. @Transactional("shopTxnManager")
  154. public void deleteItemkindInfo(Collection<Itemkind> itemkindList) {
  155. for (Itemkind itemkind : itemkindList) {
  156. goodsDao.deleteItemkindInfo(itemkind);
  157. }
  158. }
  159. /**
  160. * 색상목록 조회
  161. *
  162. * @param color
  163. * @return
  164. * @author eskim
  165. * @since 2020. 10. 16
  166. */
  167. public Collection<Color> getColorList(Color color) {
  168. return goodsDao.getColorList(color);
  169. }
  170. /**
  171. * 색상 저장
  172. *
  173. * @param colorList
  174. * @return
  175. * @author eskim
  176. * @since 2020. 10. 16
  177. */
  178. @Transactional("shopTxnManager")
  179. public void saveColor(Collection<Color> colorList) {
  180. for (Color color : colorList) {
  181. color.setRegNo(TsaSession.getInfo().getUserNo());
  182. color.setUpdNo(TsaSession.getInfo().getUserNo());
  183. goodsDao.saveColor(color);
  184. }
  185. }
  186. /**
  187. * 상품정보고시 목록
  188. *
  189. * @param notiInfo
  190. * @return
  191. * @author eskim
  192. * @since 2010. 10. 19
  193. */
  194. public Collection<NotiInfo> getNotiInfoList(NotiInfo notiInfo) {
  195. return goodsDao.getNotiInfoList(notiInfo);
  196. }
  197. /**
  198. * 상품정보고시 항목 목록
  199. *
  200. * @param notiInfo
  201. * @return
  202. * @author eskim
  203. * @since 2010. 10. 19
  204. */
  205. public Collection<NotiInfo> getNotiInfoItemList(NotiInfo notiInfo) {
  206. return goodsDao.getNotiInfoItemList(notiInfo);
  207. }
  208. /**
  209. * 상품정보고시 항목 저장
  210. *
  211. * @param notiInfoList
  212. * @return
  213. * @author eskim
  214. * @since 2010. 10. 19
  215. */
  216. @Transactional("shopTxnManager")
  217. public void saveNotiInfoItem(Collection<NotiInfo> notiInfoList) {
  218. if (notiInfoList == null || notiInfoList.isEmpty()) {
  219. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  220. }
  221. for (NotiInfo notiInfo : notiInfoList) {
  222. if (!StringUtils.isBlank(notiInfo.getNiContent())) {
  223. notiInfo.setNiContent(GagaStringUtil.replace(GagaStringUtil.replace(notiInfo.getNiContent(), "&lt;", "<"), "&gt;", ">"));
  224. }
  225. notiInfo.setRegNo(TsaSession.getInfo().getUserNo());
  226. notiInfo.setUpdNo(TsaSession.getInfo().getUserNo());
  227. goodsDao.saveNotiInfo(notiInfo);
  228. }
  229. }
  230. /**
  231. * WMS 색상 매핑목록 조회
  232. *
  233. * @param color
  234. * @return
  235. * @author eskim
  236. * @since 2020. 10. 16
  237. */
  238. public Collection<WmsColorMapping> getWmsColorMappingList(WmsColorMapping wmsColorMapping) {
  239. return goodsDao.getWmsColorMappingList(wmsColorMapping);
  240. }
  241. /**
  242. * WMS 색상 매핑 저장
  243. *
  244. * @param colorList
  245. * @return
  246. * @author eskim
  247. * @since 2020. 10. 16
  248. */
  249. @Transactional("shopTxnManager")
  250. public void saveWmsColorMapping(Collection<WmsColorMapping> wmsColorMappingList) {
  251. for (WmsColorMapping wmsColorMapping : wmsColorMappingList) {
  252. wmsColorMapping.setRegNo(TsaSession.getInfo().getUserNo());
  253. wmsColorMapping.setUpdNo(TsaSession.getInfo().getUserNo());
  254. goodsDao.saveWmsColorMapping(wmsColorMapping);
  255. }
  256. }
  257. /**
  258. * WMS 스타일년도 매핑목록 조회
  259. *
  260. * @param wmsStyleYearMapping
  261. * @return
  262. * @author eskim
  263. * @since 2020. 11. 13
  264. */
  265. public Collection<WmsStyleYearMapping> getWmsStyleYearMappingList(WmsStyleYearMapping wmsStyleYearMapping) {
  266. return goodsDao.getWmsStyleYearMappingList(wmsStyleYearMapping);
  267. }
  268. /**
  269. * WMS 스타일년도 매핑 저장
  270. *
  271. * @param wmsStyleYearMappingList
  272. * @return
  273. * @author eskim
  274. * @since 2020. 11. 13
  275. */
  276. @Transactional("shopTxnManager")
  277. public void saveWmsStyleYearMapping(Collection<WmsStyleYearMapping> wmsStyleYearMappingList) {
  278. for (WmsStyleYearMapping wmsStyleYearMapping : wmsStyleYearMappingList) {
  279. wmsStyleYearMapping.setRegNo(TsaSession.getInfo().getUserNo());
  280. wmsStyleYearMapping.setUpdNo(TsaSession.getInfo().getUserNo());
  281. goodsDao.saveWmsStyleYearMapping(wmsStyleYearMapping);
  282. }
  283. }
  284. /**
  285. * WMS 시즌 매핑목록 조회
  286. *
  287. * @param wmsSeasonMapping
  288. * @return
  289. * @author eskim
  290. * @since 2020. 11. 13
  291. */
  292. public Collection<WmsSeasonMapping> getWmsSeasonMappingList(WmsSeasonMapping wmsSeasonMapping) {
  293. return goodsDao.getWmsSeasonMappingList(wmsSeasonMapping);
  294. }
  295. /**
  296. * WMS 시즌 매핑 저장
  297. *
  298. * @param wmsSeasonMappingList
  299. * @return
  300. * @author eskim
  301. * @since 2020. 11. 13
  302. */
  303. @Transactional("shopTxnManager")
  304. public void saveWmsSeasonMapping(Collection<WmsSeasonMapping> wmsSeasonMappingList) {
  305. for (WmsSeasonMapping wmsSeasonMapping : wmsSeasonMappingList) {
  306. wmsSeasonMapping.setRegNo(TsaSession.getInfo().getUserNo());
  307. wmsSeasonMapping.setUpdNo(TsaSession.getInfo().getUserNo());
  308. goodsDao.saveWmsSeasonMapping(wmsSeasonMapping);
  309. }
  310. }
  311. /**
  312. * 상품 목록 건수
  313. *
  314. * @param goodsSearch
  315. * @return
  316. * @author eskim
  317. * @since 2020. 10. 20
  318. */
  319. public int getGoodsListCount(GoodsSearch goodsSearch) {
  320. return goodsDao.getGoodsListCount(goodsSearch);
  321. }
  322. /**
  323. * 상품 목록
  324. *
  325. * @param goodsSearch
  326. * @return
  327. * @author eskim
  328. * @since 2020. 10. 20
  329. */
  330. public Collection<Goods> getGoodsList(GoodsSearch goodsSearch) {
  331. return goodsDao.getGoodsList(goodsSearch);
  332. }
  333. /**
  334. * 상품목록 - 기본정보 엑셀다운로드
  335. *
  336. * @param goodsSearch
  337. * @param excelFilenameWithPath - 경로를 포함한 엑셀파일명
  338. * @return
  339. * @author eskim
  340. * @since 2020. 10. 21
  341. */
  342. public void getGoodsInfoExcelList(GoodsSearch goodsSearch, String excelFilenameWithPath) {
  343. if ("Y".equals(goodsSearch.getImageViewYn())) {
  344. // 헤더 title 설정
  345. String[] listTitles = {"이미지", "상품코드", "업체명", "브랜드명", "상품명", "품목", "전시재고", "상품상태", "스타일년도", "시즌",
  346. "정상가", "판매가", "자사즉시할인가", "가격변경일", "ERP재고연동여부", "정상이월구분", "반품가능 여부"};
  347. // DB 처리 시 사용되는 파라미터명(셀명) 설정
  348. String[] cellNames = {"SYS_IMG_NM", "GOODS_CD", "SUPPLY_COMP_CD", "BRAND_ENM", "GOODS_NM", "ITEMKIND_NM",
  349. "STOCK_QTY_SUM", "GOODS_STAT", "STYLE_YEAR", "SEASON_CD", "LIST_PRICE", "CURR_PRICE",
  350. "BENEFIT_PRICE", "PRICE_UPD_DT", "ERP_STOCK_LINK_YN", "FORMAL_GB", "RETURNABLE_YN"};
  351. String[] cellTypes = {GagaExcelConstants.CellType.IMAGE.name(),
  352. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
  353. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
  354. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
  355. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
  356. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
  357. GagaExcelConstants.CellType.CHAR_RIGHT.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
  358. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
  359. GagaExcelConstants.CellType.CHAR_CENTER.name(),
  360. GagaExcelConstants.CellType.CHAR_CENTER.name()};
  361. String targetPath = env.getProperty("upload.goods.view");
  362. Collection<GagaMap> dataList = goodsDao.getGoodsInfoExcelList(goodsSearch); // map형식으로 조회
  363. if (dataList != null && !dataList.isEmpty()) {
  364. for (GagaMap gagaMap : dataList) {
  365. if (!StringUtils.isBlank(gagaMap.get("SYS_IMG_NM").toString())) {
  366. gagaMap.set("SYS_IMG_NM", targetPath + '/' + gagaMap.get("SYS_IMG_NM").toString() + "?RS=60");
  367. }
  368. }
  369. }
  370. try {
  371. GagaExcelUtil.createExcel(excelFilenameWithPath, dataList, "상품 정보", listTitles, cellNames, cellTypes, TsaConstants.EXCEL_FOOTER_TITLE);
  372. } catch (Exception e) {
  373. throw new IllegalStateException(e);
  374. }
  375. } else {
  376. // 헤더 title 설정
  377. String[] listTitles = {"상품코드", "업체명", "브랜드명", "상품명", "품목", "전시재고", "상품상태", "스타일년도", "시즌",
  378. "정상가", "판매가", "자사즉시할인가", "가격변경일", "ERP재고연동여부", "정상이월구분", "반품가능 여부"};
  379. // DB 처리 시 사용되는 파라미터명(셀명) 설정
  380. String[] cellNames = {"GOODS_CD", "SUPPLY_COMP_CD", "BRAND_ENM", "GOODS_NM", "ITEMKIND_NM", "STOCK_QTY_SUM", "GOODS_STAT", "STYLE_YEAR",
  381. "SEASON_CD", "LIST_PRICE", "CURR_PRICE", "BENEFIT_PRICE", "PRICE_UPD_DT", "ERP_STOCK_LINK_YN", "FORMAL_GB", "RETURNABLE_YN"};
  382. String[] cellTypes = {
  383. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
  384. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
  385. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
  386. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
  387. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
  388. GagaExcelConstants.CellType.CHAR_RIGHT.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
  389. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
  390. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name()};
  391. Collection<GagaMap> dataList = goodsDao.getGoodsInfoExcelList(goodsSearch);
  392. try {
  393. GagaExcelUtil.createExcel(excelFilenameWithPath, dataList, "상품 정보", listTitles, cellNames, cellTypes, TsaConstants.EXCEL_FOOTER_TITLE);
  394. } catch (Exception e) {
  395. throw new IllegalStateException(e);
  396. }
  397. }
  398. }
  399. /**
  400. * 상품 이미지 등록여부 조회
  401. *
  402. * @param goods
  403. * @return
  404. * @author eskim
  405. * @since 2020. 10. 21
  406. */
  407. public Collection<Goods> getGoodsImgsYn(Goods goods) {
  408. return goodsDao.getGoodsImgsYn(goods);
  409. }
  410. /**
  411. * 상품 상세
  412. *
  413. * @param goods
  414. * @return
  415. * @author eskim
  416. * @since 2020. 10. 22
  417. */
  418. public Goods getGoods(Goods goods) {
  419. // 상품기본정보
  420. Goods resultGoods = goodsDao.getGoods(goods);
  421. // 상품 상세
  422. this.getGoodsDesc(resultGoods);
  423. return resultGoods;
  424. }
  425. /**
  426. * 상품 상세 조회
  427. *
  428. * @param resultGoods
  429. * @return
  430. * @author eskim
  431. * @since 2020. 10. 22
  432. */
  433. private Goods getGoodsDesc(Goods resultGoods) {
  434. GoodsDesc goods = new GoodsDesc();
  435. goods.setGoodsCd(resultGoods.getGoodsCd());
  436. // 상품 상세 타이틀
  437. goods.setDescGb("10");
  438. String goodsTitlesDesc = this.getGoodsDescList(goods);
  439. resultGoods.setGoodsTitlesDesc(goodsTitlesDesc);
  440. // 상품 상세 내용
  441. goods.setDescGb("20");
  442. String goodsContentsDesc = this.getGoodsDescList(goods);
  443. resultGoods.setGoodsContentsDesc(goodsContentsDesc);
  444. // 상품 상세 특징
  445. goods.setDescGb("30");
  446. String goodsCharacterDesc = this.getGoodsDescList(goods);
  447. resultGoods.setGoodsCharacterDesc(goodsCharacterDesc);
  448. // 상품 상세 pc 상단
  449. goods.setDescGb("40");
  450. String goodsPcTopDesc = this.getGoodsDescList(goods);
  451. resultGoods.setGoodsPcTopDesc(goodsPcTopDesc);
  452. // 상품 상세 pc 하단
  453. goods.setDescGb("50");
  454. String goodsPcDownDesc = this.getGoodsDescList(goods);
  455. resultGoods.setGoodsPcDownDesc(goodsPcDownDesc);
  456. // 상품 상세 mobile 상단
  457. goods.setDescGb("60");
  458. String goodsMobileTopDesc = this.getGoodsDescList(goods);
  459. resultGoods.setGoodsMobileTopDesc(goodsMobileTopDesc);
  460. // 상품 상세 mobile 하단
  461. goods.setDescGb("70");
  462. String goodsMobileDownDesc = this.getGoodsDescList(goods);
  463. resultGoods.setGoodsMobileDownDesc(goodsMobileDownDesc);
  464. // 상품 상세 (as-is)
  465. goods.setDescGb("80");
  466. String goodsDesc = this.getGoodsDescList(goods);
  467. resultGoods.setGoodsDesc(goodsDesc);
  468. return resultGoods;
  469. }
  470. /**
  471. * 상품 상세구분별 컨텐츠 조회
  472. *
  473. * @param goods
  474. * @return
  475. * @author eskim
  476. * @since 2020. 10. 22
  477. */
  478. private String getGoodsDescList(GoodsDesc goodsDesc) {
  479. Collection<GoodsDesc> goodsDescList = goodsDao.getGoodsDescList(goodsDesc);
  480. StringBuilder goodsDescSb = new StringBuilder();
  481. if (goodsDescList != null && !goodsDescList.isEmpty()) {
  482. for (GoodsDesc tmpGoodsDesc : goodsDescList) {
  483. goodsDescSb.append(tmpGoodsDesc.getGoodsDesc());
  484. }
  485. } else {
  486. goodsDescSb.append("");
  487. }
  488. return goodsDescSb.toString();
  489. }
  490. /**
  491. * 상품 정보 이력 조회
  492. *
  493. * @param goods
  494. * @return
  495. * @author eskim
  496. * @since 2019. 12. 12
  497. */
  498. public Collection<GoodsHst> getGoodsHstList(Goods goods) {
  499. return goodsDao.getGoodsHstList(goods);
  500. }
  501. /**
  502. * 상품 옵션 조회
  503. *
  504. * @param goods
  505. * @return
  506. * @author eskim
  507. * @since 2020. 10. 26
  508. */
  509. public Collection<Option> getGoodsSizeList(Goods goods) {
  510. return goodsDao.getGoodsSizeList(goods);
  511. }
  512. /**
  513. * 상품 색상목록 조회
  514. *
  515. * @param goods
  516. * @return
  517. * @author eskim
  518. * @since 2020. 11. 18
  519. */
  520. public Collection<GoodsImg> getGoodsColorList(Goods goods) {
  521. return goodsDao.getGoodsColorList(goods);
  522. }
  523. /**
  524. * 상품 정보고시 조회
  525. *
  526. * @param goods
  527. * @return
  528. * @author eskim
  529. * @since 2020. 10. 22
  530. */
  531. public Collection<GoodsNotiInfo> getGoodsNotiInfoList(GoodsNotiInfo goodsNotiInfo) {
  532. return goodsDao.getGoodsNotiInfoList(goodsNotiInfo);
  533. }
  534. /**
  535. * 상품의 정보고시 항목 목록
  536. *
  537. * @param notiInfo
  538. * @return
  539. * @author eskim
  540. * @since 2020. 11. 18
  541. */
  542. public Collection<NotiInfo> getNotiGoodsInfoList(NotiInfo notiInfo) {
  543. return goodsDao.getNotiGoodsInfoList(notiInfo);
  544. }
  545. /**
  546. * 상품 구매등급 조회
  547. *
  548. * @param goods
  549. * @return
  550. * @author eskim
  551. * @since 2020. 11. 18
  552. */
  553. public Collection<Goods> getGoodsDetailOrderGradeList(Goods goods) {
  554. return goodsDao.getGoodsDetailOrderGradeList(goods);
  555. }
  556. /**
  557. * 상품 안전인증 조회
  558. *
  559. * @param goods
  560. * @return
  561. * @author eskim
  562. * @since 2021. 05. 10
  563. */
  564. public GoodsSafeNo getGoodsDetailSafe(Goods goods) {
  565. return goodsDao.getGoodsDetailSafe(goods);
  566. }
  567. /**
  568. * 구성상품 목록
  569. *
  570. * @param goods
  571. * @return
  572. * @author eskim
  573. * @since 2020. 10. 27
  574. */
  575. public Collection<GoodsCompose> getGoodsDetailComposeList(Goods goods) {
  576. return goodsDao.getGoodsDetailComposeList(goods);
  577. }
  578. /**
  579. * 안전인증번호
  580. *
  581. * @param goods
  582. * @return
  583. * @author eskim
  584. * @since 2020. 12. 07
  585. */
  586. public GagaMap getGoodsDetailCertNum(String goodsCd) {
  587. GagaMap result = new GagaMap();
  588. return result;
  589. }
  590. /**
  591. * 안전인증번호 저장
  592. *
  593. * @param goods
  594. * @return
  595. * @author eskim
  596. * @since 2020. 12. 07
  597. */
  598. @Transactional("shopTxnManager")
  599. public void saveGoodsDetailCertNum(GoodsSafeNo goodsSafeNo) {
  600. try {
  601. //인증대상
  602. if ("G083_1".equals(goodsSafeNo.getCertTargetGb())) {
  603. //인증형태 (방송통신, 위해) or 인증타입 - 공급자적합성
  604. if ("G084_4".equals(goodsSafeNo.getCertFormGb()) || "G084_5".equals(goodsSafeNo.getCertFormGb()) || "G081_3".equals(goodsSafeNo.getCertType())) {
  605. goodsSafeNo.setCertDt("");
  606. // goodsSafeNo.setCertNum("");
  607. goodsSafeNo.setCertState("");
  608. goodsSafeNo.setCertDiv("");
  609. goodsSafeNo.setCertOrganName("");
  610. goodsSafeNo.setRegNo(TsaSession.getInfo().getUserNo());
  611. goodsSafeNo.setUpdNo(TsaSession.getInfo().getUserNo());
  612. goodsDao.saveGoodsSafeNo(goodsSafeNo);
  613. } else {
  614. GagaMap result = safetyKoreaApi.getKoreaCertifyDetail(goodsSafeNo.getCertNum());
  615. if (result != null || !StringUtil.isNullOrEmpty(result.get("certNum").toString())) {
  616. goodsSafeNo.setCertDt(result.get("certDt").toString());
  617. goodsSafeNo.setCertState(result.get("certState").toString());
  618. goodsSafeNo.setCertDiv(result.get("certDiv").toString());
  619. goodsSafeNo.setCertOrganName(result.get("certOrganName").toString());
  620. goodsSafeNo.setRegNo(TsaSession.getInfo().getUserNo());
  621. goodsSafeNo.setUpdNo(TsaSession.getInfo().getUserNo());
  622. goodsDao.saveGoodsSafeNo(goodsSafeNo);
  623. } else {
  624. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  625. }
  626. }
  627. } else { //인증대상 그외 - 인증처리 안해도 됨
  628. goodsSafeNo.setCertDt("");
  629. // goodsSafeNo.setCertNum("");
  630. goodsSafeNo.setCertState("");
  631. goodsSafeNo.setCertDiv("");
  632. goodsSafeNo.setCertOrganName("");
  633. goodsSafeNo.setRegNo(TsaSession.getInfo().getUserNo());
  634. goodsSafeNo.setUpdNo(TsaSession.getInfo().getUserNo());
  635. goodsDao.saveGoodsSafeNo(goodsSafeNo);
  636. }
  637. } catch (Exception e) {
  638. e.printStackTrace();
  639. }
  640. }
  641. /**
  642. * 상품 수정 항목 일괄변경
  643. *
  644. * @param goods
  645. * @author eskim
  646. * @since 2020. 01. 17
  647. */
  648. @Transactional("shopTxnManager")
  649. public void updateGoodsState(Goods goods) {
  650. if (goods == null || (goods.getArrGoodsCd() == null && goods.getArrGoodsCd().length <= 0)) {
  651. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  652. }
  653. goods.setRegNo(TsaSession.getInfo().getUserNo());
  654. goods.setUpdNo(TsaSession.getInfo().getUserNo());
  655. if (goods.getArrGoodsCd().length > 0) {
  656. for (String goodsCd : goods.getArrGoodsCd()) {
  657. goods.setGoodsCd(goodsCd);
  658. // 이력생성
  659. goodsDao.createGoodsHst(goods);
  660. if ("formalGb".equals(goods.getProcJob())) {
  661. // 상품브랜드 조회
  662. Goods originGoods = goodsDao.getGoods(goods);
  663. // 브랜드 확인
  664. goods.setPntPrate(originGoods.getPntPrate()); // 포인트적립율(PC)
  665. goods.setPntMrate(originGoods.getPntMrate()); // 포인트적립율(MOBILE)
  666. Brand brand = new Brand();
  667. brand.setBrandCd(originGoods.getBrandCd());
  668. Collection<Brand> brandList = businessService.getBrandList(brand);
  669. if (brandList != null && !brandList.isEmpty()) {
  670. float pntPrate = 0f;
  671. float pntMrate = 0f;
  672. for (Brand tmpBrand : brandList) {
  673. if ("G009_10".equals(goods.getFormalGb())) {
  674. pntPrate = tmpBrand.getPntPrate10();
  675. pntMrate = tmpBrand.getPntMrate10();
  676. } else {
  677. pntPrate = tmpBrand.getPntPrate20();
  678. pntMrate = tmpBrand.getPntMrate20();
  679. }
  680. }
  681. goods.setPntPrate(pntPrate); // 포인트적립율(PC)
  682. goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
  683. }
  684. } else if ("goodsStat".equals(goods.getProcJob())) {
  685. // 상품브랜드 조회
  686. Goods originGoods = goodsDao.getGoods(goods);
  687. // 승인일
  688. if (!goods.getGoodsStat().equals(originGoods.getGoodsStat()) && "G008_90".equals(goods.getGoodsStat())) {
  689. goods.setChGoodsStatYn("Y");
  690. }
  691. }
  692. // 상품정보 변경
  693. goodsDao.updateGoodsState(goods);
  694. }
  695. } else {
  696. // 이력생성
  697. goodsDao.createGoodsHst(goods);
  698. if ("formalGb".equals(goods.getProcJob())) {
  699. // 상품브랜드 조회
  700. Goods originGoods = goodsDao.getGoods(goods);
  701. // 브랜드 확인
  702. goods.setPntPrate(originGoods.getPntPrate()); // 포인트적립율(PC)
  703. goods.setPntMrate(originGoods.getPntMrate()); // 포인트적립율(MOBILE)
  704. Brand brand = new Brand();
  705. brand.setBrandCd(originGoods.getBrandCd());
  706. Collection<Brand> brandList = businessService.getBrandList(brand);
  707. if (brandList != null && !brandList.isEmpty()) {
  708. float pntPrate = 0f;
  709. float pntMrate = 0f;
  710. for (Brand tmpBrand : brandList) {
  711. if ("G009_10".equals(goods.getFormalGb())) {
  712. pntPrate = tmpBrand.getPntPrate10();
  713. pntMrate = tmpBrand.getPntMrate10();
  714. } else {
  715. pntPrate = tmpBrand.getPntPrate20();
  716. pntMrate = tmpBrand.getPntMrate20();
  717. }
  718. }
  719. goods.setPntPrate(pntPrate); // 포인트적립율(PC)
  720. goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
  721. }
  722. }
  723. // 상품정보 변경
  724. goodsDao.updateGoodsState(goods);
  725. }
  726. }
  727. /**
  728. * 엑셀조회용 상품 저장
  729. *
  730. * @param procJob : goodsExcelUpload
  731. * @param goodsList
  732. * @return
  733. * @author eskim
  734. * @since 2020. 10. 22
  735. */
  736. @Transactional("shopTxnManager")
  737. public void saveExceluploadGoods(Collection<Goods> goodsList, String excelFilename) {
  738. String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
  739. if (goodsList == null || goodsList.isEmpty()) {
  740. this.deleteExceluploadFile(targetPath, excelFilename);
  741. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  742. }
  743. //건수
  744. if (goodsList != null && goodsList.size() > EXCEL_ROW_COUNT) {
  745. throw new IllegalStateException("엑셀 파일의 건수를 " + EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
  746. }
  747. int index = 0;
  748. String goodsCdFlag = "";
  749. String goodsNumFlag = "";
  750. for (Goods goods : goodsList) {
  751. SearchData searchData = new SearchData();
  752. searchData.setRegNo(goods.getRegNo());
  753. searchData.setSearchCd(goods.getGoodsCd());
  754. if (index == 0) {
  755. commonService.deleteExceluploadSearCh(searchData);
  756. }
  757. commonService.createExceluploadSearch(searchData);
  758. index++;
  759. }
  760. }
  761. /**
  762. * 파일 삭제
  763. *
  764. * @param targetPath
  765. * @param excelFilename
  766. * @author eskim
  767. * @since 2020. 10. 22
  768. */
  769. private void deleteExceluploadFile(String targetPath, String excelFilename) {
  770. // 파일 삭제
  771. try {
  772. GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, excelFilename));
  773. } catch (IOException e) {
  774. // Nothing Do
  775. }
  776. }
  777. /**
  778. * 상품 품목 변경 저장
  779. *
  780. * @param goodsList
  781. * @return
  782. * @author eskim
  783. * @since 2020. 10. 23
  784. */
  785. @Transactional("shopTxnManager")
  786. //@CacheEvict(value = "cate", allEntries = true)
  787. public void saveItemKindChange(Collection<Goods> goodsList) {
  788. for (Goods goods : goodsList) {
  789. goods.setRegNo(TsaSession.getInfo().getUserNo());
  790. goods.setUpdNo(TsaSession.getInfo().getUserNo());
  791. goods.setItemkindCd(goods.getItemkindCd().toUpperCase());
  792. // 품목확인
  793. Itemkind itemkind = new Itemkind();
  794. itemkind.setItemkindCd(goods.getItemkindCd());
  795. itemkind.setUseYn("Y");
  796. Collection<Itemkind> itemkindList = goodsDao.getItemkindList(itemkind);
  797. if (itemkindList == null || itemkindList.isEmpty()) {
  798. throw new IllegalStateException(goods.getGoodsCd() + " 상품의 품목코드를 확인해주세요.");
  799. }
  800. // 상품이력
  801. goodsDao.createGoodsHst(goods);
  802. // 품목변경
  803. goodsDao.updateGoodItemKindCd(goods);
  804. // 검색어 변경
  805. String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
  806. Goods tmpGoods = goodsDao.getGoods(goods);
  807. if (tmpGoods != null && !StringUtils.isBlank(tmpGoods.getGoodsSnm1())) {
  808. String[] arrGoodsSnm = tmpGoods.getGoodsSnm1().split("\\;");
  809. StringBuilder tempGoodsSnm = new StringBuilder();
  810. for (String loopGoodsSnm : arrGoodsSnm) {
  811. if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
  812. tempGoodsSnm.append(loopGoodsSnm).append(";");
  813. }
  814. }
  815. goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
  816. } else {
  817. goods.setGoodsSnm(goodsSnm);
  818. }
  819. goodsDao.updateGoodsSnm(goods);
  820. //상품 등록후에는 고시정보는 품목과 상관없이 변경처리 가능하게
  821. // Collection<GoodsNotiInfo> goodsNotiInfoList = goodsDao.getNewNotiInfo(goods);
  822. // goodsDao.deleteGoodsNotiInfo(goods);
  823. //
  824. // for (GoodsNotiInfo goodsNotiInfo : goodsNotiInfoList) {
  825. // goodsNotiInfo.setRegNo(TsaSession.getInfo().getUserNo());
  826. // goodsNotiInfo.setUpdNo(TsaSession.getInfo().getUserNo());
  827. // goodsNotiInfo.setGoodsCd(goods.getGoodsCd());
  828. // goodsDao.saveGoodsNotiInfo(goodsNotiInfo);
  829. // }
  830. // 품목변경시 카테고리 전시카테고리 변경
  831. GoodsCategory goodsCategory = new GoodsCategory();
  832. goodsCategory.setRegNo(TsaSession.getInfo().getUserNo());
  833. goodsCategory.setUpdNo(TsaSession.getInfo().getUserNo());
  834. goodsCategory.setGoodsCd(goods.getGoodsCd());
  835. goodsCategory.setCateType("G031_10"); //상품분류카테고리
  836. displayService.deleteGoodsCategory(goodsCategory);
  837. goodsDao.createCategoryGoods(goods);
  838. }
  839. }
  840. /**
  841. * 상품 저장
  842. *
  843. * @param goods
  844. * @return
  845. * @author eskim
  846. * @since 2020. 10. 27
  847. */
  848. @Transactional("shopTxnManager")
  849. public void saveGoodsDetail(Goods goods) {
  850. // <,> replace 처리
  851. goods.setRegNo(TsaSession.getInfo().getUserNo());
  852. goods.setUpdNo(TsaSession.getInfo().getUserNo());
  853. // goods.setGoodsDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsDesc(), "&lt;", "<"), "&gt;", ">"));
  854. // goods.setGoodsPcTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcTopDesc(), "&lt;", "<"), "&gt;", ">"));
  855. // goods.setGoodsMobileTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileTopDesc(), "&lt;", "<"), "&gt;", ">"));
  856. // goods.setGoodsPcDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcDownDesc(), "&lt;", "<"), "&gt;", ">"));
  857. // goods.setGoodsMobileDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileDownDesc(), "&lt;", "<"), "&gt;", ">"));
  858. // goods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
  859. // goods.setGoodsTnm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsTnm(), "&lt;", "<"), "&gt;", ">"));
  860. // goods.setGoodsSnm1(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsSnm1(), "&lt;", "<"), "&gt;", ">"));
  861. // 딜상품의 대표상품 변경여부 확인
  862. if ("G056_D".equals(goods.getGoodsType())) {
  863. String newRepGoodsCd = "";
  864. int newRepGoodsPrice = 0;
  865. Collection<GoodsCompose> goodsExtendList = goods.getGoodsComposeListNew();
  866. for (GoodsCompose regGoodsExtend : goodsExtendList) {
  867. if ("Y".equals(regGoodsExtend.getRepYn())) {
  868. newRepGoodsCd = regGoodsExtend.getCompsGoodsCd();
  869. newRepGoodsPrice = regGoodsExtend.getCurrPrice();
  870. }
  871. }
  872. // 1순 : 대표상품 변경, 2순 : 판매가 변경
  873. if (!newRepGoodsCd.equals(goods.getRepGoodsCd())) {
  874. goods.setCurrBprice(goods.getCurrPriceOrg());
  875. goods.setCurrPrice(newRepGoodsPrice);
  876. goods.setListPrice(newRepGoodsPrice);
  877. goods.setDcRate(0);
  878. goods.setChDataYn("Y");
  879. } else {
  880. if (goods.getCurrPrice() != goods.getCurrPriceOrg()) {
  881. goods.setCurrBprice(goods.getCurrPriceOrg());
  882. goods.setListPrice(goods.getCurrPrice());
  883. goods.setDcRate(0);
  884. }
  885. }
  886. } else {
  887. // 가격변경일
  888. if (goods.getCurrPrice() != goods.getCurrPriceOrg()) {
  889. goods.setCurrBprice(goods.getCurrPriceOrg());
  890. } else {
  891. goods.setCurrPrice(goods.getCurrPriceOrg());
  892. }
  893. }
  894. // 승인일
  895. if (!goods.getGoodsStat().equals(goods.getGoodsStatOrg()) && "G008_90".equals(goods.getGoodsStat())) {
  896. goods.setChGoodsStatYn("Y");
  897. }
  898. // 사용자 검색어를 검색어에 적용
  899. String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
  900. if (!StringUtils.isBlank(goods.getGoodsSnm1())) {
  901. goods.setGoodsSnm1(GagaStringUtil.replace(goods.getGoodsSnm1(), " ", "")); // 빈값 삭제
  902. String[] arrGoodsSnm = goods.getGoodsSnm1().split("\\;");
  903. StringBuilder tempGoodsSnm = new StringBuilder();
  904. for (String loopGoodsSnm : arrGoodsSnm) {
  905. if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
  906. tempGoodsSnm.append(loopGoodsSnm).append(";");
  907. }
  908. }
  909. goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
  910. } else if (!goodsSnm.equals(goods.getGoodsSnm())) {
  911. goods.setGoodsSnm(goodsSnm);
  912. }
  913. goods.setFormalGb(goods.getFormalGb());
  914. // 브랜드 확인
  915. if (!"G056_N".equals(goods.getGoodsType())) {
  916. if (!goods.getFormalGb().equals(goods.getFormalGbOrg())) {
  917. Brand brand = new Brand();
  918. brand.setBrandCd(goods.getBrandCd());
  919. Collection<Brand> brandList = businessService.getBrandList(brand);
  920. if (brandList != null && !brandList.isEmpty()) {
  921. float pntPrate = 0f;
  922. float pntMrate = 0f;
  923. for (Brand tmpBrand : brandList) {
  924. if ("G009_10".equals(goods.getFormalGb())) {
  925. pntPrate = tmpBrand.getPntPrate10();
  926. pntMrate = tmpBrand.getPntMrate10();
  927. } else {
  928. pntPrate = tmpBrand.getPntPrate20();
  929. pntMrate = tmpBrand.getPntMrate20();
  930. }
  931. }
  932. goods.setPntPrate(pntPrate); // 포인트적립율(PC)
  933. goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
  934. }
  935. }
  936. }
  937. // 판매기간설정 eskim
  938. goods.setSellStdt(goods.getSellStYMD().replaceAll("-", "") + goods.getSellStHH() + "0000");
  939. goods.setSellEddt(goods.getSellEdYMD().replaceAll("-", "") + goods.getSellEdHH() + "5959");
  940. // 신규가입기간
  941. if (!StringUtils.isEmpty(goods.getNewCustOrdStdt())) {
  942. goods.setNewCustOrdStdt(goods.getNewCustOrdStdt().replaceAll("-", "") + "000000");
  943. goods.setNewCustOrdEddt(goods.getNewCustOrdEddt().replaceAll("-", "") + "235959");
  944. }
  945. // 기본정보 변경
  946. if ("Y".equals(goods.getChDataYn())) {
  947. goodsDao.createGoodsHst(goods);
  948. goodsDao.updateGoods(goods);
  949. }
  950. // 상품상세정보 변경
  951. if (!"Y".equals(goods.getChkDescKeep())) {
  952. this.saveGoodsDetailDesc(goods);
  953. }
  954. int idx = 1;
  955. // 구성상품 변경
  956. if (!"G056_N".equals(goods.getGoodsType())) {
  957. Collection<GoodsCompose> goodsExtendList = goods.getGoodsComposeListNew();
  958. for (GoodsCompose regGoodsExtend : goodsExtendList) {
  959. regGoodsExtend.setDispOrd(idx);
  960. regGoodsExtend.setRegNo(TsaSession.getInfo().getUserNo());
  961. regGoodsExtend.setUpdNo(TsaSession.getInfo().getUserNo());
  962. goodsDao.saveGoodsCompose(regGoodsExtend); // 구성상품기본 저장
  963. idx++;
  964. }
  965. }
  966. // 옵션/재고 변경
  967. if (goods.getOptCd() != null && goods.getOptCd().length > 0 && "Y".equals(goods.getChStockDataYn())) {
  968. this.saveStock(goods);
  969. }
  970. // 상품 정보고시 변경
  971. this.saveGoodsNotiInfo(goods);
  972. // 안전인증정보
  973. GoodsSafeNo goodsSafeNo = new GoodsSafeNo();
  974. goodsSafeNo.setGoodsCd(goods.getGoodsCd());
  975. goodsSafeNo.setCertFormGb(goods.getCertFormGb());
  976. goodsSafeNo.setCertTargetGb(goods.getCertTargetGb());
  977. goodsSafeNo.setCertType(goods.getCertType());
  978. goodsSafeNo.setCertNum(goods.getCertNum());
  979. log.info("goodsSafeNo ==>{}", goodsSafeNo);
  980. this.saveGoodsDetailCertNum(goodsSafeNo);
  981. // 상품 구매등급 적용
  982. if (goods.getGoodsOrderGrade() != null && goods.getGoodsOrderGrade().length > 0) {
  983. Goods goodsOrderGrade = new Goods();
  984. goodsOrderGrade.setGoodsCd(goods.getGoodsCd());
  985. goodsOrderGrade.setRegNo(TsaSession.getInfo().getUserNo());
  986. goodsDao.deleteGoodsCustGrade(goodsOrderGrade);
  987. for (String custGrade : goods.getGoodsOrderGrade()) {
  988. goodsOrderGrade.setCustGrade(custGrade);
  989. goodsDao.createGoodsCustGrade(goodsOrderGrade);
  990. }
  991. } else {
  992. Goods goodsOrderGrade = new Goods();
  993. goodsOrderGrade.setGoodsCd(goods.getGoodsCd());
  994. goodsOrderGrade.setRegNo(TsaSession.getInfo().getUserNo());
  995. goodsDao.deleteGoodsCustGrade(goodsOrderGrade);
  996. }
  997. }
  998. /**
  999. * 상품상세정보 변경 - 상품상세
  1000. *
  1001. * @param goods
  1002. * @author eskim
  1003. * @since 2020. 10. 27.
  1004. */
  1005. private void saveGoodsDetailDesc(Goods goods) {
  1006. // 상품상세 구분(10:상품타이틀,20:상품타이틀내용,30:상품특징,40:상위컨텐츠,50:하위컨텐츠,60:하위컨텐츠-모바일,70:상위컨텐츠-모바일,80:상품상세(as-is))
  1007. GoodsDesc goodsDesc = new GoodsDesc();
  1008. goodsDesc.setGoodsCd(goods.getGoodsCd());
  1009. goodsDesc.setRegNo(goods.getRegNo());
  1010. goodsDesc.setUpdNo(goods.getUpdNo());
  1011. // AS-IS 상세 정보 이력 처리
  1012. goodsDao.createGoodsDetailDescHst(goodsDesc);
  1013. // 상세 타이틀
  1014. goodsDesc.setDescGb("10");
  1015. goodsDesc.setGoodsDesc(goods.getGoodsTitlesDesc());
  1016. this.saveGoodsDesc(goodsDesc);
  1017. // 상세 내용
  1018. goodsDesc.setDescGb("20");
  1019. goodsDesc.setGoodsDesc(goods.getGoodsContentsDesc());
  1020. this.saveGoodsDesc(goodsDesc);
  1021. // 상세 특징
  1022. goodsDesc.setDescGb("30");
  1023. goodsDesc.setGoodsDesc(goods.getGoodsCharacterDesc());
  1024. this.saveGoodsDesc(goodsDesc);
  1025. // PC 상단
  1026. goodsDesc.setDescGb("40");
  1027. goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
  1028. this.saveGoodsDesc(goodsDesc);
  1029. // PC 하단
  1030. goodsDesc.setDescGb("50");
  1031. goodsDesc.setGoodsDesc(goods.getGoodsPcDownDesc());
  1032. this.saveGoodsDesc(goodsDesc);
  1033. // MO 상단
  1034. goodsDesc.setDescGb("60");
  1035. goodsDesc.setGoodsDesc(goods.getGoodsMobileTopDesc());
  1036. this.saveGoodsDesc(goodsDesc);
  1037. // MO 하단
  1038. goodsDesc.setDescGb("70");
  1039. goodsDesc.setGoodsDesc(goods.getGoodsMobileDownDesc());
  1040. this.saveGoodsDesc(goodsDesc);
  1041. // 상품상세(as-is,입점
  1042. goodsDesc.setDescGb("80");
  1043. goodsDesc.setGoodsDesc(goods.getGoodsDesc());
  1044. this.saveGoodsDesc(goodsDesc);
  1045. }
  1046. /**
  1047. * 상품 상세 저장
  1048. *
  1049. * @param goodsDesc
  1050. * @return
  1051. * @author eskim
  1052. * @since 2020. 10. 27
  1053. */
  1054. private void saveGoodsDesc(GoodsDesc goodsDesc) {
  1055. goodsDao.deleteGoodsDesc(goodsDesc);
  1056. String[] arrProdHtml = null;
  1057. arrProdHtml = makeArrayToString(goodsDesc.getGoodsDesc(), 3900);
  1058. if (arrProdHtml.length > 0) {
  1059. for (int i = 0; i < arrProdHtml.length; i++) {
  1060. if (!arrProdHtml[i].isEmpty()) {
  1061. goodsDesc.setSeq(i + 1);
  1062. goodsDesc.setGoodsDesc(arrProdHtml[i]);
  1063. goodsDao.createGoodsDesc(goodsDesc);
  1064. }
  1065. }
  1066. }
  1067. }
  1068. /**
  1069. * String => byte array
  1070. *
  1071. * @param raw
  1072. * @param len
  1073. * @return
  1074. * @author eskim
  1075. * @since 2020. 10. 27
  1076. */
  1077. public static String[] makeArrayToString(String raw, int len) {
  1078. String[] ary = null;
  1079. if (raw == null) {
  1080. return ary;
  1081. }
  1082. try {
  1083. // raw 의 byte
  1084. byte[] rawBytes = raw.getBytes("UTF-8"); // MS949
  1085. int rawLength = rawBytes.length;
  1086. if (rawLength > len) {
  1087. int aryLength = (rawLength / len) + (rawLength % len != 0 ? 1 : 0);
  1088. ary = new String[aryLength];
  1089. int endCharIndex = 0; // 문자열이 끝나는 위치
  1090. String tmp;
  1091. for (int i = 0; i < aryLength; i++) {
  1092. if (i == (aryLength - 1)) {
  1093. tmp = raw.substring(endCharIndex);
  1094. } else {
  1095. int useByteLength = 0;
  1096. int rSize = 0;
  1097. for (; endCharIndex < raw.length(); endCharIndex++) {
  1098. if (raw.charAt(endCharIndex) > 0x007F) {
  1099. useByteLength += 3;
  1100. } else {
  1101. useByteLength++;
  1102. }
  1103. if (useByteLength > len) {
  1104. break;
  1105. }
  1106. rSize++;
  1107. }
  1108. tmp = raw.substring((endCharIndex - rSize), endCharIndex);
  1109. }
  1110. ary[i] = tmp;
  1111. }
  1112. } else {
  1113. ary = new String[] {raw};
  1114. }
  1115. } catch (java.io.UnsupportedEncodingException e) {
  1116. }
  1117. return ary;
  1118. }
  1119. /**
  1120. * 옵션/재고 변경 - 상품상세
  1121. *
  1122. * @param goods
  1123. * @param index
  1124. * @author eskim
  1125. * @since 2020. 10. 27
  1126. */
  1127. private void saveStock(Goods goods) {
  1128. int index = 0;
  1129. Option stock = new Option();
  1130. stock.setGoodsCd(goods.getGoodsCd());
  1131. stock.setUpdNo(goods.getUpdNo());
  1132. stock.setRegNo(goods.getRegNo());
  1133. // goodsDao.createStockHst(stock);
  1134. //log.info("saveStock goods={}", goods);
  1135. for (String optCd : goods.getOptCd()) {
  1136. //log.info("saveStock index={}", index);
  1137. //log.info("saveStock optCd={}", optCd);
  1138. Option goodsStock = new Option();
  1139. goodsStock.setGoodsCd(goods.getCompsGoodsCd()[index]); // 구성상품 코드
  1140. goodsStock.setOptCd(optCd);
  1141. goodsStock.setOptCd1(goods.getOptCd1()[index]);
  1142. goodsStock.setOptCd2(goods.getOptCd2()[index]);
  1143. goodsStock.setAddPrice(Integer.parseInt(goods.getAddPrice()[index]));
  1144. goodsStock.setBaseStockQty(Integer.parseInt(goods.getBaseStockQty()[index]));
  1145. goodsStock.setSoldoutYn(goods.getSoldoutYn()[index]);
  1146. goodsStock.setDispOrd(Integer.parseInt(goods.getDispOrd()[index]));
  1147. goodsStock.setDispYn(goods.getDispYn()[index]);
  1148. goodsStock.setRegNo(goods.getRegNo());
  1149. goodsStock.setUpdNo(goods.getUpdNo());
  1150. if ("N".equals(goods.getSelfGoodsYn())) {
  1151. goodsStock.setSelfGoodsYn(goods.getSelfGoodsYn());
  1152. goodsStock.setCurrStockQty(Integer.parseInt(goods.getEditCurrStockQty()[index]));
  1153. goodsStock.setStoreMaxQty(Integer.parseInt(goods.getEditCurrStockQty()[index]));
  1154. }
  1155. goodsDao.createStockHst(goodsStock);
  1156. goodsDao.saveStock(goodsStock);
  1157. index++;
  1158. }
  1159. }
  1160. /**
  1161. * 상품 사이즈 옵션정보 이력 생성
  1162. *
  1163. * @param goods
  1164. * @author eskim
  1165. * @since 2020. 11. 17
  1166. */
  1167. @Transactional("shopTxnManager")
  1168. public void createStockHst(Option option) {
  1169. goodsDao.createStockHst(option);
  1170. }
  1171. /**
  1172. * 상품 정보고시 변경 - 상품상세
  1173. *
  1174. * @param goods
  1175. * @author eskim
  1176. * @since 2020. 10. 27
  1177. */
  1178. private void saveGoodsNotiInfo(Goods goods) {
  1179. int index;
  1180. if (goods.getNotiListNew() != null && !goods.getNotiListNew().isEmpty()) {
  1181. index = 0;
  1182. for (GoodsNotiInfo goodsNotiInfo : goods.getNotiListNew()) {
  1183. if (index == 0) {
  1184. goodsDao.deleteGoodsNotiInfo(goods);
  1185. }
  1186. goodsNotiInfo.setNiContent(GagaStringUtil.replace(GagaStringUtil.replace(goodsNotiInfo.getNiContent(), "&lt;", "<"), "&gt;", ">"));
  1187. goodsNotiInfo.setRegNo(goods.getRegNo());
  1188. goodsNotiInfo.setUpdNo(goods.getUpdNo());
  1189. goodsDao.saveGoodsNotiInfo(goodsNotiInfo);
  1190. index++;
  1191. }
  1192. }
  1193. }
  1194. /**
  1195. * 딜상품 저장
  1196. *
  1197. * @param goods
  1198. * @return
  1199. * @author eskim
  1200. * @since 2020. 10. 30
  1201. */
  1202. @Transactional("shopTxnManager")
  1203. public void saveGoodsDeal(Goods goods) {
  1204. Goods regGoods = new Goods();
  1205. // <,> replace 처리
  1206. regGoods.setRegNo(TsaSession.getInfo().getUserNo());
  1207. regGoods.setUpdNo(TsaSession.getInfo().getUserNo());
  1208. String goodsCd = this.getGoodsCodeSeq("D", "D");
  1209. regGoods.setGoodsCd(goodsCd);
  1210. regGoods.setSupplyGoodsCd(goodsCd);
  1211. regGoods.setGoodsType("G056_D");
  1212. regGoods.setSupplyCompCd(goods.getSupplyCompCd());
  1213. regGoods.setBrandCd(goods.getBrandCd());
  1214. regGoods.setItemkindCd(goods.getItemkindCd());
  1215. regGoods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
  1216. regGoods.setStyleYear(goods.getStyleYear());
  1217. regGoods.setSeasonCd(goods.getSeasonCd());
  1218. regGoods.setSexGb(goods.getSexGb());
  1219. regGoods.setMainColorCd("XX");
  1220. regGoods.setOriginCd(goods.getOriginCd());
  1221. regGoods.setMakeYmd(goods.getMakeYmd());
  1222. regGoods.setSelfMallYn(goods.getSelfMallYn());
  1223. regGoods.setGoodsStat("G008_20"); // 정보부족
  1224. regGoods.setFormalGb("G009_10"); // 정상 기본값 처리
  1225. regGoods.setGoodsGb("G073_11"); // 자사상품은 신규
  1226. //regGoods.setDistributionGb("G065_12"); // 유통구분
  1227. regGoods.setTaxGb("10"); // 과세구분
  1228. regGoods.setTobeFormYn("Y");
  1229. regGoods.setGoodsNum(goodsCd);
  1230. Collection<GoodsCompose> goodsComposeList = null;
  1231. try {
  1232. goodsComposeList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
  1233. });
  1234. } catch (Exception e) {
  1235. e.printStackTrace();
  1236. throw new IllegalStateException(message.getMessage("딜상품 저장 중 오류로 인해 저장되지 않았습니다."));
  1237. }
  1238. for (GoodsCompose goodsCompose : goodsComposeList) {
  1239. goodsCompose.setGoodsCd(regGoods.getGoodsCd());
  1240. goodsCompose.setGoodsType(regGoods.getGoodsType());
  1241. goodsCompose.setRegNo(TsaSession.getInfo().getUserNo());
  1242. goodsCompose.setUpdNo(TsaSession.getInfo().getUserNo());
  1243. Goods extendGoods = new Goods();
  1244. extendGoods.setGoodsCd(goodsCompose.getCompsGoodsCd());
  1245. extendGoods = goodsDao.getGoods(extendGoods);
  1246. if (StringUtils.isBlank(extendGoods.getBrandCd())) {
  1247. throw new IllegalStateException(message.getMessage("구성상품 중 " + goodsCompose.getCompsGoodsCd() + " 상품 정보를 확인해 주세요."));
  1248. }
  1249. if ("Y".equals(goodsCompose.getBaseYn())) {
  1250. regGoods.setBrandCd(extendGoods.getBrandCd());
  1251. regGoods.setItemkindCd(extendGoods.getItemkindCd());
  1252. regGoods.setSupplyCompCd(extendGoods.getSupplyCompCd());
  1253. regGoods.setFormalGb(extendGoods.getFormalGb());
  1254. regGoods.setSelfGoodsYn(extendGoods.getSelfGoodsYn());
  1255. regGoods.setDelvLocCd(extendGoods.getDelvLocCd()); //출고처
  1256. }
  1257. if ("Y".equals(goodsCompose.getRepYn())) {
  1258. regGoods.setListPrice(extendGoods.getCurrPrice());
  1259. regGoods.setCurrPrice(extendGoods.getCurrPrice());
  1260. regGoods.setDcRate((int)(this.getDcRate(regGoods.getListPrice(), regGoods.getCurrPrice())));
  1261. }
  1262. }
  1263. this.createGoodsCompose(regGoods, goodsComposeList); // 딜상품 관련 정보 저장
  1264. }
  1265. /**
  1266. * 세트상품 저장
  1267. *
  1268. * @param goods
  1269. * @return
  1270. * @author eskim
  1271. * @since 2020. 11. 04
  1272. */
  1273. @Transactional("shopTxnManager")
  1274. public void saveGoodsSet(Goods goods) {
  1275. Goods regGoods = new Goods();
  1276. // <,> replace 처리
  1277. regGoods.setRegNo(TsaSession.getInfo().getUserNo());
  1278. regGoods.setUpdNo(TsaSession.getInfo().getUserNo());
  1279. String goodsCd = this.getGoodsCodeSeq("S", "S");
  1280. regGoods.setGoodsCd(goodsCd);
  1281. regGoods.setSupplyGoodsCd(goodsCd);
  1282. regGoods.setGoodsType("G056_S");
  1283. regGoods.setSupplyCompCd(goods.getSupplyCompCd());
  1284. regGoods.setBrandCd(goods.getBrandCd());
  1285. regGoods.setItemkindCd(goods.getItemkindCd());
  1286. regGoods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
  1287. regGoods.setStyleYear(goods.getStyleYear());
  1288. regGoods.setSeasonCd(goods.getSeasonCd());
  1289. regGoods.setSexGb(goods.getSexGb());
  1290. regGoods.setMainColorCd("XX");
  1291. regGoods.setOriginCd(goods.getOriginCd());
  1292. regGoods.setMakeYmd(goods.getMakeYmd());
  1293. regGoods.setSelfMallYn(goods.getSelfMallYn());
  1294. regGoods.setGoodsStat("G008_20"); // 정보부족
  1295. regGoods.setFormalGb("G009_10"); // 정상 기본값 처리
  1296. regGoods.setGoodsGb("G073_11"); // 자사상품은 신규
  1297. //regGoods.setDistributionGb("G065_12"); // 유통구분
  1298. regGoods.setTaxGb("10"); // 과세구분
  1299. regGoods.setTobeFormYn("Y");
  1300. regGoods.setGoodsNum(goodsCd);
  1301. Collection<GoodsCompose> goodsComposeList = null;
  1302. try {
  1303. goodsComposeList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
  1304. });
  1305. } catch (Exception e) {
  1306. throw new IllegalStateException(message.getMessage("세트상품 저장 중 오류로 인해 저장되지 않았습니다."));
  1307. }
  1308. int listPriceSum = 0;
  1309. int currPriceSum = 0;
  1310. for (GoodsCompose goodsCompose : goodsComposeList) {
  1311. goodsCompose.setGoodsCd(regGoods.getGoodsCd());
  1312. goodsCompose.setGoodsType(regGoods.getGoodsType());
  1313. goodsCompose.setRegNo(TsaSession.getInfo().getUserNo());
  1314. goodsCompose.setUpdNo(TsaSession.getInfo().getUserNo());
  1315. Goods extendGoods = new Goods();
  1316. extendGoods.setGoodsCd(goodsCompose.getCompsGoodsCd());
  1317. extendGoods = goodsDao.getGoods(extendGoods);
  1318. if (StringUtils.isBlank(extendGoods.getBrandCd())) {
  1319. throw new IllegalStateException(message.getMessage("구성상품 중 " + goodsCompose.getCompsGoodsCd() + " 상품 정보를 확인해 주세요."));
  1320. }
  1321. listPriceSum += extendGoods.getListPrice() * goodsCompose.getQty();
  1322. currPriceSum += goodsCompose.getCompsCurrPrice(); // 입력값
  1323. if ("Y".equals(goodsCompose.getBaseYn())) {
  1324. regGoods.setBrandCd(extendGoods.getBrandCd());
  1325. regGoods.setItemkindCd(extendGoods.getItemkindCd());
  1326. regGoods.setGoodsNum(extendGoods.getGoodsNum());
  1327. regGoods.setSupplyCompCd(extendGoods.getSupplyCompCd());
  1328. regGoods.setFormalGb(extendGoods.getFormalGb());
  1329. regGoods.setSelfGoodsYn(extendGoods.getSelfGoodsYn());
  1330. regGoods.setDelvLocCd(extendGoods.getDelvLocCd()); //출고처
  1331. }
  1332. }
  1333. regGoods.setListPrice(listPriceSum);
  1334. regGoods.setCurrPrice(currPriceSum);
  1335. regGoods.setCostPrice(0); // 원가 0원처리
  1336. regGoods.setDcRate((int)(this.getDcRate(listPriceSum, currPriceSum)));
  1337. this.createGoodsCompose(regGoods, goodsComposeList); // 세트상품 관련 정보 저장
  1338. }
  1339. /**
  1340. * 세트/딜 상품 관련 저장
  1341. *
  1342. * @param goods
  1343. * @return
  1344. * @author eskim
  1345. * @since 2020. 10. 30
  1346. */
  1347. private void createGoodsCompose(Goods regGoods, Collection<GoodsCompose> goodsComposeList) {
  1348. // 브랜드 확인
  1349. Brand brand = new Brand();
  1350. brand.setBrandCd(regGoods.getBrandCd());
  1351. brand.setSupplyCompCd(regGoods.getSupplyCompCd());
  1352. Collection<Brand> brandList = businessService.getBrandList(brand);
  1353. if (brandList == null || brandList.isEmpty()) {
  1354. throw new IllegalStateException(message.getMessage("구성상품 중 기준 상품의 브랜드를 확인해 주세요."));
  1355. }
  1356. float pntPrate = 0f;
  1357. float pntMrate = 0f;
  1358. String distributionGb = "";
  1359. for (Brand tmpBrand : brandList) {
  1360. if ("G009_10".equals(regGoods.getFormalGb())) {
  1361. pntPrate = tmpBrand.getPntPrate10();
  1362. pntMrate = tmpBrand.getPntMrate10();
  1363. } else {
  1364. pntPrate = tmpBrand.getPntPrate20();
  1365. pntMrate = tmpBrand.getPntMrate20();
  1366. }
  1367. distributionGb = tmpBrand.getDistributionGb(); // 유통구분
  1368. }
  1369. regGoods.setPntPrate(pntPrate); // 포인트적립율(PC)
  1370. regGoods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
  1371. regGoods.setDistributionGb(distributionGb); // 유통구분
  1372. //regGoods.setSelfGoodsYn("Y");
  1373. SupplyCompany supplyCompany = new SupplyCompany();
  1374. supplyCompany.setSupplyCompCd(regGoods.getSupplyCompCd());
  1375. Collection<SupplyCompany> supplyCompanyList = businessService.getSupplyCompanyList(supplyCompany);
  1376. if (supplyCompanyList == null || supplyCompanyList.isEmpty()) {
  1377. throw new IllegalStateException(message.getMessage("구성상품 중 기준 상품의 업체(판매수수율를 확인해 주세요."));
  1378. }
  1379. regGoods.setSellFeeRate(supplyCompanyList.iterator().next().getSellFeeRate()); // 판매수수료율
  1380. DelvFeePolicy delvFeePolicy = new DelvFeePolicy();
  1381. delvFeePolicy.setSupplyCompCd(regGoods.getSupplyCompCd());
  1382. Collection<DelvFeePolicy> deliveryFeePolicyList = businessService.getDeliveryFeePolicyList(delvFeePolicy);
  1383. if (deliveryFeePolicyList == null || deliveryFeePolicyList.isEmpty()) {
  1384. throw new IllegalStateException(message.getMessage("구성상품 중 기준 상품의 업체(배송비정책)를 확인해 주세요."));
  1385. }
  1386. regGoods.setDelvFeeCd(deliveryFeePolicyList.iterator().next().getDelvFeeCd());// 배송비정책코드
  1387. // 스타일 연도
  1388. regGoods.setStyleYear(regGoods.getStyleYear());
  1389. // 판매기간설정
  1390. regGoods.setSellStdt(GagaDateUtil.getToday() + "000000");
  1391. regGoods.setSellEddt("30001231235959");
  1392. regGoods.setTobeFormYn("Y");
  1393. goodsDao.createGoods(regGoods); // 상품기본 저장
  1394. goodsDao.createGoodsSmmary(regGoods); // 상품통계 생성
  1395. StringBuilder goodsDescSb = new StringBuilder(); // 상품상세
  1396. int dispOrd = 1;
  1397. for (GoodsCompose regGoodsExtend : goodsComposeList) {
  1398. regGoodsExtend.setDispOrd(dispOrd);
  1399. goodsDao.saveGoodsCompose(regGoodsExtend); // 구성상품기본 저장
  1400. dispOrd++;
  1401. }
  1402. // 사용자 검색어를 검색어에 적용
  1403. String goodsSnm = goodsDao.getGoodsSnm(regGoods.getGoodsCd());
  1404. regGoods.setGoodsSnm(goodsSnm);
  1405. goodsDao.updateGoodsSnm(regGoods);
  1406. goodsDao.createCategoryGoods(regGoods);
  1407. }
  1408. // /**
  1409. // * 품 이미지 경로생성
  1410. // *
  1411. // * @param goodsCd
  1412. // * @param brandCd
  1413. // * @return String
  1414. // * @author eskim
  1415. // * @since 2020. 10. 30
  1416. // */
  1417. // private String getGoodsImgPath(String goodsCd, String brandCd) {
  1418. // return "/" + goodsCd.substring(0, 1) + "/" + goodsCd.substring(0, 3) + "/" + goodsCd + "/1000/" + goodsCd + "_";
  1419. // }
  1420. /**
  1421. * 상품 코드 생성
  1422. *
  1423. * @param goodsType - 상품타입
  1424. * @param goodsCdAfter - 상품시퀀스 앞에 붙는명
  1425. * @return
  1426. * @author eskim
  1427. * @since 2020. 10. 30
  1428. */
  1429. public String getGoodsCodeSeq(String goodsType, String goodsCdAfter) {
  1430. //상품코드 12자리
  1431. String goodsCd = "";
  1432. Goods goods = new Goods();
  1433. goodsDao.createGoodsSequence(goods);
  1434. String goodsSeq = GagaStringUtil.getLPadding(Integer.toString(goods.getGoodsSq()), 8, "0");
  1435. if ("S".equals(goodsType) || "D".equals(goodsType)) {
  1436. goodsCd = SELF_GOOODS_AFTER + goodsCdAfter + goodsSeq;
  1437. } else {
  1438. goodsCd = goodsCdAfter + goodsSeq; // 입점 : 브랜드코드
  1439. }
  1440. return goodsCd;
  1441. }
  1442. /**
  1443. * 상품 타이틀 관리 목록 건수
  1444. *
  1445. * @param goodsSearch
  1446. * @return
  1447. * @author eskim
  1448. * @since 2020. 11 .02
  1449. */
  1450. public int getGoodsTitleReserveCount(GoodsSearch goodsSearch) {
  1451. return goodsDao.getGoodsTitleReserveCount(goodsSearch);
  1452. }
  1453. /**
  1454. * 상품 타이틀 관리 목록
  1455. *
  1456. * @param goodsSearch
  1457. * @return
  1458. * @author eskim
  1459. * @since 2020. 11 .02
  1460. */
  1461. public Collection<GoodsTnmRes> getGoodsTitleReserveList(GoodsSearch goodsSearch) {
  1462. return goodsDao.getGoodsTitleReserveList(goodsSearch);
  1463. }
  1464. /**
  1465. * 상품 타이틀 예약 등록
  1466. *
  1467. * @param goodsTnmRes
  1468. * @author eskim
  1469. * @since 2020. 11 .02
  1470. */
  1471. @Transactional("shopTxnManager")
  1472. public void saveGoodsRsvtTnm(GoodsTnmRes goodsTnmRes) {
  1473. if (goodsTnmRes.getArrGoodsCd().length <= 0) {
  1474. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  1475. }
  1476. goodsTnmRes.setGoodsTnm(GagaStringUtil.replace(GagaStringUtil.replace(goodsTnmRes.getGoodsTnm(), "&lt;", "<"), "&gt;", ">"));
  1477. for (String goodsCd : goodsTnmRes.getArrGoodsCd()) {
  1478. goodsTnmRes.setGoodsCd(goodsCd);
  1479. goodsTnmRes.setRegNo(TsaSession.getInfo().getUserNo());
  1480. goodsTnmRes.setUpdNo(TsaSession.getInfo().getUserNo());
  1481. if (goodsDao.getGoodsTnmDupChkCount(goodsTnmRes) > 0) {
  1482. throw new IllegalStateException("이미 등록된 상품 타이틀예약이 등록하려는 예약기간내에 존재합니다. \n(상품코드 : " + goodsCd + ")");
  1483. }
  1484. goodsDao.createGoodTnmRes(goodsTnmRes);
  1485. // 현재일자가 예약기간에 포함되어 있으면 바로 적용한다.
  1486. String toDaytime = GagaDateUtil.getTodayDateTime();
  1487. if (Long.parseLong(toDaytime) >= Long.parseLong(goodsTnmRes.getApplyStdt()) && Long.parseLong(toDaytime) <= Long.parseLong(goodsTnmRes.getApplyEddt())) {
  1488. // 이력생성 및 상품타이틀 수정
  1489. Goods goods = new Goods();
  1490. goods.setGoodsCd(goodsCd);
  1491. goods.setGoodsTnm(goodsTnmRes.getGoodsTnm());
  1492. goods.setRegNo(TsaSession.getInfo().getUserNo());
  1493. goods.setUpdNo(TsaSession.getInfo().getUserNo());
  1494. goodsDao.createGoodsHst(goods);
  1495. goodsDao.updateGoodTnm(goods);
  1496. }
  1497. }
  1498. }
  1499. /**
  1500. * 상품 타이틀 예약 삭제
  1501. *
  1502. * @param goodsTnmRes
  1503. * @author eskim
  1504. * @since 2020. 11 .02
  1505. */
  1506. @Transactional("shopTxnManager")
  1507. public void deleteGoodsRsvtTnm(GoodsTnmRes goodsTnmRes) {
  1508. if (goodsTnmRes.getArrGoodsCd().length <= 0) {
  1509. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  1510. }
  1511. int idx = 0;
  1512. for (String goodsCd : goodsTnmRes.getArrGoodsCd()) {
  1513. // 상품 타이틀 예약 삭제
  1514. goodsTnmRes.setGoodsTnmResSq(goodsTnmRes.getArrGoodsTnmResSq()[idx]);
  1515. goodsDao.deleteGoodTnmRes(goodsTnmRes);
  1516. // 상품 타이틀 예약건 초기화
  1517. Goods goods = new Goods();
  1518. goods.setGoodsCd(goodsCd);
  1519. goods = goodsDao.getGoodTnmInit(goods);
  1520. goods.setRegNo(TsaSession.getInfo().getUserNo());
  1521. goods.setUpdNo(TsaSession.getInfo().getUserNo());
  1522. if (!StringUtils.isBlank(goods.getGoodsTnm()) && !goods.getGoodsTnm().equals(goods.getGoodTnmInit())) {
  1523. // 상품이력 먼저 쌓기
  1524. goodsDao.createGoodsHst(goods);
  1525. // 정보수정
  1526. goods.setGoodsTnm(goods.getGoodTnmInit());
  1527. goodsDao.updateGoodTnm(goods);
  1528. }
  1529. idx++;
  1530. }
  1531. }
  1532. /**
  1533. * 네이버 EP 제외 상품 목록 건수
  1534. *
  1535. * @param goodsSearch
  1536. * @return int
  1537. * @author eskim
  1538. * @since 2020. 11. 03
  1539. */
  1540. public int getGoodsEpSkipCount(GoodsSearch goodsSearch) {
  1541. return goodsDao.getGoodsEpSkipCount(goodsSearch);
  1542. }
  1543. /**
  1544. * 네이버 EP 제외 상품 목록
  1545. *
  1546. * @param goodsSearch
  1547. * @return Collection<TsaGoodsEpSkip>
  1548. * @author eskim
  1549. * @since 2020. 11. 03
  1550. */
  1551. public Collection<GoodsEpSkip> getGoodsEpSkipList(GoodsSearch goodsSearch) {
  1552. return goodsDao.getGoodsEpSkipList(goodsSearch);
  1553. }
  1554. /**
  1555. * 네이버 EP 제외 상품 예약 등록
  1556. *
  1557. * @param goodsEpSkip
  1558. * @return void
  1559. * @author eskim
  1560. * @since 2020. 11. 03
  1561. */
  1562. @Transactional("shopTxnManager")
  1563. public void saveGoodsRsvtEpSkip(GoodsEpSkip goodsEpSkip) {
  1564. if (goodsEpSkip.getArrGoodsCd().length <= 0) {
  1565. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  1566. }
  1567. for (String goodsCd : goodsEpSkip.getArrGoodsCd()) {
  1568. goodsEpSkip.setGoodsCd(goodsCd);
  1569. goodsEpSkip.setRegNo(TsaSession.getInfo().getUserNo());
  1570. goodsEpSkip.setUpdNo(TsaSession.getInfo().getUserNo());
  1571. if (goodsDao.getGoodsEpSkipDupChkCount(goodsEpSkip) > 0) {
  1572. throw new IllegalStateException("비노출예약이 중복된 상품이 존재합니다.<br/>(상품코드 : " + goodsCd + ")");
  1573. }
  1574. goodsDao.createGoodEpSkip(goodsEpSkip);
  1575. }
  1576. }
  1577. /**
  1578. * 네이버 EP 제외 상품 예약 삭제
  1579. *
  1580. * @param goodsEpSkip
  1581. * @return void
  1582. * @author eskim
  1583. * @since 2020. 11. 03
  1584. */
  1585. @Transactional("shopTxnManager")
  1586. public void deleteGoodsEpSkip(GoodsEpSkip goodsEpSkip) {
  1587. if (goodsEpSkip.getArrGoodsCd().length <= 0) {
  1588. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  1589. }
  1590. int idx = 0;
  1591. for (String goodsCd : goodsEpSkip.getArrGoodsCd()) {
  1592. goodsEpSkip.setGoodsEpSkipSq(goodsEpSkip.getArrGoodsEpSkipSq()[idx]);
  1593. goodsDao.deleteGoodEpSkip(goodsEpSkip);
  1594. idx++;
  1595. }
  1596. }
  1597. /**
  1598. * 상품예약판매 목록 건수
  1599. *
  1600. * @param goodsSearch
  1601. * @return Integer
  1602. * @author eskim
  1603. * @since 2020. 11. 12
  1604. */
  1605. public int getGoodsResSellCount(GoodsSearch goodsSearch) {
  1606. return goodsDao.getGoodsResSellCount(goodsSearch);
  1607. }
  1608. /**
  1609. * 상품예약판매 목록
  1610. *
  1611. * @param goodsSearch
  1612. * @return Collection<TsaGoodsResSell>
  1613. * @author eskim
  1614. * @since 2020. 11. 12
  1615. */
  1616. public Collection<GoodsResSell> getGoodsResSellList(GoodsSearch goodsSearch) {
  1617. return goodsDao.getGoodsResSellList(goodsSearch);
  1618. }
  1619. /**
  1620. * 상품예약판매 등록
  1621. *
  1622. * @param goodsResSell
  1623. * @return void
  1624. * @author eskim
  1625. * @since 2020. 11. 12
  1626. */
  1627. @Transactional("shopTxnManager")
  1628. public void saveGoodsResSell(GoodsResSell goodsResSell) {
  1629. if (goodsResSell.getArrGoodsCd().length <= 0) {
  1630. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  1631. }
  1632. for (String goodsCd : goodsResSell.getArrGoodsCd()) {
  1633. goodsResSell.setGoodsCd(goodsCd);
  1634. goodsResSell.setRegNo(TsaSession.getInfo().getUserNo());
  1635. goodsResSell.setUpdNo(TsaSession.getInfo().getUserNo());
  1636. if (goodsDao.getGoodsResSellDupChkCount(goodsResSell) > 0) {
  1637. throw new IllegalStateException("이미 등록된 상품예약판매가 존재합니다. \n(상품코드 : " + goodsCd + ")");
  1638. }
  1639. goodsDao.createGoodResSell(goodsResSell);
  1640. Goods goods = new Goods();
  1641. goods.setRegNo(TsaSession.getInfo().getUserNo());
  1642. goods.setUpdNo(TsaSession.getInfo().getUserNo());
  1643. goods.setGoodsCd(goodsResSell.getGoodsCd());
  1644. // 재고연동 비활성화
  1645. goodsDao.createGoodsHst(goods);
  1646. goodsDao.updateGoodsErpStockLinkYn(goods);
  1647. }
  1648. }
  1649. /**
  1650. * 상품예약판매 삭제
  1651. *
  1652. * @param goodsResSell
  1653. * @return void
  1654. * @author eskim
  1655. * @since 2020. 11. 12
  1656. */
  1657. @Transactional("shopTxnManager")
  1658. public void deleteGoodsResSell(GoodsResSell goodsResSell) {
  1659. if (goodsResSell.getArrGoodsCd().length <= 0) {
  1660. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  1661. }
  1662. int idx = 0;
  1663. for (String goodsCd : goodsResSell.getArrGoodsCd()) {
  1664. goodsResSell.setGoodsResSellSq(goodsResSell.getArrGoodsResSellSq()[idx]);
  1665. goodsDao.deleteGoodResSell(goodsResSell);
  1666. idx++;
  1667. }
  1668. }
  1669. /**
  1670. * 상품 상세공지 목록
  1671. *
  1672. * @param goodsSearch
  1673. * @return
  1674. * @author eskim
  1675. * @since 2020. 11. 05
  1676. */
  1677. public Collection<Notice> getNoticeList(GoodsSearch goodsSearch) {
  1678. return goodsDao.getNoticeList(goodsSearch);
  1679. }
  1680. /**
  1681. * 상품 상세공지 상품 목록
  1682. *
  1683. * @param notice
  1684. * @return
  1685. * @author eskim
  1686. * @since 2020. 11. 06
  1687. */
  1688. public Collection<NoticeGoods> getNoticeGoodsList(Notice notice) {
  1689. return goodsDao.getNoticeGoodsList(notice);
  1690. }
  1691. /**
  1692. * 공지사항 저장
  1693. * @param notice - 공지사항 정보
  1694. * @return
  1695. * @author eskim
  1696. * @since 2020. 11. 05
  1697. */
  1698. @Transactional("shopTxnManager")
  1699. public void saveNotice(Notice notice) {
  1700. notice.setRegNo(TsaSession.getInfo().getUserNo());
  1701. notice.setUpdNo(TsaSession.getInfo().getUserNo());
  1702. // 신규 일때
  1703. if (notice.getNoticeSq() == null) {
  1704. // 공지사항 저장
  1705. noticeService.createNotice(notice);
  1706. // 등록된 사용자번호 값 가져오기
  1707. Integer noticeSq = notice.getNoticeSq();
  1708. notice.setNoticeSq(noticeSq);
  1709. } else {
  1710. // 공지사항 수정
  1711. noticeService.updateNotice(notice);
  1712. }
  1713. if (!StringUtils.isBlank(notice.getGoodsList())) {
  1714. Collection<NoticeGoods> noticeGoodsList = null;
  1715. try {
  1716. noticeGoodsList = mapper.readValue(notice.getGoodsList(), new TypeReference<Collection<NoticeGoods>>() {
  1717. });
  1718. } catch (Exception e) {
  1719. e.printStackTrace();
  1720. throw new IllegalStateException(message.getMessage("상품상세공지 저장 중 오류로 인해 저장되지 않았습니다."));
  1721. }
  1722. //log.info("noticeGoodsList: {}", noticeGoodsList);
  1723. for (NoticeGoods noticeGoods : noticeGoodsList) {
  1724. noticeGoods.setNoticeSq(notice.getNoticeSq());
  1725. noticeGoods.setRegNo(TsaSession.getInfo().getUserNo());
  1726. noticeGoods.setUpdNo(TsaSession.getInfo().getUserNo());
  1727. goodsDao.saveNoticeGoods(noticeGoods);
  1728. }
  1729. }
  1730. }
  1731. /**
  1732. * 공지사항 상품 삭제
  1733. * @param noticeGoods
  1734. * @return
  1735. * @author eskim
  1736. * @since 2020. 11. 06
  1737. */
  1738. @Transactional("shopTxnManager")
  1739. public void deleteNoticeGoods(NoticeGoods noticeGoods) {
  1740. if (noticeGoods == null || (noticeGoods.getArrGoodsCd() == null && noticeGoods.getArrGoodsCd().length <= 0)) {
  1741. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  1742. }
  1743. if (noticeGoods.getArrGoodsCd().length > 0) {
  1744. for (String goodsCd : noticeGoods.getArrGoodsCd()) {
  1745. noticeGoods.setGoodsCd(goodsCd);
  1746. noticeGoods.setRegNo(TsaSession.getInfo().getUserNo());
  1747. noticeGoods.setUpdNo(TsaSession.getInfo().getUserNo());
  1748. goodsDao.deleteNoticeGoods(noticeGoods);
  1749. }
  1750. }
  1751. }
  1752. /**
  1753. * 상품 가격예약 목록 건수
  1754. *
  1755. * @param goodsSearch
  1756. * @return Integer
  1757. * @author eskim
  1758. * @since 2020. 11. 13
  1759. */
  1760. public int getGoodsPriceResCount(GoodsSearch goodsSearch) {
  1761. return goodsDao.getGoodsPriceResCount(goodsSearch);
  1762. }
  1763. /**
  1764. * 상품 가격예약 목록
  1765. *
  1766. * @param goodsSearch
  1767. * @return Collection<TsaGoodsResSell>
  1768. * @author eskim
  1769. * @since 2020. 11. 13
  1770. */
  1771. public Collection<GoodsPriceRes> getGoodsPriceResList(GoodsSearch goodsSearch) {
  1772. return goodsDao.getGoodsPriceResList(goodsSearch);
  1773. }
  1774. /**
  1775. * 상품 가격예약 등록
  1776. *
  1777. * @param goodsPriceRes
  1778. * @return void
  1779. * @author eskim
  1780. * @since 2020. 11. 13
  1781. */
  1782. @Transactional("shopTxnManager")
  1783. public void createGoodPriceRes(GoodsPriceRes goodsPriceRes) {
  1784. if (goodsPriceRes.getArrGoodsCd().length <= 0) {
  1785. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  1786. }
  1787. int idx = 0;
  1788. for (String goodsCd : goodsPriceRes.getArrGoodsCd()) {
  1789. goodsPriceRes.setGoodsCd(goodsCd);
  1790. goodsPriceRes.setEndGoodsPrice(goodsPriceRes.getArrEndGoodsPrice()[idx]);
  1791. goodsPriceRes.setRegNo(TsaSession.getInfo().getUserNo());
  1792. goodsPriceRes.setUpdNo(TsaSession.getInfo().getUserNo());
  1793. if (goodsDao.getGoodsPriceResDupChkCount(goodsPriceRes) > 0) {
  1794. throw new IllegalStateException("이미 등록된 상품 가격예약이 존재합니다. \n(상품코드 : " + goodsCd + ")");
  1795. }
  1796. goodsDao.createGoodPriceRes(goodsPriceRes);
  1797. Goods goods = new Goods();
  1798. goods.setRegNo(TsaSession.getInfo().getUserNo());
  1799. goods.setUpdNo(TsaSession.getInfo().getUserNo());
  1800. goods.setGoodsCd(goodsPriceRes.getGoodsCd());
  1801. idx++;
  1802. }
  1803. }
  1804. /**
  1805. * 상품 가격예약 삭제
  1806. *
  1807. * @param goodsPriceRes
  1808. * @return void
  1809. * @author eskim
  1810. * @since 2020. 11. 13
  1811. */
  1812. @Transactional("shopTxnManager")
  1813. public void deleteGoodsPriceRes(GoodsPriceRes goodsPriceRes) {
  1814. if (goodsPriceRes.getArrGoodsCd().length <= 0) {
  1815. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  1816. }
  1817. int idx = 0;
  1818. for (String goodsCd : goodsPriceRes.getArrGoodsCd()) {
  1819. goodsPriceRes.setGoodsPriceResSq(goodsPriceRes.getArrGoodsPriceResSq()[idx]);
  1820. goodsDao.deleteGoodPriceRes(goodsPriceRes);
  1821. idx++;
  1822. }
  1823. }
  1824. /**
  1825. * 상품 가격예약 저장
  1826. *
  1827. * @param goodsPriceList
  1828. * @return
  1829. * @author eskim
  1830. * @since 2020. 11. 16
  1831. */
  1832. @Transactional("shopTxnManager")
  1833. public void saveGoodsPriceExcelupload(Collection<GoodsPriceRes> goodsPriceList, String excelFilename) {
  1834. String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
  1835. if (goodsPriceList == null || goodsPriceList.isEmpty()) {
  1836. this.deleteExceluploadFile(targetPath, excelFilename);
  1837. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  1838. }
  1839. //건수
  1840. if (goodsPriceList != null && goodsPriceList.size() > EXCEL_ROW_COUNT) {
  1841. throw new IllegalStateException("엑셀 파일의 건수를 " + EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
  1842. }
  1843. // 입력값 확인
  1844. String goodsPriceResvCheck = getGoodsPriceResvCheck(goodsPriceList);
  1845. if (!"SUCC".equals(goodsPriceResvCheck)) {
  1846. this.deleteExceluploadFile(targetPath, excelFilename);
  1847. throw new IllegalStateException(goodsPriceResvCheck);
  1848. }
  1849. int index = 0;
  1850. for (GoodsPriceRes goodsPriceRes : goodsPriceList) {
  1851. goodsPriceRes.setUpdNo(TsaSession.getInfo().getUserNo());
  1852. goodsPriceRes.setRegNo(TsaSession.getInfo().getUserNo());
  1853. //예약일시 시분 설정
  1854. goodsPriceRes.setApplyStdt(goodsPriceRes.getApplyStdt() + "0000");
  1855. goodsPriceRes.setApplyEddt(goodsPriceRes.getApplyEddt() + "5959");
  1856. // 엑셀조회를 위한 SEARCH 테이블 생성
  1857. SearchData searchData = new SearchData();
  1858. searchData.setRegNo(goodsPriceRes.getRegNo());
  1859. searchData.setSearchCd(goodsPriceRes.getGoodsCd());
  1860. searchData.setDispOrd(index);
  1861. if (index == 0) {
  1862. commonService.deleteExceluploadSearCh(searchData);
  1863. }
  1864. commonService.createExceluploadSearch(searchData);
  1865. goodsDao.createGoodPriceRes(goodsPriceRes);
  1866. index++;
  1867. }
  1868. }
  1869. /*
  1870. * 상품 가격예약 엑셀조회용 상품 저장 - 입력값 확인
  1871. */
  1872. private String getGoodsPriceResvCheck(Collection<GoodsPriceRes> goodsPriceList) {
  1873. int cnt = 0;
  1874. for (GoodsPriceRes goodsPriceRes : goodsPriceList) {
  1875. if (StringUtils.isBlank(goodsPriceRes.getGoodsCd())) {
  1876. return (cnt + 2) + "행의 상품코드를 확인해주세요";
  1877. }
  1878. if (StringUtils.isBlank(Integer.toString(goodsPriceRes.getResGoodsPrice()))) {
  1879. return (cnt + 2) + "행의 예약가격을 확인해주세요.";
  1880. }
  1881. if (goodsPriceRes.getResGoodsPrice() <= 0) {
  1882. return (cnt + 2) + "행의 예약가격을 확인해주세요.";
  1883. }
  1884. String nowDate = GagaDateUtil.getToday(); //yyyyMMddHH
  1885. SimpleDateFormat dateFormatParser = new SimpleDateFormat("yyyyMMddHH");
  1886. dateFormatParser.setLenient(false);
  1887. try {
  1888. dateFormatParser.parse(goodsPriceRes.getApplyStdt());
  1889. } catch (Exception e) {
  1890. return (cnt + 2) + "행의 예약시작일시을 확인해주세요.";
  1891. }
  1892. try {
  1893. dateFormatParser.parse(goodsPriceRes.getApplyEddt());
  1894. } catch (Exception e) {
  1895. return (cnt + 2) + "행의 예약종료일시을 확인해주세요.";
  1896. }
  1897. if (Integer.parseInt(goodsPriceRes.getApplyStdt()) > Integer.parseInt(goodsPriceRes.getApplyEddt())) {
  1898. return (cnt + 2) + "행의 예약 시작일시은 종료일시보다 보다 클 수 없습니다.";
  1899. }
  1900. if (Integer.parseInt(goodsPriceRes.getApplyStdt()) <= Integer.parseInt(nowDate)) {
  1901. return (cnt + 2) + "행의 예약 시작일자는 현재일자 보다 작거나 같을 수 없습니다.";
  1902. }
  1903. //정상가와 비교
  1904. Goods searchGoods = new Goods();
  1905. searchGoods.setGoodsCd(goodsPriceRes.getGoodsCd());
  1906. Goods goods = goodsDao.getGoods(searchGoods);
  1907. if (goods == null) {
  1908. return (cnt + 2) + "행의 상품코드를 확인해주세요";
  1909. }
  1910. if (goods.getListPrice() < goodsPriceRes.getResGoodsPrice()) {
  1911. return (cnt + 2) + "행의 상품 정상가보다 예약판매가가 더 큽니다.";
  1912. }
  1913. if (!"Y".equals(goods.getSelfGoodsYn())) {
  1914. return (cnt + 2) + "행의 상품은 자사상품이 아닙니다.";
  1915. }
  1916. if (goodsDao.getGoodsPriceResDupChkCount(goodsPriceRes) > 0) {
  1917. return (cnt + 2) + "행은 이미 등록된 상품 가격예약이 존재합니다. \n(상품코드 : " + goodsPriceRes.getGoodsCd() + ")";
  1918. }
  1919. cnt++;
  1920. }
  1921. return "SUCC";
  1922. }
  1923. /**
  1924. * 상품 동영상 목록 조회
  1925. *
  1926. * @param goodsVideo
  1927. * @return
  1928. * @author eskim
  1929. * @since 2020. 11. 16
  1930. */
  1931. public Collection<GoodsVideo> getGoodsVideoList(GoodsVideo goodsVideo) {
  1932. return goodsDao.getGoodsVideoList(goodsVideo);
  1933. }
  1934. /**
  1935. * 상품 동영상 삭제로 변경
  1936. *
  1937. * @param goodsVideo
  1938. * @return
  1939. * @author eskim
  1940. * @since 2020. 11. 16
  1941. */
  1942. @Transactional("shopTxnManager")
  1943. public void updateNotUseGoodsVideo(Collection<GoodsVideo> goodsVideos) {
  1944. for (GoodsVideo goodsVideo : goodsVideos) {
  1945. goodsVideo.setUpdNo(TsaSession.getInfo().getUserNo());
  1946. goodsDao.updateNotUseGoodsVideo(goodsVideo);
  1947. }
  1948. }
  1949. /**
  1950. * 상품동영상 수정/저장
  1951. *
  1952. * @param video
  1953. * @return
  1954. * @author eskim
  1955. * @since 2020. 11. 16
  1956. */
  1957. @Transactional("shopTxnManager")
  1958. public void saveGoodsVideo(GoodsVideo goodsVideo) {
  1959. GoodsSearch goodsSearch = new GoodsSearch();
  1960. goodsSearch.setGoodsCd(goodsVideo.getGoodsCd());
  1961. int goodsCnt = goodsDao.getGoodsListCount(goodsSearch);
  1962. if (goodsCnt <= 0) {
  1963. throw new IllegalStateException(goodsVideo.getGoodsCd() + "의 상품코드를 확인해 주세요.");
  1964. }
  1965. goodsVideo.setRegNo(TsaSession.getInfo().getUserNo());
  1966. goodsVideo.setUpdNo(TsaSession.getInfo().getUserNo());
  1967. if (goodsVideo.getVideoSq() == null || goodsVideo.getVideoSq() == 0) {
  1968. if ("Y".equals(goodsVideo.getVideoGb())) {
  1969. Collection<GoodsVideo> goodsVideoList = goodsDao.getGoodsVideoList(goodsVideo);
  1970. if (goodsVideoList != null && goodsVideoList.size() > 0) {
  1971. GoodsVideo orgingGoodsVideo = goodsVideoList.iterator().next();
  1972. goodsVideo.setVideoSq(orgingGoodsVideo.getVideoSq());
  1973. }
  1974. }
  1975. goodsDao.createGoodsVideo(goodsVideo);
  1976. } else {
  1977. goodsDao.updateGoodsVideo(goodsVideo);
  1978. }
  1979. }
  1980. /**
  1981. * 상품동영상 엑셀파일 등록
  1982. *
  1983. * @param dataList
  1984. * @return
  1985. * @author eskim
  1986. * @since 2020. 11. 16
  1987. */
  1988. @Transactional("shopTxnManager")
  1989. public int saveExcelGoodsVideo(Collection<GagaMap> dataList) {
  1990. int cnt = 0;
  1991. for (GagaMap map : dataList) {
  1992. GoodsVideo goodsVideo = mapper.convertValue(map, GoodsVideo.class);
  1993. GoodsSearch goodsSearch = new GoodsSearch();
  1994. goodsSearch.setGoodsCd(goodsVideo.getGoodsCd());
  1995. int goodsCnt = goodsDao.getGoodsListCount(goodsSearch);
  1996. if (goodsCnt <= 0) {
  1997. throw new IllegalStateException(goodsVideo.getGoodsCd() + "의 상품코드를 확인해 주세요.");
  1998. }
  1999. Collection<GoodsVideo> goodsVideoList = goodsDao.getGoodsVideoList(goodsVideo);
  2000. if (goodsVideoList != null && goodsVideoList.size() > 0) {
  2001. GoodsVideo orgingGoodsVideo = goodsVideoList.iterator().next();
  2002. goodsVideo.setUpdNo(TsaSession.getInfo().getUserNo());
  2003. goodsVideo.setVideoGb("Y");
  2004. goodsVideo.setDispYn(orgingGoodsVideo.getDispYn());
  2005. goodsDao.updateGoodsVideo(goodsVideo);
  2006. } else {
  2007. goodsVideo.setUpdNo(TsaSession.getInfo().getUserNo());
  2008. goodsVideo.setRegNo(TsaSession.getInfo().getUserNo());
  2009. goodsVideo.setDispYn("Y");
  2010. goodsVideo.setVideoGb("Y");
  2011. goodsDao.createGoodsVideo(goodsVideo);
  2012. }
  2013. cnt++;
  2014. }
  2015. return cnt;
  2016. }
  2017. /**
  2018. * 상품별 옵션 등록 여부 확인
  2019. *
  2020. * @param
  2021. * @return
  2022. * @author eskim
  2023. * @since 2020. 11. 17
  2024. */
  2025. public int getGoodsOptionCount(Option option) {
  2026. return goodsDao.getGoodsOptionCount(option);
  2027. }
  2028. /**
  2029. * 상품 가격승인관리 목록 조회
  2030. *
  2031. * @param goodsSupplyPrice
  2032. * @return
  2033. * @author eskim
  2034. * @since 2020. 11. 26
  2035. */
  2036. public Collection<GoodsSupplyPrice> getGoodsSupplyPriceList(GoodsSupplyPrice goodsSupplyPrice) {
  2037. return goodsDao.getGoodsSupplyPriceList(goodsSupplyPrice);
  2038. }
  2039. /**
  2040. * 상품 가격승인관리 승인 처리
  2041. *
  2042. * @param goodsPriceHstList - 상품 가격 승인 목록
  2043. * @author eskim
  2044. * @since 2020. 11. 26
  2045. */
  2046. @Transactional("shopTxnManager")
  2047. public void saveGoodsSupplyPrice(Collection<GoodsSupplyPrice> goodsSupplyPriceList) {
  2048. for (GoodsSupplyPrice goodsSupplyPrice : goodsSupplyPriceList) {
  2049. goodsSupplyPrice.setRegNo(TsaSession.getInfo().getUserNo());
  2050. goodsSupplyPrice.setUpdNo(TsaSession.getInfo().getUserNo());
  2051. Goods goods = new Goods();
  2052. goods.setRegNo(TsaSession.getInfo().getUserNo());
  2053. goods.setUpdNo(TsaSession.getInfo().getUserNo());
  2054. goods.setGoodsCd(goodsSupplyPrice.getGoodsCd());
  2055. goodsDao.createGoodsHst(goods);
  2056. // 판매가 변경
  2057. if (goodsSupplyPrice.getSupplyGoodsPrice() > 0) {
  2058. goods.setDcRate((int)(this.getDcRate(goodsSupplyPrice.getListPrice(), goodsSupplyPrice.getSupplyGoodsPrice())));
  2059. goods.setCurrBprice(goodsSupplyPrice.getCurrPrice());
  2060. goods.setCurrPrice(goodsSupplyPrice.getSupplyGoodsPrice());
  2061. goodsDao.updateGoodsPrice(goods);
  2062. }
  2063. // 판매수수료율 변경
  2064. if (Float.compare(goodsSupplyPrice.getSupplySellFeeRate(), 0) > 0) {
  2065. goods.setSellFeeRate(goodsSupplyPrice.getSupplySellFeeRate());
  2066. goodsDao.updateSellFeeRate(goods);
  2067. }
  2068. goodsDao.updateGoodsSupplyPricecfrmDt(goodsSupplyPrice);
  2069. }
  2070. }
  2071. /**
  2072. * 상품 네이버 최저가 목록
  2073. *
  2074. * @param goodsSearch
  2075. * @return
  2076. * @author eskim
  2077. * @since 2020. 12. 08
  2078. */
  2079. public Collection<GoodsNaverLowestPrice> getGoodsNaverPriceList(GoodsSearch goodsSearch) {
  2080. return goodsDao.getGoodsNaverPriceList(goodsSearch);
  2081. }
  2082. /**
  2083. * 상품 네이버 최저가 엑셀다운로드
  2084. *
  2085. * @param goodsSearch
  2086. * @param excelFilenameWithPath - 경로를 포함한 엑셀파일명
  2087. * @return
  2088. * @author eskim
  2089. * @since 2021. 07. 09
  2090. */
  2091. public void getGoodsNaverExcelList(GoodsSearch goodsSearch, String excelFilenameWithPath) {
  2092. // 헤더 title 설정
  2093. String[] listTitles = {"상품코드", "브랜드명", "상품명", "정상가", "판매가", "자사즉시할인가", "네이버최저가", "차액",
  2094. "최저가몰명", "최저가몰링크"};
  2095. // DB 처리 시 사용되는 파라미터명(셀명) 설정
  2096. String[] cellNames = {"GOODS_CD", "BRAND_ENM", "GOODS_NM", "LIST_PRICE", "CURR_PRICE", "BENEFIT_PRICE", "LOWEST_PRICE", "PRICE" ,
  2097. "MALL_NM", "MALL_LINK"};
  2098. String[] cellTypes = {
  2099. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
  2100. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
  2101. GagaExcelConstants.CellType.CHAR_RIGHT.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
  2102. GagaExcelConstants.CellType.CHAR_RIGHT.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
  2103. GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name()};
  2104. Collection<GagaMap> dataList = goodsDao.getGoodsNaverExcelList(goodsSearch);
  2105. try {
  2106. GagaExcelUtil.createExcel(excelFilenameWithPath, dataList, "상품 네이버 가격", listTitles, cellNames, cellTypes, TsaConstants.EXCEL_FOOTER_TITLE);
  2107. } catch (Exception e) {
  2108. throw new IllegalStateException(e);
  2109. }
  2110. }
  2111. /**
  2112. * 상품 네이버 최저가 목록
  2113. *
  2114. * @param goodsSearch
  2115. * @return
  2116. * @author eskim
  2117. * @since 2020. 12. 08
  2118. */
  2119. @Transactional("shopTxnManager")
  2120. public Collection<GoodsNaverLowestPrice> saveGoodsNaverPrice(GoodsSearch goodsSearch) {
  2121. // 1. 조회 상품 TB_SEARCH_DATA 담기
  2122. int index = 0;
  2123. for (String goodsCd : goodsSearch.getConditionList()) {
  2124. SearchData searchData = new SearchData();
  2125. searchData.setRegNo(TsaSession.getInfo().getUserNo());
  2126. searchData.setSearchCd(goodsCd);
  2127. if (index == 0) {
  2128. commonService.deleteExceluploadSearCh(searchData);
  2129. }
  2130. commonService.createExceluploadSearch(searchData);
  2131. index++;
  2132. }
  2133. // 2. 일 최초 조회이면 테이블 삭제
  2134. String regYmd = goodsDao.getGoodsNaverLowestPriceReqYmd();
  2135. if (!StringUtils.isBlank(regYmd) && !regYmd.equals(GagaDateUtil.getToday())) {
  2136. goodsDao.deleteGoodsNaverLowestPrice();
  2137. }
  2138. // 3. 네이버 최저가 조회 저장
  2139. saveGoodsNaverLowestPrice(goodsSearch);
  2140. // 4. 최저가 상품 조회
  2141. goodsSearch.setSearchGb("EXCEL");
  2142. goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
  2143. return goodsDao.getGoodsNaverPriceList(goodsSearch);
  2144. }
  2145. /**
  2146. * 상품 네이버 최저가 목록
  2147. *
  2148. * @param goodsSearch
  2149. * @return
  2150. * @author eskim
  2151. * @since 2020. 12. 08
  2152. */
  2153. private void saveGoodsNaverLowestPrice(GoodsSearch goodsSearch) {
  2154. for (String goodsCd : goodsSearch.getConditionList()) {
  2155. try {
  2156. //log.info("saveGoodsNaverLowestPrice 11 = {}", GagaDateUtil.getTodayDateTime());
  2157. TaskSleeep();
  2158. //log.info("saveGoodsNaverLowestPrice 22 = {}", GagaDateUtil.getTodayDateTime());
  2159. NaverLowestPrice naverLowestPrice = naverLowestPriceApi.getLowestPrice(goodsCd);
  2160. //log.info("[saveGoodsNaverLowestPrice] naverLowestPrice= {}", naverLowestPrice);
  2161. if (naverLowestPrice != null && naverLowestPrice.getTotal() > 0) {
  2162. GoodsNaverLowestPrice goodsNaverLowestPrice = new GoodsNaverLowestPrice();
  2163. goodsNaverLowestPrice.setReqYmd(GagaDateUtil.getToday());
  2164. goodsNaverLowestPrice.setGoodsCd(goodsCd);
  2165. goodsNaverLowestPrice.setMallNm(naverLowestPrice.getItems().iterator().next().getMallName());
  2166. goodsNaverLowestPrice.setMallLink(naverLowestPrice.getItems().iterator().next().getLink());
  2167. goodsNaverLowestPrice.setLowestPrice(Integer.parseInt(naverLowestPrice.getItems().iterator().next().getLprice().toString()));
  2168. goodsNaverLowestPrice.setRegNo(TsaSession.getInfo().getUserNo());
  2169. goodsNaverLowestPrice.setUpdNo(TsaSession.getInfo().getUserNo());
  2170. //log.info("[saveGoodsNaverLowestPrice] goodsNaverLowestPrice= {}", goodsNaverLowestPrice);
  2171. goodsDao.saveGoodsNaverLowestPrice(goodsNaverLowestPrice);
  2172. }
  2173. } catch (Exception e) {
  2174. e.printStackTrace();
  2175. }
  2176. }
  2177. }
  2178. /**
  2179. *
  2180. *
  2181. * @return
  2182. * @author eskim
  2183. * @since 2020. 12. 08
  2184. */
  2185. static void TaskSleeep() {
  2186. try {
  2187. Thread.sleep(100);
  2188. } catch (InterruptedException e) {
  2189. // TODO Auto-generated catch block
  2190. e.printStackTrace();
  2191. }
  2192. }
  2193. /**
  2194. * 광고 키워드 목록
  2195. *
  2196. * @param adKeyword
  2197. * @return
  2198. * @author eskim
  2199. * @since 2020. 12. 15
  2200. */
  2201. public Collection<AdKeyword> getAdKeywordList(AdKeyword adKeyword) {
  2202. return goodsDao.getAdKeywordList(adKeyword);
  2203. }
  2204. /**
  2205. * 광고 키워드 상품 목록
  2206. *
  2207. * @param adKeyword
  2208. * @return
  2209. * @author eskim
  2210. * @since 2020. 12. 15
  2211. */
  2212. public Collection<AdKeywordGoods> getAdKeywordGoodsList(AdKeyword adKeyword) {
  2213. return goodsDao.getAdKeywordGoodsList(adKeyword);
  2214. }
  2215. /**
  2216. * 광고 키워드 저장
  2217. * @param adKeyword
  2218. * @return
  2219. * @author eskim
  2220. * @since 2020. 12. 15
  2221. */
  2222. @Transactional("shopTxnManager")
  2223. public void saveAdKeywordGoods(AdKeyword adKeyword) {
  2224. adKeyword.setRegNo(TsaSession.getInfo().getUserNo());
  2225. adKeyword.setUpdNo(TsaSession.getInfo().getUserNo());
  2226. // 신규 일때
  2227. if (adKeyword.getAdKeywordSq() == null) {
  2228. // 공지사항 저장
  2229. goodsDao.saveAdKeyword(adKeyword);
  2230. // 등록된 사용자번호 값 가져오기
  2231. Integer noticeSq = adKeyword.getAdKeywordSq();
  2232. adKeyword.setAdKeywordSq(noticeSq);
  2233. } else {
  2234. // 공지사항 수정
  2235. goodsDao.saveAdKeyword(adKeyword);
  2236. }
  2237. if (!StringUtils.isBlank(adKeyword.getGoodsList())) {
  2238. Collection<AdKeywordGoods> adKeywordGoodsList = null;
  2239. try {
  2240. adKeywordGoodsList = mapper.readValue(adKeyword.getGoodsList(), new TypeReference<Collection<AdKeywordGoods>>() {
  2241. });
  2242. } catch (Exception e) {
  2243. e.printStackTrace();
  2244. throw new IllegalStateException(message.getMessage("광고 키워드 저장 중 오류로 인해 저장되지 않았습니다."));
  2245. }
  2246. //log.info("adKeywordGoodsList: {}", adKeywordGoodsList);
  2247. int idx = 0;
  2248. for (AdKeywordGoods adKeywordGoods : adKeywordGoodsList) {
  2249. if (idx == 0) {
  2250. goodsDao.deleteAdKeywordGoods(adKeywordGoods); // 전체 상품 삭제
  2251. }
  2252. adKeywordGoods.setAdKeywordSq(adKeyword.getAdKeywordSq());
  2253. adKeywordGoods.setRegNo(TsaSession.getInfo().getUserNo());
  2254. adKeywordGoods.setUpdNo(TsaSession.getInfo().getUserNo());
  2255. goodsDao.saveAdKeywordGoods(adKeywordGoods);
  2256. idx++;
  2257. }
  2258. }
  2259. }
  2260. /**
  2261. * 광고 키워드 상품 삭제
  2262. * @param adKeywordGoods
  2263. * @return
  2264. * @author eskim
  2265. * @since 2020. 12. 15
  2266. */
  2267. @Transactional("shopTxnManager")
  2268. public void deleteAdKeywordGoods(AdKeywordGoods adKeywordGoods) {
  2269. if (adKeywordGoods == null || (adKeywordGoods.getArrGoodsCd() == null && adKeywordGoods.getArrGoodsCd().length <= 0)) {
  2270. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  2271. }
  2272. if (adKeywordGoods.getArrGoodsCd().length > 0) {
  2273. goodsDao.deleteAdKeywordGoods(adKeywordGoods);
  2274. }
  2275. }
  2276. /**
  2277. * 재입고알림 목록 건수
  2278. *
  2279. * @param goodsSearch
  2280. * @return Integer
  2281. * @author eskim
  2282. * @since 2020. 12. 16
  2283. */
  2284. public int getReinboundInformCount(GoodsSearch goodsSearch) {
  2285. return goodsDao.getReinboundInformCount(goodsSearch);
  2286. }
  2287. /**
  2288. * 재입고알림 목록
  2289. *
  2290. * @param goodsSearch
  2291. * @return Collection<ReinboundInform>
  2292. * @author eskim
  2293. * @since 2020. 12. 16
  2294. */
  2295. public Collection<ReinboundInform> getReinboundInformList(GoodsSearch goodsSearch) {
  2296. return goodsDao.getReinboundInformList(goodsSearch);
  2297. }
  2298. /**
  2299. * 재입고알림 발송 처리
  2300. *
  2301. * @param params
  2302. * @return void
  2303. * @author daehyoung
  2304. * @since 2020. 07 .21
  2305. */
  2306. @Transactional("shopTxnManager")
  2307. public void sendReinboundInform(ReinboundInform reinboundInform) {
  2308. goodsDao.updateReinboundInform(reinboundInform);
  2309. }
  2310. /**
  2311. * 상품이미지 목록
  2312. *
  2313. * @param goodsImg
  2314. * @return Collection<GoodsImg>
  2315. * @author eskim
  2316. * @since 2020. 12. 18
  2317. */
  2318. public Collection<GoodsImg> getGoodsImgList(GoodsImg goodsImg) {
  2319. return goodsDao.getGoodsImageList(goodsImg);
  2320. }
  2321. /**
  2322. * 상품이미지 저장 처리
  2323. * @param goodsImgList - 상품이미지 목록
  2324. * @throws AdmBizException
  2325. * @author eskim
  2326. * @since 2020. 12. 21
  2327. */
  2328. @Transactional("shopTxnManager")
  2329. public void saveGoodsImageList(Collection<GoodsImg> goodsImgList) {
  2330. int index = 0;
  2331. for (GoodsImg goodsImg : goodsImgList) {
  2332. // 상품이미지 전체 삭제
  2333. if (index++ == 0) {
  2334. goodsDao.deleteGoodsImageTotal(goodsImg);
  2335. }
  2336. if (!goodsImg.getMode().equals("D")) {
  2337. // 상품이미지 등록
  2338. goodsImg.setRegNo(TsaSession.getInfo().getUserNo());
  2339. goodsDao.createGoodsImage(goodsImg);
  2340. }
  2341. }
  2342. }
  2343. /**
  2344. * 사은품 목록
  2345. *
  2346. * @param goodsSearch
  2347. * @return Collection<FreeGoods>
  2348. * @author eskim
  2349. * @since 2020. 12. 28
  2350. */
  2351. public Collection<FreeGoods> getFreeGoodsList(GoodsSearch goodsSearch) {
  2352. return goodsDao.getFreeGoodsList(goodsSearch);
  2353. }
  2354. /**
  2355. * 사은품 정보 수정
  2356. * @param goodsImgList - 상품이미지 목록
  2357. * @throws AdmBizException
  2358. * @author eskim
  2359. * @since 2020. 12. 21
  2360. */
  2361. @Transactional("shopTxnManager")
  2362. public void updateFreeGoods(FreeGoods freeGoods) {
  2363. freeGoods.setUpdNo(TsaSession.getInfo().getUserNo());
  2364. goodsDao.updateFreeGoods(freeGoods);
  2365. }
  2366. /**
  2367. * WMS입고상품관리 목록 건수
  2368. *
  2369. * @param goodsSearch
  2370. * @return Collection<WmsGoods>
  2371. * @author eskim
  2372. * @since 2021. 01. 04
  2373. */
  2374. public int getGoodsWmsIncomelotListCount(WmsGoods wmsGoods) {
  2375. return goodsDao.getGoodsWmsIncomelotListCount(wmsGoods);
  2376. }
  2377. /**
  2378. * WMS입고상품관리 목록 조회
  2379. *
  2380. * @param goodsSearch
  2381. * @return Collection<WmsGoods>
  2382. * @author eskim
  2383. * @since 2021. 01. 04
  2384. */
  2385. public Collection<WmsGoods> getGoodsWmsIncomelotList(WmsGoods wmsGoods) {
  2386. return goodsDao.getGoodsWmsIncomelotList(wmsGoods);
  2387. }
  2388. /**
  2389. * WMS 입고상품 사은품 등록
  2390. * @param wmsGoodsList
  2391. * @author eskim
  2392. * @since 2021. 01. 05
  2393. */
  2394. @Transactional("shopTxnManager")
  2395. public void saveFreeGoods(Collection<WmsGoods> wmsGoodsList) {
  2396. for (WmsGoods wmsGoods : wmsGoodsList) {
  2397. FreeGoods freeGoods = new FreeGoods();
  2398. freeGoods.setProductNo(wmsGoods.getProductNo());
  2399. freeGoods.setProductCode(wmsGoods.getProductCode());
  2400. freeGoods.setGoodsNm(wmsGoods.getProductName());
  2401. freeGoods.setBrandCd(wmsGoods.getBrandCd());
  2402. freeGoods.setUseYn("Y");
  2403. freeGoods.setUpdNo(TsaSession.getInfo().getUserNo());
  2404. freeGoods.setRegNo(TsaSession.getInfo().getUserNo());
  2405. goodsDao.saveFreeGoods(freeGoods);
  2406. //WMS 상품등록구분
  2407. wmsGoods.setGoodsRegGb("F");
  2408. wmsGoods.setUpdNo(TsaSession.getInfo().getUserNo());
  2409. wmsGoods.setRegNo(TsaSession.getInfo().getUserNo());
  2410. goodsDao.saveGoodsWmsIncomelot(wmsGoods);
  2411. }
  2412. }
  2413. /**
  2414. * 고시분류별 상품고시정보 목록
  2415. * @param goodsNotiInfo - 상품고시정보
  2416. * @return
  2417. * @author gagamel
  2418. * @since 2021. 1. 21
  2419. */
  2420. public Collection<GoodsNotiInfo> getGoodsNotiInfoListByNotiClsf(GoodsNotiInfo goodsNotiInfo) {
  2421. return goodsDao.getGoodsNotiInfoListByNotiClsf(goodsNotiInfo);
  2422. }
  2423. /**
  2424. * 고시분류 칼럼 정보
  2425. * @param niClsfCd - 고시분류코드
  2426. * @return
  2427. * @author gagamel
  2428. * @since 2021. 1. 21
  2429. */
  2430. public GoodsNotiInfo getNotiClsfColumnInfo(String niClsfCd) {
  2431. return goodsDao.getNotiClsfColumnInfo(niClsfCd);
  2432. }
  2433. /**
  2434. * 상품대량수정 엑셀 저장
  2435. *
  2436. * @param ecxelGoodsList, procJob(updateGoods)
  2437. * @return
  2438. * @author eskim
  2439. * @since 2021. 01. 25
  2440. */
  2441. @Transactional("shopTxnManager")
  2442. public String updateMassExceluploadGoods(GagaMap gagaMap, String procJob) {
  2443. GoodsMass goodsMass = mapper.convertValue(gagaMap, GoodsMass.class);
  2444. if (StringUtils.isBlank(goodsMass.getGoodsCd())) {
  2445. throw new IllegalStateException("상품코드는 필수입니다.");
  2446. }
  2447. // 상품기본정보
  2448. Goods goodsData = new Goods();
  2449. goodsData.setGoodsCd(goodsMass.getGoodsCd().trim().toUpperCase());
  2450. Goods goodsOrigin = goodsDao.getGoods(goodsData);
  2451. if (goodsOrigin == null) {
  2452. goodsData.setGoodsRegMsg("미등록 상품코드");
  2453. goodsData.setGoodsStat("10");
  2454. this.setGoodsRegResult(goodsData, goodsMass, procJob);
  2455. return goodsData.getGoodsStat();
  2456. }
  2457. Goods goods = this.updateMassGoodsInfo(goodsMass, procJob, goodsOrigin);
  2458. if ("10".equals(goods.getGoodsStat())) { // 정보 오류
  2459. this.setGoodsRegResult(goods, goodsMass, procJob);
  2460. return goods.getGoodsStat();
  2461. }
  2462. // 옵션
  2463. if (!UPDATE_NO_PATTERN.equals(goodsMass.getOptStr().trim())) {
  2464. goods.setGoodsRegMsg("옵션은 변경할 수 없습니다.");
  2465. goods.setGoodsStat("10");
  2466. this.setGoodsRegResult(goods, goodsMass, procJob);
  2467. return goods.getGoodsStat();
  2468. }
  2469. // 상품 고시
  2470. Collection<GoodsNotiInfo> newGoodsNotiList = new ArrayList<>(); //적용할 고시 정보
  2471. goods = this.getUpdateMassGoodsNotiCheck(goods, gagaMap, goodsOrigin, newGoodsNotiList);
  2472. if ("10".equals(goods.getGoodsStat())) { // 정보 오류
  2473. this.setGoodsRegResult(goods, goodsMass, procJob);
  2474. return goods.getGoodsStat();
  2475. }
  2476. // 상품상세 (html, as-is/입점) - 일반상품만 적용
  2477. if (!UPDATE_NO_PATTERN.equals(goodsMass.getGoodsContent().trim()) && "G056_N".equals(goodsOrigin.getGoodsType())) {
  2478. if (goodsMass.getGoodsContent().toLowerCase().indexOf("script") >= 0) {
  2479. goods.setGoodsRegMsg("상품상세 html script 선언 오류");
  2480. goods.setGoodsStat("10");
  2481. this.setGoodsRegResult(goods, goodsMass, procJob);
  2482. return goods.getGoodsStat();
  2483. }
  2484. goods.setChkDescKeep("Y");
  2485. }
  2486. if ("N".equals(goods.getChDataYn()) && "N".equals(goods.getChkDescKeep()) && "N".equals(goods.getChNotiYn())) {
  2487. goods.setGoodsRegMsg("변경정보 없음");
  2488. goods.setGoodsStat("10");
  2489. this.setGoodsRegResult(goods, goodsMass, procJob);
  2490. return goods.getGoodsStat();
  2491. }
  2492. //상품 기본정보 변경여부 와 촬영업체가 아닌경우
  2493. if ("Y".equals(goods.getChDataYn()) && !"G001_E000".equals(TsaSession.getInfo().getRoleCd())) {
  2494. goodsDao.createGoodsHst(goods); // 이력생성
  2495. goodsDao.updateGoodsMass(goods); // 상품기본 저장
  2496. if (!StringUtils.isBlank(goods.getGoodsSnm1()) && !UPDATE_NO_PATTERN.equals(goods.getGoodsSnm1())) {
  2497. // 사용자 검색어를 검색어에 적용
  2498. String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
  2499. String[] arrGoodsSnm = goods.getGoodsSnm1().split("\\;");
  2500. StringBuilder tempGoodsSnm = new StringBuilder();
  2501. for (String loopGoodsSnm : arrGoodsSnm) {
  2502. if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
  2503. tempGoodsSnm.append(loopGoodsSnm).append(";");
  2504. }
  2505. }
  2506. goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
  2507. goodsDao.updateGoodsSnm(goods);
  2508. }
  2509. }
  2510. //상품 상세 변경여부 와 촬영업체가 아닌경우
  2511. if ("Y".equals(goods.getChkDescKeep()) && !"G001_E000".equals(TsaSession.getInfo().getRoleCd()) && "G056_N".equals(goodsOrigin.getGoodsType())) {
  2512. GoodsDesc goodsDesc = new GoodsDesc();
  2513. goodsDesc.setGoodsCd(goods.getGoodsCd());
  2514. goodsDesc.setRegNo(goods.getRegNo());
  2515. goodsDesc.setUpdNo(goods.getUpdNo());
  2516. goodsDesc.setDescGb("80");
  2517. goodsDesc.setGoodsDesc(goodsMass.getGoodsContent().trim());
  2518. this.saveGoodsDesc(goodsDesc);
  2519. }
  2520. // 상품고시정보 적용
  2521. if ("Y".equals(goods.getChNotiYn()) && newGoodsNotiList != null && !newGoodsNotiList.isEmpty()) {
  2522. int index = 0;
  2523. for (GoodsNotiInfo goodsNotiInfo : newGoodsNotiList) {
  2524. if (index == 0) {
  2525. goodsDao.deleteGoodsNotiInfo(goods);
  2526. }
  2527. goodsDao.saveGoodsNotiInfo(goodsNotiInfo);
  2528. index++;
  2529. }
  2530. }
  2531. // 품목변경시 카테고리 자동 전시
  2532. if (!UPDATE_NO_PATTERN.equals(goods.getItemkindCd().trim())) {
  2533. GoodsCategory goodsCategory = new GoodsCategory();
  2534. goodsCategory.setRegNo(TsaSession.getInfo().getUserNo());
  2535. goodsCategory.setUpdNo(TsaSession.getInfo().getUserNo());
  2536. goodsCategory.setGoodsCd(goods.getGoodsCd());
  2537. goodsCategory.setCateType("G031_10"); //상품분류카테고리
  2538. displayService.deleteGoodsCategory(goodsCategory);
  2539. goodsDao.createCategoryGoods(goods);
  2540. }
  2541. this.setGoodsRegResult(goods, goodsMass, procJob);
  2542. return goods.getGoodsStat();
  2543. }
  2544. /**
  2545. * 상품 대량 등록 결과 정보
  2546. *
  2547. * @param goods
  2548. * @author eskim
  2549. * @since 2021. 01. 25
  2550. */
  2551. private void setGoodsRegResult(Goods goods, GoodsMass goodsMass, String procJob) {
  2552. // 결과 저장
  2553. goodsMass.setBrandCd(goods.getBrandCd());
  2554. goodsMass.setGoodsStat(goods.getGoodsStat());
  2555. goodsMass.setRegSuccYn("Y");
  2556. goodsMass.setRegFailRsn(goods.getGoodsRegMsg());
  2557. goodsMass.setRegNo(TsaSession.getInfo().getUserNo());
  2558. //model은 string 테이블은 number 형이라 ,,,
  2559. // if (StringUtils.isBlank(goodsMass.getListPrice())) {
  2560. // goodsMass.setListPrice("0");
  2561. // }
  2562. // if (UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice()) || StringUtils.isBlank(goodsMass.getCurrPrice())) {
  2563. // goodsMass.setCurrPrice("0");
  2564. // }
  2565. // if (StringUtils.isBlank(goodsMass.getCostPrice())) {
  2566. // goodsMass.setCostPrice("0");
  2567. // }
  2568. // if ("10".equals(goods.getGoodsStat())) {
  2569. // goodsMass.setRegSuccYn("N");
  2570. // }
  2571. goodsMass.setProcGb("C");
  2572. if ("updateGoods".equals(procJob)) {
  2573. goodsMass.setProcGb("U");
  2574. }
  2575. goodsDao.createGoodsRegLog(goodsMass);
  2576. }
  2577. /**
  2578. * 상품대량수정 - 상품기본정보
  2579. *
  2580. * @param goodsMass
  2581. * @param excelFilename
  2582. * @author eskim
  2583. * @since 2021. 1. 20
  2584. */
  2585. private Goods updateMassGoodsInfo(GoodsMass goodsMass, String procJob, Goods goodsOrigin) {
  2586. Goods goods = new Goods();
  2587. goods.setChDataYn("N"); // 데이터 변경여부
  2588. goods.setGoodsRegMsg("상품정보 변경");
  2589. goods.setRegNo(TsaSession.getInfo().getUserNo());
  2590. goods.setUpdNo(TsaSession.getInfo().getUserNo());
  2591. goods.setGoodsCd(goodsMass.getGoodsCd().toUpperCase().trim().toUpperCase()); // 상품코드
  2592. if (StringUtils.isBlank(goodsMass.getGoodsNm())) {
  2593. goods.setGoodsRegMsg("상품명 오류");
  2594. goods.setGoodsStat("10");
  2595. return goods;
  2596. }
  2597. goods.setGoodsNm(goodsMass.getGoodsNm().trim()); // 상품명
  2598. if (!UPDATE_NO_PATTERN.equals(goods.getGoodsNm())) {
  2599. goods.setGoodsNm(goods.getGoodsNm().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", "")); // 상품명
  2600. goods.setChDataYn("Y");
  2601. }
  2602. goods.setGoodsTnm(goodsMass.getGoodsTnm().trim()); // 상품 타이틀
  2603. if (!UPDATE_NO_PATTERN.equals(goods.getGoodsTnm())) {
  2604. goods.setChDataYn("Y");
  2605. if (!StringUtils.isBlank(goods.getGoodsTnm())) {
  2606. goods.setGoodsTnm(goods.getGoodsTnm().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", "")); // 상품 타이틀
  2607. }
  2608. }
  2609. goods.setGoodsSnm1(goodsMass.getGoodsSnm1().trim()); // 상품 사용자 검색어
  2610. if (!UPDATE_NO_PATTERN.equals(goods.getGoodsSnm1())) {
  2611. goods.setChDataYn("Y");
  2612. if (!StringUtils.isBlank(goods.getGoodsSnm1())) {
  2613. goods.setGoodsSnm1(goods.getGoodsSnm1().replaceAll("(\\r\\n|\\r|\\n|\\n\\r|\\s)", "")); // 상품 사용자 검색어
  2614. }
  2615. }
  2616. // 품목확인
  2617. if (StringUtils.isBlank(goodsMass.getItemkindCd())) {
  2618. goods.setGoodsRegMsg("품목코드 오류");
  2619. goods.setGoodsStat("10");
  2620. return goods;
  2621. }
  2622. goods.setItemkindCd(goodsMass.getItemkindCd().trim().toUpperCase()); // 품목
  2623. if (!UPDATE_NO_PATTERN.equals(goods.getItemkindCd())) {
  2624. Itemkind itemkind = new Itemkind();
  2625. itemkind.setItemkindCd(goods.getItemkindCd());
  2626. itemkind.setUseYn("Y");
  2627. Collection<Itemkind> itemkindList = goodsDao.getItemkindList(itemkind);
  2628. if (itemkindList == null || itemkindList.isEmpty()) {
  2629. goods.setGoodsRegMsg("품목 오류");
  2630. goods.setGoodsStat("10");
  2631. return goods;
  2632. }
  2633. goods.setChDataYn("Y");
  2634. }
  2635. CommonCode commonCode = new CommonCode();
  2636. commonCode.setUseYn("Y");
  2637. // 시즌코드
  2638. if (StringUtils.isBlank(goodsMass.getSeasonCd())) {
  2639. goods.setGoodsRegMsg("시즌코드 오류");
  2640. goods.setGoodsStat("10");
  2641. return goods;
  2642. }
  2643. goods.setSeasonCd(goodsMass.getSeasonCd().trim().toUpperCase());
  2644. if (!UPDATE_NO_PATTERN.equals(goods.getSeasonCd())) {
  2645. commonCode.setCdGb("G006"); // 시즌
  2646. commonCode.setCd(goods.getSeasonCd());
  2647. Collection<CommonCode> seassonList = rendererService.getCommonCodeList(commonCode);
  2648. if (seassonList == null || seassonList.isEmpty()) {
  2649. goods.setGoodsRegMsg("시즌 오류");
  2650. goods.setGoodsStat("10");
  2651. return goods;
  2652. }
  2653. goods.setChDataYn("Y");
  2654. }
  2655. // 성별
  2656. if (StringUtils.isBlank(goodsMass.getSexGb())) {
  2657. goods.setGoodsRegMsg("성별코드 오류");
  2658. goods.setGoodsStat("10");
  2659. return goods;
  2660. }
  2661. goods.setSexGb(goodsMass.getSexGb().trim().toUpperCase());
  2662. // 성별
  2663. if (!UPDATE_NO_PATTERN.equals(goods.getSexGb())) {
  2664. commonCode.setCdGb("G007"); // 성별
  2665. commonCode.setCd(goods.getSexGb());
  2666. Collection<CommonCode> genderList = rendererService.getCommonCodeList(commonCode);
  2667. if (genderList == null || genderList.isEmpty()) {
  2668. goods.setGoodsRegMsg("성별 오류");
  2669. goods.setGoodsStat("10");
  2670. return goods;
  2671. }
  2672. goods.setChDataYn("Y");
  2673. }
  2674. //판매가
  2675. if (StringUtils.isBlank(goodsMass.getCurrPrice())) {
  2676. goods.setGoodsRegMsg("판매가 오류");
  2677. goods.setGoodsStat("10");
  2678. return goods;
  2679. }
  2680. if (UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim())) {
  2681. goods.setCurrPrice(0);
  2682. } else {
  2683. if (!GagaStringUtil.replace(goodsMass.getCurrPrice().trim(), ",", "").matches(NUMBER_PATTERN)) {
  2684. goods.setGoodsRegMsg("판매가 오류");
  2685. goods.setGoodsStat("10");
  2686. return goods;
  2687. }
  2688. if (Integer.parseInt(goodsMass.getCurrPrice().trim()) == 0) {
  2689. goods.setGoodsRegMsg("판매가 오류");
  2690. goods.setGoodsStat("10");
  2691. return goods;
  2692. }
  2693. }
  2694. //판매수수료율
  2695. if (StringUtils.isBlank(goodsMass.getSellFeeRate())) {
  2696. goods.setGoodsRegMsg("판매수수료율 오류");
  2697. goods.setGoodsStat("10");
  2698. return goods;
  2699. }
  2700. float sellFeeRate = 0f;
  2701. if (UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
  2702. goods.setSellFeeRate(0);
  2703. } else {
  2704. try {
  2705. sellFeeRate = Float.valueOf(goodsMass.getSellFeeRate().trim());
  2706. //goods.setSellFeeRate(sellFeeRate);
  2707. } catch (Exception e) {
  2708. goods.setGoodsRegMsg("판매수수료율 오류");
  2709. goods.setGoodsStat("10");
  2710. return goods;
  2711. }
  2712. //비교값 크면 1, 같으면 0, 작은면 -1 리턴
  2713. if (Float.compare(sellFeeRate, 0) == 0) {
  2714. goods.setGoodsRegMsg("판매수수료율 오류");
  2715. goods.setGoodsStat("10");
  2716. return goods;
  2717. }
  2718. if (Float.compare(sellFeeRate, 100) >= 0) {
  2719. goods.setGoodsRegMsg("판매수수료율 오류");
  2720. goods.setGoodsStat("10");
  2721. return goods;
  2722. }
  2723. }
  2724. //판매가나 판매수수료율이 변경되었을 때
  2725. if (!UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim()) || !UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
  2726. //자사
  2727. if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
  2728. //판매가 변경시
  2729. if (!UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim())) {
  2730. goods.setCurrPrice(Integer.parseInt(GagaStringUtil.replace(goodsMass.getCurrPrice().trim(), ",", ""))); // 판매가
  2731. goods.setCurrBprice(goodsOrigin.getCurrPrice());
  2732. goods.setDcRate((int)(this.getDcRate(goodsOrigin.getListPrice(), goods.getCurrPrice())));
  2733. goods.setChDataYn("Y");
  2734. }
  2735. //판매수수료율 변경시
  2736. if (!UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
  2737. goods.setSellFeeRate(sellFeeRate); // 판매수수료율
  2738. goods.setChDataYn("Y");
  2739. }
  2740. } else {
  2741. //입점
  2742. GoodsPriceRes goodsPriceRes = new GoodsPriceRes();
  2743. goodsPriceRes.setGoodsCd(goods.getGoodsCd());
  2744. if (goods.getCurrPrice() != goodsOrigin.getCurrPrice()) {
  2745. goodsPriceRes.setResGoodsPrice(goods.getCurrPrice());
  2746. goodsPriceRes.setEndGoodsPrice(goods.getCurrPrice());
  2747. }
  2748. if (goods.getSellFeeRate() != goodsOrigin.getSellFeeRate()) {
  2749. goodsPriceRes.setSellFeeRate(sellFeeRate);
  2750. }
  2751. goodsPriceRes.setApplyStdt(GagaDateUtil.getTodayDateTime()); //yyyymmddhhmiss
  2752. int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) + 4;
  2753. goodsPriceRes.setApplyEddt(Integer.toString(toYear) + "1231235959"); //yyyymmddhhmiss
  2754. goodsPriceRes.setCfrmYn("N");
  2755. goodsPriceRes.setApplyYn("N");
  2756. goodsPriceRes.setRegNo(goods.getRegNo());
  2757. goodsPriceRes.setUpdNo(goods.getUpdNo());
  2758. goodsDao.createGoodPriceRes(goodsPriceRes);
  2759. // 상품테이블에 바로 변경하지 않고 입점상품가격관리에서 승인해야함
  2760. goods.setCurrPrice(goodsOrigin.getCurrPrice());
  2761. goods.setSellFeeRate(goodsOrigin.getSellFeeRate());
  2762. }
  2763. }
  2764. // 상품구분
  2765. if (StringUtils.isBlank(goodsMass.getGoodsGb())) {
  2766. goods.setGoodsRegMsg("상품구분 오류");
  2767. goods.setGoodsStat("10");
  2768. return goods;
  2769. }
  2770. goods.setGoodsGb(goodsMass.getGoodsGb().trim().toUpperCase());
  2771. // 상품구분
  2772. if (!UPDATE_NO_PATTERN.equals(goods.getGoodsGb())) {
  2773. commonCode.setCdGb("G073"); // 상품구분
  2774. commonCode.setCd(goods.getGoodsGb());
  2775. Collection<CommonCode> goodsGbList = rendererService.getCommonCodeList(commonCode);
  2776. if (goodsGbList == null || goodsGbList.isEmpty()) {
  2777. goods.setGoodsRegMsg("상품구분 오류");
  2778. goods.setGoodsStat("10");
  2779. return goods;
  2780. }
  2781. goods.setChDataYn("Y");
  2782. }
  2783. //정상이월구분
  2784. if (StringUtils.isBlank(goodsMass.getFormalGb())) {
  2785. goods.setGoodsRegMsg("정상이월구분 오류");
  2786. goods.setGoodsStat("10");
  2787. return goods;
  2788. }
  2789. goods.setFormalGb(goodsMass.getFormalGb().trim().toUpperCase()); // 정상이월
  2790. if (!UPDATE_NO_PATTERN.equals(goods.getFormalGb())
  2791. && !"G009_10".equals(goods.getFormalGb())
  2792. && !"G009_20".equals(goods.getFormalGb())) {
  2793. goods.setGoodsRegMsg("정상이월구분 오류");
  2794. goods.setGoodsStat("10");
  2795. return goods;
  2796. }
  2797. if (!UPDATE_NO_PATTERN.equals(goods.getFormalGb())) {
  2798. goods.setPntPrate(goodsOrigin.getPntPrate()); // 포인트적립율(PC)
  2799. goods.setPntMrate(goodsOrigin.getPntMrate()); // 포인트적립율(MOBILE)
  2800. Brand brand = new Brand();
  2801. brand.setBrandCd(goodsOrigin.getBrandCd());
  2802. Collection<Brand> brandList = businessService.getBrandList(brand);
  2803. if (brandList != null && !brandList.isEmpty()) {
  2804. // 브랜드 확인
  2805. float pntPrate = 0f;
  2806. float pntMrate = 0f;
  2807. for (Brand tmpBrand : brandList) {
  2808. if ("G009_10".equals(goods.getFormalGb())) {
  2809. pntPrate = tmpBrand.getPntPrate10();
  2810. pntMrate = tmpBrand.getPntMrate10();
  2811. } else {
  2812. pntPrate = tmpBrand.getPntPrate20();
  2813. pntMrate = tmpBrand.getPntMrate20();
  2814. }
  2815. }
  2816. goods.setPntPrate(pntPrate); // 포인트적립율(PC)
  2817. goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
  2818. }
  2819. goods.setChDataYn("Y");
  2820. }
  2821. //최소주문수량
  2822. if (UPDATE_NO_PATTERN.equals(goodsMass.getMinOrdQty().trim())) {
  2823. goods.setMinOrdQty(0);
  2824. } else {
  2825. if (!goodsMass.getMinOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getMinOrdQty().trim()) == 0) {
  2826. goods.setGoodsRegMsg("최소주문수량 오류");
  2827. goods.setGoodsStat("10");
  2828. return goods;
  2829. }
  2830. goods.setMinOrdQty(Integer.parseInt(goodsMass.getMinOrdQty().trim()));
  2831. goods.setChDataYn("Y");
  2832. }
  2833. //최대주문수량
  2834. if (UPDATE_NO_PATTERN.equals(goodsMass.getMaxOrdQty().trim())) {
  2835. goods.setMaxOrdQty(0);
  2836. } else {
  2837. if (!goodsMass.getMaxOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getMaxOrdQty().trim()) == 0) {
  2838. goods.setGoodsRegMsg("최대주문수량 오류");
  2839. goods.setGoodsStat("10");
  2840. return goods;
  2841. }
  2842. goods.setMaxOrdQty(Integer.parseInt(goodsMass.getMaxOrdQty().trim()));
  2843. goods.setChDataYn("Y");
  2844. }
  2845. //ID당1일최대주문수량
  2846. if (UPDATE_NO_PATTERN.equals(goodsMass.getDayMaxOrdQty().trim())) {
  2847. goods.setMaxOrdQty(0);
  2848. } else {
  2849. if (!goodsMass.getDayMaxOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getDayMaxOrdQty().trim()) == 0) {
  2850. goods.setGoodsRegMsg("ID당1일최대주문수량 오류");
  2851. goods.setGoodsStat("10");
  2852. return goods;
  2853. }
  2854. goods.setDayMaxOrdQty(Integer.parseInt(goodsMass.getDayMaxOrdQty().trim()));
  2855. goods.setChDataYn("Y");
  2856. }
  2857. if (goods.getMinOrdQty() > goods.getMaxOrdQty()) {
  2858. goods.setGoodsRegMsg("최소주문수량 오류(최대주문수량보다 클 수 없음)");
  2859. goods.setGoodsStat("10");
  2860. return goods;
  2861. }
  2862. if (goods.getMaxOrdQty() > goods.getDayMaxOrdQty()) {
  2863. goods.setGoodsRegMsg("최대주문수량 오류(ID당1일최대구매수량보다 클 수 없음)");
  2864. goods.setGoodsStat("10");
  2865. return goods;
  2866. }
  2867. //선물주문가능여부
  2868. if (StringUtils.isBlank(goodsMass.getGiftPackYn())) {
  2869. goods.setGoodsRegMsg("선물주문가능여부 오류");
  2870. goods.setGoodsStat("10");
  2871. return goods;
  2872. }
  2873. if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
  2874. if (!UPDATE_NO_PATTERN.equals(goodsMass.getGiftPackYn().trim().toUpperCase())) {
  2875. goods.setGiftPackYn(goodsMass.getGiftPackYn().trim().toUpperCase());
  2876. if (!"Y".equals(goods.getGiftPackYn()) && !"N".equals(goods.getGiftPackYn())) {
  2877. goods.setGoodsRegMsg("선물주문가능여부 오류");
  2878. goods.setGoodsStat("10");
  2879. return goods;
  2880. }
  2881. goods.setChDataYn("Y");
  2882. }
  2883. } else {
  2884. goods.setGiftPackYn(goodsOrigin.getGiftPackYn().trim().toUpperCase());
  2885. }
  2886. //신규가입구매가능여부
  2887. if (StringUtils.isBlank(goodsMass.getNewCustOrdYn())) {
  2888. goods.setGoodsRegMsg("신규가입구매가능여부 오류");
  2889. goods.setGoodsStat("10");
  2890. return goods;
  2891. }
  2892. if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
  2893. if (!UPDATE_NO_PATTERN.equals(goodsMass.getNewCustOrdYn().trim().toUpperCase())) {
  2894. goods.setNewCustOrdYn(goodsMass.getNewCustOrdYn().trim().toUpperCase());
  2895. if (!"Y".equals(goods.getNewCustOrdYn()) && !"N".equals(goods.getNewCustOrdYn())) {
  2896. goods.setGoodsRegMsg("신규가입구매가능여부 오류");
  2897. goods.setGoodsStat("10");
  2898. return goods;
  2899. }
  2900. goods.setChDataYn("Y");
  2901. }
  2902. } else {
  2903. goods.setNewCustOrdYn(goodsOrigin.getNewCustOrdYn().toUpperCase());
  2904. }
  2905. //반품여부
  2906. if (StringUtils.isBlank(goodsMass.getReturnableYn())) {
  2907. goods.setGoodsRegMsg("반품여부 오류");
  2908. goods.setGoodsStat("10");
  2909. return goods;
  2910. }
  2911. goods.setReturnableYn(goodsMass.getReturnableYn().trim().toUpperCase());
  2912. if (!UPDATE_NO_PATTERN.equals(goodsMass.getReturnableYn().trim())) {
  2913. if (!"Y".equals(goods.getReturnableYn()) && !"N".equals(goods.getReturnableYn())) {
  2914. goods.setGoodsRegMsg("반품여부 오류");
  2915. goods.setGoodsStat("10");
  2916. return goods;
  2917. }
  2918. goods.setChDataYn("Y");
  2919. }
  2920. //교환여부
  2921. if (StringUtils.isBlank(goodsMass.getChangeableYn())) {
  2922. goods.setGoodsRegMsg("교환여부 오류");
  2923. goods.setGoodsStat("10");
  2924. return goods;
  2925. }
  2926. goods.setChangeableYn(goodsMass.getChangeableYn().trim().toUpperCase());
  2927. if (!UPDATE_NO_PATTERN.equals(goodsMass.getChangeableYn().trim())) {
  2928. if (!"Y".equals(goods.getChangeableYn()) && !"N".equals(goods.getChangeableYn())) {
  2929. goods.setGoodsRegMsg("교환여부 오류");
  2930. goods.setGoodsStat("10");
  2931. return goods;
  2932. }
  2933. goods.setChDataYn("Y");
  2934. }
  2935. //과세구분
  2936. if (StringUtils.isBlank(goodsMass.getTaxGb())) {
  2937. goods.setGoodsRegMsg("과세구분 오류");
  2938. goods.setGoodsStat("10");
  2939. return goods;
  2940. }
  2941. goods.setTaxGb(goodsMass.getTaxGb().trim().toUpperCase());
  2942. if (!UPDATE_NO_PATTERN.equals(goodsMass.getTaxGb().trim())) {
  2943. if (!"10".equals(goods.getTaxGb()) && !"20".equals(goods.getTaxGb()) && !"30".equals(goods.getTaxGb())) {
  2944. goods.setGoodsRegMsg("과세구분 오류");
  2945. goods.setGoodsStat("10");
  2946. return goods;
  2947. }
  2948. goods.setChDataYn("Y");
  2949. }
  2950. //상품연령
  2951. if (StringUtils.isBlank(goodsMass.getAgeGrpCd())) {
  2952. goods.setGoodsRegMsg("상품연령 오류");
  2953. goods.setGoodsStat("10");
  2954. return goods;
  2955. }
  2956. goods.setAgeGrpCd(goodsMass.getAgeGrpCd().trim().toUpperCase());
  2957. if (!UPDATE_NO_PATTERN.equals(goods.getAgeGrpCd())) {
  2958. commonCode.setCdGb("G023");
  2959. commonCode.setCd(goods.getAgeGrpCd());
  2960. Collection<CommonCode> ageGrpCdList = rendererService.getCommonCodeList(commonCode);
  2961. if (ageGrpCdList == null || ageGrpCdList.isEmpty()) {
  2962. goods.setGoodsRegMsg("상품연령 오류");
  2963. goods.setGoodsStat("10");
  2964. return goods;
  2965. }
  2966. goods.setChDataYn("Y");
  2967. }
  2968. //성인용품여부
  2969. if (StringUtils.isBlank(goodsMass.getAdultYn())) {
  2970. goods.setGoodsRegMsg("성인용품여부 오류");
  2971. goods.setGoodsStat("10");
  2972. return goods;
  2973. }
  2974. goods.setAdultYn(goodsMass.getAdultYn().trim().toUpperCase());
  2975. if (!UPDATE_NO_PATTERN.equals(goods.getAdultYn())) {
  2976. if (!"Y".equals(goods.getAdultYn()) && !"N".equals(goods.getAdultYn())) {
  2977. goods.setGoodsRegMsg("성인용품여부 오류");
  2978. goods.setGoodsStat("10");
  2979. return goods;
  2980. }
  2981. goods.setChDataYn("Y");
  2982. }
  2983. //PC포인트적립율
  2984. if (StringUtils.isBlank(goodsMass.getPntPrate())) {
  2985. goods.setGoodsRegMsg("PC포인트적립율 오류");
  2986. goods.setGoodsStat("10");
  2987. return goods;
  2988. }
  2989. if (!UPDATE_NO_PATTERN.equals(goodsMass.getPntPrate().trim())) {
  2990. try {
  2991. float pntPrate = Float.valueOf(goodsMass.getPntPrate().trim());
  2992. goods.setPntPrate(pntPrate);
  2993. } catch (Exception e) {
  2994. goods.setGoodsRegMsg("PC포인트적립율 오류");
  2995. goods.setGoodsStat("10");
  2996. return goods;
  2997. }
  2998. goods.setChDataYn("Y");
  2999. }
  3000. if (StringUtils.isBlank(goodsMass.getPrePpntUsableYn())) {
  3001. goods.setGoodsRegMsg("PC선포인트 사용여부 오류");
  3002. goods.setGoodsStat("10");
  3003. return goods;
  3004. }
  3005. if (!UPDATE_NO_PATTERN.equals(goodsMass.getPrePpntUsableYn().trim())) {
  3006. if ("Y".equals(goodsMass.getPrePpntUsableYn().trim()) || "N".equals(goodsMass.getPrePpntUsableYn().trim())) {
  3007. goods.setPrePpntUsableYn(goodsMass.getPrePpntUsableYn().trim());
  3008. goods.setChDataYn("Y");
  3009. } else {
  3010. goods.setGoodsRegMsg("PC선포인트 사용여부 오류");
  3011. goods.setGoodsStat("10");
  3012. return goods;
  3013. }
  3014. }
  3015. if (StringUtils.isBlank(goodsMass.getPntMrate())) {
  3016. goods.setGoodsRegMsg("모바일포인트적립율 오류");
  3017. goods.setGoodsStat("10");
  3018. return goods;
  3019. }
  3020. if (!UPDATE_NO_PATTERN.equals(goodsMass.getPntMrate().trim())) {
  3021. try {
  3022. int pntMrate = Integer.parseInt(goodsMass.getPntMrate().trim());
  3023. goods.setPntMrate(pntMrate);
  3024. } catch (Exception e) {
  3025. goods.setGoodsRegMsg("모바일포인트적립율 오류");
  3026. goods.setGoodsStat("10");
  3027. return goods;
  3028. }
  3029. goods.setChDataYn("Y");
  3030. }
  3031. if (StringUtils.isBlank(goodsMass.getPreMpntUsableYn())) {
  3032. goods.setGoodsRegMsg("모바일선포인트 사용여부 오류");
  3033. goods.setGoodsStat("10");
  3034. return goods;
  3035. }
  3036. if (!UPDATE_NO_PATTERN.equals(goodsMass.getPreMpntUsableYn().trim())) {
  3037. if ("Y".equals(goodsMass.getPreMpntUsableYn().trim()) || "N".equals(goodsMass.getPreMpntUsableYn().trim())) {
  3038. goods.setPreMpntUsableYn(goodsMass.getPreMpntUsableYn().trim());
  3039. goods.setChDataYn("Y");
  3040. } else {
  3041. goods.setGoodsRegMsg("모바일선포인트 사용여부 오류");
  3042. goods.setGoodsStat("10");
  3043. return goods;
  3044. }
  3045. }
  3046. // 배송비 정책 확인
  3047. if (StringUtils.isBlank(goodsMass.getDelvFeeCd())) {
  3048. goods.setGoodsRegMsg("배송비정책코드 오류");
  3049. goods.setGoodsStat("10");
  3050. return goods;
  3051. }
  3052. goods.setDelvFeeCd(goodsMass.getDelvFeeCd().trim().toUpperCase());
  3053. if (!UPDATE_NO_PATTERN.equals(goods.getDelvFeeCd())) {
  3054. DelvFeePolicy delvFeePolicy = new DelvFeePolicy();
  3055. delvFeePolicy.setSupplyCompCd(goods.getSupplyCompCd());
  3056. delvFeePolicy.setDelvFeeCd(goods.getDelvFeeCd());
  3057. delvFeePolicy.setUseYn("Y");
  3058. Collection<DelvFeePolicy> deliveryFeePolicyList = businessService.getDeliveryFeePolicyList(delvFeePolicy);
  3059. if (deliveryFeePolicyList != null && !deliveryFeePolicyList.isEmpty()) {
  3060. goods.setGoodsRegMsg("배송비정책코드 오류");
  3061. goods.setGoodsStat("10");
  3062. return goods;
  3063. }
  3064. }
  3065. return goods;
  3066. }
  3067. /**
  3068. * 상품대량수정 - 상품고시정보 check
  3069. *
  3070. * @param goods
  3071. * @param excelMap
  3072. * @param goodsOrigin
  3073. * @param newGoodsNotiList
  3074. * @return Goods
  3075. * @author eskim
  3076. * @since 2021. 01. 25
  3077. */
  3078. private Goods getUpdateMassGoodsNotiCheck(Goods goods, GagaMap excelMap, Goods goodsOrigin, Collection<GoodsNotiInfo> newGoodsNotiList) {
  3079. goods.setChNotiYn("N");
  3080. String oldNiClsfCd = "";
  3081. String newNiClsfCd = "";
  3082. newNiClsfCd = excelMap.getString("niClsfCd").trim();
  3083. for (int i = 0; i < 28; i++) {
  3084. if (StringUtils.isBlank(excelMap.getString("niContent" + (i + 1)))) {
  3085. goods.setGoodsRegMsg("고시항목정보 없음 (" + (i + 1) + "번째 항목)");
  3086. goods.setGoodsStat("10");
  3087. return goods;
  3088. }
  3089. if (!UPDATE_NO_PATTERN.equals(excelMap.getString("niContent" + (i + 1)).trim())) {
  3090. goods.setChNotiYn("Y");
  3091. }
  3092. }
  3093. // 변경사항이 있는지 확인
  3094. if (UPDATE_NO_PATTERN.equals(newNiClsfCd) && "N".equals(goods.getChNotiYn())) {
  3095. return goods;
  3096. }
  3097. Collection<GoodsNotiInfo> goodsNotiList = new ArrayList<>();
  3098. //고시분류 코드의 고시항목 조회
  3099. NotiInfo notiInfo = new NotiInfo();
  3100. notiInfo.setSupplyCompCd(goodsOrigin.getSupplyCompCd());
  3101. if (!UPDATE_NO_PATTERN.equals(newNiClsfCd)) {
  3102. notiInfo.setNiClsfCd(newNiClsfCd);
  3103. } else {
  3104. GoodsNotiInfo goodsNotiInfo = new GoodsNotiInfo();
  3105. goodsNotiInfo.setGoodsCd(goods.getGoodsCd());
  3106. goodsNotiList = goodsDao.getGoodsNotiInfoList(goodsNotiInfo);
  3107. if (goodsNotiList != null && !goodsNotiList.isEmpty()) {
  3108. oldNiClsfCd = goodsNotiList.iterator().next().getNiClsfCd();
  3109. }
  3110. notiInfo.setNiClsfCd(oldNiClsfCd);
  3111. newNiClsfCd = oldNiClsfCd;
  3112. }
  3113. Collection<NotiInfo> notiInfolist = goodsDao.getNotiInfoItemList(notiInfo); // 항목별 기본값 조회
  3114. // 상품의 고시 분류코드 조회
  3115. if (notiInfolist == null || notiInfolist.isEmpty()) {
  3116. goods.setGoodsRegMsg("고시분류정보 없음");
  3117. goods.setGoodsStat("10");
  3118. return goods;
  3119. }
  3120. int index = 0;
  3121. // 같은 고시분류 일경우 기존 고시항목 정보 적용
  3122. if (oldNiClsfCd.equals(newNiClsfCd)) {
  3123. for (NotiInfo notiInfoData : notiInfolist) {
  3124. for (GoodsNotiInfo goodsNotiInfoTemp : goodsNotiList) {
  3125. if (notiInfoData.getNiItemCd().equals(goodsNotiInfoTemp.getNiItemCd())) {
  3126. notiInfoData.setNiContent(goodsNotiInfoTemp.getNiContent());
  3127. break;
  3128. }
  3129. }
  3130. index++;
  3131. }
  3132. }
  3133. index = 0;
  3134. for (NotiInfo notiInfoTmp : notiInfolist) {
  3135. GoodsNotiInfo goodsNotiInfoTmp = new GoodsNotiInfo();
  3136. goodsNotiInfoTmp.setGoodsCd(goods.getGoodsCd());
  3137. goodsNotiInfoTmp.setNiClsfCd(notiInfoTmp.getNiClsfCd());
  3138. goodsNotiInfoTmp.setNiItemCd(notiInfoTmp.getNiItemCd());
  3139. goodsNotiInfoTmp.setDispOrd(index + 1);
  3140. goodsNotiInfoTmp.setRegNo(TsaSession.getInfo().getUserNo());
  3141. goodsNotiInfoTmp.setUpdNo(TsaSession.getInfo().getUserNo());
  3142. if (UPDATE_NO_PATTERN.equals(excelMap.getString("niContent" + (index + 1)))) {
  3143. goodsNotiInfoTmp.setNiContent(notiInfoTmp.getNiContent());
  3144. } else {
  3145. goodsNotiInfoTmp.setNiContent(excelMap.getString("niContent" + (index + 1)));
  3146. }
  3147. newGoodsNotiList.add(goodsNotiInfoTmp);
  3148. index++;
  3149. }
  3150. return goods;
  3151. }
  3152. /**
  3153. * 상품등록로그 목록
  3154. *
  3155. * @param goodsSearch
  3156. * @return
  3157. * @author eskim
  3158. * @since 2020. 01. 25
  3159. */
  3160. public Collection<GoodsMass> getGoodsRegLogList(GoodsSearch goodsSearch) {
  3161. // 입점업체담당자는 업체코드 설정
  3162. if ("G001_B000".equals(TsaSession.getInfo().getRoleCd()) || "G001_E000".equals(TsaSession.getInfo().getRoleCd())) {
  3163. goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
  3164. goodsSearch.setRegNo(TsaSession.getInfo().getUserNo());
  3165. }
  3166. return goodsDao.getGoodsRegLogList(goodsSearch);
  3167. }
  3168. /**
  3169. * 사이즈 정보 목록
  3170. *
  3171. * @param sizeInfo
  3172. * @return
  3173. * @author eskim
  3174. * @since 2021. 01. 26
  3175. */
  3176. public Collection<SizeInfo> getSizeInfoList(SizeInfo sizeInfo) {
  3177. return goodsDao.getSizeInfoList(sizeInfo);
  3178. }
  3179. /**
  3180. * 사이즈 정보 저장
  3181. *
  3182. * @param sizeInfo
  3183. * @return
  3184. * @author eskim
  3185. * @since 2021. 01. 27
  3186. */
  3187. public void saveSizeInfo(SizeInfo sizeInfo) {
  3188. //log.info("[saveSizeInfo] sizeInfo {}", sizeInfo);
  3189. String sizeCate1Cd = "";
  3190. String sizeCate2Cd = "";
  3191. if ("1".equals(sizeInfo.getSizeGb())) {
  3192. if (StringUtils.isBlank(sizeInfo.getSizeCate1Cd())) {
  3193. sizeCate1Cd = "00";
  3194. if ("Y".equals(sizeInfo.getSelfYn())) {
  3195. sizeCate1Cd = sizeInfo.getBrandCd();
  3196. }
  3197. sizeInfo.setSizeCate1Cd(sizeCate1Cd);
  3198. }
  3199. if (StringUtils.isBlank(sizeInfo.getSizeCate2Cd())) {
  3200. sizeCate2Cd = tscCommonService.getNextSequence("SEQ_CATE").toString();
  3201. sizeInfo.setSizeCate2Cd(sizeCate2Cd);
  3202. }
  3203. } else {
  3204. if (StringUtils.isBlank(sizeInfo.getSizeCate1Cd())) {
  3205. sizeCate1Cd = tscCommonService.getNextSequence("SEQ_CATE").toString();
  3206. sizeInfo.setSizeCate1Cd(sizeCate1Cd);
  3207. sizeInfo.setSizeCate2Cd(sizeCate1Cd);
  3208. }
  3209. }
  3210. sizeInfo.setRegNo(TsaSession.getInfo().getUserNo());
  3211. sizeInfo.setUpdNo(TsaSession.getInfo().getUserNo());
  3212. goodsDao.saveSizeInfo(sizeInfo);
  3213. }
  3214. /**
  3215. * 총알배송 제외 상품 건수
  3216. *
  3217. * @param goodsSearch
  3218. * @return
  3219. * @author eskim
  3220. * @since 2021. 02. 25
  3221. */
  3222. public int getGoodsQuikDeleverySkipCount(GoodsSearch goodsSearch) {
  3223. return goodsDao.getGoodsQuikDeleverySkipCount(goodsSearch);
  3224. }
  3225. /**
  3226. * 총알배송 제외 상품 목록
  3227. *
  3228. * @param goodsSearch
  3229. * @return
  3230. * @author eskim
  3231. * @since 2021. 02. 25
  3232. */
  3233. public Collection<Goods> getGoodsQuikDeleverySkipList(GoodsSearch goodsSearch) {
  3234. return goodsDao.getGoodsQuikDeleverySkipList(goodsSearch);
  3235. }
  3236. /**
  3237. * 총알배송 제외 상품 저장
  3238. *
  3239. * @param goods
  3240. * @author eskim
  3241. * @since 2021. 02. 25
  3242. */
  3243. @Transactional("shopTxnManager")
  3244. public void createGoodsQuikDeleverySkip(Goods goods) {
  3245. if (goods.getArrGoodsCd().length <= 0) {
  3246. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  3247. }
  3248. GoodsSearch search = new GoodsSearch();
  3249. search.setConditionList(goods.getArrGoodsCd());
  3250. search.setSearch("searchGoodsCd");
  3251. int cnt = getGoodsListCount(search);
  3252. if (cnt < goods.getArrGoodsCd().length) {
  3253. throw new IllegalStateException("상품코드를 확인해주세요.");
  3254. }
  3255. goods.setRegNo(TsaSession.getInfo().getUserNo());
  3256. goods.setUpdNo(TsaSession.getInfo().getUserNo());
  3257. for (String goodsCd : goods.getArrGoodsCd()) {
  3258. goods.setGoodsCd(goodsCd);
  3259. goodsDao.createGoodsQuikDeleverySkip(goods);
  3260. }
  3261. }
  3262. /**
  3263. * 총알배송 제외 상품 삭제
  3264. *
  3265. * @param goods
  3266. * @author eskim
  3267. * @since 2021. 02. 25
  3268. */
  3269. @Transactional("shopTxnManager")
  3270. public void deleteGoodsQuikDeleverySkip(Goods goods) {
  3271. if (goods.getArrGoodsCd().length <= 0) {
  3272. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  3273. }
  3274. goodsDao.deleteGoodsQuikDeleverySkip(goods);
  3275. }
  3276. /**
  3277. * 상품 입출고 엑셀조회용 상품 저장
  3278. *
  3279. * @param procJob : goodsExcelUpload
  3280. * @param goodsSizeList
  3281. * @return
  3282. * @author eskim
  3283. * @since 2020. 02. 13
  3284. */
  3285. @Transactional("shopTxnManager")
  3286. public void saveGoodsSizeSoldoutExcelupload(Collection<Goods> goodsList, String excelFilename) {
  3287. String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
  3288. if (goodsList == null || goodsList.isEmpty()) {
  3289. this.deleteExceluploadFile(targetPath, excelFilename);
  3290. throw new IllegalStateException(message.getMessage("FAIL_1001"));
  3291. }
  3292. //건수
  3293. if (goodsList != null && goodsList.size() > EXCEL_ROW_COUNT) {
  3294. throw new IllegalStateException("엑셀 파일의 건수를 " + EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
  3295. }
  3296. // 검증
  3297. GoodsSearch search = new GoodsSearch();
  3298. search.setSearch("searchGoodsCd");
  3299. int index = 0;
  3300. for (Goods goods : goodsList) {
  3301. search.setGoodsCd(goods.getGoodsCd());
  3302. int cnt = getGoodsListCount(search);
  3303. if (cnt == 0) {
  3304. throw new IllegalStateException("상품코드를 확인해주세요.");
  3305. }
  3306. goods.setRegNo(TsaSession.getInfo().getUserNo());
  3307. // 엑셀조회를 위한 SEARCH 테이블 생성
  3308. SearchData searchData = new SearchData();
  3309. searchData.setRegNo(goods.getRegNo());
  3310. searchData.setSearchCd(goods.getGoodsCd());
  3311. searchData.setDispOrd(index);
  3312. if (index == 0) {
  3313. commonService.deleteExceluploadSearCh(searchData);
  3314. }
  3315. commonService.createExceluploadSearch(searchData);
  3316. goodsDao.createGoodsQuikDeleverySkip(goods);
  3317. index++;
  3318. }
  3319. }
  3320. /**
  3321. * 상품 모델 정보
  3322. *
  3323. * @param goodsImg
  3324. * @return
  3325. * @author eskim
  3326. * @since 2021. 04. 27
  3327. */
  3328. public GoodsImg getGoodsModelInfo(GoodsImg goodsImg) {
  3329. return goodsDao.getGoodsModelInfo(goodsImg);
  3330. }
  3331. /**
  3332. * 상품 모델 정보 저장
  3333. *
  3334. * @param goodsImg
  3335. * @return
  3336. * @author eskim
  3337. * @since 2020.04. 27
  3338. */
  3339. @Transactional("shopTxnManager")
  3340. public void saveGoodsModelInfo(GoodsImg goodsImg) {
  3341. goodsDao.saveGoodsModelInfo(goodsImg);
  3342. }
  3343. /**
  3344. * WMS입고단품목록 건수
  3345. *
  3346. * @param goodsSearch
  3347. * @return Collection<WmsGoods>
  3348. * @author eskim
  3349. * @since 2021. 06. 28
  3350. */
  3351. public int getGoodsWmsIncomelotSkuListCount(IfIncomelot iIfIncomelot) {
  3352. return goodsDao.getGoodsWmsIncomelotSkuListCount(iIfIncomelot);
  3353. }
  3354. /**
  3355. * WMS입고단품목록 조회
  3356. *
  3357. * @param goodsSearch
  3358. * @return Collection<WmsGoods>
  3359. * @author eskim
  3360. * @since 2021. 06. 28
  3361. */
  3362. public Collection<WmsGoods> getGoodsWmsIncomelotSkuList(IfIncomelot ifIncomelot) {
  3363. return goodsDao.getGoodsWmsIncomelotSkuList(ifIncomelot);
  3364. }
  3365. /**
  3366. * 자사 상품 등록
  3367. *
  3368. * @param goods
  3369. * @return
  3370. * @author eskim
  3371. * @since 2021. 07. 04
  3372. */
  3373. @Transactional("shopTxnManager")
  3374. public void createSalfGoodsDetail(Goods goods) {
  3375. // 중복여부 확인
  3376. Goods goodsDup = goodsDao.getGoods(goods);
  3377. if (goodsDup != null) {
  3378. throw new IllegalStateException("자사상품코드 중복요청입니다.");
  3379. }
  3380. // 입고여부확인
  3381. WmsGoods WmsGoods = goodsDao.getWmsGoodsInfo(goods);
  3382. if (WmsGoods == null) {
  3383. throw new IllegalStateException("미입고 상품코드입니다.");
  3384. }
  3385. Brand brand = new Brand();
  3386. brand.setSupplyCompCd(goods.getSupplyCompCd());
  3387. brand.setBrandCd(goods.getBrandCd());
  3388. int brandCount = goodsDao.getBrandSupplyCount(brand);
  3389. if (brandCount != 1) {
  3390. throw new IllegalStateException("미입고 상품의 업체/브랜드코드와 상품의 업체/브랜드코드가 상이합니다.");
  3391. }
  3392. goods.setErpStockLinkYn("Y");
  3393. goods.setGoodsStat("G008_20");
  3394. goods.setNewCustOrdYn("N");
  3395. goods.setSelfGoodsYn("Y");
  3396. goods.setGoodsType("G056_N");
  3397. goods.setTobeFormYn("Y");
  3398. // <,> replace 처리
  3399. goods.setRegNo(TsaSession.getInfo().getUserNo());
  3400. goods.setUpdNo(TsaSession.getInfo().getUserNo());
  3401. // goods.setGoodsDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsDesc(), "&lt;", "<"), "&gt;", ">"));
  3402. // goods.setGoodsPcTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcTopDesc(), "&lt;", "<"), "&gt;", ">"));
  3403. // goods.setGoodsMobileTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileTopDesc(), "&lt;", "<"), "&gt;", ">"));
  3404. // goods.setGoodsPcDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcDownDesc(), "&lt;", "<"), "&gt;", ">"));
  3405. // goods.setGoodsMobileDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileDownDesc(), "&lt;", "<"), "&gt;", ">"));
  3406. //
  3407. // goods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
  3408. // goods.setGoodsTnm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsTnm(), "&lt;", "<"), "&gt;", ">"));
  3409. // goods.setGoodsSnm1(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsSnm1(), "&lt;", "<"), "&gt;", ">"));
  3410. // 판매기간설정 eskim
  3411. goods.setSellStdt(goods.getSellStYMD().replaceAll("-", "") + goods.getSellStHH() + "0000");
  3412. goods.setSellEddt(goods.getSellEdYMD().replaceAll("-", "") + goods.getSellEdHH() + "5959");
  3413. // 품번코드
  3414. goods.setGoodsNum(goods.getGoodsCd());
  3415. // 입점상품코드
  3416. goods.setSupplyGoodsCd(goods.getGoodsCd());
  3417. if (goods.getListPrice() < goods.getCurrPrice()) {
  3418. throw new IllegalStateException("판매가를 올바르게 입력해주세요.");
  3419. }
  3420. // 판매수수료율
  3421. SupplyCompany supplyCompany = new SupplyCompany();
  3422. supplyCompany.setSupplyCompCd(goods.getSupplyCompCd());
  3423. Collection<SupplyCompany> supplyCompanyList = businessService.getSupplyCompanyList(supplyCompany);
  3424. if (supplyCompanyList == null || supplyCompanyList.isEmpty()) {
  3425. throw new IllegalStateException("업체정보를 확인해 주세요.");
  3426. }
  3427. goods.setSellFeeRate(supplyCompanyList.iterator().next().getSellFeeRate()); // 판매수수료율
  3428. // 적립포인트 관련 브랜드 확인
  3429. // Brand brand = new Brand();
  3430. brand.setBrandCd(goods.getBrandCd());
  3431. Collection<Brand> brandList = businessService.getBrandList(brand);
  3432. if (brandList == null || brandList.isEmpty()) {
  3433. throw new IllegalStateException("상품브랜드를 확인해 주세요.");
  3434. }
  3435. float pntPrate = 0f;
  3436. float pntMrate = 0f;
  3437. String distributionGb = "G065_12";
  3438. for (Brand tmpBrand : brandList) {
  3439. if ("G009_10".equals(goods.getFormalGb())) {
  3440. pntPrate = tmpBrand.getPntPrate10();
  3441. pntMrate = tmpBrand.getPntMrate10();
  3442. } else {
  3443. pntPrate = tmpBrand.getPntPrate20();
  3444. pntMrate = tmpBrand.getPntMrate20();
  3445. }
  3446. distributionGb = tmpBrand.getDistributionGb(); //유통구분
  3447. }
  3448. goods.setPntPrate(pntPrate); // 포인트적립율(PC)
  3449. goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
  3450. goods.setPrePpntUsableYn("N");
  3451. goods.setPreMpntUsableYn("N");
  3452. goods.setDistributionGb(distributionGb);
  3453. //출고처 코드
  3454. goods.setDelvLocCd("DL001"); // 자사상품 출고처 코드 고정
  3455. // 기본정보 생성
  3456. goodsDao.createGoods(goods); // 상품기본 저장
  3457. goodsDao.createGoodsSmmary(goods); // 상품통계 생성
  3458. WmsGoods wmsGoods = new WmsGoods();
  3459. wmsGoods.setUpdNo(TsaSession.getInfo().getUserNo());
  3460. wmsGoods.setGoodsRegGb("G"); // G: 상품, F: 사은품
  3461. wmsGoods.setModelNo(goods.getGoodsCd());
  3462. goodsDao.saveGoodsWmsIncomelotByModelNo(wmsGoods); // wms 상품 상품등록일 변경
  3463. // 사용자 검색어를 검색어에 적용
  3464. String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
  3465. if (!StringUtils.isBlank(goods.getGoodsSnm1())) {
  3466. String[] arrGoodsSnm = goods.getGoodsSnm1().split("\\;");
  3467. StringBuilder tempGoodsSnm = new StringBuilder();
  3468. for (String loopGoodsSnm : arrGoodsSnm) {
  3469. if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
  3470. tempGoodsSnm.append(loopGoodsSnm).append(";");
  3471. }
  3472. }
  3473. goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
  3474. } else if (!goodsSnm.equals(goods.getGoodsSnm())) {
  3475. goods.setGoodsSnm(goodsSnm);
  3476. }
  3477. // 상품타이틀 수정
  3478. goodsDao.updateGoodsSnm(goods);
  3479. // 상품사이즈 정보
  3480. Collection<IfProductSku> goodsWmsSizeList = wmsGoodsService.getGoodsWmsSizeList(goods.getGoodsCd());
  3481. if (goodsWmsSizeList == null || goodsWmsSizeList.isEmpty()) {
  3482. throw new IllegalStateException("WMS의 TB_IF_PRODUCTSKU 에 " + goods.getGoodsCd() + " 상품이 존재하지 않습니다.");
  3483. } else {
  3484. int index = 1;
  3485. for (IfProductSku ifProductSku : goodsWmsSizeList) {
  3486. Option wmsOption = goodsDao.getWmsColorStock(ifProductSku);
  3487. if (wmsOption == null) {
  3488. throw new IllegalStateException(goods.getGoodsCd() + " 의 WMS의 색상 " + ifProductSku.getWmsColorCd() + "이(가) WMS색상관리에 없습니다.");
  3489. }
  3490. Option goodsStock = new Option();
  3491. goodsStock.setGoodsCd(goods.getGoodsCd());
  3492. goodsStock.setOptCd(ifProductSku.getSkucode());
  3493. goodsStock.setOptCd1(wmsOption.getOptCd1());
  3494. goodsStock.setOptCd2(ifProductSku.getOption2());
  3495. goodsStock.setSkuModelNo(ifProductSku.getSkumodelno());
  3496. goodsStock.setProductNo(ifProductSku.getProductno());
  3497. goodsStock.setProductCode(ifProductSku.getProductcode());
  3498. goodsStock.setBaseStockQty(0);
  3499. goodsStock.setCurrStockQty(wmsOption.getCurrStockQty());
  3500. goodsStock.setStoreStockQty(0);
  3501. goodsStock.setStoreMaxQty(wmsOption.getCurrStockQty());
  3502. goodsStock.setAddPrice(0);
  3503. goodsStock.setSoldoutYn("N");
  3504. goodsStock.setDispOrd(index);
  3505. goodsStock.setDispYn("Y");
  3506. goodsStock.setRegNo(TsaSession.getInfo().getUserNo());
  3507. goodsStock.setUpdNo(TsaSession.getInfo().getUserNo());
  3508. goodsDao.saveStock(goodsStock);
  3509. index++;
  3510. }
  3511. }
  3512. // 상품 색상 , 사이즈 옵션 정보 조회
  3513. Goods goodsColorSize = goodsDao.getGoodsColorSize(goods);
  3514. if (goodsColorSize != null && !StringUtils.isBlank(goodsColorSize.getMainColorCd())) {
  3515. goodsColorSize.setUpdNo(TsaSession.getInfo().getUserNo());
  3516. goodsDao.updateGoodsMainColorCd(goodsColorSize); // 대표색상 설정
  3517. }
  3518. // 상품상세정보 저장
  3519. this.saveGoodsDetailDesc(goods);
  3520. // 상품 정보고시 변경
  3521. this.saveGoodsNotiInfo(goods);
  3522. // 전시카테고리 작업
  3523. goodsDao.createCategoryGoods(goods);
  3524. log.info("goods = {}", goods);
  3525. // 안전안증작업
  3526. if (!StringUtils.isEmpty(goods.getCertTargetGb())) {
  3527. GoodsSafeNo goodsSafeNo = new GoodsSafeNo();
  3528. goodsSafeNo.setGoodsCd(goods.getGoodsCd());
  3529. goodsSafeNo.setCertTargetGb(goods.getCertTargetGb());
  3530. goodsSafeNo.setCertFormGb(goods.getCertFormGb());
  3531. goodsSafeNo.setCertType(goods.getCertType());
  3532. goodsSafeNo.setCertNum(goods.getCertNum());
  3533. saveGoodsDetailCertNum(goodsSafeNo);
  3534. }
  3535. }
  3536. }