HouseOrderController.java 205 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368
  1. package com.template.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.metadata.IPage;
  7. import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  8. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  9. import com.sun.org.apache.bcel.internal.generic.NEW;
  10. import com.template.annotation.PassToken;
  11. import com.template.api.HouseOrderAPI;
  12. import com.template.common.utils.*;
  13. import com.template.component.WeiXiaoComponent;
  14. import com.template.config.WeixiaoConfig;
  15. import com.template.config.WxPayV3Config;
  16. import com.template.model.dto.*;
  17. import com.template.model.enumModel.ePayStatu;
  18. import com.template.model.pojo.*;
  19. import com.template.model.result.CommonResult;
  20. import com.template.model.result.PageUtils;
  21. import com.template.model.vo.*;
  22. import com.template.model.weixin.PayUtil;
  23. import com.template.model.weixin.WechatPayV3Util;
  24. import com.template.services.*;
  25. import com.wechat.pay.java.core.Config;
  26. import com.wechat.pay.java.core.RSAAutoCertificateConfig;
  27. import com.wechat.pay.java.core.notification.NotificationConfig;
  28. import com.wechat.pay.java.core.notification.NotificationParser;
  29. import com.wechat.pay.java.core.notification.RequestParam;
  30. import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
  31. import com.wechat.pay.java.service.payments.jsapi.model.*;
  32. import com.wechat.pay.java.service.payments.model.Transaction;
  33. import com.wechat.pay.java.service.payments.nativepay.NativePayService;
  34. import com.wechat.pay.java.service.refund.RefundService;
  35. import com.wechat.pay.java.service.refund.model.QueryByOutRefundNoRequest;
  36. import com.wechat.pay.java.service.refund.model.Refund;
  37. import io.swagger.annotations.ApiModelProperty;
  38. import lombok.extern.slf4j.Slf4j;
  39. import org.apache.http.impl.client.CloseableHttpClient;
  40. import org.apache.poi.ss.usermodel.Row;
  41. import org.apache.poi.ss.usermodel.Sheet;
  42. import org.apache.poi.ss.usermodel.Workbook;
  43. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  44. import org.springframework.beans.BeanUtils;
  45. import org.springframework.beans.factory.annotation.Autowired;
  46. import org.springframework.http.HttpEntity;
  47. import org.springframework.http.HttpHeaders;
  48. import org.springframework.http.HttpMethod;
  49. import org.springframework.scheduling.annotation.Scheduled;
  50. import org.springframework.transaction.annotation.Transactional;
  51. import org.springframework.util.StringUtils;
  52. import org.springframework.validation.BindingResult;
  53. import org.springframework.web.bind.annotation.RestController;
  54. import org.springframework.web.client.RestTemplate;
  55. import javax.servlet.http.HttpServletRequest;
  56. import javax.servlet.http.HttpServletResponse;
  57. import java.math.BigDecimal;
  58. import java.security.Signature;
  59. import java.text.SimpleDateFormat;
  60. import java.time.Duration;
  61. import java.time.LocalDate;
  62. import java.time.LocalDateTime;
  63. import java.time.ZoneId;
  64. import java.time.format.DateTimeFormatter;
  65. import java.time.format.TextStyle;
  66. import java.time.temporal.ChronoUnit;
  67. import java.util.*;
  68. import java.util.stream.Collectors;
  69. import static com.template.common.utils.StrUtils.getUUIDBits;
  70. import static com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.NOTPAY;
  71. import static com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.SUCCESS;
  72. /**
  73. * <p>
  74. * 前端控制器
  75. * </p>
  76. *
  77. * @author ceshi
  78. * @since 2023-11-21
  79. */
  80. @RestController
  81. @Slf4j
  82. public class HouseOrderController implements HouseOrderAPI {
  83. @Autowired
  84. HouseOrderService houseOrderService;
  85. @Autowired
  86. HouseService houseService;
  87. @Autowired
  88. private WeixiaoConfig weixiaoConfig;
  89. @Autowired
  90. HouseNumberService houseNumberService;
  91. @Autowired
  92. HouseNumberStateService houseNumberStateService;
  93. @Autowired
  94. ClassScheduleService classScheduleService;
  95. @Autowired
  96. HousePriceService housePriceService;
  97. @Autowired
  98. UsersService usersService;
  99. @Autowired
  100. HouseLockService houseLockService;
  101. @Autowired
  102. WeiXiaoComponent weiXiaoComponent;
  103. @Autowired
  104. UnlockingService unlockingService;
  105. @Autowired
  106. PasswordIssController passwordIssController;
  107. @Autowired
  108. PermissionSettingService permissionSettingService;
  109. @Autowired
  110. AdminService adminService;
  111. @Autowired
  112. OperatingRecordService operatingRecordService;
  113. @Autowired
  114. WaterEquipmentService waterEquipmentService;
  115. @Autowired
  116. ElectricEquipmentService electricEquipmentService;
  117. @Autowired
  118. private WxPayV3Config wxPayV3Config;
  119. @Autowired
  120. PayRecordService payRecordService;
  121. @Autowired
  122. RefundRecordService refundRecordService;
  123. @Autowired
  124. SubsidySetupService subsidySetupService;
  125. @Autowired
  126. ApartmentSettingService apartmentSettingService;
  127. @Autowired
  128. BlacklistOrderService blacklistOrderService;
  129. @Autowired
  130. BlacklistService blacklistService;
  131. @Autowired
  132. BlacklistSettingService blacklistSettingService;
  133. @Autowired
  134. ApplicationProcedureTemporaryService applicationProcedureTemporaryService;
  135. @Autowired
  136. HouseOrderBillService houseOrderBillService;
  137. @Override
  138. public CommonResult getHouseOrderPrice(int houseOrderNumber, String userId, String houseId, String liveTime, String leaveTime, Integer source) {
  139. if (ObjectUtils.isEmpty(userId) && ObjectUtils.isEmpty(houseId) && ObjectUtils.isEmpty(leaveTime) && ObjectUtils.isEmpty(leaveTime) && ObjectUtils.isEmpty(houseOrderNumber) && houseOrderNumber <= 0) {
  140. return CommonResult.fail();
  141. }
  142. House house = houseService.getById(houseId);
  143. if (house == null) {
  144. return CommonResult.fail("无此房间,请重新查询");
  145. }
  146. // 判断传过来的时间和当前时间比较
  147. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  148. LocalDateTime now = LocalDateTime.now();
  149. LocalDateTime date = LocalDateTime.parse(liveTime, dateTimeFormatter1);
  150. if (now.isAfter(date)) {
  151. liveTime = now.format(dateTimeFormatter1);
  152. // establishOrderDto.setReserveLiveTime(reserveLeaveTime);
  153. }
  154. // 计算总金额
  155. BigDecimal totalPrice = houseOrderService.getHouseOrderPrice(houseOrderNumber, userId, houseId, liveTime, leaveTime, source);
  156. return CommonResult.ok(totalPrice);
  157. }
  158. @Override
  159. @Transactional(rollbackFor = Exception.class)//1
  160. public CommonResult establishOrder(EstablishOrderDto establishOrderDto) {
  161. if (ObjectUtils.isEmpty(establishOrderDto)) {
  162. return CommonResult.fail();
  163. }
  164. // 判断传过来的时间和当前时间比较
  165. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  166. // 需判断当前用户是能定这时间段的房
  167. String reserveLiveTime = establishOrderDto.getReserveLiveTime();
  168. System.out.println("reserveLiveTime = " + reserveLiveTime);
  169. String reserveLeaveTime = establishOrderDto.getReserveLeaveTime();
  170. System.out.println("reserveLeaveTime = " + reserveLeaveTime);
  171. Integer source = establishOrderDto.getSource();
  172. // 判断课表,临时人员
  173. String userId = establishOrderDto.getUserId();
  174. String houseId = establishOrderDto.getHouseId();
  175. House house = houseService.getById(houseId);
  176. if (house == null) {
  177. return CommonResult.fail("无此房间,请重新查询");
  178. }
  179. // 计算总金额
  180. BigDecimal totalPrice = houseOrderService.getHouseOrderPrice(establishOrderDto.getHouseOrderNumber(), userId, houseId, establishOrderDto.getReserveLiveTime(), establishOrderDto.getReserveLeaveTime(), source);
  181. double v = totalPrice.doubleValue();
  182. Integer roomType = house.getRoomType();
  183. // 当金额不是0时,则判断时间是否为当天
  184. if (roomType == 1) {
  185. if (v > 0) {
  186. // 判断是否到13点了
  187. LocalDateTime now = LocalDateTime.now();
  188. LocalDateTime localDateTime = now.withHour(13).withMinute(0).withSecond(0);
  189. if (now.isBefore(localDateTime)) {
  190. return CommonResult.fail("未到预定时间");
  191. }
  192. LocalDateTime start = now.withHour(0).withMinute(0).withSecond(0);
  193. LocalDateTime end = start.plusDays(1);
  194. LocalDateTime end2 = start.plusDays(2);
  195. // 预定时间在start和end之前,离店时间在
  196. LocalDateTime time = LocalDateTime.parse(reserveLiveTime, dateTimeFormatter1);
  197. LocalDateTime time2 = LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter1);
  198. if (!(time.isAfter(start) && time.isBefore(end) && time2.isAfter(end) && time2.isBefore(end2))) {
  199. return CommonResult.fail("不支持跨天预定");
  200. }
  201. }
  202. }
  203. // if (house.getNumber() < Func.parseInt(establishOrderDto.getHouseOrderNumber())) {
  204. // return CommonResult.fail("超出限定房间数量");
  205. // }
  206. LambdaQueryWrapper<HouseNumber> wrapperHn = new LambdaQueryWrapper<>();
  207. wrapperHn.eq(HouseNumber::getHouseId, houseId);
  208. // 房间必须是净房
  209. wrapperHn.eq(HouseNumber::getHouseStatus, 1);
  210. List<HouseNumber> houseNumberList = houseNumberService.list(wrapperHn);
  211. // 获取该房态下可使用房间号
  212. String ids = "";
  213. for (int i = 0; i < houseNumberList.size(); i++) {
  214. HouseNumber houseNumber = houseNumberList.get(i);
  215. String id = houseNumber.getId() + "";
  216. if (i == 0) {
  217. ids = id;
  218. } else {
  219. ids = ids + "," + id;
  220. }
  221. }
  222. LocalDateTime now = LocalDateTime.now();
  223. LocalDateTime date = LocalDateTime.parse(reserveLiveTime, dateTimeFormatter1);
  224. if (now.isAfter(date)) {
  225. reserveLiveTime = now.format(dateTimeFormatter1);
  226. // establishOrderDto.setReserveLiveTime(reserveLeaveTime);
  227. }
  228. // 获取该时间段内的所有使用的房间
  229. List<HouseNumberState> houseNumberStateList = houseNumberStateService.beBooked(ids, reserveLiveTime, reserveLeaveTime);
  230. // 重新组合没有使用过的房间
  231. ArrayList<HouseNumber> list = new ArrayList<>();
  232. for (HouseNumber houseNumber : houseNumberList) {
  233. String id = houseNumber.getId() + "";
  234. if (!houseNumberStateList.stream().anyMatch(houseNumberState -> houseNumberState.getHouseNumberId().equals(id))) {
  235. list.add(houseNumber);
  236. }
  237. }
  238. if (list.size() < establishOrderDto.getHouseOrderNumber()) {
  239. return CommonResult.fail("超出可订购房间数量");
  240. }
  241. HouseOrder houseOrder = new HouseOrder();
  242. BigDecimal payPrice = establishOrderDto.getPayPrice();
  243. // 返回的结果是int类型,-1表示小于,0是等于,1是大于。
  244. if (payPrice.compareTo(totalPrice) != 0) {
  245. return CommonResult.fail("需付金额异常");
  246. }
  247. // 订单号
  248. // String orderNumber = UUID.randomUUID().toString();
  249. // orderNumber = orderNumber.replace("-", "");
  250. String orderNumber = OrderNumber.getOrderNumber();
  251. houseOrder.setOrderNumber(orderNumber);
  252. ArrayList<HouseNumber> houseNumbers = new ArrayList<>();
  253. ArrayList<HouseNumberState> houseNumberStates = new ArrayList<>();
  254. // 随机匹配房间
  255. int houseOrderNumber = establishOrderDto.getHouseOrderNumber();
  256. String houseNumberIds = "";
  257. for (int i = 0; i < houseOrderNumber; i++) {
  258. HouseNumber houseNumber = list.get(i);
  259. String id = houseNumber.getId() + "";
  260. //// 判断预定的时间是否是今天,是今天则在使用,否则则不在使用
  261. // houseNumber.setStatus(2);
  262. if (i == 0) {
  263. houseNumberIds = id;
  264. } else {
  265. houseNumberIds = houseNumberIds + "," + id;
  266. }
  267. // 修改房间表,
  268. // houseNumbers.add(houseNumber);
  269. // 修改房间状态表,判断预定时间是否在
  270. HouseNumberState houseNumberState = new HouseNumberState();
  271. houseNumberState.setHouseNumberId(id);
  272. houseNumberState.setStatus(3);
  273. // Integer roomType = house.getRoomType();
  274. if (1 == roomType) {
  275. // DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  276. // LocalDateTime start = LocalDateTime.parse(reserveLiveTime, dateTimeFormatter1);
  277. // LocalDateTime end = LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter1);
  278. // String startTime = start.format(dateTimeFormatter1);
  279. // String endTime = end.format(dateTimeFormatter1);
  280. houseNumberState.setStartTime(reserveLiveTime);
  281. houseNumberState.setEndTime(reserveLeaveTime);
  282. } else {
  283. houseNumberState.setStartTime(establishOrderDto.getReserveLiveTime());
  284. houseNumberState.setEndTime(reserveLeaveTime);
  285. }
  286. houseNumberState.setOrderNumber(orderNumber);
  287. houseNumberStates.add(houseNumberState);
  288. }
  289. // 待支付
  290. houseOrder.setOrderStatus("1");
  291. // 房态id
  292. houseOrder.setHouseId(houseId);
  293. // 房间号id(可多个房间id)
  294. houseOrder.setHouseNumberId(houseNumberIds);
  295. Users users = usersService.getById(userId);
  296. if (ObjectUtils.isNotEmpty(users)) {
  297. // 预定人姓名
  298. houseOrder.setReserveName(users.getUserName());
  299. log.info("预定人姓名:" + users.getUserName());
  300. // 预定人电话号码
  301. houseOrder.setReservePhone(users.getPhone());
  302. log.info("预定人手机号码:" + users.getPhone());
  303. } else {
  304. // 预定人姓名
  305. houseOrder.setReserveName(establishOrderDto.getReserveName());
  306. log.info("预定人姓名:" + establishOrderDto.getReserveName());
  307. // 预定人电话号码
  308. houseOrder.setReservePhone(establishOrderDto.getReservePhone());
  309. log.info("预定人手机号码:" + establishOrderDto.getReservePhone());
  310. }
  311. // 预定入住时间
  312. houseOrder.setReserveLiveTime(reserveLiveTime);
  313. // 预定离开时间
  314. houseOrder.setReserveLeaveTime(reserveLeaveTime);
  315. // 超时时间
  316. String timeOut = now.plusMinutes(2).format(dateTimeFormatter1);
  317. houseOrder.setTimeOut(timeOut);
  318. houseOrder.setSource(source);
  319. houseOrder.setSourceId(establishOrderDto.getSourceId());
  320. // 单价 全日房 价格单价=总价/房间数/天数
  321. // 钟点房 价格单价=总价/房间数
  322. // Integer roomType = house.getRoomType();
  323. BigDecimal price;
  324. if (roomType == 1) {
  325. price = payPrice.divide(new BigDecimal(houseOrderNumber), 2, BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(establishOrderDto.getLiveDay()), 2, BigDecimal.ROUND_HALF_UP);
  326. } else {
  327. price = payPrice.divide(new BigDecimal(houseOrderNumber), 2, BigDecimal.ROUND_HALF_UP);
  328. }
  329. houseOrder.setPrice(price);
  330. // 订房数量
  331. houseOrder.setHouseOrderNumber(houseOrderNumber);
  332. // 入住天数
  333. houseOrder.setLiveDay(establishOrderDto.getLiveDay());
  334. // 付款金额
  335. houseOrder.setPayPrice(payPrice);
  336. // 入住人id
  337. houseOrder.setLiveUsersId(userId);
  338. // 预定人
  339. houseOrder.setReserveUserId(userId);
  340. // 创建人
  341. houseOrder.setCreateUser(userId);
  342. // 更新人
  343. houseOrder.setUpdateUser(userId);
  344. // 订单渠道 订单渠道(1:线上,2:线下)
  345. houseOrder.setOrderChannel("1");
  346. houseOrderService.save(houseOrder);
  347. houseNumberStateService.saveBatch(houseNumberStates);
  348. // houseNumberService.updateBatchById(houseNumbers);
  349. System.out.println("创建订单成功");
  350. return CommonResult.ok(houseOrder);
  351. }
  352. @Override
  353. public CommonResult payOrder(String houseOrderId, String openId) {
  354. /*try {
  355. // 支付费用
  356. HouseOrder houseOrder = houseOrderService.getById(houseOrderId);
  357. BigDecimal payPrice = houseOrder.getPayPrice();
  358. double totalPrice = payPrice.doubleValue();
  359. int totalfee = Func.parseInt(totalPrice * 100);
  360. WechatUnifiedOrder w = new WechatUnifiedOrder();
  361. w.setAppid(WeiXinUtil.appid_c);
  362. w.setAttach("chuanghai");
  363. w.setBody("chuanghai");
  364. w.setMch_id(WeiXinUtil.account);
  365. w.setNonce_str(PayWxUtil.getNonceStr());// 随机支付串
  366. w.setNotify_url(WeiXinUtil.ip_h + "/abkpayResulet.action");// 支付结果回调地址
  367. w.setOpenid(openId);
  368. String orderNo = houseOrder.getOrderNumber(); // 订单编号
  369. w.setOut_trade_no(orderNo);
  370. w.setSpbill_create_ip(WeiXinUtil.ip);
  371. w.setTotal_fee(totalfee);
  372. w.setTrade_type("JSAPI");
  373. Map<String, String> params = new HashMap<String, String>();
  374. params.put("attach", w.getAttach());
  375. params.put("appid", w.getAppid());
  376. params.put("mch_id", w.getMch_id());
  377. params.put("nonce_str", w.getNonce_str());
  378. params.put("body", w.getBody());
  379. params.put("out_trade_no", w.getOut_trade_no());
  380. params.put("total_fee", Func.parseStr(w.getTotal_fee()));
  381. params.put("spbill_create_ip", w.getSpbill_create_ip());
  382. params.put("notify_url", w.getNotify_url());
  383. params.put("trade_type", w.getTrade_type());
  384. params.put("openid", w.getOpenid());
  385. w.setSign(PayWxUtil.getSign(params, WeiXinUtil.key));
  386. params.put("sign", w.getSign());
  387. String retXml = JaxbUtil.getRequestXml(params);
  388. String msg = HttpUtils.post("https://api.mch.weixin.qq.com/pay/unifiedorder", retXml);
  389. System.out.println(msg);
  390. // 支付失败
  391. if (msg.indexOf("FAIL") > -1) {
  392. return CommonResult.fail("支付失败");
  393. }
  394. JaxbUtil requestBinder = new JaxbUtil(TongYiReturn.class, JaxbUtil.CollectionWrapper.class);
  395. TongYiReturn to = requestBinder.fromXml(msg);
  396. // 支付成功
  397. if (to.getReturn_code().equals("SUCCESS") && to.getResult_code().equals("SUCCESS")) {
  398. EndPay pay = new EndPay();
  399. pay.setAppId(WeiXinUtil.appid_c);
  400. pay.setSignType("MD5");
  401. pay.setTimeStamp(System.currentTimeMillis() / 1000 + "");
  402. pay.setPrepay_id(to.getPrepay_id());
  403. pay.setNonceStr(PayWxUtil.getNonceStr());
  404. Map<String, String> requestMap = new HashMap<String, String>();
  405. requestMap.put("appId", pay.getAppId());
  406. requestMap.put("timeStamp", pay.getTimeStamp());
  407. requestMap.put("nonceStr", pay.getNonceStr());
  408. requestMap.put("package", "prepay_id=" + pay.getPrepay_id());
  409. requestMap.put("signType", "MD5");
  410. pay.setPaySign(PayWxUtil.getSign(requestMap, WeiXinUtil.key));
  411. // 保存支付信息
  412. houseOrder.setPayTime(DateUtil.getFormatPaternDate(new Date()));
  413. // 等收到回调
  414. houseOrder.setOrderStatus("1");
  415. // 支付方式
  416. houseOrder.setPayType("微信支付");
  417. houseOrderService.updateById(houseOrder);
  418. // booking.setOrderStatus(Func.parseStr(PayEnum.待支付.getNum()));
  419. // //booking.setPayAccount(0);
  420. // booking.setPayWay(OrderEnum.微信支付.toString());
  421. // bookService.updateBooking(booking);
  422. //
  423. // //用户开启支付,写入数据操作
  424. // bookinglogService.addBooklog("用户点击订单,进行支付" ,booking);
  425. //
  426. //
  427. //
  428. // resultjson.put(B.code, ResultStatusCode.OK.getStatus());
  429. // resultjson.put(B.message, "返回成功");
  430. // resultjson.put(B.data, pay);
  431. // ResponseUtil.writeJson(ServletActionContext.getResponse(), resultjson.toString());
  432. return CommonResult.ok(pay);
  433. }
  434. } catch (Exception e) {
  435. // resultjson.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  436. // resultjson.put(B.message, e.getMessage());
  437. // ResponseUtil.writeJson(ServletActionContext.getResponse(), resultjson.toString());
  438. e.printStackTrace();
  439. return CommonResult.fail();
  440. }
  441. return CommonResult.fail("支付失败");*/
  442. return null;
  443. }
  444. @Override
  445. @Transactional(rollbackFor = Exception.class)//1
  446. public CommonResult checkIn(String houseOrderId, String userId) {
  447. if (ObjectUtils.isEmpty(houseOrderId)) {
  448. return CommonResult.fail();
  449. }
  450. Users users = usersService.getById(userId);
  451. if (ObjectUtils.isEmpty(users)) {
  452. return CommonResult.fail("用户不存在");
  453. }
  454. String department = users.getDepartment();
  455. if (!"4".equals(department)) {
  456. return CommonResult.fail("请前往前台办理入住");
  457. }
  458. HouseOrder houseOrder = houseOrderService.getById(houseOrderId);
  459. // 判断当然时间是否在入住时间内。是的话则可以入住
  460. // 判断传过来的时间和当前时间比较
  461. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  462. LocalDateTime now = LocalDateTime.now();
  463. String reserveLiveTime = houseOrder.getReserveLiveTime();
  464. LocalDateTime date2 = LocalDateTime.parse(reserveLiveTime, dateTimeFormatter1);
  465. if (date2.isAfter(now)) {
  466. return CommonResult.fail("未到入住时间");
  467. }
  468. // 判断当然时间是否在入住时间内。是的话则可以入住
  469. String reserveLeaveTime = houseOrder.getReserveLeaveTime();
  470. LocalDateTime date3 = LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter1);
  471. if (now.isAfter(date3)) {
  472. return CommonResult.fail("已超过入住时间,请前往前台办理");
  473. }
  474. // 预定人就是入住人
  475. String reserveName = houseOrder.getReserveName();
  476. houseOrder.setLiveName(reserveName);
  477. // 入住时间
  478. Date date = new Date();
  479. houseOrder.setLiveTime(date);
  480. // 离店时间=预离店时间
  481. // String reserveLeaveTime = houseOrder.getReserveLeaveTime();
  482. Date leaveTime = Date.from(LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter1).atZone(ZoneId.systemDefault()).toInstant());
  483. // houseOrder.setLiveTime(leaveTime);
  484. // 需先获取所属房间号的门锁型号
  485. String houseNumberId = houseOrder.getHouseNumberId();
  486. HouseLock houseLock = houseLockService.getHouseNumberId(houseNumberId);
  487. // 如果没有房锁则需要去前台
  488. if (ObjectUtils.isEmpty(houseLock)) {
  489. return CommonResult.fail("请前往前台办理入住,领取钥匙");
  490. }
  491. long start = date.getTime();
  492. long end = leaveTime.getTime();
  493. // 设备id
  494. // 下发门锁密码
  495. // 设备id
  496. String equipmentType = houseLock.getEquipmentType();
  497. PasswordDto pr = new PasswordDto();
  498. pr.setLuid(equipmentType);
  499. pr.setStartTime(String.valueOf(start));
  500. pr.setEndTime(String.valueOf(end));
  501. pr.setHouseNumberId(houseNumberId);
  502. pr.setOrderNumber(houseOrder.getOrderNumber());
  503. Unlocking unlocking = passwordIssController.addPassword(pr);
  504. String passWord = unlocking.getPassWord();
  505. houseOrder.setKeyPassWord(passWord);
  506. houseOrder.setKeyType(1);
  507. //添加
  508. unlockingService.save(unlocking);
  509. // String password = "测试";
  510. Integer houseNumberId1 = houseLock.getHouseNumberId();
  511. HouseNumber houseNumber = houseNumberService.getById(houseNumberId1);
  512. // 房间号
  513. String roomNumber = houseNumber.getRoomNumber();
  514. // 获取工号
  515. String cardNumber = users.getCardNumber();
  516. if (ObjectUtils.isEmpty(cardNumber)) {
  517. return CommonResult.fail("无微校卡号");
  518. }
  519. log.info("微校卡号【{}】", cardNumber);
  520. ArrayList<String> strings = new ArrayList<>();
  521. strings.add(cardNumber);
  522. // 获取手机号,酒店名字
  523. List<ApartmentSetting> list2 = apartmentSettingService.list(new LambdaQueryWrapper<>());
  524. ApartmentSetting apartmentSetting = list2.get(0);
  525. String phoneNumber = apartmentSetting.getPhoneNumbr();
  526. String name = apartmentSetting.getName();
  527. weiXiaoComponent.sendNotice(strings, "公寓办理入住成功", "办理入住成功", "您的房间号为:" + roomNumber + ",密码是:" + passWord + "离店时间为:" + reserveLeaveTime + ",欢迎您入住" + name + ",我们全体员工很荣幸能为您服务,如有任何需要请致电:" + phoneNumber + ",期待为你服务。祝你生活愉快!", null);
  528. // 添加锁的操作记录
  529. OperatingRecord operatingRecord = new OperatingRecord();
  530. operatingRecord.setRoomNumber(houseNumber.getRoomNumber());
  531. operatingRecord.setHouseNumberId(houseNumber.getId());
  532. operatingRecord.setOperatorName(users.getUserName());
  533. operatingRecord.setDataTime(LocalDateTime.now().format(dateTimeFormatter1));
  534. operatingRecord.setContent("姓名:" + houseOrder.getLiveName());
  535. operatingRecord.setType("添加密码钥匙");
  536. operatingRecordService.save(operatingRecord);
  537. HouseNumber number = houseNumberService.getById(houseLock.getHouseNumberId());
  538. // 开电
  539. // Boolean aBoolean = electricEquipmentService.openMeterControl(number.getElectricEquipmentId());
  540. String msg = "";
  541. // if (!aBoolean) {
  542. // msg = "开电失败";
  543. // // 设置关电状态
  544. // number.setElectricType("2");
  545. // }else {
  546. // // 设置开电状态
  547. number.setElectricType("1");
  548. // }
  549. // 房间号设置成脏房需要退房后设置
  550. // number.setHouseStatus(2);
  551. houseNumberService.updateById(number);
  552. // 修改订单状态
  553. // 订单状态 1.待支付,2.已支付,3.待入住,4.已入住,5.待结账,6.退款中,7.已退款,8.已退房,9.已取消,超时
  554. houseOrder.setOrderStatus("4");
  555. houseOrderService.updateById(houseOrder);
  556. // 修改房态状态
  557. LambdaQueryWrapper<HouseNumberState> wrapperHns = new LambdaQueryWrapper<>();
  558. wrapperHns.eq(HouseNumberState::getOrderNumber, houseOrder.getOrderNumber());
  559. List<HouseNumberState> list = houseNumberStateService.list(wrapperHns);
  560. ArrayList<HouseNumberState> houseNumberStates = new ArrayList<>();
  561. for (HouseNumberState houseNumberState : list) {
  562. // 状态 1空闲、2脏房,3预定、4入住、5锁定、6维修
  563. houseNumberState.setStatus(4);
  564. houseNumberStates.add(houseNumberState);
  565. }
  566. houseNumberStateService.updateBatchById(houseNumberStates);
  567. if (msg.equals("")) {
  568. return CommonResult.ok();
  569. } else {
  570. return CommonResult.ok(msg);
  571. }
  572. }
  573. @Override
  574. public CommonResult pageList(int adminId, int page, int size, String keyWord, String houseType, String orderStatus, String payPriceStartTime,
  575. String payPriceEndTime, String refundStartTime, String refundEndTime, String cancelStartTime, String cancelEndTime,
  576. String liveStartTime, String liveEndTime, String leaveStartTime, String leaveEndTime,
  577. String reserveLiveStartTime, String reserveLiveEndTime, String reserveLeaveStartTime, String reserveLeaveEndTime,
  578. String houseId, Integer keyType, Integer giveBack, Integer buildingId, Integer orgId) {
  579. // PermissionSetting permissionSetting = permissionSettingService.getById(adminId);
  580. // if (ObjectUtils.isEmpty(permissionSetting)) {
  581. // return CommonResult.fail("非法进入");
  582. // }
  583. //// 判断该用户是否拥有权限
  584. // String houseTypeManagement = permissionSetting.getHouseOrderManagement();
  585. // if (!"0".equals(houseTypeManagement) && !houseTypeManagement.contains("6")) {
  586. // return CommonResult.fail("此账号暂无该权限");
  587. // }
  588. if (ObjectUtils.isEmpty(page) && page <= 0) {
  589. page = 1;
  590. }
  591. if (ObjectUtils.isEmpty(size) && size <= 0) {
  592. size = 10;
  593. }
  594. PageUtils<HouseOrderPageListVo> pageList = houseOrderService.pageList(page, size, keyWord, houseType, orderStatus, payPriceStartTime,
  595. payPriceEndTime, refundStartTime, refundEndTime, cancelStartTime, cancelEndTime,
  596. liveStartTime, liveEndTime, leaveStartTime, leaveEndTime,
  597. reserveLiveStartTime, reserveLiveEndTime, reserveLeaveStartTime, reserveLeaveEndTime, houseId, keyType, giveBack, buildingId, orgId);
  598. List<HouseOrderPageListVo> list = pageList.getList();
  599. for (int i = 0; i < list.size(); i++) {
  600. HouseOrderPageListVo houseOrderPageListVo = list.get(i);
  601. String orderStart = houseOrderPageListVo.getOrderStart();
  602. String choiceBox = "";
  603. if ("1".equals(orderStart)) {
  604. choiceBox = "1,6";
  605. } else if ("2".equals(orderStart)) {
  606. choiceBox = "2,6";
  607. } else if ("3".equals(orderStart)) {
  608. choiceBox = "2,3,6";
  609. } else if ("4".equals(orderStart)) {
  610. choiceBox = "2,4,5,6";
  611. } else if ("5".equals(orderStart)) {
  612. choiceBox = "6";
  613. } else if ("6".equals(orderStart)) {
  614. choiceBox = "6";
  615. } else if ("7".equals(orderStart)) {
  616. choiceBox = "6";
  617. } else if ("8".equals(orderStart)) {
  618. choiceBox = "6";
  619. } else if ("9".equals(orderStart)) {
  620. choiceBox = "6";
  621. }
  622. houseOrderPageListVo.setChoiceBox(choiceBox);
  623. String[] arr=(houseOrderPageListVo.getSourceId()==null?"":houseOrderPageListVo.getSourceId()).split(",");
  624. ArrayList<String> idList = new ArrayList<String>(Arrays.asList(arr)) ;
  625. if(!StringUtils.hasText(houseOrderPageListVo.getSource())){
  626. houseOrderPageListVo.setSource("自费");
  627. }else if ("1".equals(houseOrderPageListVo.getSource())){
  628. houseOrderPageListVo.setSource("课表");
  629. List<ClassSchedule> schedules=new ArrayList<>(classScheduleService.listByIds(idList));
  630. houseOrderPageListVo.setSchedules(schedules);
  631. } else if ("2".equals(houseOrderPageListVo.getSource())){
  632. houseOrderPageListVo.setSource("流程");
  633. List<ApplicationProcedureTemporary> applicationProcedureTemporaries= new ArrayList<>(applicationProcedureTemporaryService.listByIds(idList));
  634. houseOrderPageListVo.setApplicationProcedureTemporaries(applicationProcedureTemporaries);
  635. }
  636. }
  637. pageList.setList(list);
  638. return CommonResult.ok(pageList);
  639. }
  640. @Override
  641. @Transactional(rollbackFor = Exception.class)//1
  642. public CommonResult cancel(CancelDto cancelDto) {
  643. int adminId = cancelDto.getAdminId();
  644. PermissionSetting permissionSetting = permissionSettingService.getById(adminId);
  645. if (ObjectUtils.isEmpty(permissionSetting)) {
  646. return CommonResult.fail("非法进入");
  647. }
  648. // 判断该用户是否拥有权限
  649. String houseTypeManagement = permissionSetting.getHouseOrderManagement();
  650. if (!"0".equals(houseTypeManagement) && !houseTypeManagement.contains("1")) {
  651. return CommonResult.fail("此账号暂无该权限");
  652. }
  653. String houseNumberId = cancelDto.getHouseNumberId();
  654. String orderNumber = cancelDto.getOrderNumber();
  655. if (ObjectUtils.isEmpty(houseNumberId) && ObjectUtils.isEmpty(orderNumber)) {
  656. return CommonResult.fail();
  657. }
  658. LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
  659. wrapperHo.eq(HouseOrder::getOrderNumber, orderNumber);
  660. HouseOrder houseOrder = houseOrderService.getOne(wrapperHo);
  661. String orderStatus = houseOrder.getOrderStatus();
  662. if (!("1".equals(orderStatus))) {
  663. return CommonResult.fail("该订单不是待支付,不能直接取消");
  664. }
  665. // 修改订单状态
  666. houseOrder.setOrderStatus("9");
  667. // 设置取消时间
  668. houseOrder.setCancelTime(new Date());
  669. LambdaQueryWrapper<HouseNumberState> wrapperHns = new LambdaQueryWrapper<>();
  670. wrapperHns.eq(HouseNumberState::getHouseNumberId, houseNumberId)
  671. .eq(HouseNumberState::getOrderNumber, orderNumber);
  672. HouseNumberState houseNumberState = houseNumberStateService.getOne(wrapperHns);
  673. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  674. houseNumberState.setEndTime(sdf.format(new Date()));
  675. houseOrderService.updateById(houseOrder);
  676. // houseNumberStateService.updateById(houseNumberState);
  677. houseNumberStateService.removeById(houseNumberState.getId());
  678. return CommonResult.ok();
  679. }
  680. @Override
  681. public CommonResult particulars(String orderNumber, int adminId) {
  682. PermissionSetting permissionSetting = permissionSettingService.getById(adminId);
  683. if (ObjectUtils.isEmpty(permissionSetting)) {
  684. return CommonResult.fail("非法进入");
  685. }
  686. // 判断该用户是否拥有权限
  687. String houseTypeManagement = permissionSetting.getHouseOrderManagement();
  688. if (!"0".equals(houseTypeManagement) && !houseTypeManagement.contains("2")) {
  689. return CommonResult.fail("此账号暂无该权限");
  690. }
  691. if (ObjectUtils.isEmpty(orderNumber)) {
  692. return CommonResult.fail();
  693. }
  694. LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
  695. wrapperHo.eq(HouseOrder::getOrderNumber, orderNumber);
  696. HouseOrder houseOrder = houseOrderService.getOne(wrapperHo);
  697. if (ObjectUtils.isEmpty(houseOrder)) {
  698. return CommonResult.fail("无该订单");
  699. }
  700. String liveUsersId = houseOrder.getLiveUsersId();
  701. HouseOrderParticularsVo vo = new HouseOrderParticularsVo();
  702. vo.setHouseOrder(houseOrder);
  703. if (ObjectUtils.isNotEmpty(liveUsersId)) {
  704. Users users = usersService.getById(liveUsersId);
  705. if (ObjectUtils.isNotEmpty(users)) {
  706. // 指纹
  707. String fingerprint = users.getFingerprint();
  708. vo.setFingerprint(fingerprint);
  709. // 卡号编码idCardInformation
  710. String idCardInformation = users.getIdCardInformation();
  711. vo.setIdCardInformation(idCardInformation);
  712. }
  713. }
  714. Unlocking unlocking = unlockingService.getOrderNumber(orderNumber);
  715. if (ObjectUtils.isNotEmpty(unlocking)) {
  716. vo.setStartTime(unlocking.getStartTime());
  717. vo.setEndTime(unlocking.getEndTime());
  718. }
  719. String houseNumberId = houseOrder.getHouseNumberId();
  720. HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  721. if (ObjectUtils.isNotEmpty(houseNumber)) {
  722. vo.setElectricEquipmentMeterName(houseNumber.getElectricEquipmentMeterName());
  723. vo.setWaterEquipmentMeterName(houseNumber.getWaterEquipmentMeterName());
  724. }
  725. SubsidySetup subsidySetup = subsidySetupService.list(new LambdaQueryWrapper<>()).get(0);
  726. if (ObjectUtils.isNotEmpty(subsidySetup)) {
  727. vo.setFreeQuotaOfWater(subsidySetup.getFreeQuotaOfWater());
  728. vo.setFreeQuotaOfElectric(subsidySetup.getFreeQuotaOfElectric());
  729. }
  730. return CommonResult.ok(vo);
  731. }
  732. @Override
  733. @Transactional(rollbackFor = Exception.class)//1
  734. public CommonResult checkIdCard(CheckIdCardDto checkIdCardDto) {
  735. if (ObjectUtils.isEmpty(checkIdCardDto)) {
  736. return CommonResult.fail();
  737. }
  738. String adminMenuId = checkIdCardDto.getAdminMenuId();
  739. PermissionSetting permissionSetting = permissionSettingService.getById(adminMenuId);
  740. if (ObjectUtils.isEmpty(permissionSetting)) {
  741. return CommonResult.fail("非法进入");
  742. }
  743. // 判断该用户是否拥有权限
  744. String houseTypeManagement = permissionSetting.getHouseOrderManagement();
  745. if (!"0".equals(houseTypeManagement) && !houseTypeManagement.contains("3")) {
  746. return CommonResult.fail("此账号暂无该权限");
  747. }
  748. String houseNumberId = checkIdCardDto.getHouseNumberId();
  749. // String cardNumber = checkIdCardDto.getCardNumber();
  750. String houseId = checkIdCardDto.getHouseId();
  751. String liveTime = checkIdCardDto.getLiveTime();
  752. String leaveTime = checkIdCardDto.getLeaveTime();
  753. // 管理端 计算总金额
  754. // PriceVo priceVo = houseOrderService.reservePrice(houseId, cardNumber, liveTime, leaveTime);
  755. // BigDecimal totalPrice = priceVo.getTotalPrice();
  756. //
  757. // BigDecimal payPrice = checkIdCardDto.getPayPrice();
  758. //// 返回的结果是int类型,-1表示小于,0是等于,1是大于。
  759. // if (payPrice.compareTo(totalPrice) != 0) {
  760. // return CommonResult.fail("需付金额异常");
  761. // }
  762. // 获取该时间段内的该房间的使用情况
  763. List<HouseNumberState> houseNumberStateList = houseNumberStateService.beBooked(houseNumberId, liveTime, leaveTime);
  764. if (ObjectUtils.isNotEmpty(houseNumberStateList) && houseNumberStateList.size() > 0) {
  765. return CommonResult.fail("该时间段无法预定");
  766. }
  767. // 入住人
  768. String liveName = checkIdCardDto.getLiveName();
  769. // 电话
  770. // String phone = checkIdCardDto.getPhone();
  771. // 指纹特殊编码
  772. String fingerprint = checkIdCardDto.getFingerprint();
  773. // 身份证
  774. String idCard = checkIdCardDto.getIdCard();
  775. // 身份证特殊编码
  776. String idCardInformation = checkIdCardDto.getIdCardInformation();
  777. // 判断是否有用户
  778. LambdaQueryWrapper<Users> wrapperU = new LambdaQueryWrapper<>();
  779. wrapperU.eq(Users::getIdCard, idCard);
  780. Users users = usersService.getOne(wrapperU);
  781. // 判断是否有订单,没有订单需先添加订单
  782. String orderNumber = checkIdCardDto.getOrderNumber();
  783. LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
  784. wrapperHo.eq(HouseOrder::getOrderNumber, orderNumber);
  785. HouseOrder houseOrder = houseOrderService.getOne(wrapperHo);
  786. // HouseOrder houseOrder = new HouseOrder();
  787. // if (ObjectUtils.isEmpty(houseOrder1)) {
  788. // // 订单号
  789. // String orderNumber1 = UUID.randomUUID().toString();
  790. // orderNumber1 = orderNumber1.replace("-", "");
  791. // houseOrder.setOrderNumber(orderNumber1);
  792. // houseOrder.setHouseId(houseId);
  793. // houseOrder.setHouseNumberId(houseNumberId);
  794. // houseOrder.setReserveName(liveName);
  795. // houseOrder.setReservePhone(phone);
  796. // houseOrder.setReserveLiveTime(liveTime);
  797. // houseOrder.setReserveLeaveTime(leaveTime);
  798. // houseOrder.setPrice(priceVo.getPrice());
  799. // houseOrder.setPayPrice(priceVo.getTotalPrice());
  800. // houseOrder.setHouseOrderNumber(1);
  801. // houseOrder.setLiveDay(checkIdCardDto.getLiveDay() + "");
  802. // houseOrder.setOrderChannel("2");
  803. //
  804. // } else {
  805. // BeanUtils.copyProperties(houseOrder1, houseOrder);
  806. // }
  807. // 入住人id
  808. if (ObjectUtils.isEmpty(users)) {
  809. Users users1 = new Users();
  810. users1.setUserName(liveName);
  811. users1.setFingerprint(fingerprint);
  812. users1.setIdCard(idCard);
  813. users1.setIdCardInformation(idCardInformation);
  814. // users1.setUserMenuId("4");
  815. boolean save = usersService.save(users1);
  816. houseOrder.setLiveUsersId(users1.getId() + "");
  817. } else {
  818. users.setFingerprint(fingerprint);
  819. users.setIdCard(idCard);
  820. users.setIdCardInformation(idCardInformation);
  821. usersService.updateById(users);
  822. houseOrder.setLiveUsersId(users.getId() + "");
  823. }
  824. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  825. Date liveDate = Date.from(LocalDateTime.parse(liveTime, dateTimeFormatter1).atZone(ZoneId.systemDefault()).toInstant());
  826. Date leaveDate = Date.from(LocalDateTime.parse(leaveTime, dateTimeFormatter1).atZone(ZoneId.systemDefault()).toInstant());
  827. // 订单状态 入住状态
  828. houseOrder.setOrderStatus("4");
  829. houseOrder.setLiveTime(liveDate);
  830. houseOrder.setLeaveTime(leaveDate);
  831. houseOrder.setLiveName(liveName);
  832. // 添加房态或修改房态
  833. LambdaQueryWrapper<HouseNumberState> wrapperHns = new LambdaQueryWrapper<>();
  834. wrapperHns.eq(HouseNumberState::getOrderNumber, houseOrder.getOrderNumber())
  835. .eq(HouseNumberState::getHouseNumberId, houseNumberId);
  836. HouseNumberState houseNumberState1 = houseNumberStateService.getOne(wrapperHns);
  837. HouseNumberState houseNumberState = new HouseNumberState();
  838. if (ObjectUtils.isEmpty(houseNumberState1)) {
  839. return CommonResult.fail();
  840. } else {
  841. BeanUtils.copyProperties(houseNumberState1, houseNumberState);
  842. }
  843. houseNumberState.setStatus(4);
  844. houseNumberState.setStartTime(liveTime);
  845. // 修改房间状态
  846. HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  847. // 开电
  848. // Boolean aBoolean = electricEquipmentService.openMeterControl(houseNumber.getElectricEquipmentId());
  849. String msg = "";
  850. // if (!aBoolean) {
  851. // msg = "开电失败";
  852. // // 设置关电状态
  853. // houseNumber.setElectricType("2");
  854. // }else {
  855. // // 设置开电状态
  856. houseNumber.setElectricType("1");
  857. // }
  858. String roomNumber = houseNumber.getRoomNumber();
  859. String start = String.valueOf(liveDate.getTime());
  860. String end = String.valueOf(leaveDate.getTime());
  861. // 发放密码
  862. Integer lockStatus = checkIdCardDto.getLockStatus();
  863. // 添加锁的操作记录
  864. Admin byId = adminService.getById(checkIdCardDto.getAdminId());
  865. OperatingRecord operatingRecord = new OperatingRecord();
  866. operatingRecord.setRoomNumber(houseNumber.getRoomNumber());
  867. operatingRecord.setHouseNumberId(houseNumber.getId());
  868. operatingRecord.setOperatorName(byId.getName());
  869. operatingRecord.setDataTime(LocalDateTime.now().format(dateTimeFormatter1));
  870. operatingRecord.setContent("姓名:" + houseOrder.getLiveName());
  871. houseOrder.setKeyType(lockStatus);
  872. if (5 == lockStatus) {
  873. // 默认未归还
  874. houseOrder.setGiveBack(2);
  875. } else {
  876. // 获取设备id
  877. LambdaQueryWrapper<HouseLock> wrapperHl = new LambdaQueryWrapper<>();
  878. wrapperHl.eq(HouseLock::getHouseNumberId, houseNumberId);
  879. HouseLock houseLock = houseLockService.getOne(wrapperHl);
  880. if (ObjectUtils.isEmpty(houseLock)) {
  881. return CommonResult.fail("请先绑定门锁设备");
  882. }
  883. String equipmentState = houseLock.getEquipmentType();
  884. if (1 == lockStatus) {
  885. PasswordDto pr = new PasswordDto();
  886. pr.setLuid(equipmentState);
  887. pr.setStartTime(start);
  888. pr.setEndTime(end);
  889. pr.setHouseNumberId(houseNumberId);
  890. pr.setOrderNumber(houseOrder.getOrderNumber());
  891. Unlocking unlocking = passwordIssController.addPassword(pr);
  892. // 添加锁的操作记录类型
  893. operatingRecord.setType("添加密码钥匙");
  894. unlockingService.save(unlocking);
  895. String passWord = unlocking.getPassWord();
  896. houseOrder.setKeyPassWord(passWord);
  897. // ArrayList<String> strings = new ArrayList<>();
  898. // strings.add(cardNumber);
  899. // weiXiaoComponent.sendNotice(strings, "公寓办理入住成功", "办理入住成功", "您的房间号为:" + roomNumber + ",密码是:" + passWord + "离店时间为:" + liveTime + ",欢迎您入住张玉玲酒店,我们全体员工很荣幸能为您服务,如有任何需要请致电张玉玲,期待为你服务。祝你生活愉快!", null);
  900. } else if (2 == lockStatus) {
  901. CardInfoDto cid = new CardInfoDto();
  902. cid.setCard(idCardInformation);
  903. cid.setLuid(equipmentState);
  904. cid.setCardType(0);
  905. cid.setStartTime(start);
  906. cid.setEndTime(end);
  907. cid.setHouseNumberId(houseNumberId);
  908. cid.setOrderNumber(houseOrder.getOrderNumber());
  909. Unlocking unlocking = passwordIssController.addCardInfo(cid);
  910. unlockingService.save(unlocking);
  911. // 添加锁的操作记录类型
  912. operatingRecord.setType("添加卡片钥匙");
  913. // 默认未归还
  914. houseOrder.setGiveBack(2);
  915. } else if (3 == lockStatus) {
  916. FingerprintDataDto fd = new FingerprintDataDto();
  917. fd.setLuid(equipmentState);
  918. fd.setHouseNumberId(houseNumberId);
  919. fd.setOrderNumber(houseOrder.getOrderNumber());
  920. fd.setStartTime(start);
  921. fd.setEndTime(end);
  922. fd.setFingerprintData(fingerprint);
  923. Unlocking unlocking = passwordIssController.addFingerprintData(fd);
  924. unlockingService.save(unlocking);
  925. // 添加锁的操作记录类型
  926. operatingRecord.setType("添加指纹钥匙");
  927. } else if (4 == lockStatus) {
  928. CardInfoDto cid = new CardInfoDto();
  929. cid.setCard(idCardInformation);
  930. cid.setLuid(equipmentState);
  931. cid.setCardType(1);
  932. cid.setStartTime(start);
  933. cid.setEndTime(end);
  934. cid.setHouseNumberId(houseNumberId);
  935. cid.setOrderNumber(houseOrder.getOrderNumber());
  936. Unlocking unlocking = passwordIssController.addCardInfo(cid);
  937. unlockingService.save(unlocking);
  938. // 添加锁的操作记录类型
  939. operatingRecord.setType("添加身份证钥匙");
  940. }
  941. }
  942. houseOrderService.updateById(houseOrder);
  943. houseNumberStateService.updateById(houseNumberState);
  944. houseNumberService.updateById(houseNumber);
  945. operatingRecordService.save(operatingRecord);
  946. if (msg.equals("")) {
  947. return CommonResult.ok();
  948. } else {
  949. return CommonResult.ok(msg);
  950. }
  951. }
  952. @Override
  953. @Transactional(rollbackFor = Exception.class)//1
  954. public CommonResult checkOut(CheckOutDto checkOutDto) {
  955. int adminId = checkOutDto.getAdminId();
  956. PermissionSetting permissionSetting = permissionSettingService.getById(adminId);
  957. if (ObjectUtils.isEmpty(permissionSetting)) {
  958. return CommonResult.fail("非法进入");
  959. }
  960. // 判断该用户是否拥有权限
  961. String houseTypeManagement = permissionSetting.getHouseOrderManagement();
  962. if (!"0".equals(houseTypeManagement) && !houseTypeManagement.contains("5")) {
  963. return CommonResult.fail("此账号暂无该权限");
  964. }
  965. String houseNumberId = checkOutDto.getHouseNumberId();
  966. String orderNumber = checkOutDto.getOrderNumber();
  967. if (ObjectUtils.isEmpty(houseNumberId) && ObjectUtils.isEmpty(orderNumber)) {
  968. return CommonResult.fail();
  969. }
  970. LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
  971. wrapperHo.eq(HouseOrder::getOrderNumber, orderNumber);
  972. HouseOrder houseOrder = houseOrderService.getOne(wrapperHo);
  973. if (ObjectUtils.isEmpty(houseOrder)) {
  974. return CommonResult.fail("无该订单");
  975. }
  976. houseOrder.setOrderStatus("8");
  977. // 判断退房在不在预定的时间段中,不在的话则判断是否有人在使用,没有的话按之前的步骤走,有的话则只改订单状态。
  978. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  979. String reserveLeaveTime = houseOrder.getReserveLeaveTime();
  980. // Date liveTime = houseOrder.getLiveTime();
  981. // LocalDateTime localDateTime = LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter).plusMinutes(30);
  982. // Date endTime = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  983. // boolean effectiveDate = DateUtil.isEffectiveDate(new Date(), liveTime, endTime);
  984. // if (!effectiveDate) {
  985. List<HouseNumberState> houseNumberStateData = houseNumberStateService.getData(new Date(), houseNumberId);
  986. if (ObjectUtils.isNotEmpty(houseNumberStateData)) {
  987. houseOrder.setLeaveTime(Date.from(LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter).atZone(ZoneId.systemDefault()).toInstant()));
  988. // 获取水电消费金额和额度
  989. HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  990. String electricEquipmentId = houseNumber.getElectricEquipmentId();
  991. String waterEquipmentId = houseNumber.getWaterEquipmentId();
  992. ElectricEquipment electricEquipment = electricEquipmentService.getById(electricEquipmentId);
  993. WaterEquipment waterEquipment = waterEquipmentService.getById(waterEquipmentId);
  994. if (ObjectUtils.isNotEmpty(electricEquipment) && ObjectUtils.isNotEmpty(waterEquipment)) {
  995. String electricEquipmentRoomId = electricEquipment.getRoomId();
  996. String waterEquipmentRoomId = waterEquipment.getRoomId();
  997. Date liveTime = houseOrder.getLiveTime();
  998. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  999. String live = sdf.format(liveTime);
  1000. String leave = sdf.format(new Date());
  1001. // 获取电的消费金额和额度
  1002. HouseOrderBill houseOrderBill = new HouseOrderBill();
  1003. JSONObject jsonObjectElectric = electricEquipmentService.roomCostRecord(electricEquipmentRoomId, live, leave);
  1004. BigDecimal costElectric = jsonObjectElectric.getBigDecimal("cost");
  1005. BigDecimal consumeElectric = jsonObjectElectric.getBigDecimal("consume");
  1006. houseOrderBill.setElectricCost(costElectric);
  1007. houseOrderBill.setElectricConsume(consumeElectric);
  1008. BigDecimal electricCost = houseOrder.getElectricCost();
  1009. if (ObjectUtils.isNotEmpty(electricCost)) {
  1010. costElectric = costElectric.add(electricCost);
  1011. }
  1012. BigDecimal electricConsume = houseOrder.getElectricConsume();
  1013. if (ObjectUtils.isNotEmpty(electricConsume)) {
  1014. consumeElectric = consumeElectric.add(electricConsume);
  1015. }
  1016. houseOrder.setElectricCost(costElectric);
  1017. houseOrder.setElectricConsume(consumeElectric);
  1018. // 获取水的消费金额和额度
  1019. JSONObject jsonObjectWater = waterEquipmentService.roomCostRecord(waterEquipmentRoomId, live, leave);
  1020. BigDecimal costWater = jsonObjectWater.getBigDecimal("cost");
  1021. BigDecimal consumeWater = jsonObjectWater.getBigDecimal("consume");
  1022. houseOrderBill.setWaterCost(costWater);
  1023. houseOrderBill.setWaterConsume(consumeWater);
  1024. BigDecimal waterCost = houseOrder.getWaterCost();
  1025. if (ObjectUtils.isNotEmpty(waterCost)) {
  1026. costWater = costWater.add(waterCost);
  1027. }
  1028. BigDecimal waterConsume = houseOrder.getWaterConsume();
  1029. if (ObjectUtils.isNotEmpty(waterConsume)) {
  1030. consumeWater = consumeWater.add(waterConsume);
  1031. }
  1032. houseOrder.setWaterCost(costWater);
  1033. houseOrder.setWaterConsume(consumeWater);
  1034. houseOrderBill.setHouseOrderId(houseOrder.getId());
  1035. houseOrderBill.setHouseNumberId(houseNumberId);
  1036. houseOrderBill.setLiveTime(liveTime);
  1037. houseOrderBill.setLeaveTime(new Date());
  1038. houseOrderBillService.save(houseOrderBill);
  1039. }
  1040. LambdaQueryWrapper<Unlocking> wrapperU = new LambdaQueryWrapper<>();
  1041. wrapperU.eq(Unlocking::getOrderNumber, orderNumber)
  1042. .eq(Unlocking::getHouseNumberId, houseNumberId);
  1043. Unlocking unlocking = unlockingService.getOne(wrapperU);
  1044. if (ObjectUtils.isNotEmpty(unlocking)) {
  1045. // 删除房间密码
  1046. passwordIssController.deleteLockUser(unlocking.getLuid(), unlocking.getLockUserId());
  1047. unlockingService.removeById(unlocking);
  1048. }
  1049. houseOrderService.updateById(houseOrder);
  1050. return CommonResult.ok("该时间段已超过退房时间,已修改其订单状态");
  1051. }
  1052. // }
  1053. LambdaQueryWrapper<Unlocking> wrapperU = new LambdaQueryWrapper<>();
  1054. wrapperU.eq(Unlocking::getOrderNumber, orderNumber)
  1055. .eq(Unlocking::getHouseNumberId, houseNumberId);
  1056. Unlocking unlocking = unlockingService.getOne(wrapperU);
  1057. if (ObjectUtils.isNotEmpty(unlocking)) {
  1058. // 删除房间密码
  1059. passwordIssController.deleteLockUser(unlocking.getLuid(), unlocking.getLockUserId());
  1060. unlockingService.removeById(unlocking);
  1061. }
  1062. // 修改订单
  1063. houseOrder.setLeaveTime(new Date());
  1064. // 获取水电消费金额和额度
  1065. HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  1066. String electricEquipmentId = houseNumber.getElectricEquipmentId();
  1067. String waterEquipmentId = houseNumber.getWaterEquipmentId();
  1068. ElectricEquipment electricEquipment = electricEquipmentService.getById(electricEquipmentId);
  1069. WaterEquipment waterEquipment = waterEquipmentService.getById(waterEquipmentId);
  1070. if (ObjectUtils.isNotEmpty(electricEquipment) && ObjectUtils.isNotEmpty(waterEquipment)) {
  1071. String electricEquipmentRoomId = electricEquipment.getRoomId();
  1072. String waterEquipmentRoomId = waterEquipment.getRoomId();
  1073. Date liveTime = houseOrder.getLiveTime();
  1074. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1075. String live = sdf.format(liveTime);
  1076. String leave = sdf.format(new Date());
  1077. // 获取电的消费金额和额度
  1078. HouseOrderBill houseOrderBill = new HouseOrderBill();
  1079. JSONObject jsonObjectElectric = electricEquipmentService.roomCostRecord(electricEquipmentRoomId, live, leave);
  1080. BigDecimal costElectric = jsonObjectElectric.getBigDecimal("cost");
  1081. BigDecimal consumeElectric = jsonObjectElectric.getBigDecimal("consume");
  1082. houseOrderBill.setElectricCost(costElectric);
  1083. houseOrderBill.setElectricConsume(consumeElectric);
  1084. BigDecimal electricCost = houseOrder.getElectricCost();
  1085. if (ObjectUtils.isNotEmpty(electricCost)) {
  1086. costElectric = costElectric.add(electricCost);
  1087. }
  1088. BigDecimal electricConsume = houseOrder.getElectricConsume();
  1089. if (ObjectUtils.isNotEmpty(electricConsume)) {
  1090. consumeElectric = consumeElectric.add(electricConsume);
  1091. }
  1092. houseOrder.setElectricCost(costElectric);
  1093. houseOrder.setElectricConsume(consumeElectric);
  1094. // 获取水的消费金额和额度
  1095. JSONObject jsonObjectWater = waterEquipmentService.roomCostRecord(waterEquipmentRoomId, live, leave);
  1096. BigDecimal costWater = jsonObjectWater.getBigDecimal("cost");
  1097. BigDecimal consumeWater = jsonObjectWater.getBigDecimal("consume");
  1098. houseOrderBill.setWaterCost(costWater);
  1099. houseOrderBill.setWaterConsume(consumeWater);
  1100. BigDecimal waterCost = houseOrder.getWaterCost();
  1101. if (ObjectUtils.isNotEmpty(waterCost)) {
  1102. costWater = costWater.add(waterCost);
  1103. }
  1104. BigDecimal waterConsume = houseOrder.getWaterConsume();
  1105. if (ObjectUtils.isNotEmpty(waterConsume)) {
  1106. consumeWater = consumeWater.add(waterConsume);
  1107. }
  1108. houseOrder.setWaterCost(costWater);
  1109. houseOrder.setWaterConsume(consumeWater);
  1110. houseOrderBill.setHouseOrderId(houseOrder.getId());
  1111. houseOrderBill.setHouseNumberId(houseNumberId);
  1112. houseOrderBill.setLiveTime(liveTime);
  1113. houseOrderBill.setLeaveTime(new Date());
  1114. houseOrderBillService.save(houseOrderBill);
  1115. }
  1116. // 修改房态
  1117. LambdaQueryWrapper<HouseNumberState> wrapperHns = new LambdaQueryWrapper<>();
  1118. wrapperHns.eq(HouseNumberState::getOrderNumber, orderNumber);
  1119. wrapperHns.eq(HouseNumberState::getHouseNumberId, houseNumberId);
  1120. HouseNumberState houseNumberState = houseNumberStateService.getOne(wrapperHns);
  1121. if (ObjectUtils.isEmpty(houseNumberState)) {
  1122. return CommonResult.fail("房间号有误");
  1123. }
  1124. dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  1125. // 设置房态的结束时间
  1126. // houseNumberState.setEndTime(LocalDateTime.now().format(dateTimeFormatter));
  1127. // 修改房间状态(置脏)
  1128. // HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  1129. houseNumber.setHouseStatus(2);
  1130. // 判断该房间是否免费的房间,是则需要支付水电费,并改成带结账状态
  1131. // BigDecimal payPrice = houseOrder.getPayPrice();
  1132. // if (ObjectUtils.isNotEmpty(payPrice) && payPrice.doubleValue() <= 0) {
  1133. // houseOrder.setOrderStatus("5");
  1134. // BigDecimal electricCost = houseOrder.getElectricCost();
  1135. // BigDecimal waterCost = houseOrder.getWaterCost();
  1136. // BigDecimal total = electricCost.add(waterCost);
  1137. // houseOrder.setPayPrice(total);
  1138. // }
  1139. houseOrderService.updateById(houseOrder);
  1140. // houseNumberStateService.updateById(houseNumberState);
  1141. houseNumberStateService.removeById(houseNumberState.getId());
  1142. houseNumberService.updateById(houseNumber);
  1143. return CommonResult.ok();
  1144. }
  1145. @Override
  1146. @Transactional(rollbackFor = Exception.class)//1
  1147. public CommonResult roomChange(RoomChangeDto roomChangeDto) {
  1148. if (ObjectUtils.isEmpty(roomChangeDto)) {
  1149. return CommonResult.fail();
  1150. }
  1151. int adminMenuId = roomChangeDto.getAdminMenuId();
  1152. PermissionSetting permissionSetting = permissionSettingService.getById(adminMenuId);
  1153. if (ObjectUtils.isEmpty(permissionSetting)) {
  1154. return CommonResult.fail("非法进入");
  1155. }
  1156. // 判断该用户是否拥有权限
  1157. String houseTypeManagement = permissionSetting.getHouseOrderManagement();
  1158. if (!"0".equals(houseTypeManagement) && !houseTypeManagement.contains("8")) {
  1159. return CommonResult.fail("此账号暂无该权限");
  1160. }
  1161. // 初始房间号
  1162. String initialHouseNumberId = roomChangeDto.getInitialHouseNumberId();
  1163. // 换的房间号
  1164. String houseNumberId = roomChangeDto.getHouseNumberId();
  1165. // 订单号
  1166. String orderNumber = roomChangeDto.getOrderNumber();
  1167. LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
  1168. wrapperHo.eq(HouseOrder::getOrderNumber, orderNumber);
  1169. HouseOrder houseOrder = houseOrderService.getOne(wrapperHo);
  1170. if (ObjectUtils.isEmpty(houseOrder)) {
  1171. return CommonResult.fail("无该订单");
  1172. }
  1173. Date liveTime = houseOrder.getLiveTime();
  1174. Date date = new Date();
  1175. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1176. String format = sdf.format(liveTime);
  1177. String format1 = sdf.format(date);
  1178. // 判断该房间在该订单的时间内是否有使用
  1179. List<HouseNumberState> houseNumberStateList = houseNumberStateService.beBooked(houseNumberId, format1, houseOrder.getReserveLeaveTime());
  1180. if (ObjectUtils.isNotEmpty(houseNumberStateList) && houseNumberStateList.size() > 0) {
  1181. return CommonResult.fail("此时间段内,该房间已被使用");
  1182. }
  1183. // 修改订单
  1184. houseOrder.setHouseNumberId(houseNumberId);
  1185. // 将换房当前时间改为入住时间
  1186. houseOrder.setLiveTime(date);
  1187. // 获取水电消费金额和额度
  1188. // 获取初始房间号的水电表设备id
  1189. HouseNumber initialHouseNumber = houseNumberService.getById(initialHouseNumberId);
  1190. String electricEquipmentId = initialHouseNumber.getElectricEquipmentId();
  1191. String waterEquipmentId = initialHouseNumber.getWaterEquipmentId();
  1192. ElectricEquipment electricEquipment = electricEquipmentService.getById(electricEquipmentId);
  1193. WaterEquipment waterEquipment = waterEquipmentService.getById(waterEquipmentId);
  1194. if (ObjectUtils.isNotEmpty(electricEquipment) && ObjectUtils.isNotEmpty(waterEquipment)) {
  1195. String electricEquipmentRoomId = electricEquipment.getRoomId();
  1196. String waterEquipmentRoomId = waterEquipment.getRoomId();
  1197. String live = sdf.format(liveTime);
  1198. String leave = sdf.format(new Date());
  1199. // 获取电的消费金额和额度
  1200. HouseOrderBill houseOrderBill = new HouseOrderBill();
  1201. JSONObject jsonObjectElectric = electricEquipmentService.roomCostRecord(electricEquipmentRoomId, live, leave);
  1202. BigDecimal costElectric = jsonObjectElectric.getBigDecimal("cost");
  1203. BigDecimal consumeElectric = jsonObjectElectric.getBigDecimal("consume");
  1204. houseOrderBill.setElectricCost(costElectric);
  1205. houseOrderBill.setElectricConsume(consumeElectric);
  1206. BigDecimal electricCost = houseOrder.getElectricCost();
  1207. if (ObjectUtils.isNotEmpty(electricCost)) {
  1208. costElectric = costElectric.add(electricCost);
  1209. }
  1210. BigDecimal electricConsume = houseOrder.getElectricConsume();
  1211. if (ObjectUtils.isNotEmpty(electricConsume)) {
  1212. consumeElectric = consumeElectric.add(electricConsume);
  1213. }
  1214. houseOrder.setElectricCost(costElectric);
  1215. houseOrder.setElectricConsume(consumeElectric);
  1216. // 获取水的消费金额和额度
  1217. JSONObject jsonObjectWater = waterEquipmentService.roomCostRecord(waterEquipmentRoomId, live, leave);
  1218. BigDecimal costWater = jsonObjectWater.getBigDecimal("cost");
  1219. BigDecimal consumeWater = jsonObjectWater.getBigDecimal("consume");
  1220. houseOrderBill.setWaterCost(costWater);
  1221. houseOrderBill.setWaterConsume(consumeWater);
  1222. BigDecimal waterCost = houseOrder.getWaterCost();
  1223. if (ObjectUtils.isNotEmpty(waterCost)) {
  1224. costWater = costWater.add(waterCost);
  1225. }
  1226. BigDecimal waterConsume = houseOrder.getWaterConsume();
  1227. if (ObjectUtils.isNotEmpty(waterConsume)) {
  1228. consumeWater = consumeWater.add(waterConsume);
  1229. }
  1230. houseOrder.setWaterCost(costWater);
  1231. houseOrder.setWaterConsume(consumeWater);
  1232. houseOrderBill.setHouseOrderId(houseOrder.getId());
  1233. houseOrderBill.setHouseNumberId(initialHouseNumberId);
  1234. houseOrderBill.setLiveTime(liveTime);
  1235. houseOrderBill.setLeaveTime(date);
  1236. houseOrderBillService.save(houseOrderBill);
  1237. }
  1238. houseOrderService.updateById(houseOrder);
  1239. // 添加状态表,修改状态表
  1240. HouseNumberState houseNumberState = new HouseNumberState();
  1241. houseNumberState.setStatus(4);
  1242. houseNumberState.setHouseNumberId(houseNumberId);
  1243. houseNumberState.setStartTime(format);
  1244. houseNumberState.setEndTime(houseOrder.getReserveLeaveTime());
  1245. houseNumberState.setOrderNumber(orderNumber);
  1246. houseNumberStateService.save(houseNumberState);
  1247. // 找到订单之前的房态,并修改
  1248. LambdaQueryWrapper<HouseNumberState> wrapperHns = new LambdaQueryWrapper<>();
  1249. wrapperHns.eq(HouseNumberState::getOrderNumber, orderNumber)
  1250. .eq(HouseNumberState::getHouseNumberId, initialHouseNumberId);
  1251. HouseNumberState one = houseNumberStateService.getOne(wrapperHns);
  1252. // one.setEndTime(sdf.format(new Date()));
  1253. // houseNumberStateService.updateById(one);
  1254. houseNumberStateService.removeById(one.getId());
  1255. // 修改换的房间
  1256. HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  1257. // 房间置脏需退房后
  1258. // houseNumber.setHouseStatus(2);
  1259. // 开电
  1260. // Boolean aBoolean = electricEquipmentService.openMeterControl(houseNumber.getElectricEquipmentId());
  1261. String msg = "";
  1262. // if (!aBoolean) {
  1263. // msg = "开电失败";
  1264. // // 设置关电状态
  1265. // houseNumber.setElectricType("2");
  1266. // }else {
  1267. // // 设置开电状态
  1268. houseNumber.setElectricType("1");
  1269. // }
  1270. houseNumberService.updateById(houseNumber);
  1271. // 之前的房间需要置脏,不需要关电,置净才需要关电
  1272. HouseNumber houseNumber1 = houseNumberService.getById(initialHouseNumberId);
  1273. // 房间置脏
  1274. houseNumber1.setHouseStatus(2);
  1275. houseNumberService.updateById(houseNumber1);
  1276. // 旧房间密码删除,添加新房间密码
  1277. Admin byId = adminService.getById(roomChangeDto.getAdminId());
  1278. LambdaQueryWrapper<Unlocking> wrapperU = new LambdaQueryWrapper<>();
  1279. wrapperU.eq(Unlocking::getOrderNumber, orderNumber)
  1280. .eq(Unlocking::getHouseNumberId, initialHouseNumberId);
  1281. Unlocking unlocking = unlockingService.getOne(wrapperU);
  1282. if (ObjectUtils.isNotEmpty(unlocking)) {
  1283. // 删除房间密码
  1284. passwordIssController.deleteLockUser(unlocking.getLuid(), unlocking.getLockUserId());
  1285. unlockingService.removeById(unlocking);
  1286. OperatingRecord operatingRecord = new OperatingRecord();
  1287. operatingRecord.setRoomNumber(houseNumber1.getRoomNumber());
  1288. operatingRecord.setHouseNumberId(houseNumber1.getId());
  1289. operatingRecord.setOperatorName(byId.getName());
  1290. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  1291. operatingRecord.setDataTime(LocalDateTime.now().format(dateTimeFormatter1));
  1292. operatingRecord.setContent("姓名:" + houseOrder.getLiveName());
  1293. operatingRecord.setType("删除锁钥匙");
  1294. operatingRecordService.save(operatingRecord);
  1295. }
  1296. LambdaQueryWrapper<HouseLock> wrapperHl = new LambdaQueryWrapper<>();
  1297. wrapperHl.eq(HouseLock::getHouseNumberId, houseNumberId);
  1298. HouseLock houseLock = houseLockService.getOne(wrapperHl);
  1299. String equipment = "";
  1300. if (ObjectUtils.isNotEmpty(houseLock)) {
  1301. equipment = houseLock.getEquipmentType();
  1302. }
  1303. // 入住人id
  1304. String liveUsersId = houseOrder.getLiveUsersId();
  1305. Users users = usersService.getById(liveUsersId);
  1306. if (ObjectUtils.isNotEmpty(unlocking)) {
  1307. // 判断是什么类型的开锁方式
  1308. String lockStatus = unlocking.getLockStatus();
  1309. // 添加锁的操作记录
  1310. OperatingRecord operatingRecord = new OperatingRecord();
  1311. operatingRecord.setRoomNumber(houseNumber.getRoomNumber());
  1312. operatingRecord.setHouseNumberId(houseNumber.getId());
  1313. operatingRecord.setOperatorName(byId.getName());
  1314. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  1315. operatingRecord.setDataTime(LocalDateTime.now().format(dateTimeFormatter1));
  1316. operatingRecord.setContent("姓名:" + houseOrder.getLiveName());
  1317. if ("1".equals(lockStatus)) {
  1318. PasswordDto pr = new PasswordDto();
  1319. pr.setLuid(houseLock.getEquipmentType());
  1320. // 开始时间
  1321. pr.setStartTime(String.valueOf(liveTime.getTime()));
  1322. // 结束时间
  1323. String reserveLeaveTime = houseOrder.getReserveLeaveTime();
  1324. Date leaveTime = Date.from(LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter1).atZone(ZoneId.systemDefault()).toInstant());
  1325. pr.setEndTime(String.valueOf(leaveTime.getTime()));
  1326. pr.setHouseNumberId(houseNumberId);
  1327. pr.setOrderNumber(orderNumber);
  1328. Unlocking unlocking1 = passwordIssController.addPassword(pr);
  1329. unlockingService.save(unlocking1);
  1330. String passWord = unlocking1.getPassWord();
  1331. ArrayList<String> strings = new ArrayList<>();
  1332. strings.add(users.getCardNumber());
  1333. weiXiaoComponent.sendNotice(strings, "公寓办理入住成功", "办理入住成功", "您的房间号为:" + houseNumber.getRoomNumber() + ",密码是:" + passWord + "离店时间为:" + liveTime + ",欢迎您入住张玉玲酒店,我们全体员工很荣幸能为您服务,如有任何需要请致电张玉玲,期待为你服务。祝你生活愉快!", null);
  1334. operatingRecord.setType("添加密码钥匙");
  1335. } else if ("2".equals(lockStatus)) {
  1336. CardInfoDto cid = new CardInfoDto();
  1337. cid.setCard(users.getIdCardInformation());
  1338. cid.setLuid(equipment);
  1339. cid.setCardType(1);
  1340. cid.setStartTime(String.valueOf(liveTime.getTime()));
  1341. // 结束时间
  1342. String reserveLeaveTime = houseOrder.getReserveLeaveTime();
  1343. Date leaveTime = Date.from(LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter1).atZone(ZoneId.systemDefault()).toInstant());
  1344. cid.setEndTime(String.valueOf(leaveTime.getTime()));
  1345. cid.setHouseNumberId(houseNumberId);
  1346. cid.setOrderNumber(houseOrder.getOrderNumber());
  1347. Unlocking unlocking1 = passwordIssController.addCardInfo(cid);
  1348. unlockingService.save(unlocking1);
  1349. operatingRecord.setType("添加卡片钥匙");
  1350. } else if ("3".equals(lockStatus)) {
  1351. FingerprintDataDto fd = new FingerprintDataDto();
  1352. fd.setLuid(equipment);
  1353. fd.setHouseNumberId(houseNumberId);
  1354. fd.setOrderNumber(houseOrder.getOrderNumber());
  1355. fd.setStartTime(String.valueOf(liveTime.getTime()));
  1356. // 结束时间
  1357. String reserveLeaveTime = houseOrder.getReserveLeaveTime();
  1358. Date leaveTime = Date.from(LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter1).atZone(ZoneId.systemDefault()).toInstant());
  1359. fd.setEndTime(String.valueOf(leaveTime.getTime()));
  1360. fd.setFingerprintData(users.getFingerprint());
  1361. Unlocking unlocking1 = passwordIssController.addFingerprintData(fd);
  1362. unlockingService.save(unlocking1);
  1363. operatingRecord.setType("添加指纹钥匙");
  1364. }
  1365. operatingRecordService.save(operatingRecord);
  1366. }
  1367. if (msg.equals("")) {
  1368. return CommonResult.ok();
  1369. } else {
  1370. return CommonResult.ok(msg);
  1371. }
  1372. }
  1373. @Override
  1374. public void queryExport(HttpServletResponse response, int adminId, String keyWord, String houseType, String orderStatus, String payPriceStartTime, String payPriceEndTime, String refundStartTime, String refundEndTime, String cancelStartTime,
  1375. String cancelEndTime,String liveStartTime, String liveEndTime, String leaveStartTime, String leaveEndTime,
  1376. String reserveLiveStartTime, String reserveLiveEndTime, String reserveLeaveStartTime, String reserveLeaveEndTime, String houseId, Integer keyType, Integer giveBack, Integer buildingId, Integer orgId) {
  1377. // PermissionSetting permissionSetting = permissionSettingService.getById(adminId);
  1378. // if (ObjectUtils.isEmpty(permissionSetting)) {
  1379. // return CommonResult.fail("非法进入");
  1380. // }
  1381. //// 判断该用户是否拥有权限
  1382. // String houseTypeManagement = permissionSetting.getHouseOrderManagement();
  1383. // if (!"0".equals(houseTypeManagement) && !houseTypeManagement.contains("9")) {
  1384. // return CommonResult.fail("此账号暂无该权限");
  1385. // }
  1386. List<QueryExportVo> vos = houseOrderService.queryExport(keyWord, houseType, orderStatus, payPriceStartTime, payPriceEndTime, refundStartTime, refundEndTime, cancelStartTime, cancelEndTime,liveStartTime, liveEndTime, leaveStartTime, leaveEndTime, reserveLiveStartTime, reserveLiveEndTime, reserveLeaveStartTime, reserveLeaveEndTime, houseId, keyType, giveBack, buildingId, orgId);
  1387. // 导出
  1388. Workbook workbook = new XSSFWorkbook();
  1389. Sheet sheet = workbook.createSheet("订单表");
  1390. Row headerRow = sheet.createRow(0);
  1391. headerRow.createCell(0).setCellValue("房间号");
  1392. headerRow.createCell(1).setCellValue("房类");
  1393. headerRow.createCell(2).setCellValue("房型名称");
  1394. headerRow.createCell(3).setCellValue("钥匙类型");
  1395. headerRow.createCell(4).setCellValue("是否归还");
  1396. headerRow.createCell(5).setCellValue("预定人");
  1397. headerRow.createCell(6).setCellValue("手机号码");
  1398. headerRow.createCell(7).setCellValue("入住人");
  1399. headerRow.createCell(8).setCellValue("身份证号");
  1400. headerRow.createCell(9).setCellValue("部门");
  1401. headerRow.createCell(10).setCellValue("部门职工号");
  1402. headerRow.createCell(11).setCellValue("订单号");
  1403. headerRow.createCell(12).setCellValue("入住时间");
  1404. headerRow.createCell(13).setCellValue("离店时间");
  1405. headerRow.createCell(14).setCellValue("订单金额(元)");
  1406. headerRow.createCell(15).setCellValue("订单状态");
  1407. headerRow.createCell(16).setCellValue("备注");
  1408. headerRow.createCell(17).setCellValue("支付类型");
  1409. headerRow.createCell(18).setCellValue("来源渠道");
  1410. headerRow.createCell(19).setCellValue("支付时间");
  1411. headerRow.createCell(20).setCellValue("退款时间");
  1412. headerRow.createCell(21).setCellValue("取消时间");
  1413. headerRow.createCell(22).setCellValue("来源");
  1414. headerRow.createCell(23).setCellValue("来源详情");
  1415. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1416. if (ObjectUtils.isNotEmpty(vos) && vos.size() > 0) {
  1417. for (int i = 0; i < vos.size(); i++) {
  1418. QueryExportVo vo = vos.get(i);
  1419. Row dataRow1 = sheet.createRow(i + 1);
  1420. dataRow1.createCell(0).setCellValue(vo.getHouseNumber());
  1421. Integer roomType = vo.getRoomType();
  1422. String houseSta = "";
  1423. if (ObjectUtils.isNotEmpty(roomType)) {
  1424. if (2 == roomType) {
  1425. houseSta = "钟点房";
  1426. } else if (1 == roomType) {
  1427. houseSta = "全日房";
  1428. }
  1429. }
  1430. dataRow1.createCell(1).setCellValue(houseSta);
  1431. dataRow1.createCell(2).setCellValue(vo.getHouseName());
  1432. Integer lockStatus = vo.getLockStatus();
  1433. String lockString = "";
  1434. if (ObjectUtils.isNotEmpty(lockStatus)) {
  1435. if (1 == lockStatus) {
  1436. lockString = "密码开锁";
  1437. } else if (2 == lockStatus) {
  1438. lockString = "房卡开锁";
  1439. } else if (3 == lockStatus) {
  1440. lockString = "指纹开锁";
  1441. } else if (4 == lockStatus) {
  1442. lockString = "身份证开锁";
  1443. } else if (5 == lockStatus) {
  1444. lockString = "钥匙开锁";
  1445. }
  1446. }
  1447. dataRow1.createCell(3).setCellValue(lockString);
  1448. Integer giveBack1 = vo.getGiveBack();
  1449. String back = "";
  1450. if (ObjectUtils.isNotEmpty(giveBack1)) {
  1451. if (1 == giveBack1) {
  1452. back = "已归还";
  1453. } else {
  1454. back = "未归还";
  1455. }
  1456. }
  1457. dataRow1.createCell(4).setCellValue(back);
  1458. dataRow1.createCell(5).setCellValue(vo.getReserveName());
  1459. dataRow1.createCell(6).setCellValue(vo.getPhone());
  1460. dataRow1.createCell(7).setCellValue(vo.getLiveName());
  1461. dataRow1.createCell(8).setCellValue(vo.getIdCard());
  1462. dataRow1.createCell(9).setCellValue(vo.getOrgName());
  1463. dataRow1.createCell(10).setCellValue(vo.getCardNumber());
  1464. dataRow1.createCell(11).setCellValue(vo.getOrderNumber());
  1465. dataRow1.createCell(12).setCellValue(vo.getLiveTime());
  1466. dataRow1.createCell(13).setCellValue(vo.getLeaveTime());
  1467. BigDecimal orderPrice = vo.getOrderPrice();
  1468. String price = "";
  1469. if (ObjectUtils.isNotEmpty(orderPrice)) {
  1470. price = orderPrice.toString();
  1471. }
  1472. dataRow1.createCell(14).setCellValue(price);
  1473. // 订单 订单状态 1.待支付,2.已支付,3.待入住,4.已入住,5.待结账,6.退款中,7.已退款,8.已退房,9.已取消,超时
  1474. String orderStart = vo.getOrderStart();
  1475. String orderName = "";
  1476. if ("1".equals(orderStart)) {
  1477. orderName = "待支付";
  1478. } else if ("2".equals(orderStart)) {
  1479. orderName = "已支付";
  1480. } else if ("3".equals(orderStart)) {
  1481. orderName = "待入住";
  1482. } else if ("4".equals(orderStart)) {
  1483. orderName = "已入住";
  1484. } else if ("5".equals(orderStart)) {
  1485. orderName = "待结账";
  1486. } else if ("6".equals(orderStart)) {
  1487. orderName = "退款中";
  1488. } else if ("7".equals(orderStart)) {
  1489. orderName = "已退款";
  1490. } else if ("8".equals(orderStart)) {
  1491. orderName = "已退房";
  1492. } else if ("9".equals(orderStart)) {
  1493. orderName = "已取消";
  1494. } else if ("10".equals(orderStart)) {
  1495. orderName = "已支付未入住";
  1496. }
  1497. dataRow1.createCell(15).setCellValue(orderName);
  1498. dataRow1.createCell(16).setCellValue(vo.getRemark());
  1499. // pay_type 支付方式(微信支付,现金)
  1500. String payType = vo.getPayType();
  1501. String payName = "";
  1502. if ("1".equals(payType)) {
  1503. payName = "微信支付";
  1504. } else if ("2".equals(payType)) {
  1505. payName = "现金";
  1506. }
  1507. dataRow1.createCell(17).setCellValue(payName);
  1508. // order_channel 订单渠道(1:线上,2:线下)
  1509. String orderChannelType = vo.getOrderChannelType();
  1510. String orderChannelName = "";
  1511. if ("1".equals(orderChannelType)) {
  1512. orderChannelName = "线上";
  1513. } else if ("2".equals(orderChannelType)) {
  1514. orderChannelName = "线下";
  1515. }
  1516. dataRow1.createCell(18).setCellValue(orderChannelName);
  1517. dataRow1.createCell(19).setCellValue(vo.getPayTime());
  1518. Date refundTime = vo.getRefundTime();
  1519. if (ObjectUtils.isEmpty(refundTime)) {
  1520. dataRow1.createCell(20).setCellValue(refundTime);
  1521. } else {
  1522. dataRow1.createCell(20).setCellValue(sdf.format(vo.getRefundTime()));
  1523. }
  1524. Date cancelTime = vo.getCancelTime();
  1525. if (ObjectUtils.isEmpty(cancelTime)) {
  1526. dataRow1.createCell(21).setCellValue(cancelTime);
  1527. } else {
  1528. dataRow1.createCell(21).setCellValue(sdf.format(cancelTime));
  1529. }
  1530. String[] arr=(vo.getSourceId()==null?"":vo.getSourceId()).split(",");
  1531. ArrayList<String> idList = new ArrayList<String>(Arrays.asList(arr)) ;
  1532. if(!StringUtils.hasText(vo.getSource())){
  1533. dataRow1.createCell(22).setCellValue("自费");
  1534. dataRow1.createCell(23).setCellValue("");
  1535. }else if ("1".equals(vo.getSource())){
  1536. vo.setSource("课表");
  1537. List<ClassSchedule> schedules=new ArrayList<>(classScheduleService.listByIds(idList));
  1538. String data = schedules.stream().peek((ClassSchedule u) -> u.setJsxm("姓名:"+u.getJsxm()+ ";工号:" + u.getJsgh() + ";课表日期:" + u.getDateTime() + ";备注:" + u.getRemark()+";")).map(ClassSchedule::getJsxm).collect(Collectors.joining("\r\n"));
  1539. dataRow1.createCell(22).setCellValue("课表");
  1540. dataRow1.createCell(23).setCellValue(data);
  1541. } else if ("2".equals(vo.getSource())){
  1542. vo.setSource("流程");
  1543. List<ApplicationProcedureTemporaryVo> applicationProcedureTemporaries= new ArrayList<>();
  1544. for (int j = 0; j <idList.size(); j++) {
  1545. if (StringUtils.hasText(idList.get(j))){
  1546. applicationProcedureTemporaries.add(applicationProcedureTemporaryService.appletDetail(Integer.valueOf(idList.get(j))));
  1547. }
  1548. }
  1549. String data = applicationProcedureTemporaries.stream().peek((ApplicationProcedureTemporaryVo u) ->
  1550. u.setUsersName("申请人姓名:"+u.getUsersName()+ ";申请人部门" + u.getOrgName() + ";房间数量:" + u.getHouseCount()
  1551. + ";开始时间:" + u.getStartTime()+";结束时间"+u.getEndTime()+";审核状态:"+u.getStatus()+"(0:已拒绝,1:待审批,2:处理中,3:已同意);")).map(ApplicationProcedureTemporaryVo::getUsersName).collect(Collectors.joining("\r\n"));
  1552. dataRow1.createCell(22).setCellValue("流程");
  1553. dataRow1.createCell(23).setCellValue(data);
  1554. }
  1555. }
  1556. }
  1557. // 将工作簿写入文件
  1558. ExcelUtils2.excelDownload(workbook, "订单表.xlsx", response);
  1559. // return CommonResult.ok();
  1560. }
  1561. @Override
  1562. public CommonResult reportStatistics(String permissionSettingId, String state, String keyWord, String startTime, String endTime, int page, int size,String dateBill) {
  1563. PermissionSetting permissionSetting = permissionSettingService.getById(permissionSettingId);
  1564. if (ObjectUtils.isEmpty(permissionSetting)) {
  1565. return CommonResult.fail("非法进入");
  1566. }
  1567. // 判断该用户是否拥有权限
  1568. // String reportManagement = permissionSetting.getReportManagement();
  1569. // if (!"0".equals(reportManagement) && !reportManagement.contains("1")) {
  1570. // return CommonResult.fail("此账号暂无该权限");
  1571. // }
  1572. if (ObjectUtils.isEmpty(state)) {
  1573. return CommonResult.fail("参数异常");
  1574. }
  1575. String s = "";
  1576. if ("1".equals(state)) {
  1577. s = "2,3,4,8,10";
  1578. } else {
  1579. s = "5";
  1580. }
  1581. PageUtils<ReportStatisticsVo> pageUtils = houseOrderService.reportStatisticsPage(s, keyWord, startTime, endTime, page, size,dateBill);
  1582. return CommonResult.ok(pageUtils);
  1583. }
  1584. @Override
  1585. public void reportStatisticsExport(HttpServletResponse response, String permissionSettingId, String state, String keyWord, String startTime, String endTime,String dateBill) {
  1586. // PermissionSetting permissionSetting = permissionSettingService.getById(permissionSettingId);
  1587. // if (ObjectUtils.isEmpty(permissionSetting)) {
  1588. // return CommonResult.fail("非法进入");
  1589. // }
  1590. //
  1591. //// 判断该用户是否拥有权限
  1592. // String reportManagement = permissionSetting.getReportManagement();
  1593. // if (!"0".equals(reportManagement) && !reportManagement.contains("2")) {
  1594. // return CommonResult.fail("此账号暂无该权限");
  1595. // }
  1596. //
  1597. // if (ObjectUtils.isEmpty(state)) {
  1598. // return CommonResult.fail("参数异常");
  1599. // }
  1600. String s = "";
  1601. if ("1".equals(state)) {
  1602. s = "2,3,4,8,10";
  1603. } else {
  1604. s = "5";
  1605. }
  1606. List<ReportStatisticsExportVo> vos = houseOrderService.reportStatisticsExport(s, keyWord, startTime, endTime,dateBill);
  1607. // 导出
  1608. Workbook workbook = new XSSFWorkbook();
  1609. Sheet sheet = workbook.createSheet("报表统计");
  1610. Row headerRow = sheet.createRow(0);
  1611. headerRow.createCell(0).setCellValue("序号");
  1612. headerRow.createCell(2).setCellValue("入住人");
  1613. headerRow.createCell(3).setCellValue("部门");
  1614. headerRow.createCell(4).setCellValue("职工卡号");
  1615. headerRow.createCell(5).setCellValue("房型");
  1616. headerRow.createCell(6).setCellValue("房号");
  1617. headerRow.createCell(7).setCellValue("订单金额/元");
  1618. headerRow.createCell(8).setCellValue("支付时间");
  1619. headerRow.createCell(9).setCellValue("订单状态");
  1620. headerRow.createCell(10).setCellValue("创建时间");
  1621. if (ObjectUtils.isNotEmpty(vos) && vos.size() > 0) {
  1622. if ("5".equals(s)) {
  1623. headerRow.createCell(1).setCellValue("账期");
  1624. headerRow.createCell(11).setCellValue("订单详情");
  1625. //水:2.1元/吨,电:0.62元/度
  1626. BigDecimal waterPrice = new BigDecimal(2.1);
  1627. BigDecimal electricPrice = new BigDecimal(0.62);
  1628. // 获取免费的额度
  1629. SubsidySetup subsidySetup = subsidySetupService.list(new LambdaQueryWrapper<>()).get(0);
  1630. BigDecimal water = subsidySetup.getFreeQuotaOfWater();
  1631. BigDecimal electric = subsidySetup.getFreeQuotaOfElectric();
  1632. for (int i = 0; i < vos.size(); i++) {
  1633. ReportStatisticsExportVo vo = vos.get(i);
  1634. Row dataRow1 = sheet.createRow(i + 1);
  1635. dataRow1.createCell(0).setCellValue(i + 1);
  1636. dataRow1.createCell(1).setCellValue(vo.getDateBill());
  1637. dataRow1.createCell(2).setCellValue(vo.getLiveName());
  1638. // 房型是房间名称加房间类型
  1639. String roomName = vo.getRoomName();
  1640. String roomType = vo.getRoomType();
  1641. String type = "";
  1642. if ("1".equals(roomType)) {
  1643. type = "全";
  1644. } else {
  1645. type = "钟";
  1646. }
  1647. dataRow1.createCell(3).setCellValue(vo.getOrgName());
  1648. dataRow1.createCell(4).setCellValue(vo.getCardNumber());
  1649. if (ObjectUtils.isEmpty(roomName)) {
  1650. dataRow1.createCell(5).setCellValue(roomName);
  1651. } else {
  1652. dataRow1.createCell(5).setCellValue(roomName + "(" + type + ")");
  1653. }
  1654. dataRow1.createCell(6).setCellValue(vo.getRoomNumber());
  1655. dataRow1.createCell(7).setCellValue(vo.getPayPrice().doubleValue());
  1656. dataRow1.createCell(8).setCellValue(vo.getPayTime());
  1657. // 订单状态
  1658. String orderStatus = vo.getOrderStatus();
  1659. String orderName = "";
  1660. if ("1".equals(orderStatus)) {
  1661. orderName = "待支付";
  1662. } else if ("2".equals(orderStatus)) {
  1663. orderName = "已支付";
  1664. } else if ("3".equals(orderStatus)) {
  1665. orderName = "待入住";
  1666. } else if ("4".equals(orderStatus)) {
  1667. orderName = "已入住";
  1668. } else if ("5".equals(orderStatus)) {
  1669. orderName = "待结账";
  1670. } else if ("6".equals(orderStatus)) {
  1671. orderName = "退款中";
  1672. } else if ("7".equals(orderStatus)) {
  1673. orderName = "已退款";
  1674. } else if ("8".equals(orderStatus)) {
  1675. orderName = "已退房";
  1676. } else if ("9".equals(orderStatus)) {
  1677. orderName = "已取消";
  1678. } else if ("10".equals(orderStatus)) {
  1679. orderName = "已支付未入住";
  1680. }
  1681. dataRow1.createCell(9).setCellValue(orderName);
  1682. dataRow1.createCell(10).setCellValue(vo.getCreateTime());
  1683. // 订单详情
  1684. List<HouseOrderWaterAndElectricVo> houseOrderWaters=houseOrderService.getWaterAndElectric(vo.getHouseOrderSource());
  1685. String details="";
  1686. for (int i2 = 0; i2 < houseOrderWaters.size(); i++) {
  1687. HouseOrderWaterAndElectricVo we = houseOrderWaters.get(i2);
  1688. we.setFreeWater(water);
  1689. we.setWaterPrice(waterPrice);
  1690. // 计算总金额
  1691. BigDecimal waterConsume = we.getWaterConsume();
  1692. BigDecimal subtract=waterConsume.subtract(water);
  1693. if (subtract.doubleValue()<0) {
  1694. subtract=new BigDecimal(0);
  1695. }
  1696. BigDecimal waterTotalPrice=subtract.multiply(waterPrice);
  1697. we.setWaterTotalPrice(waterTotalPrice);
  1698. we.setFreeElectric(electric);
  1699. we.setElectricPrice(electricPrice);
  1700. // 计算总金额
  1701. BigDecimal electricConsume = we.getElectricConsume();
  1702. BigDecimal subtract2=electricConsume.subtract(electric);
  1703. if (subtract2.doubleValue()<0) {
  1704. subtract2=new BigDecimal(0);
  1705. }
  1706. BigDecimal electricTotalPrice=subtract2.multiply(electricPrice);
  1707. we.setElectricTotalPrice(electricTotalPrice);
  1708. if (i2==0) {
  1709. details="订单号: "+we.getOrderNumber()+","+"入住时间: "+we.getLiveTime()+","+"离店时间: "+we.getLeaveTime()+","+"房号: "+we.getRoomNumber()
  1710. +","+"用水量/吨: "+we.getWaterConsume()+","+"水价/元: "+we.getWaterPrice()+","+"水费补助/吨: "+we.getFreeWater()
  1711. +","+"产生水费/元: "+we.getWaterTotalPrice()+","+"用电量/度: "+we.getElectricConsume()+","+"电价/元: "+we.getElectricPrice()
  1712. +","+"电费补助/度: "+we.getFreeElectric()+","+"产生的电费/元: "+we.getElectricTotalPrice();
  1713. }else {
  1714. details=details+"\n"
  1715. +"订单号: "+we.getOrderNumber()+","+"入住时间: "+we.getLiveTime()+","+"离店时间: "+we.getLeaveTime()+","+"房号: "+we.getRoomNumber()
  1716. +","+"用水量/吨: "+we.getWaterConsume()+","+"水价/元: "+we.getWaterPrice()+","+"水费补助/吨: "+we.getFreeWater()
  1717. +","+"产生水费/元: "+we.getWaterTotalPrice()+","+"用电量/度: "+we.getElectricConsume()+","+"电价/元: "+we.getElectricPrice()
  1718. +","+"电费补助/度: "+we.getFreeElectric()+","+"产生的电费/元: "+we.getElectricTotalPrice();
  1719. }
  1720. }
  1721. dataRow1.createCell(11).setCellValue(details);
  1722. }
  1723. } else {
  1724. headerRow.createCell(1).setCellValue("订单编号");
  1725. for (int i = 0; i < vos.size(); i++) {
  1726. ReportStatisticsExportVo vo = vos.get(i);
  1727. Row dataRow1 = sheet.createRow(i + 1);
  1728. dataRow1.createCell(0).setCellValue(i + 1);
  1729. dataRow1.createCell(1).setCellValue(vo.getOrderNumber());
  1730. dataRow1.createCell(2).setCellValue(vo.getLiveName());
  1731. // 房型是房间名称加房间类型
  1732. String roomName = vo.getRoomName();
  1733. String roomType = vo.getRoomType();
  1734. String type = "";
  1735. if ("1".equals(roomType)) {
  1736. type = "全";
  1737. } else {
  1738. type = "钟";
  1739. }
  1740. dataRow1.createCell(3).setCellValue(vo.getOrgName());
  1741. dataRow1.createCell(4).setCellValue(vo.getCardNumber());
  1742. if (ObjectUtils.isEmpty(roomName)) {
  1743. dataRow1.createCell(5).setCellValue(roomName);
  1744. } else {
  1745. dataRow1.createCell(5).setCellValue(roomName + "(" + type + ")");
  1746. }
  1747. dataRow1.createCell(6).setCellValue(vo.getRoomNumber());
  1748. dataRow1.createCell(7).setCellValue(vo.getPayPrice().doubleValue());
  1749. dataRow1.createCell(8).setCellValue(vo.getPayTime());
  1750. // 订单状态
  1751. String orderStatus = vo.getOrderStatus();
  1752. String orderName = "";
  1753. if ("1".equals(orderStatus)) {
  1754. orderName = "待支付";
  1755. } else if ("2".equals(orderStatus)) {
  1756. orderName = "已支付";
  1757. } else if ("3".equals(orderStatus)) {
  1758. orderName = "待入住";
  1759. } else if ("4".equals(orderStatus)) {
  1760. orderName = "已入住";
  1761. } else if ("5".equals(orderStatus)) {
  1762. orderName = "待结账";
  1763. } else if ("6".equals(orderStatus)) {
  1764. orderName = "退款中";
  1765. } else if ("7".equals(orderStatus)) {
  1766. orderName = "已退款";
  1767. } else if ("8".equals(orderStatus)) {
  1768. orderName = "已退房";
  1769. } else if ("9".equals(orderStatus)) {
  1770. orderName = "已取消";
  1771. } else if ("10".equals(orderStatus)) {
  1772. orderName = "已支付未入住";
  1773. }
  1774. dataRow1.createCell(9).setCellValue(orderName);
  1775. dataRow1.createCell(10).setCellValue(vo.getCreateTime());
  1776. }
  1777. }
  1778. }
  1779. // 将工作簿写入文件
  1780. ExcelUtils2.excelDownload(workbook, "订单报表.xlsx", response);
  1781. // return CommonResult.ok();
  1782. }
  1783. @Override
  1784. public CommonResult orderPage(String userId, int page, int size, String status) {
  1785. if (ObjectUtils.isEmpty(userId)) {
  1786. return CommonResult.fail("参数异常");
  1787. }
  1788. if (ObjectUtils.isEmpty(page) && page <= 0) {
  1789. page = 1;
  1790. }
  1791. if (ObjectUtils.isEmpty(size) && size <= 0) {
  1792. size = 10;
  1793. }
  1794. LambdaQueryWrapper<HouseOrder> wrapper = new LambdaQueryWrapper<>();
  1795. wrapper.eq(HouseOrder::getReserveUserId, userId)
  1796. .orderByDesc(HouseOrder::getCreateTime);
  1797. if (ObjectUtils.isEmpty(status)) {
  1798. ArrayList<String> strings = new ArrayList<>();
  1799. strings.add("1");
  1800. strings.add("3");
  1801. strings.add("4");
  1802. strings.add("5");
  1803. strings.add("8");
  1804. strings.add("9");
  1805. wrapper.in(HouseOrder::getOrderStatus, strings);
  1806. } else {
  1807. wrapper.eq(HouseOrder::getOrderStatus, status);
  1808. }
  1809. IPage<HouseOrder> page1 = houseOrderService.page(new Page<>(page, size), wrapper);
  1810. List<HouseOrder> records = page1.getRecords();
  1811. ArrayList<OrderPageVo> orderPageVos = new ArrayList<>();
  1812. for (HouseOrder record : records) {
  1813. OrderPageVo orderPageVo = new OrderPageVo();
  1814. BeanUtils.copyProperties(record, orderPageVo);
  1815. String orderStatus = record.getOrderStatus();
  1816. if ("1".equals(orderStatus)) {
  1817. // 取消,支付
  1818. orderPageVo.setType("1,2");
  1819. } else if ("3".equals(orderStatus)) {
  1820. // 取消,入住
  1821. orderPageVo.setType("1,3");
  1822. } else if ("4".equals(orderStatus)) {
  1823. // 退房
  1824. orderPageVo.setType("4");
  1825. } else if ("5".equals(orderStatus)) {
  1826. // 支付
  1827. orderPageVo.setType("2");
  1828. } else if ("8".equals(orderStatus)) {
  1829. // 再次预定
  1830. orderPageVo.setType("5");
  1831. } else if ("9".equals(orderStatus)) {
  1832. // 再次预定
  1833. orderPageVo.setType("5");
  1834. }
  1835. // 找到对应订单的房间图片和房间号
  1836. String houseId = record.getHouseId();
  1837. House byId = houseService.getById(houseId);
  1838. if (ObjectUtils.isNotEmpty(byId)) {
  1839. orderPageVo.setUrl(byId.getRoomPicture());
  1840. orderPageVo.setRoomType(byId.getRoomType());
  1841. }
  1842. String houseNumberId = record.getHouseNumberId();
  1843. HouseNumber byId1 = houseNumberService.getById(houseNumberId);
  1844. if (ObjectUtils.isNotEmpty(byId1)) {
  1845. orderPageVo.setRoomNumber(byId1.getRoomNumber());
  1846. }
  1847. orderPageVos.add(orderPageVo);
  1848. }
  1849. IPage<OrderPageVo> orderPageVoIPage = new Page<>();
  1850. BeanUtils.copyProperties(page1, orderPageVoIPage);
  1851. orderPageVoIPage.setRecords(orderPageVos);
  1852. return CommonResult.ok(orderPageVoIPage);
  1853. }
  1854. @Override
  1855. public CommonResult getHouseOrder(String houseOrderId) {
  1856. if (ObjectUtils.isEmpty(houseOrderId)) {
  1857. return CommonResult.fail("参数异常");
  1858. }
  1859. HouseOrder houseOrder = houseOrderService.getById(houseOrderId);
  1860. if (ObjectUtils.isEmpty(houseOrder)) {
  1861. return CommonResult.fail();
  1862. }
  1863. String houseId = houseOrder.getHouseId();
  1864. House house = houseService.getById(houseId);
  1865. HouseOrderVo houseOrderVo = new HouseOrderVo();
  1866. houseOrderVo.setHouseOrder(houseOrder);
  1867. houseOrderVo.setHouse(house);
  1868. String houseNumberId = houseOrder.getHouseNumberId();
  1869. HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  1870. if (ObjectUtils.isNotEmpty(houseNumber)) {
  1871. houseOrderVo.setRoomNumber(houseNumber.getRoomNumber());
  1872. }
  1873. String orderNumber = houseOrder.getOrderNumber();
  1874. Unlocking unlocking = unlockingService.getOrderNumber(orderNumber);
  1875. if (ObjectUtils.isNotEmpty(unlocking)) {
  1876. houseOrderVo.setPassWord(unlocking.getPassWord());
  1877. }
  1878. return CommonResult.ok(houseOrderVo);
  1879. }
  1880. private CloseableHttpClient httpClient;
  1881. /**
  1882. * 订单支付
  1883. *
  1884. * @param wpd
  1885. * @param bindingResult
  1886. * @return
  1887. * @throws Exception
  1888. */
  1889. @Override
  1890. @Transactional(rollbackFor = {Exception.class})
  1891. public CommonResult pay(WxPayDto wpd, BindingResult bindingResult, HttpServletRequest request) throws Exception {
  1892. System.out.println(TimeExchange.getTime() + "微信支付参数====:" + JSON.toJSON(wpd));
  1893. String wxCode = request.getHeader("openId");
  1894. log.info("openId:" + wxCode);
  1895. if (wxCode == null || wxCode == "") {
  1896. return CommonResult.fail("openId不能为空");
  1897. }
  1898. if (bindingResult.hasErrors()) {
  1899. String st = paramUtils.getParamError(bindingResult);
  1900. return CommonResult.fail(st);
  1901. }
  1902. HouseOrder ho = houseOrderService.getById(wpd.getHouseOrderId());
  1903. if (ObjectUtils.isEmpty(ho)) {
  1904. return CommonResult.fail("订单已失效,支付失败");
  1905. }
  1906. BigDecimal payPrice = ho.getPayPrice();
  1907. if (wpd.getTotalPrice().compareTo(payPrice) != 0) {
  1908. return CommonResult.fail("支付金额与订单金额不一致");
  1909. }
  1910. //查看该订单是否支付过
  1911. LambdaQueryWrapper<PayRecord> wrapper = new LambdaQueryWrapper<>();
  1912. wrapper.eq(PayRecord::getHouseOrderId, wpd.getHouseOrderId());
  1913. PayRecord oldPr = payRecordService.getOne(wrapper);
  1914. if (oldPr != null && oldPr.getIsSuccess().equals(ePayStatu.Paysuccess.getValue())) {
  1915. return CommonResult.fail("该订单已支付,请勿重复操作");
  1916. }
  1917. Users ru = usersService.getById(wpd.getUsersId());
  1918. if (ru == null) {
  1919. return CommonResult.fail("用户信息不合法,支付失败");
  1920. }
  1921. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  1922. try {
  1923. log.info(TimeExchange.getTime() + "微信支付判断全部通过");
  1924. //返回0表示等于0,返回1表示大于0,返回-1表示小于0
  1925. if (wpd.getTotalPrice().compareTo(BigDecimal.ZERO) < 0 || wpd.getTotalPrice().compareTo(BigDecimal.ZERO) == 0) {
  1926. if (oldPr == null) {
  1927. PayRecord pr = new PayRecord();
  1928. pr.setHouseOrderId(wpd.getHouseOrderId());
  1929. pr.setUserId(ru.getId());
  1930. pr.setPayNo(getUUIDBits(15));
  1931. pr.setPayPrice(BigDecimal.ZERO);
  1932. pr.setIsSuccess(ePayStatu.Paysuccess.getValue());
  1933. pr.setRemark("支付金额为0,不用走微信支付");
  1934. boolean save = payRecordService.save(pr);
  1935. if (!save) {
  1936. throw new Exception("支付失败!");
  1937. }
  1938. } else {
  1939. oldPr.setRemark(oldPr.getRemark() + "后续支付:支付金额为0,不用走微信支付");
  1940. oldPr.setPayPrice(BigDecimal.ZERO);
  1941. oldPr.setIsSuccess(ePayStatu.Paysuccess.getValue());
  1942. boolean update = payRecordService.updateById(oldPr);
  1943. if (!update) {
  1944. throw new Exception("支付失败!");
  1945. }
  1946. }
  1947. // 金额为0为待入住
  1948. ho.setOrderStatus("3");
  1949. // 支付时间
  1950. ho.setPayTime(LocalDateTime.now().format(dateTimeFormatter));
  1951. // 支付渠道
  1952. ho.setOrderChannel("1");
  1953. // 支付人
  1954. ho.setPayUserId(ru.getId() + "");
  1955. Boolean updateHouseOrder = houseOrderService.updateById(ho);
  1956. if (!updateHouseOrder) {
  1957. throw new Exception("支付失败!");
  1958. }
  1959. log.info("金额为0,待入住成功");
  1960. return CommonResult.ok("支付金额为0,不用走微信支付");
  1961. }
  1962. } catch (Exception e) {
  1963. throw new Exception("支付失败!");
  1964. }
  1965. //微信支付以分为单位
  1966. int totalfee = (wpd.getTotalPrice().multiply(new BigDecimal(100))).intValue();
  1967. //查询是否有未支付订单,有则调用关闭更新支付订单号重新生成支付订单
  1968. List<PayRecord> houseOrderId = payRecordService.list(new QueryWrapper<PayRecord>().eq("house_order_id", ho.getId()));
  1969. log.info("支付订单houseOrderId==" + houseOrderId.toString());
  1970. PayRecord payRecord = houseOrderId.size() > 0 ? houseOrderId.get(0) : new PayRecord();
  1971. if (StringUtils.hasText(payRecord.getPayNo())) {
  1972. try {
  1973. this.closeOrderById(payRecord.getPayNo());
  1974. } catch (Exception e) {
  1975. return CommonResult.fail("关闭已生成支付订单失败返回:" + e.getMessage());
  1976. }
  1977. payRecord.setPayNo(CommonUtil.generateUUID());
  1978. payRecord.setRemark("更新订单");
  1979. boolean a = payRecordService.updateById(payRecord);
  1980. if (!a) {
  1981. return CommonResult.fail("生成支付订单失败");
  1982. }
  1983. } else {
  1984. payRecord.setPayNo(CommonUtil.generateUUID());
  1985. payRecord.setHouseOrderId(ho.getId());
  1986. payRecord.setUserId(Integer.valueOf(ho.getReserveUserId()));
  1987. payRecord.setPayPrice(BigDecimal.valueOf(totalfee));
  1988. payRecord.setIsSuccess(1);
  1989. payRecord.setRemark("新订单");
  1990. boolean a = payRecordService.save(payRecord);
  1991. if (!a) {
  1992. return CommonResult.fail("创建支付订单失败");
  1993. }
  1994. }
  1995. // jsapi支付
  1996. //获取openid
  1997. // String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token";
  1998. // tokenUrl = tokenUrl + "?code=" + wxCode + "&appid=" + wxPayV3Config.getAppId() + "&secret=" + wxPayV3Config.getSecret() + "&grant_type=authorization_code";
  1999. // RestTemplate client = new RestTemplate();
  2000. // String tokenResponse = client.postForObject(tokenUrl, null, String.class);
  2001. // log.info("获取openid结果" + tokenResponse);
  2002. // JSONObject jsonObject1 = JSONObject.parseObject(tokenResponse);
  2003. // String openId = (String) jsonObject1.getString("openid");
  2004. // if (openId == null || openId == "") {
  2005. // return CommonResult.fail("openid查询失败");
  2006. // }
  2007. // String openId = "okdUu5xZ2ICm3RuMUHbpJi4DUyzw";
  2008. //改为直接传openId
  2009. String openId = wxCode;
  2010. PrepayRequest requestpay = new PrepayRequest();
  2011. requestpay.setAppid(wxPayV3Config.getAppId());
  2012. requestpay.setMchid(wxPayV3Config.getMchId());
  2013. requestpay.setDescription("研究生公寓");
  2014. Amount amount2 = new Amount();
  2015. amount2.setTotal(totalfee);
  2016. requestpay.setNotifyUrl(wxPayV3Config.getDomain() + "/auto/house-order/returnPay");
  2017. requestpay.setAmount(amount2);
  2018. Payer payer1 = new Payer();
  2019. payer1.setOpenid(openId);
  2020. requestpay.setPayer(payer1);
  2021. // requestpay.setOutTradeNo(TimeExchange.DateToTimestamp(new Date())+"");
  2022. requestpay.setOutTradeNo(payRecord.getPayNo());
  2023. Config config = new RSAAutoCertificateConfig.Builder()
  2024. .merchantId(wxPayV3Config.getMchId())
  2025. .privateKeyFromPath(wxPayV3Config.getKeyPath())
  2026. .merchantSerialNumber(wxPayV3Config.getSerialNum())
  2027. .apiV3Key(wxPayV3Config.getApiKey3())
  2028. .build();
  2029. JsapiServiceExtension service = new JsapiServiceExtension.Builder()
  2030. .config(config)
  2031. .signType("RSA") // 不填默认为RSA
  2032. .build();
  2033. PrepayWithRequestPaymentResponse responseSdk = null;
  2034. try {
  2035. log.info("请求支付参数:" + requestpay.toString());
  2036. responseSdk = service.prepayWithRequestPayment(requestpay);
  2037. log.info("请求支付参数返回:" + responseSdk.toString());
  2038. } catch (Exception e) {
  2039. log.info("请求支付异常返回:" + e);
  2040. return CommonResult.fail(e.getMessage());
  2041. }
  2042. return CommonResult.ok(responseSdk);
  2043. }
  2044. /**
  2045. * 微信支付订单号查询订单
  2046. *
  2047. * @param outTradeNo
  2048. * @return
  2049. * @throws Exception
  2050. */
  2051. @Override
  2052. @Transactional(rollbackFor = {Exception.class})
  2053. public CommonResult queryOrderById(String outTradeNo) throws Exception {
  2054. Transaction transaction = new Transaction();
  2055. HouseOrder one = houseOrderService.getOne(new QueryWrapper<HouseOrder>().eq("order_number", outTradeNo));
  2056. if ("2".equals(one.getOrderStatus()) && "2".equals(one.getPayType())) {
  2057. transaction.setTradeState(SUCCESS);
  2058. transaction.setTradeStateDesc("现金支付完成");
  2059. return CommonResult.ok(transaction);
  2060. }
  2061. PayRecord payRecord = payRecordService.getOne(new QueryWrapper<PayRecord>().eq("house_order_id", one.getId()));
  2062. if (payRecord == null || payRecord.getPayNo() == null) {
  2063. transaction.setTradeState(NOTPAY);
  2064. transaction.setTradeStateDesc("该订单尚未支付");
  2065. return CommonResult.ok(transaction);
  2066. }
  2067. QueryOrderByOutTradeNoRequest queryOrderByIdRequest = new QueryOrderByOutTradeNoRequest();
  2068. // 调用request.setXxx(val)设置所需参数,具体参数可见Request定义
  2069. queryOrderByIdRequest.setMchid(wxPayV3Config.getMchId());
  2070. queryOrderByIdRequest.setOutTradeNo(payRecord.getPayNo());
  2071. // 调用接口
  2072. // JsapiService service = new JsapiService.Builder().config(config).build();
  2073. log.info("微信支付查询订单入参:" + queryOrderByIdRequest.toString());
  2074. Config config =
  2075. new RSAAutoCertificateConfig.Builder()
  2076. .merchantId(wxPayV3Config.getMchId())
  2077. .privateKeyFromPath(wxPayV3Config.getKeyPath())
  2078. .merchantSerialNumber(wxPayV3Config.getSerialNum())
  2079. .apiV3Key(wxPayV3Config.getApiKey3())
  2080. .build();
  2081. JsapiServiceExtension service = new JsapiServiceExtension.Builder()
  2082. .config(config)
  2083. .signType("RSA") // 不填默认为RSA
  2084. .build();
  2085. try {
  2086. transaction = service.queryOrderByOutTradeNo(queryOrderByIdRequest);
  2087. switch (transaction.getTradeState()) {
  2088. case SUCCESS:
  2089. payRecord.setIsSuccess(2);
  2090. payRecord.setRemark(transaction.getTradeStateDesc());
  2091. one.setOrderStatus("3");
  2092. one.setPayTime(TimeExchange.utcToString(transaction.getSuccessTime()));
  2093. break;
  2094. case PAYERROR:
  2095. payRecord.setRemark(transaction.getTradeStateDesc());
  2096. payRecord.setIsSuccess(3);
  2097. break;
  2098. }
  2099. boolean a = houseOrderService.updateById(one);
  2100. boolean b = payRecordService.updateById(payRecord);
  2101. if (!a || !b) {
  2102. throw new Exception("更新支付状态失败");
  2103. }
  2104. log.info("微信支付查询订单出参:" + transaction.toString());
  2105. } catch (Exception e) {
  2106. e.printStackTrace();
  2107. return CommonResult.fail(e.getMessage());
  2108. }
  2109. return CommonResult.ok(transaction);
  2110. }
  2111. /**
  2112. * 微信支付关闭订单
  2113. *
  2114. * @param outTradeNo
  2115. * @return
  2116. * @throws Exception
  2117. */
  2118. @Override
  2119. @Transactional(rollbackFor = {Exception.class})
  2120. public CommonResult closeOrder(String outTradeNo) {
  2121. HouseOrder one = houseOrderService.getOne(new QueryWrapper<HouseOrder>().eq("order_number", outTradeNo));
  2122. PayRecord payRecord = payRecordService.getOne(new QueryWrapper<PayRecord>().eq("house_order_id", one.getId()));
  2123. if (payRecord == null) {
  2124. return CommonResult.ok("没有可关闭支付订单,无需关闭");
  2125. }
  2126. try {
  2127. this.closeOrderById(payRecord.getPayNo());
  2128. } catch (Exception e) {
  2129. e.printStackTrace();
  2130. return CommonResult.fail("关闭订单失败" + e.getMessage());
  2131. }
  2132. return CommonResult.ok("关闭成功");
  2133. }
  2134. public void closeOrderById(String outTradeNo) throws Exception {
  2135. CloseOrderRequest closeOrderRequest = new CloseOrderRequest();
  2136. // 调用request.setXxx(val)设置所需参数,具体参数可见Request定义
  2137. closeOrderRequest.setMchid(wxPayV3Config.getMchId());
  2138. closeOrderRequest.setOutTradeNo(outTradeNo);
  2139. // 调用接口
  2140. // JsapiService service = new JsapiService.Builder().config(config).build();
  2141. log.info("微信支付关闭订单入参:" + closeOrderRequest.toString());
  2142. Config config =
  2143. new RSAAutoCertificateConfig.Builder()
  2144. .merchantId(wxPayV3Config.getMchId())
  2145. .privateKeyFromPath(wxPayV3Config.getKeyPath())
  2146. .merchantSerialNumber(wxPayV3Config.getSerialNum())
  2147. .apiV3Key(wxPayV3Config.getApiKey3())
  2148. .build();
  2149. JsapiServiceExtension service = new JsapiServiceExtension.Builder()
  2150. .config(config)
  2151. .signType("RSA") // 不填默认为RSA
  2152. .build();
  2153. service.closeOrder(closeOrderRequest);
  2154. }
  2155. /**
  2156. * 支付成功后回调,推送消息给商家
  2157. *
  2158. * @param request 请求参数
  2159. * @param response 响应参数
  2160. * @throws Exception
  2161. */
  2162. @Override
  2163. @Transactional(rollbackFor = {Exception.class})
  2164. @PassToken
  2165. public void returnPay(HttpServletRequest request, HttpServletResponse response) throws Exception {
  2166. System.out.println(TimeExchange.getTime() + "进入支付回调====");
  2167. // 构造 RequestParam
  2168. String readData = PayUtil.readData(request);
  2169. RequestParam requestParam = new RequestParam.Builder()
  2170. .serialNumber(request.getHeader("Wechatpay-Serial"))
  2171. .nonce(request.getHeader("Wechatpay-Nonce"))
  2172. .signature(request.getHeader("Wechatpay-Signature"))
  2173. .timestamp(request.getHeader("Wechatpay-Timestamp"))
  2174. .body(readData)
  2175. .build();
  2176. NotificationConfig config = new RSAAutoCertificateConfig.Builder()
  2177. .merchantId(wxPayV3Config.getMchId())
  2178. .privateKeyFromPath(wxPayV3Config.getKeyPath())
  2179. .merchantSerialNumber(wxPayV3Config.getSerialNum())
  2180. .apiV3Key(wxPayV3Config.getApiKey3())
  2181. .build();
  2182. // 初始化 NotificationParser
  2183. NotificationParser parser = new NotificationParser((NotificationConfig) config);
  2184. try {
  2185. // 以支付通知回调为例,验签、解密并转换成 Transaction
  2186. Transaction transaction = parser.parse(requestParam, Transaction.class);
  2187. PayRecord payRecord = payRecordService.getOne(new QueryWrapper<PayRecord>().eq("pay_no", transaction.getOutTradeNo()));
  2188. HouseOrder one = houseOrderService.getById(payRecord.getHouseOrderId());
  2189. switch (transaction.getTradeState()) {
  2190. case SUCCESS:
  2191. payRecord.setIsSuccess(2);
  2192. payRecord.setRemark(transaction.getTradeStateDesc());
  2193. one.setOrderStatus("3");
  2194. one.setPayTime(TimeExchange.utcToString(transaction.getSuccessTime()));
  2195. break;
  2196. case PAYERROR:
  2197. payRecord.setRemark(transaction.getTradeStateDesc());
  2198. payRecord.setIsSuccess(3);
  2199. break;
  2200. default:
  2201. payRecord.setRemark(transaction.getTradeStateDesc());
  2202. break;
  2203. }
  2204. boolean a = houseOrderService.updateById(one);
  2205. boolean b = payRecordService.updateById(payRecord);
  2206. if (!a || !b) {
  2207. throw new Exception("更新支付状态失败");
  2208. }
  2209. log.info("支付回调请求返回" + transaction.toString());
  2210. //回调成功业务没写
  2211. } catch (Exception e) {
  2212. // 签名验证失败,返回 401 UNAUTHORIZED 状态码
  2213. log.error("支付回调请求失败", e);
  2214. }
  2215. Map<String, String> map = new HashMap<>();
  2216. boolean isHandleSuccess = true;
  2217. // 如果处理失败,应返回 4xx/5xx 的状态码,例如 500 INTERNAL_SERVER_ERROR
  2218. if (isHandleSuccess) {
  2219. response.setStatus(200);
  2220. map.put("code", "SUCCESS");
  2221. map.put("message", "SUCCESS");
  2222. } else {
  2223. response.setStatus(500);
  2224. map.put("code", "ERROR");
  2225. map.put("message", "签名错误");
  2226. }
  2227. // 处理成功,返回 200 OK 状态码
  2228. // response.setHeader("Content-type", "application/json");
  2229. // ObjectMapper mapper = new ObjectMapper();
  2230. // response.getOutputStream().write(mapper.writeValueAsString(map).getBytes(StandardCharsets.UTF_8));
  2231. // response.flushBuffer();
  2232. //
  2233. // String inputLine = "";
  2234. // String notityXml = "";
  2235. // try {
  2236. //
  2237. // String timestamp = request.getHeader("Wechatpay-Timestamp");
  2238. // String nonce = request.getHeader("Wechatpay-Nonce");
  2239. // String serialNo = request.getHeader("Wechatpay-Serial");
  2240. // String signature = request.getHeader("Wechatpay-Signature");
  2241. //
  2242. // // 通知密文
  2243. // String result = PayUtil.readData(request);
  2244. //
  2245. // // 需要通过证书序列号查找对应的证书,verifyNotify 中有验证证书的序列号,获取通知明文
  2246. // String plainText = WechatPayV3Util.verifyNotify(serialNo, result, signature, nonce, timestamp,
  2247. // wxPayV3Config.getApiKey3(), wxPayV3Config.getPlatformCertPath());
  2248. //
  2249. //
  2250. // log.info("微信支付异步通知:【{}】", plainText);
  2251. //
  2252. // while ((inputLine = request.getReader().readLine()) != null) {
  2253. // notityXml += inputLine;
  2254. // }
  2255. // //关闭流
  2256. // request.getReader().close();
  2257. // System.out.println("微信回调内容信息:" + notityXml);
  2258. // //解析成json
  2259. // JSONObject data = JSONObject.parseObject(notityXml);
  2260. // //判断 支付是否成功
  2261. // if ("TRANSACTION.SUCCESS".equals(data.get("event_type"))) {
  2262. //
  2263. // // 在这里处理接收到的支付结果通知数据
  2264. // Map<String, Object> resourceMap = handlePaymentNotification(data);
  2265. //
  2266. // // 获取 trade_state 值
  2267. // String tradeState = resourceMap.get("trade_state").toString();
  2268. // if (tradeState.equals("SUCCESS")) {
  2269. // // 获取 amount 字段
  2270. // Map<String, Object> amountMap = (Map<String, Object>) resourceMap.get("amount");
  2271. // //获得 返回的商户订单号
  2272. // String outTradeNo = resourceMap.get("out_trade_no").toString();
  2273. //// 微信支付订单号
  2274. // String transactionId = resourceMap.get("transaction_id").toString();
  2275. //
  2276. // String attach = resourceMap.get("attach").toString();
  2277. // String total_fee = amountMap.get("payer_total").toString();
  2278. // //业务逻辑------------
  2279. // LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
  2280. // wrapperHo.eq(HouseOrder::getHouseOrderNumber, outTradeNo);
  2281. // HouseOrder rr = houseOrderService.getOne(wrapperHo);
  2282. // if (ObjectUtils.isNotEmpty(rr)) {
  2283. // LambdaQueryWrapper<PayRecord> wrapperPr = new LambdaQueryWrapper<>();
  2284. // wrapperPr.eq(PayRecord::getHouseOrderId, rr.getId());
  2285. // PayRecord rpr = payRecordService.getOne(wrapperPr);
  2286. // if (rpr == null) {
  2287. // // 保存支付信息
  2288. // rpr = new PayRecord();
  2289. // rpr.setHouseOrderId(rr.getId());
  2290. // rpr.setUserId(Integer.valueOf(rr.getReserveUserId()));
  2291. // rpr.setPayNo(transactionId);
  2292. // System.out.println("回调的金额:" + total_fee);
  2293. // rpr.setPayPrice(new BigDecimal(total_fee).divide(new BigDecimal("100")).setScale(2));
  2294. // rpr.setIsSuccess(ePayStatu.Paysuccess.getValue());
  2295. // rpr.setRemark("微信支付支付成功");
  2296. // Boolean insertRpr = payRecordService.save(rpr);
  2297. // if (!insertRpr) {
  2298. // response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  2299. // JSONObject jsonObject = new JSONObject();
  2300. // jsonObject.put("code", "FAIL");
  2301. // jsonObject.put("message", "失败");
  2302. // response.getWriter().write(jsonObject.toJSONString());
  2303. // }
  2304. //
  2305. // } else if (rpr.getIsSuccess() != ePayStatu.Paysuccess.getValue()) {
  2306. // rpr.setPayNo(transactionId);
  2307. // System.out.println("回调的金额:" + total_fee);
  2308. // rpr.setPayPrice(new BigDecimal(total_fee).divide(new BigDecimal("100")).setScale(2));
  2309. // rpr.setIsSuccess(ePayStatu.Paysuccess.getValue());
  2310. // rpr.setRemark(rpr.getRemark() + "微信支付支付成功");
  2311. // Boolean updateRpr = payRecordService.updateById(rpr);
  2312. // if (!updateRpr) {
  2313. // response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  2314. // JSONObject jsonObject = new JSONObject();
  2315. // jsonObject.put("code", "FAIL");
  2316. // jsonObject.put("message", "失败");
  2317. // response.getWriter().write(jsonObject.toJSONString());
  2318. // }
  2319. // }
  2320. //
  2321. // }
  2322. //
  2323. // // 返回成功响应
  2324. // rr.setOrderStatus("2");
  2325. //// 支付时间
  2326. // DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  2327. // rr.setPayTime(LocalDateTime.now().format(dateTimeFormatter));
  2328. //// 支付渠道
  2329. // rr.setOrderChannel("1");
  2330. //// 支付人
  2331. // rr.setPayUserId(rr.getReserveUserId());
  2332. // Boolean updateHouseOrder = houseOrderService.updateById(rr);
  2333. // if (!updateHouseOrder) {
  2334. // response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  2335. // JSONObject jsonObject = new JSONObject();
  2336. // jsonObject.put("code", "FAIL");
  2337. // jsonObject.put("message", "失败");
  2338. // response.getWriter().write(jsonObject.toJSONString());
  2339. // }
  2340. //
  2341. // response.setStatus(HttpServletResponse.SC_OK);
  2342. // response.getWriter().write("OK");
  2343. //
  2344. // } else {
  2345. // response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  2346. // JSONObject jsonObject = new JSONObject();
  2347. // jsonObject.put("code", "FAIL");
  2348. // jsonObject.put("message", "失败");
  2349. // response.getWriter().write(jsonObject.toJSONString());
  2350. // }
  2351. // }
  2352. // } catch (Exception e) {
  2353. // e.printStackTrace();
  2354. // response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  2355. // JSONObject jsonObject = new JSONObject();
  2356. // jsonObject.put("code", "FAIL");
  2357. // jsonObject.put("message", "失败");
  2358. // response.getWriter().write(jsonObject.toJSONString());
  2359. // }
  2360. }
  2361. private Map<String, Object> handlePaymentNotification(JSONObject data) {
  2362. System.out.println("进入解析resource:" + data.toString());
  2363. Map<String, Object> resourceMap = null;
  2364. // 在这里解析和处理接收到的支付结果通知数据
  2365. System.out.println("接收到支付结果通知:" + data.toJSONString());
  2366. //解密resource中的通知数据
  2367. String resource = data.get("resource").toString();
  2368. resourceMap = WechatPayApiV3Util.decryptFromResource(resource, "e10adc3949ba59abbe56e057f20f883e", 1);
  2369. System.out.println("解析resource结果:" + resourceMap);
  2370. return resourceMap;
  2371. }
  2372. @Override
  2373. @Transactional(rollbackFor = Exception.class)//1
  2374. public CommonResult checkOutApplet(CheckOutAppletDto checkOutAppletDto) {
  2375. String houseNumberId = checkOutAppletDto.getHouseNumberId();
  2376. String orderNumber = checkOutAppletDto.getOrderNumber();
  2377. if (ObjectUtils.isEmpty(houseNumberId) && ObjectUtils.isEmpty(orderNumber)) {
  2378. return CommonResult.fail();
  2379. }
  2380. LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
  2381. wrapperHo.eq(HouseOrder::getOrderNumber, orderNumber);
  2382. HouseOrder houseOrder = houseOrderService.getOne(wrapperHo);
  2383. if (ObjectUtils.isEmpty(houseOrder)) {
  2384. return CommonResult.fail("无该订单");
  2385. }
  2386. // 判断是是否是房卡和钥匙开门,是的话则需要去前台办理
  2387. Integer keyType = houseOrder.getKeyType();
  2388. if (keyType == 2) {
  2389. return CommonResult.fail("未归还房卡,请前往前台办理退房");
  2390. } else if (keyType == 5) {
  2391. return CommonResult.fail("未归还钥匙,请前往前台办理退房");
  2392. }
  2393. houseOrder.setOrderStatus("8");
  2394. // 判断退房在不在预定的时间段中,不在的话则判断是否有人在使用,没有的话按之前的步骤走,有的话则只改订单状态。
  2395. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  2396. String reserveLeaveTime = houseOrder.getReserveLeaveTime();
  2397. // Date liveTime = houseOrder.getLiveTime();
  2398. // LocalDateTime localDateTime = LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter).plusMinutes(30);
  2399. // Date endTime = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  2400. // boolean effectiveDate = DateUtil.isEffectiveDate(new Date(), liveTime, endTime);
  2401. // if (!effectiveDate) {
  2402. List<HouseNumberState> houseNumberStateData = houseNumberStateService.getData(new Date(), houseNumberId);
  2403. if (ObjectUtils.isEmpty(houseNumberStateData)) {
  2404. houseOrder.setLeaveTime(Date.from(LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter).atZone(ZoneId.systemDefault()).toInstant()));
  2405. // 获取水电消费金额和额度
  2406. HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  2407. String electricEquipmentId = houseNumber.getElectricEquipmentId();
  2408. String waterEquipmentId = houseNumber.getWaterEquipmentId();
  2409. ElectricEquipment electricEquipment = electricEquipmentService.getById(electricEquipmentId);
  2410. WaterEquipment waterEquipment = waterEquipmentService.getById(waterEquipmentId);
  2411. if (ObjectUtils.isNotEmpty(electricEquipment) && ObjectUtils.isNotEmpty(waterEquipment)) {
  2412. String electricEquipmentRoomId = electricEquipment.getRoomId();
  2413. String waterEquipmentRoomId = waterEquipment.getRoomId();
  2414. Date liveTime = houseOrder.getLiveTime();
  2415. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2416. String live = sdf.format(liveTime);
  2417. String leave = sdf.format(new Date());
  2418. // 获取电的消费金额和额度
  2419. HouseOrderBill houseOrderBill = new HouseOrderBill();
  2420. JSONObject jsonObjectElectric = electricEquipmentService.roomCostRecord(electricEquipmentRoomId, live, leave);
  2421. BigDecimal costElectric = jsonObjectElectric.getBigDecimal("cost");
  2422. BigDecimal consumeElectric = jsonObjectElectric.getBigDecimal("consume");
  2423. houseOrderBill.setElectricCost(costElectric);
  2424. houseOrderBill.setElectricConsume(consumeElectric);
  2425. BigDecimal electricCost = houseOrder.getElectricCost();
  2426. if (ObjectUtils.isNotEmpty(electricCost)) {
  2427. costElectric = costElectric.add(electricCost);
  2428. }
  2429. BigDecimal electricConsume = houseOrder.getElectricConsume();
  2430. if (ObjectUtils.isNotEmpty(electricConsume)) {
  2431. consumeElectric = consumeElectric.add(electricConsume);
  2432. }
  2433. houseOrder.setElectricCost(costElectric);
  2434. houseOrder.setElectricConsume(consumeElectric);
  2435. // 获取水的消费金额和额度
  2436. JSONObject jsonObjectWater = waterEquipmentService.roomCostRecord(waterEquipmentRoomId, live, leave);
  2437. BigDecimal costWater = jsonObjectWater.getBigDecimal("cost");
  2438. BigDecimal consumeWater = jsonObjectWater.getBigDecimal("consume");
  2439. houseOrderBill.setWaterCost(costWater);
  2440. houseOrderBill.setWaterConsume(consumeWater);
  2441. BigDecimal waterCost = houseOrder.getWaterCost();
  2442. if (ObjectUtils.isNotEmpty(waterCost)) {
  2443. costWater = costWater.add(waterCost);
  2444. }
  2445. BigDecimal waterConsume = houseOrder.getWaterConsume();
  2446. if (ObjectUtils.isNotEmpty(waterConsume)) {
  2447. consumeWater = consumeWater.add(waterConsume);
  2448. }
  2449. houseOrder.setWaterCost(costWater);
  2450. houseOrder.setWaterConsume(consumeWater);
  2451. houseOrderBill.setHouseOrderId(houseOrder.getId());
  2452. houseOrderBill.setHouseNumberId(houseNumberId);
  2453. houseOrderBill.setLiveTime(liveTime);
  2454. houseOrderBill.setLeaveTime(new Date());
  2455. houseOrderBillService.save(houseOrderBill);
  2456. }
  2457. LambdaQueryWrapper<Unlocking> wrapperU = new LambdaQueryWrapper<>();
  2458. wrapperU.eq(Unlocking::getOrderNumber, orderNumber)
  2459. .eq(Unlocking::getHouseNumberId, houseNumberId);
  2460. Unlocking unlocking = unlockingService.getOne(wrapperU);
  2461. if (ObjectUtils.isNotEmpty(unlocking)) {
  2462. // 删除房间密码
  2463. passwordIssController.deleteLockUser(unlocking.getLuid(), unlocking.getLockUserId());
  2464. unlockingService.removeById(unlocking);
  2465. }
  2466. houseOrderService.updateById(houseOrder);
  2467. return CommonResult.ok("该时间段已超过退房时间,已修改其订单状态");
  2468. }
  2469. // }
  2470. LambdaQueryWrapper<Unlocking> wrapperU = new LambdaQueryWrapper<>();
  2471. wrapperU.eq(Unlocking::getOrderNumber, orderNumber)
  2472. .eq(Unlocking::getHouseNumberId, houseNumberId);
  2473. Unlocking unlocking = unlockingService.getOne(wrapperU);
  2474. if (ObjectUtils.isNotEmpty(unlocking)) {
  2475. // 删除房间密码
  2476. passwordIssController.deleteLockUser(unlocking.getLuid(), unlocking.getLockUserId());
  2477. unlockingService.removeById(unlocking);
  2478. }
  2479. // 修改订单
  2480. houseOrder.setLeaveTime(new Date());
  2481. // 获取水电消费金额和额度
  2482. HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  2483. String electricEquipmentId = houseNumber.getElectricEquipmentId();
  2484. String waterEquipmentId = houseNumber.getWaterEquipmentId();
  2485. ElectricEquipment electricEquipment = electricEquipmentService.getById(electricEquipmentId);
  2486. WaterEquipment waterEquipment = waterEquipmentService.getById(waterEquipmentId);
  2487. if (ObjectUtils.isNotEmpty(electricEquipment) && ObjectUtils.isNotEmpty(waterEquipment)) {
  2488. String electricEquipmentRoomId = electricEquipment.getRoomId();
  2489. String waterEquipmentRoomId = waterEquipment.getRoomId();
  2490. Date liveTime = houseOrder.getLiveTime();
  2491. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2492. String live = sdf.format(liveTime);
  2493. String leave = sdf.format(new Date());
  2494. // 获取电的消费金额和额度
  2495. HouseOrderBill houseOrderBill = new HouseOrderBill();
  2496. JSONObject jsonObjectElectric = electricEquipmentService.roomCostRecord(electricEquipmentRoomId, live, leave);
  2497. BigDecimal costElectric = jsonObjectElectric.getBigDecimal("cost");
  2498. BigDecimal consumeElectric = jsonObjectElectric.getBigDecimal("consume");
  2499. houseOrderBill.setElectricCost(costElectric);
  2500. houseOrderBill.setElectricConsume(consumeElectric);
  2501. BigDecimal electricCost = houseOrder.getElectricCost();
  2502. if (ObjectUtils.isNotEmpty(electricCost)) {
  2503. costElectric = costElectric.add(electricCost);
  2504. }
  2505. BigDecimal electricConsume = houseOrder.getElectricConsume();
  2506. if (ObjectUtils.isNotEmpty(electricConsume)) {
  2507. consumeElectric = consumeElectric.add(electricConsume);
  2508. }
  2509. houseOrder.setElectricCost(costElectric);
  2510. houseOrder.setElectricConsume(consumeElectric);
  2511. // 获取水的消费金额和额度
  2512. JSONObject jsonObjectWater = waterEquipmentService.roomCostRecord(waterEquipmentRoomId, live, leave);
  2513. BigDecimal costWater = jsonObjectWater.getBigDecimal("cost");
  2514. BigDecimal consumeWater = jsonObjectWater.getBigDecimal("consume");
  2515. houseOrderBill.setWaterCost(costWater);
  2516. houseOrderBill.setWaterConsume(consumeWater);
  2517. BigDecimal waterCost = houseOrder.getWaterCost();
  2518. if (ObjectUtils.isNotEmpty(waterCost)) {
  2519. costWater = costWater.add(waterCost);
  2520. }
  2521. BigDecimal waterConsume = houseOrder.getWaterConsume();
  2522. if (ObjectUtils.isNotEmpty(waterConsume)) {
  2523. consumeWater = consumeWater.add(waterConsume);
  2524. }
  2525. houseOrder.setWaterCost(costWater);
  2526. houseOrder.setWaterConsume(consumeWater);
  2527. houseOrderBill.setHouseOrderId(houseOrder.getId());
  2528. houseOrderBill.setHouseNumberId(houseNumberId);
  2529. houseOrderBill.setLiveTime(liveTime);
  2530. houseOrderBill.setLeaveTime(new Date());
  2531. houseOrderBillService.save(houseOrderBill);
  2532. }
  2533. // 修改房态
  2534. LambdaQueryWrapper<HouseNumberState> wrapperHns = new LambdaQueryWrapper<>();
  2535. wrapperHns.eq(HouseNumberState::getOrderNumber, orderNumber);
  2536. wrapperHns.eq(HouseNumberState::getHouseNumberId, houseNumberId);
  2537. HouseNumberState houseNumberState = houseNumberStateService.getOne(wrapperHns);
  2538. if (ObjectUtils.isEmpty(houseNumberState)) {
  2539. return CommonResult.fail("房间号有误");
  2540. }
  2541. dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  2542. // 设置房态的结束时间
  2543. houseNumberState.setEndTime(LocalDateTime.now().format(dateTimeFormatter));
  2544. // 修改房间状态(置脏)
  2545. // HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  2546. houseNumber.setHouseStatus(2);
  2547. // 判断该房间是否免费的房间,是则需要支付水电费,并改成带结账状态
  2548. // BigDecimal payPrice = houseOrder.getPayPrice();
  2549. // if (ObjectUtils.isNotEmpty(payPrice) && payPrice.doubleValue() <= 0) {
  2550. // houseOrder.setOrderStatus("5");
  2551. // BigDecimal electricCost = houseOrder.getElectricCost();
  2552. // BigDecimal waterCost = houseOrder.getWaterCost();
  2553. // BigDecimal total = electricCost.add(waterCost);
  2554. // houseOrder.setPayPrice(total);
  2555. // }
  2556. houseOrderService.updateById(houseOrder);
  2557. // houseNumberStateService.updateById(houseNumberState);
  2558. houseNumberStateService.removeById(houseNumberState.getId());
  2559. houseNumberService.updateById(houseNumber);
  2560. return CommonResult.ok();
  2561. }
  2562. @Override
  2563. @Transactional(rollbackFor = Exception.class)//1
  2564. public CommonResult cancelApplet(CancelAppletDto cancelAppletDto, HttpServletRequest request) throws Exception {
  2565. String houseNumberId = cancelAppletDto.getHouseNumberId();
  2566. String orderNumber = cancelAppletDto.getOrderNumber();
  2567. String ua = request.getHeader("User-Agent");
  2568. int usersId = cancelAppletDto.getUsersId();
  2569. if (ObjectUtils.isEmpty(houseNumberId) && ObjectUtils.isEmpty(orderNumber) && ObjectUtils.isEmpty(usersId) && usersId > 0) {
  2570. return CommonResult.fail();
  2571. }
  2572. LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
  2573. wrapperHo.eq(HouseOrder::getOrderNumber, orderNumber);
  2574. HouseOrder houseOrder = houseOrderService.getOne(wrapperHo);
  2575. if (ObjectUtils.isEmpty(houseOrder)) {
  2576. return CommonResult.fail("无该订单");
  2577. }
  2578. LambdaQueryWrapper<HouseNumberState> wrapperHns = new LambdaQueryWrapper<>();
  2579. wrapperHns.eq(HouseNumberState::getHouseNumberId, houseNumberId)
  2580. .eq(HouseNumberState::getOrderNumber, orderNumber);
  2581. HouseNumberState houseNumberState = houseNumberStateService.getOne(wrapperHns);
  2582. if (ObjectUtils.isEmpty(houseNumberState)) {
  2583. return CommonResult.ok("无该订单房态");
  2584. }
  2585. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2586. houseNumberState.setEndTime(sdf.format(new Date()));
  2587. // 修改订单状态
  2588. // houseOrder.setOrderStatus("9");
  2589. // 设置取消时间
  2590. houseOrder.setCancelTime(new Date());
  2591. //现金支付则需要去前台办理
  2592. if ("2".equals(houseOrder.getPayType())) {
  2593. return CommonResult.fail("现金退款请往前台办理");
  2594. }
  2595. String orderStatus = houseOrder.getOrderStatus();
  2596. // 判断是否付款,已支付则是退款,未支付则是取消
  2597. if ("2".equals(orderStatus) || "3".equals(orderStatus)) {
  2598. // 判断当然时间是否在预定时间内。是的话则可以退款
  2599. // 判断传过来的时间和当前时间比较
  2600. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  2601. LocalDateTime now = LocalDateTime.now();
  2602. String reserveLiveTime = houseOrder.getReserveLiveTime();
  2603. LocalDateTime date = LocalDateTime.parse(reserveLiveTime, dateTimeFormatter1);
  2604. if (now.isAfter(date) && HttpUtils.checkAgentIsMobile(ua)) {
  2605. log.info("User-Agent移动端:" + ua);
  2606. return CommonResult.fail("已超过退款时间,如需退款请前往前台办理");
  2607. }
  2608. // 退款订单号
  2609. String refund_no = UUID.randomUUID().toString();
  2610. refund_no = "R" + refund_no.replace("-", "");
  2611. //查看该订单是否退款过
  2612. LambdaQueryWrapper<RefundRecord> wrapperRr = new LambdaQueryWrapper<>();
  2613. wrapperRr.eq(RefundRecord::getHouseOrderId, houseOrder.getId());
  2614. RefundRecord refundRecord = refundRecordService.getOne(wrapperRr);
  2615. // 待支付,带入住
  2616. // todo 需退款
  2617. System.out.println("退款");
  2618. //返回0表示等于0,返回1表示大于0,返回-1表示小于0
  2619. if (houseOrder.getPayPrice().compareTo(BigDecimal.ZERO) < 0 || houseOrder.getPayPrice().compareTo(BigDecimal.ZERO) == 0) {
  2620. // 退款时间
  2621. houseOrder.setRefundTime(new Date());
  2622. if (refundRecord == null) {
  2623. RefundRecord rr = new RefundRecord();
  2624. rr.setHouseOrderId(houseOrder.getId());
  2625. rr.setUserId(usersId);
  2626. rr.setRefundPrice(BigDecimal.ZERO);
  2627. rr.setIsSuccess(1);
  2628. rr.setRemark("退款金额为0,不用走微信退款");
  2629. boolean save = refundRecordService.save(rr);
  2630. if (!save) {
  2631. throw new Exception("退款失败!");
  2632. }
  2633. } else {
  2634. refundRecord.setRemark(refundRecord.getRemark() + "后续支付:退款金额为0,不用走微信退款");
  2635. refundRecord.setRefundPrice(BigDecimal.ZERO);
  2636. refundRecord.setIsSuccess(1);
  2637. boolean update = refundRecordService.updateById(refundRecord);
  2638. if (!update) {
  2639. throw new Exception("退款失败!");
  2640. }
  2641. }
  2642. } else {
  2643. // 当有金额需要退款时,状态不变,等收到回调后在改变
  2644. houseOrder.setOrderStatus(houseOrder.getOrderStatus());
  2645. PayRecord payRecord = payRecordService.getOne(new QueryWrapper<PayRecord>().eq("house_order_id", houseOrder.getId()));
  2646. JSONObject jsonObject = new JSONObject();
  2647. //商户订单号;
  2648. jsonObject.put("out_trade_no", payRecord.getPayNo() == null ? orderNumber : payRecord.getPayNo());
  2649. //商户退款单号
  2650. jsonObject.put("out_refund_no", refund_no);
  2651. //退款原因
  2652. jsonObject.put("reason", "取消入住");
  2653. // 退款结果回调url todo
  2654. jsonObject.put("notify_url", wxPayV3Config.getDomain() + "/auto/house-order/returnRefund");
  2655. // 订单金额信息
  2656. JSONObject amount = new JSONObject();
  2657. // 退款金额
  2658. int total = houseOrder.getPayPrice().multiply(new BigDecimal(100)).intValue();
  2659. amount.put("refund", total);
  2660. // 原订单金额
  2661. amount.put("total", total);
  2662. amount.put("currency", "CNY");
  2663. jsonObject.put("amount", amount);
  2664. RestTemplate client = new RestTemplate();
  2665. HttpHeaders httpHeaders = new HttpHeaders();
  2666. // 签名,获取authStr
  2667. String authStr = WechatPayV3Util.buildAuthorization(HttpMethod.POST,
  2668. "/v3/refund/domestic/refunds",
  2669. wxPayV3Config.getMchId(),
  2670. wxPayV3Config.getSerialNum(),
  2671. wxPayV3Config.getKeyPath(),
  2672. JSONObject.toJSONString(jsonObject));
  2673. log.info("退款签名值" + authStr);
  2674. httpHeaders.add("Accept", "application/json");
  2675. httpHeaders.add("Authorization", authStr);
  2676. // httpHeaders.add("User-Agent", "WeChatPay-HttpClient/null (Windows 10/10.0) Java/1.8.0_171");
  2677. httpHeaders.add("Content-Type", "application/json");
  2678. HttpEntity<JSONObject> fromEntity = new HttpEntity<>(jsonObject, httpHeaders);
  2679. log.info("退款请求入参" + fromEntity.toString());
  2680. String msg = client.postForObject("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds", fromEntity, String.class);
  2681. log.info("退款请求出参" + msg);
  2682. JSONObject h5Refund = JSONObject.parseObject(msg);
  2683. System.out.println(TimeExchange.getTime() + "微信退款返回的信息:" + h5Refund);
  2684. RefundRecord rpr = new RefundRecord();
  2685. rpr.setHouseOrderId(houseOrder.getId());
  2686. rpr.setRefundNo(refund_no);
  2687. rpr.setUserId(Integer.valueOf(houseOrder.getReserveUserId()));
  2688. rpr.setRefundPrice(new BigDecimal(total).divide(new BigDecimal("100")).setScale(2));
  2689. rpr.setIsSuccess(0);
  2690. rpr.setRemark("发起微信支付退款金额:" + total + "- " + TimeExchange.getTime());
  2691. houseOrder.setOrderStatus("6");
  2692. houseOrderService.updateById(houseOrder);
  2693. refundRecordService.save(rpr);
  2694. houseNumberStateService.updateById(houseNumberState);
  2695. return CommonResult.ok(h5Refund);
  2696. }
  2697. }
  2698. houseOrder.setOrderStatus("9");
  2699. houseOrderService.updateById(houseOrder);
  2700. // houseNumberStateService.updateById(houseNumberState);
  2701. houseNumberStateService.removeById(houseNumberState.getId());
  2702. return CommonResult.ok();
  2703. }
  2704. @Override
  2705. public void returnRefund(HttpServletRequest request, HttpServletResponse response) throws Exception {
  2706. String inputLine = "";
  2707. String notityXml = "";
  2708. String timestamp = request.getHeader("Wechatpay-Timestamp");
  2709. String nonce = request.getHeader("Wechatpay-Nonce");
  2710. String serialNo = request.getHeader("Wechatpay-Serial");
  2711. String signature = request.getHeader("Wechatpay-Signature");
  2712. try {
  2713. while ((inputLine = request.getReader().readLine()) != null) {
  2714. notityXml += inputLine;
  2715. }
  2716. //关闭流
  2717. request.getReader().close();
  2718. //解析成json
  2719. JSONObject data = JSONObject.parseObject(notityXml);
  2720. //判断 支付是否成功
  2721. log.info("退款回调入参" + timestamp + "===" + nonce + "====" + serialNo + "======" + signature + "=======" + notityXml);
  2722. if ("REFUND.SUCCESS".equals(data.get("event_type"))) {
  2723. String plainText = WechatPayV3Util.verifyNotify(serialNo, notityXml, signature, nonce, timestamp,
  2724. wxPayV3Config.getApiKey3(), wxPayV3Config.getPlatformCertPath());
  2725. log.info("退款回调明文" + plainText);
  2726. // 在这里处理接收到的支付结果通知数据
  2727. JSONObject resourceMap = JSONObject.parseObject(plainText);
  2728. // 获取 trade_state 值
  2729. String tradeState = resourceMap.get("refund_status").toString();
  2730. // 获取 amount 字段
  2731. Map<String, Object> amountMap = (Map<String, Object>) resourceMap.get("amount");
  2732. //获得 返回的商户订单号
  2733. String outTradeNo = resourceMap.get("out_trade_no").toString();
  2734. // 微信支付订单号
  2735. String transactionId = resourceMap.get("transaction_id").toString();
  2736. // 商户退款单号
  2737. String outRefundNo = resourceMap.get("out_refund_no").toString();
  2738. // 微信支付退款单号
  2739. String refundId = resourceMap.get("refund_id").toString();
  2740. // 退款成功时间
  2741. String success_time = resourceMap.get("success_time").toString();
  2742. // 用户退款金额
  2743. String total_fee = amountMap.get("payer_refund").toString();
  2744. //业务逻辑------------
  2745. LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
  2746. wrapperHo.eq(HouseOrder::getOrderNumber, outTradeNo);
  2747. PayRecord payRecord = payRecordService.getOne(new QueryWrapper<PayRecord>().eq("pay_no", outTradeNo));
  2748. HouseOrder rr = houseOrderService.getById(payRecord.getHouseOrderId());
  2749. LambdaQueryWrapper<RefundRecord> wrapperRr = new LambdaQueryWrapper<>();
  2750. wrapperRr.eq(RefundRecord::getHouseOrderId, rr.getId());
  2751. RefundRecord rpr = refundRecordService.getOne(wrapperRr);
  2752. if (tradeState.equals("SUCCESS")) {
  2753. if (rpr == null) {
  2754. // 保存支付信息
  2755. rpr = new RefundRecord();
  2756. rpr.setHouseOrderId(rr.getId());
  2757. rpr.setUserId(Integer.valueOf(rr.getReserveUserId()));
  2758. rpr.setRefundNo(outRefundNo);
  2759. rpr.setWxNo(refundId);
  2760. System.out.println("回调的金额:" + total_fee);
  2761. rpr.setRefundPrice(new BigDecimal(total_fee).divide(new BigDecimal("100")).setScale(2));
  2762. rpr.setIsSuccess(1);
  2763. rpr.setRemark("微信支付退款成功");
  2764. Boolean insertRpr = refundRecordService.save(rpr);
  2765. if (!insertRpr) {
  2766. response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  2767. JSONObject jsonObject = new JSONObject();
  2768. jsonObject.put("code", "FAIL");
  2769. jsonObject.put("message", "失败");
  2770. response.getWriter().write(jsonObject.toJSONString());
  2771. }
  2772. } else if (rpr.getIsSuccess() != ePayStatu.Paysuccess.getValue()) {
  2773. rpr.setRefundNo(outRefundNo);
  2774. rpr.setWxNo(refundId);
  2775. System.out.println("回调的金额:" + total_fee);
  2776. rpr.setRefundPrice(new BigDecimal(total_fee).divide(new BigDecimal("100")).setScale(2));
  2777. rpr.setIsSuccess(1);
  2778. rpr.setRemark(rpr.getRemark() + "|微信支付退款成功金额:" + total_fee + "--" + TimeExchange.getTime());
  2779. Boolean updateRpr = refundRecordService.updateById(rpr);
  2780. if (!updateRpr) {
  2781. response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  2782. JSONObject jsonObject = new JSONObject();
  2783. jsonObject.put("code", "FAIL");
  2784. jsonObject.put("message", "失败");
  2785. response.getWriter().write(jsonObject.toJSONString());
  2786. }
  2787. }
  2788. // 订单状态
  2789. rr.setOrderStatus("7");
  2790. // 退款时间
  2791. rr.setRefundTime(new Date());
  2792. Boolean updateHouseOrder = houseOrderService.updateById(rr);
  2793. if (!updateHouseOrder) {
  2794. response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  2795. JSONObject jsonObject = new JSONObject();
  2796. jsonObject.put("code", "FAIL");
  2797. jsonObject.put("message", "失败");
  2798. response.getWriter().write(jsonObject.toJSONString());
  2799. }
  2800. response.setStatus(HttpServletResponse.SC_OK);
  2801. JSONObject jsonObject = new JSONObject();
  2802. jsonObject.put("code", "SUCCESS");
  2803. jsonObject.put("message", "SUCCESS");
  2804. response.getWriter().write(jsonObject.toJSONString());
  2805. } else {
  2806. if (rpr != null) {
  2807. rpr.setRefundNo(outRefundNo);
  2808. rpr.setWxNo(refundId);
  2809. rpr.setIsSuccess(2);
  2810. rpr.setRemark(rpr.getRemark() + "|微信支付退款失败:" + tradeState + "--" + TimeExchange.getTime());
  2811. } else {
  2812. rpr = new RefundRecord();
  2813. rpr.setHouseOrderId(rr.getId());
  2814. rpr.setUserId(Integer.valueOf(rr.getReserveUserId()));
  2815. rpr.setRefundNo(outRefundNo);
  2816. rpr.setWxNo(refundId);
  2817. // System.out.println("回调的金额:" + total_fee);
  2818. // rpr.setRefundPrice(new BigDecimal(total_fee).divide(new BigDecimal("100")).setScale(2));
  2819. rpr.setIsSuccess(2);
  2820. rpr.setRemark("微信支付退款失败");
  2821. Boolean insertRpr = refundRecordService.save(rpr);
  2822. }
  2823. // 订单状态改为失败
  2824. rr.setOrderStatus("10");
  2825. // 退款时间
  2826. rr.setRefundTime(new Date());
  2827. Boolean updateHouseOrder = houseOrderService.updateById(rr);
  2828. //更新成功返回200
  2829. if (!updateHouseOrder) {
  2830. response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  2831. JSONObject jsonObject = new JSONObject();
  2832. jsonObject.put("code", "FAIL");
  2833. jsonObject.put("message", "失败");
  2834. response.getWriter().write(jsonObject.toJSONString());
  2835. }
  2836. response.setStatus(HttpServletResponse.SC_OK);
  2837. JSONObject jsonObject = new JSONObject();
  2838. jsonObject.put("code", "SUCCESS");
  2839. jsonObject.put("message", "SUCCESS");
  2840. response.getWriter().write(jsonObject.toJSONString());
  2841. }
  2842. }
  2843. } catch (Exception e) {
  2844. e.printStackTrace();
  2845. response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  2846. JSONObject jsonObject = new JSONObject();
  2847. jsonObject.put("code", "FAIL");
  2848. jsonObject.put("message", "失败");
  2849. response.getWriter().write(jsonObject.toJSONString());
  2850. // response.setStatus(HttpServletResponse.SC_OK);
  2851. // JSONObject jsonObject = new JSONObject();
  2852. // jsonObject.put("code", "SUCCESS");
  2853. // jsonObject.put("message", "SUCCESS");
  2854. // response.getWriter().write(jsonObject.toJSONString());
  2855. }
  2856. }
  2857. @Override
  2858. public CommonResult payOrderPrice(HouseOrderPriceDto houseOrderPriceDto) {
  2859. Double price = houseOrderPriceDto.getPrice();
  2860. String payType = houseOrderPriceDto.getPayType() + "";
  2861. if (price <= 0) {
  2862. return CommonResult.fail("金额异常");
  2863. }
  2864. if (!StringUtils.hasText(payType)) {
  2865. return CommonResult.fail("支付类型异常");
  2866. }
  2867. String orderNumber = houseOrderPriceDto.getOrderNumber();
  2868. LambdaQueryWrapper<HouseOrder> wrapper = new LambdaQueryWrapper<>();
  2869. wrapper.eq(HouseOrder::getOrderNumber, orderNumber);
  2870. HouseOrder one = houseOrderService.getOne(wrapper);
  2871. one.setPayPrice(BigDecimal.valueOf(price));
  2872. one.setPayType(payType);
  2873. if (!"1".equals(one.getOrderStatus())) {
  2874. return CommonResult.fail("订单状态不为待支付");
  2875. }
  2876. //查询是否有未支付订单,有则调用关闭更新支付订单号重新生成支付订单
  2877. List<PayRecord> houseOrderId = payRecordService.list(new QueryWrapper<PayRecord>().eq("house_order_id", one.getId()));
  2878. //现金支付流程
  2879. if ("2".equals(payType)) {
  2880. if (houseOrderId.size() > 0) {
  2881. try {
  2882. this.closeOrderById(houseOrderId.get(0).getPayNo());
  2883. } catch (Exception e) {
  2884. return CommonResult.fail("关闭已生成支付订单失败返回,请查询订单支付状态:" + e.getMessage());
  2885. }
  2886. }
  2887. one.setOrderStatus("2");
  2888. one.setPayTime(TimeExchange.getTime());
  2889. boolean oneFlag = houseOrderService.updateById(one);
  2890. if (!oneFlag) {
  2891. return CommonResult.fail("订单现金支付失败");
  2892. }
  2893. return CommonResult.ok("订单现金支付完成");
  2894. }
  2895. boolean oneFlag = houseOrderService.updateById(one);
  2896. if (!oneFlag) {
  2897. return CommonResult.fail("订单价格修改失败");
  2898. }
  2899. PayRecord payRecord = houseOrderId.size() > 0 ? houseOrderId.get(0) : new PayRecord();
  2900. if (StringUtils.hasText(payRecord.getPayNo())) {
  2901. try {
  2902. this.closeOrderById(payRecord.getPayNo());
  2903. } catch (Exception e) {
  2904. return CommonResult.fail("关闭已生成支付订单失败返回:" + e.getMessage());
  2905. }
  2906. payRecord.setPayPrice(BigDecimal.valueOf(price));
  2907. payRecord.setPayNo(CommonUtil.generateUUID());
  2908. payRecord.setRemark("更新订单");
  2909. payRecordService.updateById(payRecord);
  2910. } else {
  2911. payRecord.setPayNo(CommonUtil.generateUUID());
  2912. payRecord.setHouseOrderId(one.getId());
  2913. payRecord.setUserId(StringUtils.hasText(one.getPayUserId()) ? Integer.valueOf(one.getPayUserId()) : 0);
  2914. payRecord.setPayPrice(BigDecimal.valueOf(price));
  2915. payRecord.setIsSuccess(1);
  2916. payRecord.setRemark("新订单");
  2917. payRecordService.save(payRecord);
  2918. }
  2919. Config config =
  2920. new RSAAutoCertificateConfig.Builder()
  2921. .merchantId(wxPayV3Config.getMchId())
  2922. .privateKeyFromPath(wxPayV3Config.getKeyPath())
  2923. .merchantSerialNumber(wxPayV3Config.getSerialNum())
  2924. .apiV3Key(wxPayV3Config.getApiKey3())
  2925. .build();
  2926. // 构建service
  2927. NativePayService service = new NativePayService.Builder().config(config).build();
  2928. // request.setXxx(val)设置所需参数,具体参数可见Request定义
  2929. com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest request = new com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest();
  2930. com.wechat.pay.java.service.payments.nativepay.model.Amount amount = new com.wechat.pay.java.service.payments.nativepay.model.Amount();
  2931. request.setAppid(wxPayV3Config.getAppId());
  2932. request.setMchid(wxPayV3Config.getMchId());
  2933. request.setDescription("研究生公寓");
  2934. amount.setTotal((int) (price * 100));
  2935. request.setAmount(amount);
  2936. request.setOutTradeNo(payRecord.getPayNo());
  2937. request.setNotifyUrl(wxPayV3Config.getDomain() + "/auto/house-order/returnPay");
  2938. // 调用下单方法,得到应答
  2939. com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse response = null;
  2940. try {
  2941. response = service.prepay(request);
  2942. log.info("CodeUrl()========" + response.getCodeUrl());
  2943. } catch (Exception e) {
  2944. e.printStackTrace();
  2945. return CommonResult.fail(e.getMessage());
  2946. }
  2947. return CommonResult.ok(response);
  2948. }
  2949. @Override
  2950. public CommonResult queryRefundById(String refundNo) {
  2951. Refund refund = new Refund();
  2952. Map<String, Object> result = new HashMap<>();
  2953. HouseOrder one = houseOrderService.getById(refundNo);
  2954. RefundRecord reFundRecord = refundRecordService.getOne(new QueryWrapper<RefundRecord>().eq("house_order_id", refundNo));
  2955. if (reFundRecord == null || reFundRecord.getId() == null) {
  2956. result.put("code", "1001");
  2957. result.put("message", "该订单没有退款记录");
  2958. one.setOrderStatus("9");
  2959. one.setRefundTime(new Date());
  2960. houseOrderService.updateById(one);
  2961. return CommonResult.ok(result);
  2962. }
  2963. if (reFundRecord.getIsSuccess() == 1) {
  2964. result.put("code", "200");
  2965. result.put("message", "退款已完成");
  2966. one.setOrderStatus("7");
  2967. one.setRefundTime(new Date());
  2968. houseOrderService.updateById(one);
  2969. return CommonResult.ok(result);
  2970. }
  2971. if (reFundRecord.getIsSuccess() == 2) {
  2972. one.setOrderStatus("10");
  2973. one.setRefundTime(new Date());
  2974. houseOrderService.updateById(one);
  2975. result.put("code", "1002");
  2976. result.put("message", "退款失败,原因:" + reFundRecord.getRemark());
  2977. //失败不更新订房单
  2978. return CommonResult.ok(result);
  2979. }
  2980. //退款中状态去微信查
  2981. if (reFundRecord.getIsSuccess() == 0) {
  2982. QueryByOutRefundNoRequest queryByOutRefundNoRequest = new QueryByOutRefundNoRequest();
  2983. // 调用request.setXxx(val)设置所需参数,具体参数可见Request定义
  2984. // queryOrderByIdRequest.setSubMchid(wxPayV3Config.getMchId());
  2985. queryByOutRefundNoRequest.setOutRefundNo(reFundRecord.getRefundNo());
  2986. log.info("微信支付查询订单入参:" + queryByOutRefundNoRequest.toString());
  2987. Config config =
  2988. new RSAAutoCertificateConfig.Builder()
  2989. .merchantId(wxPayV3Config.getMchId())
  2990. .privateKeyFromPath(wxPayV3Config.getKeyPath())
  2991. .merchantSerialNumber(wxPayV3Config.getSerialNum())
  2992. .apiV3Key(wxPayV3Config.getApiKey3())
  2993. .build();
  2994. RefundService service = new RefundService.Builder()
  2995. .config(config)
  2996. .build();
  2997. try {
  2998. refund = service.queryByOutRefundNo(queryByOutRefundNoRequest);
  2999. log.info("微信退款查询订单出参:" + refund.toString());
  3000. switch (refund.getStatus()) {
  3001. case SUCCESS:
  3002. one.setOrderStatus("7");
  3003. one.setRefundTime(new Date());
  3004. reFundRecord.setRefundNo(refund.getOutRefundNo());
  3005. reFundRecord.setWxNo(refund.getRefundId());
  3006. reFundRecord.setRefundPrice(new BigDecimal(refund.getAmount().getPayerRefund()).divide(new BigDecimal("100")).setScale(2));
  3007. reFundRecord.setIsSuccess(1);
  3008. reFundRecord.setRemark(reFundRecord.getRemark() + "|微信支付退款成功金额:" + refund.getAmount().getPayerRefund() + "--" + TimeExchange.getTime() + "-" + refund.getUserReceivedAccount());
  3009. result.put("code", "200");
  3010. result.put("message", "退款成功");
  3011. break;
  3012. case PROCESSING:
  3013. result.put("code", "1003");
  3014. result.put("message", "退款处理中,请稍后再查询:" + reFundRecord.getRemark());
  3015. break;
  3016. case CLOSED:
  3017. one.setOrderStatus("10");
  3018. one.setRefundTime(new Date());
  3019. reFundRecord.setIsSuccess(2);
  3020. reFundRecord.setRemark(reFundRecord.getRemark() + "|退款处理失败,退款订单被关闭,联系商户处理:" + TimeExchange.getTime());
  3021. result.put("code", "1004");
  3022. result.put("message", "退款处理失败,退款订单被关闭,联系商户处理");
  3023. break;
  3024. case ABNORMAL:
  3025. reFundRecord.setIsSuccess(2);
  3026. one.setOrderStatus("10");
  3027. one.setRefundTime(new Date());
  3028. reFundRecord.setRemark(reFundRecord.getRemark() + "|退款处理失败,退款异常,联系商户处理:" + TimeExchange.getTime());
  3029. result.put("code", "1005");
  3030. result.put("message", "退款处理失败,退款异常,联系商户处理");
  3031. break;
  3032. }
  3033. boolean a = houseOrderService.updateById(one);
  3034. boolean b = refundRecordService.updateById(reFundRecord);
  3035. if (!a || !b) {
  3036. throw new Exception("更新支付状态失败");
  3037. }
  3038. } catch (Exception e) {
  3039. e.printStackTrace();
  3040. return CommonResult.fail(e.getMessage());
  3041. }
  3042. }
  3043. return CommonResult.ok(result);
  3044. }
  3045. @Override
  3046. public CommonResult appletReserveHour(String houseNumberId, String startTime, Integer liveTime) {
  3047. // 获取钟点房可用时间段
  3048. List<ApartmentSetting> list = apartmentSettingService.list(new LambdaQueryWrapper<>());
  3049. ApartmentSetting apartmentSetting = list.get(0);
  3050. String hourTime = apartmentSetting.getHourTime();
  3051. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  3052. LocalDateTime start = LocalDateTime.parse(startTime, dateTimeFormatter1);
  3053. start = start.withSecond(0).withMinute(0);
  3054. LocalDateTime end = start.plusHours(liveTime);
  3055. String endTime = end.format(dateTimeFormatter1);
  3056. String[] split = hourTime.split(",");
  3057. ArrayList<AppletReserveDayVo> reserveDayVos = new ArrayList<>();
  3058. for (int i = 0; i < 13; i++) {
  3059. LocalDateTime localDateTime = null;
  3060. LocalDateTime localDateTime2 = null;
  3061. if (i == 0) {
  3062. localDateTime = LocalDateTime.parse(startTime, dateTimeFormatter1);
  3063. localDateTime2 = localDateTime.plusHours(liveTime);
  3064. } else {
  3065. localDateTime = start.plusHours(i);
  3066. localDateTime2 = end.plusHours(i);
  3067. }
  3068. // LocalDateTime localDateTime = start.plusHours(i);
  3069. // LocalDateTime localDateTime2 = end.plusHours(i);
  3070. AppletReserveDayVo reserveDayVo = new AppletReserveDayVo();
  3071. // LocalDateTime localDateTime = start.plusHours(i);
  3072. // LocalDateTime localDateTime2 = end.plusHours(i);
  3073. String format = localDateTime.format(dateTimeFormatter1);
  3074. String format2 = localDateTime2.format(dateTimeFormatter1);
  3075. reserveDayVo.setDate(format + "至" + format2);
  3076. reserveDayVo.setHourDate(format.split(" ")[1] + "至" + format2.split(" ")[1]);
  3077. // 先判断时间是否在可用时间范围内
  3078. LocalDateTime start1 = localDateTime.withHour(23).withMinute(59).withSecond(59);
  3079. String format3 = start1.format(dateTimeFormatter1);
  3080. String[] s1 = format.split(" ");
  3081. String startStr = s1[0];
  3082. String[] s2 = format2.split(" ");
  3083. String endStr = s2[0];
  3084. Integer status = 1;
  3085. for (int j = 0; j < split.length; j++) {
  3086. String s = split[j];
  3087. String[] split1 = s.split("-");
  3088. String start2 = split1[0];
  3089. String end2 = split1[1];
  3090. String start3 = startStr + " " + start2;
  3091. String end3 = startStr + " " + end2;
  3092. LocalDateTime localStart = LocalDateTime.parse(start3, dateTimeFormatter1);
  3093. LocalDateTime localEnd = LocalDateTime.parse(end3, dateTimeFormatter1);
  3094. // 该天最后时间小于结束时间则需要分为2个时间段
  3095. if (start1.isBefore(localDateTime2)) {
  3096. String start4 = endStr + " " + start2;
  3097. String end4 = endStr + " " + end2;
  3098. LocalDateTime localStart4 = LocalDateTime.parse(start4, dateTimeFormatter1);
  3099. LocalDateTime localEnd4 = LocalDateTime.parse(end4, dateTimeFormatter1);
  3100. if ((localStart.isBefore(localDateTime) || format.equals(start3)) && (start1.isBefore(localEnd) || format3.equals(end3)) && (localStart4.isBefore(start1) || start4.equals(format3)) && (start1.isBefore(localEnd4) || end4.equals(format3))) {
  3101. // 可用
  3102. status = 2;
  3103. break;
  3104. }
  3105. } else {
  3106. if ((localStart.isBefore(localDateTime) || format.equals(start3)) && (localDateTime2.isBefore(localEnd) || format2.equals(end3))) {
  3107. // 可用
  3108. status = 2;
  3109. break;
  3110. }
  3111. }
  3112. }
  3113. if (status == 2) {
  3114. // 获取该时间段内的房态的使用情况
  3115. List<HouseNumberState> houseNumberStateList = houseNumberStateService.beBooked(houseNumberId, format, format2);
  3116. if (ObjectUtils.isNotEmpty(houseNumberStateList) && houseNumberStateList.size() > 0) {
  3117. reserveDayVo.setStatus("不可用");
  3118. } else {
  3119. reserveDayVo.setStatus("可用");
  3120. }
  3121. } else {
  3122. reserveDayVo.setStatus("不可用");
  3123. }
  3124. reserveDayVos.add(reserveDayVo);
  3125. }
  3126. return CommonResult.ok(reserveDayVos);
  3127. }
  3128. @Override
  3129. public CommonResult getPayOpenId(String wxcode) throws Exception {
  3130. String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token";
  3131. tokenUrl = tokenUrl + "?code=" + wxcode + "&appid=" + wxPayV3Config.getAppId() + "&secret=" + wxPayV3Config.getSecret() + "&grant_type=authorization_code";
  3132. RestTemplate client = new RestTemplate();
  3133. String tokenResponse = client.postForObject(tokenUrl, null, String.class);
  3134. log.info("获取openid结果" + tokenResponse);
  3135. JSONObject jsonObject1 = JSONObject.parseObject(tokenResponse);
  3136. String openId = (String) jsonObject1.getString("openid");
  3137. if (openId == null || openId == "") {
  3138. return CommonResult.fail("openid查询失败:" + tokenResponse);
  3139. }
  3140. return CommonResult.ok(openId);
  3141. }
  3142. @Override
  3143. public CommonResult ifGiveBack(String houseOrderId, Integer giveBack) {
  3144. LambdaQueryWrapper<HouseOrder> wrapper = new LambdaQueryWrapper<>();
  3145. wrapper.eq(HouseOrder::getOrderNumber, houseOrderId);
  3146. HouseOrder houseOrder = houseOrderService.getOne(wrapper);
  3147. if (ObjectUtils.isEmpty(houseOrder)) {
  3148. return CommonResult.fail("订单异常");
  3149. }
  3150. houseOrder.setGiveBack(giveBack);
  3151. houseOrderService.updateById(houseOrder);
  3152. return CommonResult.ok();
  3153. }
  3154. @Override
  3155. public CommonResult saveRemark(Integer houseOrderId, String remark) {
  3156. HouseOrder houseOrder = houseOrderService.getById(houseOrderId);
  3157. if (ObjectUtils.isEmpty(houseOrder)) {
  3158. return CommonResult.fail("订单不存在");
  3159. }
  3160. houseOrder.setRemark(remark);
  3161. houseOrderService.updateById(houseOrder);
  3162. return CommonResult.ok();
  3163. }
  3164. @Override
  3165. @Transactional(rollbackFor = Exception.class)//1
  3166. public CommonResult payNotCheckIn(CancelDto cancelDto) {
  3167. int adminId = cancelDto.getAdminId();
  3168. PermissionSetting permissionSetting = permissionSettingService.getById(adminId);
  3169. if (ObjectUtils.isEmpty(permissionSetting)) {
  3170. return CommonResult.fail("非法进入");
  3171. }
  3172. String houseNumberId = cancelDto.getHouseNumberId();
  3173. String orderNumber = cancelDto.getOrderNumber();
  3174. if (ObjectUtils.isEmpty(houseNumberId) && ObjectUtils.isEmpty(orderNumber)) {
  3175. return CommonResult.fail();
  3176. }
  3177. LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
  3178. wrapperHo.eq(HouseOrder::getOrderNumber, orderNumber);
  3179. HouseOrder houseOrder = houseOrderService.getOne(wrapperHo);
  3180. // 修改订单状态
  3181. houseOrder.setOrderStatus("10");
  3182. // 设置取消时间
  3183. houseOrder.setCancelTime(new Date());
  3184. LambdaQueryWrapper<HouseNumberState> wrapperHns = new LambdaQueryWrapper<>();
  3185. wrapperHns.eq(HouseNumberState::getHouseNumberId, houseNumberId)
  3186. .eq(HouseNumberState::getOrderNumber, orderNumber);
  3187. HouseNumberState houseNumberState = houseNumberStateService.getOne(wrapperHns);
  3188. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  3189. houseNumberState.setEndTime(sdf.format(new Date()));
  3190. houseOrderService.updateById(houseOrder);
  3191. // houseNumberStateService.updateById(houseNumberState);
  3192. houseNumberStateService.removeById(houseNumberState.getId());
  3193. return CommonResult.ok();
  3194. }
  3195. @Override
  3196. public CommonResult remainFree(String userId, String liveTime, String leaveTime) {
  3197. log.info("查询该用户是否能免费订房,userId: " + userId + " liveTime: " + liveTime + " leaveTime: " + leaveTime);
  3198. Users users = usersService.getById(userId);
  3199. if (ObjectUtils.isEmpty(users)) {
  3200. return CommonResult.fail("该用户未授权");
  3201. }
  3202. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  3203. // 判断传过来的时间和当前时间比较
  3204. LocalDateTime now = LocalDateTime.now();
  3205. LocalDateTime date = LocalDateTime.parse(liveTime, dateTimeFormatter1);
  3206. if (now.isAfter(date)) {
  3207. liveTime = now.format(dateTimeFormatter1);
  3208. // establishOrderDto.setReserveLiveTime(reserveLeaveTime);
  3209. }
  3210. LocalDateTime stateTime = LocalDateTime.parse(liveTime, dateTimeFormatter1);
  3211. LocalDateTime endTime = LocalDateTime.parse(leaveTime, dateTimeFormatter1);
  3212. long day = stateTime.toLocalDate().until(endTime.toLocalDate(), ChronoUnit.DAYS);
  3213. if (day > 2) {
  3214. return CommonResult.fail("超过限制的时间段");
  3215. }
  3216. ArrayList<RemainFreeVo> vos = new ArrayList<>();
  3217. RemainFreeVo vo = new RemainFreeVo();
  3218. vo.setName("课表值班预定");
  3219. vo.setSource(1);
  3220. RemainFreeVo vo1 = new RemainFreeVo();
  3221. vo1.setName("流程预定");
  3222. vo1.setSource(2);
  3223. // 先判断是否在黑名单中
  3224. LambdaQueryWrapper<Blacklist> wrapperB = new LambdaQueryWrapper<>();
  3225. wrapperB.eq(Blacklist::getReserveUserId, userId);
  3226. Blacklist one = blacklistService.getOne(wrapperB);
  3227. if (ObjectUtils.isNotEmpty(one)) {
  3228. vo.setCount(0);
  3229. vos.add(vo);
  3230. vo1.setCount(0);
  3231. vos.add(vo1);
  3232. return CommonResult.fail("您本月预订成功后未入住次数已达到上限,已被加入黑名单,无法免费入住。");
  3233. }
  3234. // 获取课表
  3235. LocalDate state = stateTime.toLocalDate();
  3236. LocalDate end = endTime.toLocalDate();
  3237. // 获取预定时间的开始星期和结束星期
  3238. String chineseDayOfWeek = state.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINA);
  3239. Integer week = 0;
  3240. if ("星期一".equals(chineseDayOfWeek)) {
  3241. week = 1;
  3242. } else if ("星期二".equals(chineseDayOfWeek)) {
  3243. week = 2;
  3244. } else if ("星期三".equals(chineseDayOfWeek)) {
  3245. week = 3;
  3246. } else if ("星期四".equals(chineseDayOfWeek)) {
  3247. week = 4;
  3248. } else if ("星期五".equals(chineseDayOfWeek)) {
  3249. week = 5;
  3250. } else if ("星期六".equals(chineseDayOfWeek)) {
  3251. week = 6;
  3252. } else {
  3253. week = 7;
  3254. }
  3255. DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  3256. LocalDate localDate = state.minusDays(week - 1);
  3257. String stateTimeXq = localDate.format(dateTimeFormatter2);
  3258. LocalDate localEnd = localDate.plusDays(6);
  3259. String endTimeXq = localEnd.format(dateTimeFormatter2);
  3260. // 查询该星期是否满足有2天的订单
  3261. LambdaQueryWrapper<HouseOrder> wrapperHO = new LambdaQueryWrapper<>();
  3262. wrapperHO.between(HouseOrder::getReserveLiveTime, stateTimeXq + " 00:00:00", endTimeXq + " 23:59:59")
  3263. .eq(HouseOrder::getReserveUserId, userId)
  3264. .eq(HouseOrder::getSource, 1)
  3265. .eq(HouseOrder::getPayPrice, 0)
  3266. .in(HouseOrder::getOrderStatus, 1, 2, 3, 4, 8);
  3267. List<HouseOrder> orderList = houseOrderService.list(wrapperHO);
  3268. long dayDiff = 0;
  3269. for (HouseOrder houseOrder : orderList) {
  3270. String reserveLiveTime = houseOrder.getReserveLiveTime();
  3271. String reserveLeaveTime = houseOrder.getReserveLeaveTime();
  3272. LocalDateTime stateTime2 = LocalDateTime.parse(reserveLiveTime, dateTimeFormatter1);
  3273. LocalDateTime endTime2 = LocalDateTime.parse(reserveLeaveTime, dateTimeFormatter1);
  3274. LocalDate state1 = stateTime2.toLocalDate();
  3275. LocalDate end2 = endTime2.toLocalDate();
  3276. // 计算2个时间差
  3277. long until = state1.until(end2, ChronoUnit.DAYS);
  3278. dayDiff = dayDiff + until;
  3279. }
  3280. // 计算2个时间差
  3281. long until = state.until(end, ChronoUnit.DAYS);
  3282. Integer count = 1;
  3283. List<String> idList =new ArrayList<>();
  3284. if (dayDiff + until > 2) {
  3285. count = 0;
  3286. } else {
  3287. for (int i = 0; i < until; i++) {
  3288. LocalDateTime dateTime1 = stateTime.plusDays(i);
  3289. LocalDateTime startS = dateTime1.withHour(0).withMinute(0).withSecond(0);
  3290. LocalDateTime endS = dateTime1.withHour(23).withMinute(59).withSecond(59);
  3291. LambdaQueryWrapper<ClassSchedule> wrapperCS = new LambdaQueryWrapper<>();
  3292. wrapperCS.eq(ClassSchedule::getJsgh, users.getCardNumber())
  3293. .between(ClassSchedule::getDateTime, startS, endS);
  3294. List<ClassSchedule> scheduleList = classScheduleService.list(wrapperCS);
  3295. // 只要有一天是空的就不是免费
  3296. if (ObjectUtils.isEmpty(scheduleList)) {
  3297. count = 0;
  3298. break;
  3299. } else {
  3300. // 有课表就查询是否已经有该订单了
  3301. List<HouseOrder> list = houseOrderService.getDate(dateTime1, userId, 1);
  3302. if (ObjectUtils.isNotEmpty(list)) {
  3303. count = 0;
  3304. break;
  3305. }
  3306. idList.add(scheduleList.get(0).getId());
  3307. }
  3308. }
  3309. }
  3310. vo.setCount(count);
  3311. vo.setSourceId(StringUtils.collectionToCommaDelimitedString(idList));
  3312. vo.setDays((int) (until-dayDiff));
  3313. if (count > 0) {
  3314. vos.add(vo);
  3315. }
  3316. // 获取流程
  3317. List<ApplicationProcedureTemporary> aptList = applicationProcedureTemporaryService.getApt(state, end, userId);
  3318. if (ObjectUtils.isEmpty(aptList)) {
  3319. vo1.setCount(0);
  3320. } else {
  3321. //可申请天数
  3322. long dayApt=0;
  3323. List<Integer> aptIdList =new ArrayList<>();
  3324. for (int i = 0; i <aptList.size() ; i++) {
  3325. ApplicationProcedureTemporary applicationProcedureTemporary = aptList.get(0);
  3326. String houseCount = applicationProcedureTemporary.getHouseCount();
  3327. String startTime = applicationProcedureTemporary.getStartTime();
  3328. String endTime1 = applicationProcedureTemporary.getEndTime();
  3329. // 计算开始到结束时间有多少订单
  3330. LambdaQueryWrapper<HouseOrder> wrapper = new LambdaQueryWrapper<>();
  3331. wrapper.eq(HouseOrder::getReserveUserId, userId)
  3332. .eq(HouseOrder::getSource, 2)
  3333. .between(HouseOrder::getReserveLiveTime, startTime, endTime1)
  3334. .eq(HouseOrder::getPayPrice, 0)
  3335. .in(HouseOrder::getOrderStatus, 1, 2, 3, 4, 8);
  3336. List<HouseOrder> list = houseOrderService.list(wrapper);
  3337. Integer count2 = Integer.valueOf(houseCount);
  3338. count2 = count2 - list.size();
  3339. if(count2==0){
  3340. break;
  3341. }
  3342. aptIdList.add(applicationProcedureTemporary.getId());
  3343. LocalDateTime stateTimeApt = LocalDateTime.parse(startTime, dateTimeFormatter1);
  3344. LocalDateTime endTimeApt = LocalDateTime.parse(endTime1, dateTimeFormatter1);
  3345. dayApt =dayApt+stateTimeApt.toLocalDate().until(endTimeApt.toLocalDate(), ChronoUnit.DAYS);
  3346. vo1.setCount(count2);
  3347. }
  3348. vo1.setDays((int) dayApt);
  3349. vo1.setSourceId(StringUtils.collectionToCommaDelimitedString(aptIdList));
  3350. }
  3351. if (vo1.getCount() > 0) {
  3352. vos.add(vo1);
  3353. }
  3354. log.info("最终免费结果:" + vos);
  3355. return CommonResult.ok(vos);
  3356. }
  3357. @Override
  3358. public CommonResult reportStatisticsParticulars(Integer id) {
  3359. HouseOrder houseOrder = houseOrderService.getById(id);
  3360. if (ObjectUtils.isEmpty(houseOrder)) {
  3361. return CommonResult.fail("不存在该订单");
  3362. }
  3363. String houseOrderSource = houseOrder.getHouseOrderSource();
  3364. List<HouseOrderWaterVo> houseOrderWaters=houseOrderService.getWater(houseOrderSource);
  3365. List<HouseOrderElectricVo> houseOrderElectrics=houseOrderService.getElectric(houseOrderSource);
  3366. //水:2.1元/吨,电:0.62元/度
  3367. BigDecimal waterPrice = new BigDecimal(2.1);
  3368. BigDecimal electricPrice = new BigDecimal(0.62);
  3369. // 获取免费的额度
  3370. BigDecimal water = houseOrder.getFreeWater();
  3371. BigDecimal electric = houseOrder.getFreeElectric();
  3372. for (int i = 0; i < houseOrderWaters.size(); i++) {
  3373. HouseOrderWaterVo houseOrderWaterVo = houseOrderWaters.get(i);
  3374. houseOrderWaterVo.setFreeWater(water);
  3375. houseOrderWaterVo.setWaterPrice(waterPrice);
  3376. // 计算总金额
  3377. BigDecimal waterConsume = houseOrderWaterVo.getWaterConsume();
  3378. BigDecimal subtract=waterConsume.subtract(water);
  3379. if (subtract.doubleValue()<0) {
  3380. subtract=new BigDecimal(0);
  3381. }
  3382. BigDecimal waterTotalPrice=subtract.multiply(waterPrice);
  3383. houseOrderWaterVo.setWaterTotalPrice(waterTotalPrice);
  3384. }
  3385. for (int i = 0; i < houseOrderElectrics.size(); i++) {
  3386. HouseOrderElectricVo houseOrderElectricVo = houseOrderElectrics.get(i);
  3387. houseOrderElectricVo.setFreeElectric(electric);
  3388. houseOrderElectricVo.setElectricPrice(electricPrice);
  3389. // 计算总金额
  3390. BigDecimal electricConsume = houseOrderElectricVo.getElectricConsume();
  3391. BigDecimal subtract=electricConsume.subtract(electric);
  3392. if (subtract.doubleValue()<0) {
  3393. subtract=new BigDecimal(0);
  3394. }
  3395. BigDecimal electricTotalPrice=subtract.multiply(electricPrice);
  3396. houseOrderElectricVo.setElectricTotalPrice(electricTotalPrice);
  3397. }
  3398. ReportStatisticsParticularsVo vo = new ReportStatisticsParticularsVo();
  3399. vo.setHouseOrder(houseOrder);
  3400. vo.setWaterVos(houseOrderWaters);
  3401. vo.setElectricVos(houseOrderElectrics);
  3402. return CommonResult.ok(vo);
  3403. }
  3404. @Override
  3405. public CommonResult dateBillType() {
  3406. List<String> dateBillTypeList=houseOrderService.dateBillType();
  3407. return CommonResult.ok(dateBillTypeList);
  3408. }
  3409. public static void main(String[] args) throws Exception {
  3410. // 获取签名
  3411. // 随机字符串
  3412. // String nonceStr = WxUtil.getWxNonceStr();
  3413. // // 时间戳
  3414. // long timestamp = System.currentTimeMillis() / 1000;
  3415. //// 构造签名串
  3416. // String qmc = "GET" + "\n"
  3417. // + "/v3/pay/transactions/h5" + "\n"
  3418. // + timestamp + "\n"
  3419. // + nonceStr + "\n";
  3420. //// 使用商户私钥对待签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值
  3421. // Signature sign = Signature.getInstance("SHA256withRSA");
  3422. //// sign.initSign(privateKey);
  3423. //// sign.update(qmc.getBytes());
  3424. // String signature = RSATest.sign("KReLfbAgGZKc3slfEW9Jnhn7RLKqyrGF", qmc);
  3425. // System.out.println("signature = " + signature);
  3426. // String a="第一个订单"+"\n"+"第二个订单";
  3427. // System.out.println(a);
  3428. // 入住天数
  3429. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  3430. LocalDateTime start = LocalDateTime.parse("2024-12-31 15:17:27", dateTimeFormatter);
  3431. LocalDateTime end = LocalDateTime.parse("2025-01-01 13:00:00", dateTimeFormatter);
  3432. LocalDate startDate = start.toLocalDate();
  3433. LocalDate endDate = end.toLocalDate();
  3434. int daysBetween = (int) startDate.until(endDate, ChronoUnit.DAYS);
  3435. System.out.println("daysBetween = " + daysBetween);
  3436. }
  3437. /**
  3438. * 每2个小时查询一次到时间没有点退房的订单,并自动退房
  3439. */
  3440. @Scheduled(cron = "0 0 0/2 * * ? ")
  3441. // @Scheduled(cron = "0 0/1 * * * ?")
  3442. @Transactional(rollbackFor = Exception.class)//1
  3443. public void getOrder() {
  3444. LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
  3445. wrapperHo.eq(HouseOrder::getOrderStatus, 4);
  3446. // 小于等于当前时间
  3447. wrapperHo.le(HouseOrder::getReserveLeaveTime, new Date());
  3448. List<HouseOrder> list = houseOrderService.list(wrapperHo);
  3449. ArrayList<HouseOrder> houseOrders = new ArrayList<>();
  3450. ArrayList<HouseNumber> houseNumbers = new ArrayList<>();
  3451. if (ObjectUtils.isNotEmpty(list) && list.size() > 0) {
  3452. log.info("开始自动退房");
  3453. for (HouseOrder houseOrder : list) {
  3454. houseOrder.setOrderStatus("8");
  3455. houseOrder.setLeaveTime(new Date());
  3456. String houseNumberId = houseOrder.getHouseNumberId();
  3457. HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  3458. String orderNumber = houseOrder.getOrderNumber();
  3459. LambdaQueryWrapper<Unlocking> wrapperU = new LambdaQueryWrapper<>();
  3460. wrapperU.eq(Unlocking::getOrderNumber, orderNumber)
  3461. .eq(Unlocking::getHouseNumberId, houseNumberId);
  3462. Unlocking unlocking = unlockingService.getOne(wrapperU);
  3463. if (ObjectUtils.isNotEmpty(unlocking)) {
  3464. // 删除房间密码
  3465. passwordIssController.deleteLockUser(unlocking.getLuid(), unlocking.getLockUserId());
  3466. unlockingService.removeById(unlocking);
  3467. }
  3468. if (ObjectUtils.isNotEmpty(houseNumber)) {
  3469. // 获取水电能耗
  3470. // 获取水电消费金额和额度
  3471. String electricEquipmentId = houseNumber.getElectricEquipmentId();
  3472. String waterEquipmentId = houseNumber.getWaterEquipmentId();
  3473. ElectricEquipment electricEquipment = electricEquipmentService.getById(electricEquipmentId);
  3474. WaterEquipment waterEquipment = waterEquipmentService.getById(waterEquipmentId);
  3475. if (ObjectUtils.isNotEmpty(electricEquipment) && ObjectUtils.isNotEmpty(waterEquipment)) {
  3476. String electricEquipmentRoomId = electricEquipment.getRoomId();
  3477. String waterEquipmentRoomId = waterEquipment.getRoomId();
  3478. Date liveTime = houseOrder.getLiveTime();
  3479. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  3480. String live = sdf.format(liveTime);
  3481. String leave = sdf.format(new Date());
  3482. // 获取电的消费金额和额度
  3483. HouseOrderBill houseOrderBill = new HouseOrderBill();
  3484. JSONObject jsonObjectElectric = electricEquipmentService.roomCostRecord(electricEquipmentRoomId, live, leave);
  3485. BigDecimal costElectric = jsonObjectElectric.getBigDecimal("cost");
  3486. BigDecimal consumeElectric = jsonObjectElectric.getBigDecimal("consume");
  3487. houseOrderBill.setElectricCost(costElectric);
  3488. houseOrderBill.setElectricConsume(consumeElectric);
  3489. BigDecimal electricCost = houseOrder.getElectricCost();
  3490. if (ObjectUtils.isNotEmpty(electricCost)) {
  3491. costElectric = costElectric.add(electricCost);
  3492. }
  3493. BigDecimal electricConsume = houseOrder.getElectricConsume();
  3494. if (ObjectUtils.isNotEmpty(electricConsume)) {
  3495. consumeElectric = consumeElectric.add(electricConsume);
  3496. }
  3497. houseOrder.setElectricCost(costElectric);
  3498. houseOrder.setElectricConsume(consumeElectric);
  3499. // 获取水的消费金额和额度
  3500. JSONObject jsonObjectWater = waterEquipmentService.roomCostRecord(waterEquipmentRoomId, live, leave);
  3501. BigDecimal costWater = jsonObjectWater.getBigDecimal("cost");
  3502. BigDecimal consumeWater = jsonObjectWater.getBigDecimal("consume");
  3503. houseOrderBill.setWaterCost(costWater);
  3504. houseOrderBill.setWaterConsume(consumeWater);
  3505. BigDecimal waterCost = houseOrder.getWaterCost();
  3506. if (ObjectUtils.isNotEmpty(waterCost)) {
  3507. costWater = costWater.add(waterCost);
  3508. }
  3509. BigDecimal waterConsume = houseOrder.getWaterConsume();
  3510. if (ObjectUtils.isNotEmpty(waterConsume)) {
  3511. consumeWater = consumeWater.add(waterConsume);
  3512. }
  3513. houseOrder.setWaterCost(costWater);
  3514. houseOrder.setWaterConsume(consumeWater);
  3515. houseOrderBill.setHouseOrderId(houseOrder.getId());
  3516. houseOrderBill.setHouseNumberId(houseNumberId);
  3517. houseOrderBill.setLiveTime(liveTime);
  3518. houseOrderBill.setLeaveTime(new Date());
  3519. houseOrderBillService.save(houseOrderBill);
  3520. }
  3521. // 将房间设置成脏房
  3522. houseNumber.setHouseStatus(2);
  3523. houseOrders.add(houseOrder);
  3524. houseNumbers.add(houseNumber);
  3525. }
  3526. }
  3527. }
  3528. if (ObjectUtils.isNotEmpty(houseOrders)) {
  3529. houseOrderService.updateBatchById(houseOrders);
  3530. }
  3531. if (ObjectUtils.isNotEmpty(houseNumbers)) {
  3532. houseNumberService.updateBatchById(houseNumbers);
  3533. }
  3534. }
  3535. // @Scheduled(cron = "0 0/1 * * * ?")
  3536. public void pay() {
  3537. // 计算上个免费的订单
  3538. LocalDateTime end = LocalDateTime.now().withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0);
  3539. LocalDateTime start = end.minusMonths(1);
  3540. LambdaQueryWrapper<HouseOrder> wrapper = new LambdaQueryWrapper<>();
  3541. wrapper/*.between(HouseOrder::getLeaveTime, start, end)*/
  3542. .eq(HouseOrder::getPayPrice, 0)
  3543. .eq(HouseOrder::getOrderStatus, 8);
  3544. List<HouseOrder> list = houseOrderService.list(wrapper);
  3545. // 重新计算订单
  3546. for (int i = 0; i < list.size(); i++) {
  3547. HouseOrder houseOrder = list.get(i);
  3548. String houseNumberId = houseOrder.getHouseNumberId();
  3549. // 获取水电消费金额和额度
  3550. HouseNumber houseNumber = houseNumberService.getById(houseNumberId);
  3551. String electricEquipmentId = houseNumber.getElectricEquipmentId();
  3552. String waterEquipmentId = houseNumber.getWaterEquipmentId();
  3553. ElectricEquipment electricEquipment = electricEquipmentService.getById(electricEquipmentId);
  3554. WaterEquipment waterEquipment = waterEquipmentService.getById(waterEquipmentId);
  3555. if (ObjectUtils.isNotEmpty(electricEquipment) && ObjectUtils.isNotEmpty(waterEquipment)) {
  3556. String electricEquipmentRoomId = electricEquipment.getRoomId();
  3557. String waterEquipmentRoomId = waterEquipment.getRoomId();
  3558. Date liveTime = houseOrder.getLiveTime();
  3559. Date leaveTime = houseOrder.getLeaveTime();
  3560. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  3561. String live = sdf.format(liveTime);
  3562. String leave = sdf.format(leaveTime);
  3563. // 获取电的消费金额和额度
  3564. JSONObject jsonObjectElectric = electricEquipmentService.roomCostRecord(electricEquipmentRoomId, live, leave);
  3565. BigDecimal costElectric = jsonObjectElectric.getBigDecimal("cost");
  3566. BigDecimal consumeElectric = jsonObjectElectric.getBigDecimal("consume");
  3567. houseOrder.setElectricCost(costElectric);
  3568. houseOrder.setElectricConsume(consumeElectric);
  3569. // 获取水的消费金额和额度
  3570. JSONObject jsonObjectWater = waterEquipmentService.roomCostRecord(waterEquipmentRoomId, live, leave);
  3571. BigDecimal costWater = jsonObjectWater.getBigDecimal("cost");
  3572. BigDecimal consumeWater = jsonObjectWater.getBigDecimal("consume");
  3573. houseOrder.setWaterCost(costWater);
  3574. houseOrder.setWaterConsume(consumeWater);
  3575. }
  3576. }
  3577. houseOrderService.updateBatchById(list);
  3578. }
  3579. // 计算一个月内每个人的免费入住所消费的水电
  3580. @Scheduled(cron = "0 0 1 1 * ? ")
  3581. // @Scheduled(cron = "0 0/1 * * * ?")
  3582. public void payHouseOrder() {
  3583. // 获取免费的额度
  3584. SubsidySetup subsidySetup = subsidySetupService.list(new LambdaQueryWrapper<>()).get(0);
  3585. BigDecimal water = subsidySetup.getFreeQuotaOfWater();
  3586. BigDecimal electric = subsidySetup.getFreeQuotaOfElectric();
  3587. //水:2.1元/吨,电:0.62元/度
  3588. BigDecimal waterPrice = new BigDecimal(2.1);
  3589. BigDecimal electricPrice = new BigDecimal(0.62);
  3590. // water = water.multiply(waterPrice);
  3591. // electric = electric.multiply(electricPrice);
  3592. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  3593. DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM");
  3594. // 计算上个免费的订单
  3595. LocalDateTime end = LocalDateTime.now().withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0);
  3596. LocalDateTime start = end.minusMonths(1);
  3597. String dateBill=start.toLocalDate().format(dateTimeFormatter2);
  3598. LambdaQueryWrapper<HouseOrder> wrapper = new LambdaQueryWrapper<>();
  3599. wrapper.between(HouseOrder::getLeaveTime, start, end)
  3600. .eq(HouseOrder::getPayPrice, 0)
  3601. .eq(HouseOrder::getOrderStatus, 8);
  3602. List<HouseOrder> list = houseOrderService.list(wrapper);
  3603. // 获取上个月哪些人有免费订单
  3604. List<String> userList = houseOrderService.payHouseOrderUser(start, end);
  3605. ArrayList<HouseOrder> houseOrders = new ArrayList<>();
  3606. for (String user : userList) {
  3607. List<HouseOrder> ownerClasses = list.stream().filter(e -> e.getReserveUserId().equals(user)).collect(Collectors.toList());
  3608. // 总能耗
  3609. BigDecimal waterTotal = new BigDecimal(0);
  3610. // 总金额
  3611. BigDecimal waterCostTotal = new BigDecimal(0);
  3612. BigDecimal electricTotal = new BigDecimal(0);
  3613. BigDecimal electricCostTotal = new BigDecimal(0);
  3614. String houseOrderSource = "";
  3615. for (int i = 0; i < ownerClasses.size(); i++) {
  3616. HouseOrder ownerClass = ownerClasses.get(i);
  3617. String id = ownerClass.getId()+"";
  3618. if (i==0) {
  3619. houseOrderSource=id;
  3620. }else {
  3621. houseOrderSource=houseOrderSource+","+id;
  3622. }
  3623. // 金额
  3624. // BigDecimal electricCost = ownerClass.getElectricCost();
  3625. // 能耗
  3626. BigDecimal electricConsume = ownerClass.getElectricConsume();
  3627. if (electricConsume.subtract(electric).doubleValue() > 0) {
  3628. // 超出的能耗
  3629. BigDecimal decimal = electricConsume.subtract(electric);
  3630. // 超出的总能耗
  3631. electricTotal = electricTotal.add(decimal);
  3632. // 超出的金额
  3633. BigDecimal multiply = decimal.multiply(electricPrice);
  3634. // 超出的总金额
  3635. electricCostTotal = electricCostTotal.add(multiply);
  3636. }
  3637. // BigDecimal waterCost = ownerClass.getWaterCost();
  3638. BigDecimal waterConsume = ownerClass.getWaterConsume();
  3639. if (waterConsume.subtract(water).doubleValue() > 0) {
  3640. // 超出的能耗
  3641. BigDecimal decimal = waterConsume.subtract(water);
  3642. // 超出的总能耗
  3643. waterTotal = waterTotal.add(decimal);
  3644. // 超出的金额
  3645. BigDecimal multiply = decimal.multiply(waterPrice);
  3646. // 超出的总金额
  3647. waterCostTotal = waterCostTotal.add(multiply);
  3648. }
  3649. }
  3650. // 需支付金额=电费+水费
  3651. BigDecimal payPrice = waterCostTotal.add(electricCostTotal);
  3652. if (payPrice.doubleValue() > 0) {
  3653. HouseOrder houseOrder = new HouseOrder();
  3654. // 订单号
  3655. // String orderNumber = UUID.randomUUID().toString();
  3656. // orderNumber = orderNumber.replace("-", "");
  3657. String orderNumber = OrderNumber.getOrderNumber();
  3658. houseOrder.setOrderNumber(orderNumber);
  3659. // 订单状态
  3660. houseOrder.setOrderStatus("5");
  3661. Users users = usersService.getById(user);
  3662. // 入住人
  3663. houseOrder.setLiveName(users.getUserName());
  3664. // 预定人
  3665. houseOrder.setReserveName(users.getUserName());
  3666. // 预定人电话
  3667. houseOrder.setReservePhone(users.getPhone());
  3668. // 预定人id
  3669. houseOrder.setReserveUserId(user);
  3670. // 入住人id
  3671. houseOrder.setLiveUsersId(user);
  3672. // 居住天数
  3673. houseOrder.setLiveDay(ownerClasses.size() + "");
  3674. // 渠道
  3675. houseOrder.setOrderChannel("1");
  3676. // 订单金额
  3677. houseOrder.setPayPrice(payPrice);
  3678. houseOrder.setElectricCost(electricCostTotal);
  3679. houseOrder.setElectricConsume(electricTotal);
  3680. houseOrder.setWaterCost(waterCostTotal);
  3681. houseOrder.setWaterConsume(waterTotal);
  3682. houseOrder.setReserveLiveTime(start.format(dateTimeFormatter1));
  3683. houseOrder.setReserveLeaveTime(end.format(dateTimeFormatter1));
  3684. houseOrder.setLiveTime(Date.from(start.atZone(ZoneId.systemDefault()).toInstant()));
  3685. houseOrder.setLeaveTime(Date.from(end.atZone(ZoneId.systemDefault()).toInstant()));
  3686. houseOrder.setHouseOrderSource(houseOrderSource);
  3687. houseOrder.setFreeElectric(electric);
  3688. houseOrder.setFreeWater(water);
  3689. // 结账日期
  3690. houseOrder.setDateBill(dateBill);
  3691. houseOrders.add(houseOrder);
  3692. }
  3693. }
  3694. houseOrderService.saveBatch(houseOrders);
  3695. }
  3696. // 到时间超时还未付款则取消
  3697. @Scheduled(cron = "0 0/5 * * * ? ")
  3698. public void getTimeOut() {
  3699. // 当前时间
  3700. LocalDateTime now = LocalDateTime.now();
  3701. LambdaQueryWrapper<HouseOrder> wrapper = new LambdaQueryWrapper<>();
  3702. wrapper.eq(HouseOrder::getOrderStatus, 1)
  3703. .le(HouseOrder::getTimeOut, now);
  3704. List<HouseOrder> list = houseOrderService.list(wrapper);
  3705. ArrayList<HouseOrder> houseOrders = new ArrayList<>();
  3706. for (HouseOrder houseOrder : list) {
  3707. String orderNumber = houseOrder.getOrderNumber();
  3708. String houseNumberId = houseOrder.getHouseNumberId();
  3709. LambdaQueryWrapper<HouseNumberState> wrapperHns = new LambdaQueryWrapper<>();
  3710. wrapperHns.eq(HouseNumberState::getHouseNumberId, houseNumberId)
  3711. .eq(HouseNumberState::getOrderNumber, orderNumber);
  3712. HouseNumberState houseNumberState = houseNumberStateService.getOne(wrapperHns);
  3713. if (ObjectUtils.isNotEmpty(houseNumberState)) {
  3714. houseNumberStateService.removeById(houseNumberState.getId());
  3715. }
  3716. // 修改订单状态
  3717. houseOrder.setOrderStatus("9");
  3718. // 设置取消时间
  3719. houseOrder.setCancelTime(new Date());
  3720. houseOrders.add(houseOrder);
  3721. }
  3722. if (houseOrders.size() > 0) {
  3723. houseOrderService.updateBatchById(houseOrders);
  3724. }
  3725. }
  3726. /**
  3727. * 每天13点
  3728. * 计算当天当前时间超过待入住.已支付订单的预离时间
  3729. */
  3730. // @Scheduled(cron = "0 0 13 * * ? ")
  3731. @Scheduled(cron = "0 0 0 * * ? ")
  3732. @Transactional(rollbackFor = Exception.class)//1
  3733. public void getBlacklist() {
  3734. // 获取预离时间是当天的待入住,已支付订单
  3735. LocalDateTime startTime = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).minusDays(1);
  3736. LocalDateTime endTime = startTime.withHour(23).withMinute(59).withSecond(59);
  3737. LambdaQueryWrapper<HouseOrder> wrapper = new LambdaQueryWrapper<>();
  3738. wrapper.in(HouseOrder::getOrderStatus, 2, 3)
  3739. .between(HouseOrder::getReserveLeaveTime, startTime, endTime)
  3740. .eq(HouseOrder::getPayPrice, 0);
  3741. List<HouseOrder> list = houseOrderService.list(wrapper);
  3742. if (list.size() > 0) {
  3743. ArrayList<BlacklistOrder> blacklistOrders = new ArrayList<>();
  3744. for (HouseOrder houseOrder : list) {
  3745. BlacklistOrder blacklistOrder = new BlacklistOrder();
  3746. blacklistOrder.setHouseOrderId(houseOrder.getId());
  3747. blacklistOrder.setOrderNumber(houseOrder.getOrderNumber());
  3748. blacklistOrder.setOrderStatus(houseOrder.getOrderStatus());
  3749. blacklistOrder.setReserveUserId(houseOrder.getReserveUserId());
  3750. blacklistOrder.setReserveName(houseOrder.getReserveName());
  3751. blacklistOrder.setReservePhone(houseOrder.getReservePhone());
  3752. Users users = usersService.getById(houseOrder.getReserveUserId());
  3753. if (ObjectUtils.isNotEmpty(users)) {
  3754. blacklistOrder.setCardNumber(users.getCardNumber());
  3755. }
  3756. blacklistOrder.setReserveLiveTime(houseOrder.getReserveLiveTime());
  3757. blacklistOrder.setReserveLeaveTime(houseOrder.getReserveLeaveTime());
  3758. blacklistOrders.add(blacklistOrder);
  3759. // 将订单状态改成取消,空出房间
  3760. // 修改订单状态,已支付待入住
  3761. houseOrder.setOrderStatus("10");
  3762. // 设置取消时间
  3763. houseOrder.setCancelTime(new Date());
  3764. LambdaQueryWrapper<HouseNumberState> wrapperHns = new LambdaQueryWrapper<>();
  3765. wrapperHns.eq(HouseNumberState::getHouseNumberId, houseOrder.getHouseNumberId())
  3766. .eq(HouseNumberState::getOrderNumber, houseOrder.getOrderNumber());
  3767. HouseNumberState houseNumberState = houseNumberStateService.getOne(wrapperHns);
  3768. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  3769. houseNumberState.setEndTime(sdf.format(new Date()));
  3770. houseOrderService.updateById(houseOrder);
  3771. houseNumberStateService.removeById(houseNumberState.getId());
  3772. }
  3773. blacklistOrderService.saveBatch(blacklistOrders);
  3774. BlacklistSetting blacklistSetting = blacklistSettingService.list(new LambdaQueryWrapper<>()).get(0);
  3775. Integer count = blacklistSetting.getCount();
  3776. List<BlacklistVo> vos = blacklistOrderService.getBlacklist(count);
  3777. if (vos.size() > 0) {
  3778. ArrayList<Blacklist> blacklists = new ArrayList<>();
  3779. for (BlacklistVo vo : vos) {
  3780. Integer id1 = vo.getId();
  3781. Users users = usersService.getById(id1);
  3782. // 通过预定id找到对应的黑名单预定人id
  3783. LambdaQueryWrapper<Blacklist> wrapperB = new LambdaQueryWrapper<>();
  3784. wrapperB.eq(Blacklist::getReserveUserId, id1);
  3785. Blacklist one = blacklistService.getOne(wrapperB);
  3786. if (ObjectUtils.isNotEmpty(one)) {
  3787. one.setCount(vo.getCount());
  3788. blacklists.add(one);
  3789. } else {
  3790. if (ObjectUtils.isNotEmpty(users)) {
  3791. Blacklist blacklist = new Blacklist();
  3792. blacklist.setReserveUserId(id1);
  3793. blacklist.setReserveName(users.getUserName());
  3794. blacklist.setPhone(users.getPhone());
  3795. blacklist.setCardNumber(users.getCardNumber());
  3796. blacklist.setCount(vo.getCount());
  3797. blacklists.add(blacklist);
  3798. }
  3799. }
  3800. }
  3801. if (blacklists.size() > 0) {
  3802. blacklistService.saveOrUpdateBatch(blacklists);
  3803. }
  3804. }
  3805. }
  3806. }
  3807. }