TsaGoodsService.java 141 KB

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