OrderServiceImpl.java 112 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390
  1. package com.fuint.common.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.fuint.common.Constants;
  7. import com.fuint.common.dto.*;
  8. import com.fuint.common.enums.*;
  9. import com.fuint.common.param.OrderListParam;
  10. import com.fuint.common.param.RechargeParam;
  11. import com.fuint.common.param.SettlementParam;
  12. import com.fuint.common.service.*;
  13. import com.fuint.common.util.*;
  14. import com.fuint.framework.annoation.OperationServiceLog;
  15. import com.fuint.framework.exception.BusinessCheckException;
  16. import com.fuint.framework.pagination.PaginationResponse;
  17. import com.fuint.framework.web.ResponseObject;
  18. import com.fuint.repository.mapper.*;
  19. import com.fuint.repository.model.*;
  20. import com.fuint.utils.PropertiesUtil;
  21. import com.fuint.utils.StringUtil;
  22. import com.github.pagehelper.Page;
  23. import com.github.pagehelper.PageHelper;
  24. import lombok.AllArgsConstructor;
  25. import org.apache.commons.lang.StringUtils;
  26. import org.slf4j.Logger;
  27. import org.slf4j.LoggerFactory;
  28. import org.springframework.beans.BeanUtils;
  29. import org.springframework.context.annotation.Lazy;
  30. import org.springframework.data.domain.PageImpl;
  31. import org.springframework.data.domain.PageRequest;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.transaction.annotation.Transactional;
  34. import weixin.popular.util.JsonUtil;
  35. import javax.servlet.http.HttpServletRequest;
  36. import java.math.BigDecimal;
  37. import java.util.*;
  38. import java.util.stream.Collectors;
  39. /**
  40. * 订单接口实现类
  41. *
  42. * Created by FSQ
  43. * CopyRight https://www.fuint.cn
  44. */
  45. @Service
  46. @AllArgsConstructor(onConstructor_= {@Lazy})
  47. public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implements OrderService {
  48. private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);
  49. private MtOrderMapper mtOrderMapper;
  50. private MtGoodsMapper mtGoodsMapper;
  51. private MtOrderGoodsMapper mtOrderGoodsMapper;
  52. private MtCartMapper mtCartMapper;
  53. private MtOrderAddressMapper mtOrderAddressMapper;
  54. private MtConfirmLogMapper mtConfirmLogMapper;
  55. private MtUserCouponMapper mtUserCouponMapper;
  56. private MtGoodsSkuMapper mtGoodsSkuMapper;
  57. private MtRegionMapper mtRegionMapper;
  58. private MtUserGradeMapper mtUserGradeMapper;
  59. private MtCouponGoodsMapper mtCouponGoodsMapper;
  60. /**
  61. * 系统设置服务接口
  62. * */
  63. private SettingService settingService;
  64. /**
  65. * 卡券服务接口
  66. * */
  67. private CouponService couponService;
  68. /**
  69. * 会员卡券服务接口
  70. * */
  71. private UserCouponService userCouponService;
  72. /**
  73. * 收货地址服务接口
  74. * */
  75. private AddressService addressService;
  76. /**
  77. * 会员服务接口
  78. * */
  79. private MemberService memberService;
  80. /**
  81. * 积分服务接口
  82. * */
  83. private PointService pointService;
  84. /**
  85. * 购物车服务接口
  86. * */
  87. private CartService cartService;
  88. /**
  89. * 商品服务接口
  90. * */
  91. private GoodsService goodsService;
  92. /**
  93. * 店铺服务接口
  94. * */
  95. private StoreService storeService;
  96. /**
  97. * 会员等级服务接口
  98. * */
  99. private UserGradeService userGradeService;
  100. /**
  101. * 售后服务接口
  102. * */
  103. private RefundService refundService;
  104. /**
  105. * 余额服务接口
  106. * */
  107. private BalanceService balanceService;
  108. /**
  109. * 微信相关服务接口
  110. * */
  111. private WeixinService weixinService;
  112. /**
  113. * 支付宝服务接口
  114. * */
  115. private AlipayService alipayService;
  116. /**
  117. * 短信发送服务接口
  118. * */
  119. private SendSmsService sendSmsService;
  120. /**
  121. * 开卡赠礼服务接口
  122. * */
  123. private OpenGiftService openGiftService;
  124. /**
  125. * 商户服务接口
  126. * */
  127. private MerchantService merchantService;
  128. /**
  129. * 店铺员工服务接口
  130. * */
  131. private StaffService staffService;
  132. /**
  133. * 支付服务接口
  134. * */
  135. private PaymentService paymentService;
  136. /**
  137. * 云打印服务接口
  138. * */
  139. private PrinterService printerService;
  140. /**
  141. * 获取用户订单列表
  142. * @param orderListParam
  143. * @throws BusinessCheckException
  144. * */
  145. @Override
  146. @Transactional(rollbackFor = Exception.class)
  147. public PaginationResponse getUserOrderList(OrderListParam orderListParam) throws BusinessCheckException {
  148. Integer pageNumber = orderListParam.getPage() == null ? Constants.PAGE_NUMBER : orderListParam.getPage();
  149. Integer pageSize = orderListParam.getPageSize() == null ? Constants.PAGE_SIZE : orderListParam.getPageSize();
  150. String userId = orderListParam.getUserId() == null ? "" : orderListParam.getUserId();
  151. Integer merchantId = orderListParam.getMerchantId() == null ? 0 : orderListParam.getMerchantId();
  152. Integer storeId = orderListParam.getStoreId() == null ? 0 : orderListParam.getStoreId();
  153. String status = orderListParam.getStatus() == null ? "": orderListParam.getStatus();
  154. String payStatus = orderListParam.getPayStatus() == null ? "": orderListParam.getPayStatus();
  155. String settleStatus = orderListParam.getSettleStatus() == null ? "": orderListParam.getSettleStatus();
  156. String dataType = orderListParam.getDataType() == null ? "": orderListParam.getDataType();
  157. String type = orderListParam.getType() == null ? "": orderListParam.getType();
  158. String orderSn = orderListParam.getOrderSn() == null ? "": orderListParam.getOrderSn();
  159. String mobile = orderListParam.getMobile() == null ? "": orderListParam.getMobile();
  160. String orderMode = orderListParam.getOrderMode() == null ? "" : orderListParam.getOrderMode();
  161. String staffId = orderListParam.getStaffId() == null ? "" : orderListParam.getStaffId();
  162. String couponId = orderListParam.getCouponId() == null ? "" : orderListParam.getCouponId();
  163. String storeIds = orderListParam.getStoreIds() == null ? "" : orderListParam.getStoreIds();
  164. String startTime = orderListParam.getStartTime() == null ? "" : orderListParam.getStartTime();
  165. String endTime = orderListParam.getEndTime() == null ? "" : orderListParam.getEndTime();
  166. String keyword = orderListParam.getKeyword() == null ? "" : orderListParam.getKeyword();
  167. String confirmStatus = orderListParam.getConfirmStatus() == null ? "" : orderListParam.getConfirmStatus();
  168. List<String> payType = orderListParam.getPayType();
  169. LambdaQueryWrapper<MtOrder> lambdaQueryWrapper = Wrappers.lambdaQuery();
  170. lambdaQueryWrapper.ne(MtOrder::getStatus, OrderStatusEnum.DELETED.getKey());
  171. if (dataType.equals("toPay")) {
  172. status = OrderStatusEnum.CREATED.getKey(); // 待支付
  173. } else if(dataType.equals("paid")) {
  174. status = "";
  175. payStatus = PayStatusEnum.SUCCESS.getKey(); // 已支付
  176. } else if(dataType.equals("cancel")) {
  177. status = OrderStatusEnum.CANCEL.getKey(); // 已取消
  178. } else if(dataType.equals("todo")) {
  179. // 待核销
  180. payStatus = PayStatusEnum.SUCCESS.getKey();
  181. lambdaQueryWrapper.eq(MtOrder::getConfirmStatus, YesOrNoEnum.NO.getKey());
  182. lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey());
  183. lambdaQueryWrapper.eq(MtOrder::getOrderMode, OrderModeEnum.ONESELF.getKey());
  184. } else if(dataType.equals("confirm")) {
  185. // 已核销
  186. payStatus = PayStatusEnum.SUCCESS.getKey();
  187. lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey());
  188. lambdaQueryWrapper.eq(MtOrder::getConfirmStatus, YesOrNoEnum.YES.getKey());
  189. lambdaQueryWrapper.eq(MtOrder::getOrderMode, OrderModeEnum.ONESELF.getKey());
  190. }
  191. if (StringUtil.isNotEmpty(orderSn)) {
  192. lambdaQueryWrapper.eq(MtOrder::getOrderSn, orderSn);
  193. }
  194. if (StringUtil.isNotEmpty(status)) {
  195. lambdaQueryWrapper.eq(MtOrder::getStatus, status);
  196. }
  197. if (StringUtil.isNotEmpty(payStatus)) {
  198. lambdaQueryWrapper.eq(MtOrder::getPayStatus, payStatus);
  199. }
  200. if (StringUtil.isNotEmpty(settleStatus)) {
  201. lambdaQueryWrapper.eq(MtOrder::getSettleStatus, settleStatus);
  202. }
  203. if (StringUtil.isNotEmpty(keyword)) {
  204. MtUser userInfo = memberService.queryMemberByMobile(merchantId, keyword);
  205. if (userInfo != null) {
  206. lambdaQueryWrapper.and(wq -> wq
  207. .like(MtOrder::getOrderSn, keyword)
  208. .or()
  209. .eq(MtOrder::getUserId, userInfo.getId().toString()));
  210. } else {
  211. lambdaQueryWrapper.like(MtOrder::getOrderSn, keyword);
  212. }
  213. }
  214. if (StringUtil.isNotEmpty(mobile)) {
  215. MtUser userInfo = memberService.queryMemberByMobile(merchantId, mobile);
  216. if (userInfo != null) {
  217. userId = userInfo.getId().toString();
  218. } else {
  219. userId = "0";
  220. }
  221. }
  222. if (StringUtil.isNotEmpty(userId)) {
  223. lambdaQueryWrapper.eq(MtOrder::getUserId, userId);
  224. }
  225. if (merchantId != null && merchantId > 0) {
  226. lambdaQueryWrapper.eq(MtOrder::getMerchantId, merchantId);
  227. }
  228. if (storeId != null && storeId > 0) {
  229. lambdaQueryWrapper.eq(MtOrder::getStoreId, storeId);
  230. }
  231. if (StringUtil.isNotEmpty(staffId)) {
  232. lambdaQueryWrapper.eq(MtOrder::getStaffId, staffId);
  233. }
  234. if (StringUtil.isNotEmpty(type)) {
  235. lambdaQueryWrapper.eq(MtOrder::getType, type);
  236. }
  237. if (StringUtil.isNotEmpty(orderMode)) {
  238. lambdaQueryWrapper.eq(MtOrder::getOrderMode, orderMode);
  239. }
  240. if (StringUtils.isNotBlank(couponId)) {
  241. lambdaQueryWrapper.eq(MtOrder::getCouponId, couponId);
  242. }
  243. if (StringUtils.isNotBlank(storeIds)) {
  244. List<String> idList = Arrays.asList(storeIds.split(","));
  245. if (idList.size() > 0) {
  246. lambdaQueryWrapper.in(MtOrder::getStoreId, idList);
  247. }
  248. }
  249. if (StringUtil.isNotEmpty(startTime)) {
  250. lambdaQueryWrapper.ge(MtOrder::getCreateTime, startTime);
  251. }
  252. if (StringUtil.isNotEmpty(endTime)) {
  253. lambdaQueryWrapper.le(MtOrder::getCreateTime, endTime);
  254. }
  255. if (payType != null && payType.size() > 0) {
  256. lambdaQueryWrapper.in(MtOrder::getPayType, payType);
  257. }
  258. if (StringUtil.isNotEmpty(confirmStatus)) {
  259. lambdaQueryWrapper.eq(MtOrder::getConfirmStatus, confirmStatus);
  260. lambdaQueryWrapper.eq(MtOrder::getPayStatus, PayStatusEnum.SUCCESS.getKey());
  261. lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey());
  262. }
  263. lambdaQueryWrapper.orderByDesc(MtOrder::getId);
  264. Page<MtOrder> pageHelper = PageHelper.startPage(pageNumber, pageSize);
  265. List<MtOrder> orderList = mtOrderMapper.selectList(lambdaQueryWrapper);
  266. List<UserOrderDto> dataList = new ArrayList<>();
  267. if (orderList.size() > 0) {
  268. for (MtOrder order : orderList) {
  269. UserOrderDto dto = getOrderDetail(order,false, false);
  270. dataList.add(dto);
  271. }
  272. }
  273. PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
  274. PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
  275. PaginationResponse<UserOrderDto> paginationResponse = new PaginationResponse(pageImpl, UserOrderDto.class);
  276. paginationResponse.setTotalPages(pageHelper.getPages());
  277. paginationResponse.setTotalElements(pageHelper.getTotal());
  278. paginationResponse.setContent(dataList);
  279. return paginationResponse;
  280. }
  281. /**
  282. * 保存订单信息
  283. *
  284. * @param orderDto 订单参数
  285. * @throws BusinessCheckException
  286. * @return
  287. */
  288. @Override
  289. @Transactional(rollbackFor = Exception.class)
  290. @OperationServiceLog(description = "提交订单信息")
  291. public MtOrder saveOrder(OrderDto orderDto) throws BusinessCheckException {
  292. logger.info("orderService.saveOrder orderDto = {}", JsonUtil.toJSONString(orderDto));
  293. MtOrder mtOrder;
  294. if (null != orderDto.getId() && orderDto.getId() > 0) {
  295. mtOrder = mtOrderMapper.selectById(orderDto.getId());
  296. } else {
  297. mtOrder = new MtOrder();
  298. }
  299. // 检查店铺是否已被禁用
  300. if (orderDto.getStoreId() != null && orderDto.getStoreId() > 0) {
  301. MtStore storeInfo = storeService.queryStoreById(orderDto.getStoreId());
  302. if (storeInfo != null) {
  303. if (!storeInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  304. orderDto.setStoreId(0);
  305. }
  306. }
  307. }
  308. String orderSn;
  309. if (orderDto.getId() == null || orderDto.getId() < 1) {
  310. orderSn = CommonUtil.createOrderSN(orderDto.getUserId() + "");
  311. mtOrder.setOrderSn(orderSn);
  312. } else {
  313. orderSn = mtOrder.getOrderSn();
  314. }
  315. mtOrder.setUserId(orderDto.getUserId());
  316. mtOrder.setMerchantId(orderDto.getMerchantId());
  317. mtOrder.setStoreId(orderDto.getStoreId());
  318. mtOrder.setCouponId(orderDto.getCouponId());
  319. mtOrder.setParam(orderDto.getParam());
  320. mtOrder.setRemark(orderDto.getRemark());
  321. if (orderDto.getStatus() != null) {
  322. mtOrder.setStatus(orderDto.getStatus());
  323. } else {
  324. mtOrder.setStatus(OrderStatusEnum.CREATED.getKey());
  325. }
  326. mtOrder.setType(orderDto.getType());
  327. mtOrder.setAmount(orderDto.getAmount());
  328. mtOrder.setPayAmount(orderDto.getPayAmount());
  329. mtOrder.setDiscount(orderDto.getDiscount());
  330. if (orderDto.getPayStatus() != null) {
  331. mtOrder.setPayStatus(orderDto.getPayStatus());
  332. } else {
  333. mtOrder.setPayStatus(PayStatusEnum.WAIT.getKey());
  334. }
  335. mtOrder.setPlatform(orderDto.getPlatform());
  336. mtOrder.setPointAmount(orderDto.getPointAmount());
  337. mtOrder.setUsePoint(orderDto.getUsePoint());
  338. mtOrder.setOrderMode(orderDto.getOrderMode());
  339. mtOrder.setPayType(orderDto.getPayType());
  340. mtOrder.setOperator(orderDto.getOperator());
  341. mtOrder.setStaffId(orderDto.getStaffId());
  342. mtOrder.setIsVisitor(orderDto.getIsVisitor());
  343. mtOrder.setUpdateTime(new Date());
  344. mtOrder.setDeliveryFee(orderDto.getDeliveryFee() == null ? new BigDecimal(0) : orderDto.getDeliveryFee());
  345. mtOrder.setSettleStatus(SettleStatusEnum.WAIT.getKey());
  346. mtOrder.setConfirmStatus(YesOrNoEnum.NO.getKey());
  347. if (mtOrder.getId() == null || mtOrder.getId() <= 0) {
  348. mtOrder.setCreateTime(new Date());
  349. }
  350. // 核销码
  351. if (orderDto.getPlatform() == null) {
  352. orderDto.setPlatform("");
  353. }
  354. if (mtOrder.getVerifyCode() == null && !orderDto.getPlatform().equals(PlatformTypeEnum.PC.getCode())) {
  355. mtOrder.setVerifyCode(SeqUtil.getRandomNumber(6));
  356. }
  357. // 首先生成订单
  358. mtOrderMapper.insert(mtOrder);
  359. MtOrder orderInfo = mtOrderMapper.selectById(mtOrder.getId());
  360. mtOrder.setId(orderInfo.getId());
  361. // 会员相关信息
  362. MtUser userInfo = memberService.queryMemberById(orderDto.getUserId());
  363. MtUserGrade userGrade = userGradeService.queryUserGradeById(orderDto.getMerchantId(), userInfo.getGradeId() != null ? Integer.parseInt(userInfo.getGradeId()) : 1, orderDto.getUserId());
  364. BigDecimal percent = new BigDecimal("0");
  365. if (userGrade != null && userGrade.getDiscount() != null && userGrade.getDiscount() > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) {
  366. // 会员折扣
  367. percent = new BigDecimal(userGrade.getDiscount()).divide(new BigDecimal("10"), BigDecimal.ROUND_CEILING, 4);
  368. if (percent.compareTo(new BigDecimal("0")) <= 0) {
  369. percent = new BigDecimal("1");
  370. }
  371. }
  372. // 如果没有指定店铺,则读取默认的店铺
  373. if (orderDto.getStoreId() == null || orderDto.getStoreId() <= 0) {
  374. Map<String, Object> params = new HashMap<>();
  375. params.put("status", StatusEnum.ENABLED.getKey());
  376. params.put("is_default", YesOrNoEnum.YES.getKey());
  377. List<MtStore> storeList = storeService.queryStoresByParams(params);
  378. if (storeList.size() > 0) {
  379. mtOrder.setStoreId(storeList.get(0).getId());
  380. } else {
  381. mtOrder.setStoreId(0);
  382. }
  383. }
  384. mtOrder.setUpdateTime(new Date());
  385. if (mtOrder.getCreateTime() == null) {
  386. mtOrder.setCreateTime(new Date());
  387. }
  388. // 计算商品订单总金额
  389. List<MtCart> cartList = new ArrayList<>();
  390. Map<String, Object> cartData = new HashMap<>();
  391. if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey())) {
  392. if (StringUtil.isNotEmpty(orderDto.getCartIds())) {
  393. Map<String, Object> param = new HashMap<>();
  394. param.put("status", StatusEnum.ENABLED.getKey());
  395. param.put("ids", orderDto.getCartIds());
  396. cartList = cartService.queryCartListByParams(param);
  397. if (cartList.size() < 1) {
  398. throw new BusinessCheckException("生成订单失败,请稍后重试");
  399. }
  400. } else {
  401. if (orderDto.getGoodsId() == null || orderDto.getGoodsId() <= 0) {
  402. throw new BusinessCheckException("生成订单失败,请稍后重试");
  403. }
  404. // 直接购买
  405. MtCart mtCart = new MtCart();
  406. mtCart.setGoodsId(orderDto.getGoodsId());
  407. mtCart.setSkuId(orderDto.getSkuId());
  408. mtCart.setNum(orderDto.getBuyNum());
  409. mtCart.setId(0);
  410. mtCart.setUserId(orderDto.getUserId());
  411. mtCart.setStatus(StatusEnum.ENABLED.getKey());
  412. cartList.add(mtCart);
  413. }
  414. boolean isUsePoint = orderDto.getUsePoint() > 0 ? true : false;
  415. cartData = calculateCartGoods(orderInfo.getMerchantId(), orderDto.getUserId(), cartList, orderDto.getCouponId(), isUsePoint, orderDto.getPlatform(), orderInfo.getOrderMode());
  416. mtOrder.setAmount(new BigDecimal(cartData.get("totalPrice").toString()));
  417. mtOrder.setUsePoint(Integer.parseInt(cartData.get("usePoint").toString()));
  418. mtOrder.setDiscount(new BigDecimal(cartData.get("couponAmount").toString()));
  419. // 实付金额
  420. BigDecimal payAmount = mtOrder.getAmount().subtract(mtOrder.getPointAmount()).subtract(mtOrder.getDiscount());
  421. if (payAmount.compareTo(new BigDecimal("0")) > 0) {
  422. mtOrder.setPayAmount(payAmount);
  423. } else {
  424. mtOrder.setPayAmount(new BigDecimal("0"));
  425. }
  426. // 购物使用了卡券
  427. if (mtOrder.getCouponId() > 0) {
  428. // 查询是否适用商品
  429. MtUserCoupon userCoupon = mtUserCouponMapper.selectById(mtOrder.getCouponId());
  430. if (userCoupon != null) {
  431. MtCoupon couponInfo = couponService.queryCouponById(userCoupon.getCouponId());
  432. if (couponInfo.getApplyGoods() != null && couponInfo.getApplyGoods().equals(ApplyGoodsEnum.PARK_GOODS.getKey())) {
  433. List<MtCouponGoods> couponGoodsList = mtCouponGoodsMapper.getCouponGoods(couponInfo.getId());
  434. if (couponGoodsList != null && couponGoodsList.size() > 0 && cartList.size() > 0) {
  435. List<Integer> applyGoodsIds = new ArrayList<>();
  436. List<Integer> goodsIds = new ArrayList<>();
  437. for (MtCouponGoods mtCouponGoods : couponGoodsList) {
  438. applyGoodsIds.add(mtCouponGoods.getGoodsId());
  439. }
  440. for (MtCart mtCart : cartList) {
  441. goodsIds.add(mtCart.getGoodsId());
  442. }
  443. List<Integer> intersection = applyGoodsIds.stream()
  444. .filter(goodsIds::contains)
  445. .collect(Collectors.toList());
  446. if (intersection.size() == 0) {
  447. throw new BusinessCheckException("该卡券不适用于购买的商品列表");
  448. }
  449. }
  450. }
  451. }
  452. updateOrder(mtOrder);
  453. String useCode = couponService.useCoupon(mtOrder.getCouponId(), mtOrder.getUserId(), mtOrder.getStoreId(), mtOrder.getId(), mtOrder.getDiscount(), "购物使用卡券");
  454. // 卡券使用失败
  455. if (StringUtil.isEmpty(useCode)) {
  456. mtOrder.setDiscount(new BigDecimal("0"));
  457. mtOrder.setCouponId(0);
  458. }
  459. }
  460. }
  461. // 会员付款类订单
  462. if (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) {
  463. if (userInfo != null && userInfo.getGradeId() != null && orderDto.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) {
  464. if (percent.compareTo(new BigDecimal("0")) > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) {
  465. // 会员折扣
  466. BigDecimal payAmountDiscount = mtOrder.getAmount().multiply(percent);
  467. if (payAmountDiscount.compareTo(new BigDecimal("0")) > 0) {
  468. mtOrder.setDiscount(mtOrder.getDiscount().add(mtOrder.getAmount().subtract(payAmountDiscount)));
  469. mtOrder.setPayAmount(payAmountDiscount);
  470. } else {
  471. mtOrder.setPayAmount(new BigDecimal("0"));
  472. }
  473. }
  474. }
  475. }
  476. // 再次更新订单
  477. try {
  478. orderInfo = updateOrder(mtOrder);
  479. } catch (Exception e) {
  480. logger.error("OrderService 生成订单失败...");
  481. throw new BusinessCheckException("生成订单失败,请稍后重试");
  482. }
  483. // 扣减积分
  484. if (orderDto.getUsePoint() != null && orderDto.getUsePoint() > 0) {
  485. try {
  486. MtPoint reqPointDto = new MtPoint();
  487. reqPointDto.setUserId(orderDto.getUserId());
  488. reqPointDto.setAmount(-orderDto.getUsePoint());
  489. reqPointDto.setOrderSn(orderSn);
  490. reqPointDto.setDescription("支付扣除" + orderDto.getUsePoint() + "积分");
  491. reqPointDto.setOperator("");
  492. pointService.addPoint(reqPointDto);
  493. } catch (BusinessCheckException e) {
  494. logger.error("OrderService 扣减积分失败...{}", e.getMessage());
  495. throw new BusinessCheckException("扣减积分失败,请稍后重试");
  496. }
  497. }
  498. // 如果是商品订单,生成订单商品
  499. if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey()) && cartList.size() > 0) {
  500. Object listObject = cartData.get("list");
  501. List<ResCartDto> lists =(ArrayList<ResCartDto>)listObject;
  502. BigDecimal memberDiscount = new BigDecimal("0");
  503. for (ResCartDto cart : lists) {
  504. MtOrderGoods orderGoods = new MtOrderGoods();
  505. orderGoods.setOrderId(orderInfo.getId());
  506. orderGoods.setGoodsId(cart.getGoodsId());
  507. orderGoods.setSkuId(cart.getSkuId());
  508. orderGoods.setNum(cart.getNum());
  509. // 计算会员折扣
  510. BigDecimal price = cart.getGoodsInfo().getPrice();
  511. boolean isDiscount = cart.getGoodsInfo().getIsMemberDiscount().equals(YesOrNoEnum.YES.getKey()) ? true : false;
  512. if (percent.compareTo(new BigDecimal("0")) > 0 && isDiscount) {
  513. orderGoods.setPrice(price.multiply(percent));
  514. BigDecimal discount = price.subtract(price.multiply(percent)).multiply(new BigDecimal(cart.getNum()));
  515. orderGoods.setDiscount(discount);
  516. memberDiscount = memberDiscount.add(discount);
  517. } else {
  518. orderGoods.setPrice(price);
  519. orderGoods.setDiscount(new BigDecimal("0"));
  520. }
  521. orderGoods.setStatus(StatusEnum.ENABLED.getKey());
  522. orderGoods.setCreateTime(new Date());
  523. orderGoods.setUpdateTime(new Date());
  524. mtOrderGoodsMapper.insert(orderGoods);
  525. // 扣减库存
  526. MtGoods goodsInfo = mtGoodsMapper.selectById(cart.getGoodsId());
  527. if (goodsInfo.getIsSingleSpec().equals(YesOrNoEnum.YES.getKey())) {
  528. // 单规格减去库存
  529. Double stock = goodsInfo.getStock() - cart.getNum();
  530. if (stock < 0) {
  531. throw new BusinessCheckException("商品“" + goodsInfo.getName() + "”库存不足,订单提交失败");
  532. }
  533. goodsInfo.setStock(stock);
  534. mtGoodsMapper.updateById(goodsInfo);
  535. } else {
  536. // 多规格减去库存
  537. MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(cart.getSkuId());
  538. if (mtGoodsSku != null) {
  539. Double stock = mtGoodsSku.getStock() - cart.getNum();
  540. if (stock < 0) {
  541. throw new BusinessCheckException("商品sku编码“" + mtGoodsSku.getSkuNo() +"”库存不足,订单提交失败");
  542. }
  543. mtGoodsSku.setStock(stock);
  544. mtGoodsSkuMapper.updateById(mtGoodsSku);
  545. if (goodsInfo.getStock() != null && goodsInfo.getStock() > 0) {
  546. Double goodsStock = goodsInfo.getStock() - cart.getNum();
  547. if (goodsStock >= 0) {
  548. goodsInfo.setStock(goodsStock);
  549. mtGoodsMapper.updateById(goodsInfo);
  550. }
  551. }
  552. }
  553. }
  554. if (cart.getId() > 0) {
  555. mtCartMapper.deleteById(cart.getId());
  556. }
  557. }
  558. // 会员折扣
  559. if (memberDiscount.compareTo(new BigDecimal("0")) > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) {
  560. orderInfo.setDiscount(orderInfo.getDiscount().add(memberDiscount));
  561. if (orderInfo.getPayAmount().subtract(memberDiscount).compareTo(new BigDecimal("0")) > 0) {
  562. orderInfo.setPayAmount(orderInfo.getPayAmount().subtract(memberDiscount));
  563. } else {
  564. orderInfo.setPayAmount(new BigDecimal("0"));
  565. }
  566. orderInfo.setUpdateTime(new Date());
  567. orderInfo = updateOrder(orderInfo);
  568. }
  569. // 需要配送的订单,生成配送地址
  570. if (orderDto.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) {
  571. Map<String, Object> params = new HashMap<>();
  572. params.put("userId", orderDto.getUserId().toString());
  573. params.put("isDefault", YesOrNoEnum.YES.getKey());
  574. List<MtAddress> addressList = addressService.queryListByParams(params);
  575. MtAddress mtAddress;
  576. if (addressList.size() > 0) {
  577. mtAddress = addressList.get(0);
  578. } else {
  579. throw new BusinessCheckException("配送地址出错了,请重新选择配送地址");
  580. }
  581. // 是否超出起送范围
  582. MtSetting deliveryRange = settingService.querySettingByName(orderInfo.getMerchantId(), SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.DELIVERY_RANGE.getKey());
  583. if (deliveryRange != null && StringUtil.isNotEmpty(deliveryRange.getValue()) && (Double.parseDouble(deliveryRange.getValue()) > 0)) {
  584. MtStore mtStore = storeService.queryStoreById(orderInfo.getStoreId());
  585. if (mtStore != null && StringUtil.isNotEmpty(mtStore.getLatitude()) && StringUtil.isNotEmpty(mtStore.getLongitude())) {
  586. String address = "";
  587. if (mtAddress.getProvinceId() != null && mtAddress.getProvinceId() > 0) {
  588. MtRegion mtProvince = mtRegionMapper.selectById(mtAddress.getProvinceId());
  589. if (mtProvince != null) {
  590. address = mtProvince.getName();
  591. }
  592. }
  593. if (mtAddress.getCityId() != null && mtAddress.getCityId() > 0) {
  594. MtRegion mtCity = mtRegionMapper.selectById(mtAddress.getCityId());
  595. if (mtCity != null) {
  596. address = address + mtCity.getName();
  597. }
  598. }
  599. if (mtAddress.getRegionId() != null && mtAddress.getRegionId() > 0) {
  600. MtRegion mtRegion = mtRegionMapper.selectById(mtAddress.getRegionId());
  601. if (mtRegion != null) {
  602. address = address + mtRegion.getName();
  603. }
  604. }
  605. address = address + mtAddress.getDetail();
  606. Map<String, Object> latAndLng = storeService.getLatAndLngByAddress(address);
  607. if (StringUtil.isNotEmpty(latAndLng.get("lat").toString()) && StringUtil.isNotEmpty(latAndLng.get("lng").toString())) {
  608. Double distance = storeService.getDistance(mtStore.getLongitude() + "," + mtStore.getLatitude(), latAndLng.get("lng").toString() + "," + latAndLng.get("lat").toString());
  609. Double limitDistance = Double.parseDouble(deliveryRange.getValue());
  610. logger.info("订单地址:{},配送距离为:{}", address, distance);
  611. if (distance > limitDistance) {
  612. throw new BusinessCheckException("抱歉,配送距离超过了" + limitDistance + "公里,请重新选择配送地址!");
  613. }
  614. }
  615. }
  616. }
  617. MtOrderAddress orderAddress = new MtOrderAddress();
  618. orderAddress.setOrderId(orderInfo.getId());
  619. orderAddress.setUserId(orderDto.getUserId());
  620. orderAddress.setName(mtAddress.getName());
  621. orderAddress.setMobile(mtAddress.getMobile());
  622. orderAddress.setCityId(mtAddress.getCityId());
  623. orderAddress.setProvinceId(mtAddress.getProvinceId());
  624. orderAddress.setRegionId(mtAddress.getRegionId());
  625. orderAddress.setDetail(mtAddress.getDetail());
  626. orderAddress.setCreateTime(new Date());
  627. mtOrderAddressMapper.insert(orderAddress);
  628. }
  629. }
  630. return orderInfo;
  631. }
  632. /**
  633. * 订单结算
  634. * @param request
  635. * @param param 结算参数
  636. * @throws BusinessCheckException
  637. * @return
  638. * */
  639. @Override
  640. @Transactional(rollbackFor = Exception.class)
  641. public Map<String, Object> doSettle(HttpServletRequest request, SettlementParam param) throws BusinessCheckException {
  642. String token = request.getHeader("Access-Token");
  643. String isWechat = request.getHeader("isWechat") == null ? YesOrNoEnum.NO.getKey() : request.getHeader("isWechat");
  644. Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId"));
  645. String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform");
  646. String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo");
  647. String ip = CommonUtil.getIPFromHttpRequest(request);
  648. String cartIds = param.getCartIds() == null ? "" : param.getCartIds();
  649. Integer targetId = param.getTargetId() == null ? 0 : Integer.parseInt(param.getTargetId()); // 储值卡、升级等级必填
  650. String selectNum = param.getSelectNum() == null ? "" : param.getSelectNum(); // 储值卡必填
  651. String remark = param.getRemark() == null ? "" : param.getRemark();
  652. String type = param.getType() == null ? "" : param.getType(); // 订单类型
  653. String payAmount = param.getPayAmount() == null ? "0" : StringUtil.isEmpty(param.getPayAmount()) ? "0" : param.getPayAmount(); // 支付金额
  654. Integer usePoint = param.getUsePoint() == null ? 0 : param.getUsePoint(); // 使用积分数量
  655. Integer couponId = param.getCouponId() == null ? 0 : param.getCouponId(); // 会员卡券ID
  656. String payType = param.getPayType() == null ? PayTypeEnum.JSAPI.getKey() : param.getPayType();
  657. String authCode = param.getAuthCode() == null ? "" : param.getAuthCode();
  658. Integer userId = param.getUserId() == null ? 0 : param.getUserId(); // 指定下单会员 eg:收银功能
  659. String cashierPayAmount = param.getCashierPayAmount() == null ? "" : param.getCashierPayAmount(); // 收银台实付金额
  660. String cashierDiscountAmount = param.getCashierDiscountAmount() == null ? "" : param.getCashierDiscountAmount(); // 收银台优惠金额
  661. Integer goodsId = param.getGoodsId() == null ? 0 : param.getGoodsId(); // 立即购买商品ID
  662. Integer skuId = param.getSkuId() == null ? 0 : param.getSkuId(); // 立即购买商品skuId
  663. Double buyNum = param.getBuyNum() == null ? 1.0 : param.getBuyNum(); // 立即购买商品数量
  664. String orderMode = StringUtil.isEmpty(param.getOrderMode()) ? OrderModeEnum.ONESELF.getKey() : param.getOrderMode(); // 订单模式(配送or自取)
  665. Integer orderId = param.getOrderId() == null ? null : param.getOrderId(); // 订单ID
  666. Integer merchantId = merchantService.getMerchantId(merchantNo);
  667. UserInfo loginInfo = TokenUtil.getUserInfoByToken(token);
  668. MtUser userInfo = null;
  669. if (loginInfo != null) {
  670. userInfo = memberService.queryMemberById(loginInfo.getId());
  671. }
  672. // 后台管理员或店员操作
  673. String operator = null;
  674. Integer staffId = 0;
  675. String isVisitor = YesOrNoEnum.NO.getKey();
  676. AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
  677. if (accountInfo != null) {
  678. operator = accountInfo.getAccountName();
  679. staffId = accountInfo.getStaffId() == null ? 0 : accountInfo.getStaffId();
  680. if (param.getStaffId() != null && param.getStaffId() > 0) {
  681. staffId = param.getStaffId();
  682. }
  683. storeId = accountInfo.getStoreId();
  684. merchantId = accountInfo.getMerchantId();
  685. if (storeId <= 0) {
  686. MtMerchant mtMerchant = merchantService.queryMerchantById(merchantId);
  687. if (mtMerchant != null) {
  688. MtStore mtStore = storeService.getDefaultStore(mtMerchant.getNo());
  689. if (mtStore != null) {
  690. storeId = mtStore.getId();
  691. }
  692. }
  693. }
  694. if (userId < 1) {
  695. isVisitor = YesOrNoEnum.YES.getKey();
  696. }
  697. }
  698. if (userInfo == null) {
  699. MtUser user = memberService.getCurrentUserInfo(request, userId, token);
  700. if (user != null) {
  701. userInfo = memberService.queryMemberById(user.getId());
  702. }
  703. } else {
  704. MtStaff mtStaff = staffService.queryStaffByUserId(userInfo.getId());
  705. if (mtStaff == null) {
  706. mtStaff = staffService.queryStaffByMobile(userInfo.getMobile());
  707. }
  708. if (mtStaff != null) {
  709. operator = mtStaff.getRealName();
  710. }
  711. }
  712. MtSetting config = settingService.querySettingByName(merchantId, storeId, SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.IS_CLOSE.getKey());
  713. if (config != null && config.getValue().equals(YesOrNoEnum.TRUE.getKey())) {
  714. throw new BusinessCheckException("系统已关闭交易功能,请稍后再试!");
  715. }
  716. // 收银台通过手机号自动注册会员信息
  717. if ((userInfo == null || StringUtil.isEmpty(token))) {
  718. String mobile = param.getMobile() == null ? "" : param.getMobile();
  719. if (StringUtil.isNotEmpty(operator) && StringUtil.isNotEmpty(mobile)) {
  720. userInfo = memberService.queryMemberByMobile(merchantId, mobile);
  721. // 自动注册会员
  722. if (userInfo == null) {
  723. userInfo = memberService.addMemberByMobile(merchantId, mobile, "0", ip);
  724. }
  725. }
  726. }
  727. if (userInfo == null) {
  728. if (StringUtil.isNotEmpty(operator)) {
  729. throw new BusinessCheckException("该管理员还未关联店铺员工");
  730. } else {
  731. throw new BusinessCheckException("请先登录");
  732. }
  733. }
  734. if (userId <= 0) {
  735. userId = userInfo.getId();
  736. } else {
  737. if (StringUtil.isNotEmpty(operator)) {
  738. userInfo = memberService.queryMemberById(userId);
  739. }
  740. }
  741. param.setUserId(userId);
  742. // 订单所属店铺
  743. if (storeId < 1) {
  744. if (userInfo.getStoreId() > 0) {
  745. storeId = userInfo.getStoreId();
  746. }
  747. }
  748. // 生成订单数据
  749. OrderDto orderDto = new OrderDto();
  750. orderDto.setId(orderId);
  751. orderDto.setRemark(remark);
  752. orderDto.setUserId(userId);
  753. orderDto.setMerchantId(merchantId);
  754. orderDto.setStoreId(storeId);
  755. orderDto.setType(type);
  756. orderDto.setGoodsId(goodsId);
  757. orderDto.setSkuId(skuId);
  758. orderDto.setBuyNum(buyNum);
  759. orderDto.setOrderMode(orderMode);
  760. orderDto.setOperator(operator);
  761. orderDto.setPayType(payType);
  762. orderDto.setCouponId(0);
  763. orderDto.setStaffId(staffId);
  764. orderDto.setIsVisitor(isVisitor);
  765. orderDto.setPlatform(platform);
  766. MtSetting pointSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.POINT.getKey(), PointSettingEnum.CAN_USE_AS_MONEY.getKey());
  767. // 使用积分数量
  768. if (pointSetting != null && pointSetting.getValue().equals(YesOrNoEnum.TRUE.getKey())) {
  769. orderDto.setUsePoint(usePoint);
  770. } else {
  771. orderDto.setUsePoint(0);
  772. usePoint = 0;
  773. }
  774. orderDto.setPointAmount(new BigDecimal("0"));
  775. orderDto.setDiscount(new BigDecimal("0"));
  776. orderDto.setPayAmount(new BigDecimal("0"));
  777. orderDto.setAmount(new BigDecimal("0"));
  778. orderDto.setCartIds(cartIds);
  779. // 储值卡的订单
  780. if (orderDto.getType().equals(OrderTypeEnum.PRESTORE.getKey())) {
  781. orderDto.setCouponId(targetId);
  782. String orderParam = "";
  783. BigDecimal totalAmount = new BigDecimal(0);
  784. MtCoupon couponInfo = couponService.queryCouponById(targetId);
  785. String inRule = couponInfo.getInRule();
  786. String[] selectNumArr = selectNum.split(",");
  787. String[] ruleArr = inRule.split(",");
  788. for (int i = 0; i < ruleArr.length; i++) {
  789. String item = ruleArr[i] + "_" + (StringUtil.isNotEmpty(selectNumArr[i]) ? selectNumArr[i] : 0);
  790. String[] itemArr = item.split("_");
  791. // 预存金额
  792. BigDecimal price = new BigDecimal(itemArr[0]);
  793. // 预存数量
  794. BigDecimal num = new BigDecimal(selectNumArr[i]);
  795. BigDecimal amount = price.multiply(num);
  796. totalAmount = totalAmount.add(amount);
  797. orderParam = StringUtil.isEmpty(orderParam) ? item : orderParam + ","+item;
  798. }
  799. orderDto.setParam(orderParam);
  800. orderDto.setAmount(totalAmount);
  801. payAmount = totalAmount.toString();
  802. }
  803. // 付款订单
  804. if (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) {
  805. orderDto.setAmount(new BigDecimal(payAmount));
  806. orderDto.setPayAmount(new BigDecimal(payAmount));
  807. orderDto.setDiscount(new BigDecimal("0"));
  808. orderDto.setDeliveryFee(new BigDecimal("0"));
  809. }
  810. // 会员升级订单
  811. if (orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
  812. orderDto.setParam(targetId.toString());
  813. orderDto.setCouponId(couponId);
  814. MtUserGrade userGrade = userGradeService.queryUserGradeById(merchantId, targetId, orderDto.getUserId());
  815. if (userGrade != null) {
  816. orderDto.setRemark("付费升级" + userGrade.getName());
  817. orderDto.setAmount(new BigDecimal(userGrade.getCatchValue().toString()));
  818. }
  819. }
  820. // 商品订单
  821. if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey())) {
  822. orderDto.setCouponId(couponId);
  823. }
  824. // 商品订单且配送要加上配送费用
  825. if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey()) && orderDto.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) {
  826. MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.DELIVERY_FEE.getKey());
  827. if (mtSetting != null && StringUtil.isNotEmpty(mtSetting.getValue())) {
  828. BigDecimal deliveryFee = new BigDecimal(mtSetting.getValue());
  829. if (deliveryFee.compareTo(new BigDecimal("0")) > 0) {
  830. orderDto.setDeliveryFee(deliveryFee);
  831. }
  832. }
  833. }
  834. // 使用积分抵扣
  835. if (usePoint > 0) {
  836. List<MtSetting> settingList = settingService.getSettingList(merchantId, SettingTypeEnum.POINT.getKey());
  837. String canUsedAsMoney = YesOrNoEnum.FALSE.getKey();
  838. String exchangeNeedPoint = "0";
  839. for (MtSetting setting : settingList) {
  840. if (setting.getName().equals("canUsedAsMoney")) {
  841. canUsedAsMoney = setting.getValue();
  842. } else if (setting.getName().equals("exchangeNeedPoint")) {
  843. exchangeNeedPoint = setting.getValue();
  844. }
  845. }
  846. // 是否可以使用积分,并且积分数量足够
  847. if (canUsedAsMoney.equals(YesOrNoEnum.TRUE.getKey()) && Float.parseFloat(exchangeNeedPoint) > 0 && (userInfo.getPoint() >= usePoint)) {
  848. orderDto.setUsePoint(usePoint);
  849. orderDto.setPointAmount(new BigDecimal(usePoint).divide(new BigDecimal(exchangeNeedPoint), BigDecimal.ROUND_CEILING, 4));
  850. if (orderDto.getPayAmount().compareTo(orderDto.getPointAmount()) > 0) {
  851. orderDto.setPayAmount(orderDto.getPayAmount().subtract(orderDto.getPointAmount()));
  852. } else {
  853. orderDto.setPayAmount(new BigDecimal("0"));
  854. }
  855. }
  856. }
  857. // 首先生成订单,拿到订单ID
  858. MtOrder orderInfo;
  859. try {
  860. orderInfo = saveOrder(orderDto);
  861. } catch (BusinessCheckException e) {
  862. throw new BusinessCheckException(e.getMessage() == null ? "生成订单失败" : e.getMessage());
  863. }
  864. orderDto.setId(orderInfo.getId());
  865. param.setOrderId(orderInfo.getId());
  866. // 收银台实付金额、优惠金额
  867. if ((StringUtil.isNotEmpty(cashierPayAmount) || StringUtil.isNotEmpty(cashierDiscountAmount)) && StringUtil.isNotEmpty(operator)) {
  868. OrderDto reqOrder = new OrderDto();
  869. reqOrder.setId(orderInfo.getId());
  870. if (orderInfo.getAmount().compareTo(new BigDecimal("0")) <= 0) {
  871. reqOrder.setAmount(new BigDecimal(cashierPayAmount).add(new BigDecimal(cashierDiscountAmount)));
  872. } else {
  873. reqOrder.setAmount(orderInfo.getAmount());
  874. }
  875. if (new BigDecimal(cashierDiscountAmount).compareTo(new BigDecimal("0")) > 0) {
  876. reqOrder.setDiscount(new BigDecimal(cashierDiscountAmount).add(orderInfo.getDiscount()));
  877. } else {
  878. reqOrder.setDiscount(orderInfo.getDiscount());
  879. }
  880. BigDecimal realPayAmount = reqOrder.getAmount().subtract(reqOrder.getDiscount());
  881. if (realPayAmount.compareTo(new BigDecimal("0")) < 0) {
  882. realPayAmount = new BigDecimal("0");
  883. }
  884. reqOrder.setPayAmount(realPayAmount);
  885. updateOrder(reqOrder);
  886. orderInfo = getOrderInfo(orderInfo.getId());
  887. }
  888. // 订单中使用卡券抵扣(付款订单、会员升级订单)
  889. if (couponId > 0 && (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) || orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
  890. if (orderDto.getAmount().compareTo(new BigDecimal("0")) > 0) {
  891. MtUserCoupon userCouponInfo = userCouponService.getUserCouponDetail(couponId);
  892. if (userCouponInfo != null) {
  893. MtCoupon couponInfo = couponService.queryCouponById(userCouponInfo.getCouponId());
  894. if (couponInfo != null) {
  895. boolean isEffective = couponService.isCouponEffective(couponInfo, userCouponInfo);
  896. if (isEffective && userCouponInfo.getUserId().equals(orderDto.getUserId())) {
  897. // 优惠券,直接减去优惠券金额
  898. if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
  899. // 检查是否会员升级专用卡券
  900. boolean canUse = true;
  901. if (couponInfo.getUseFor() != null && StringUtil.isNotEmpty(couponInfo.getUseFor())) {
  902. if (orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
  903. if (!couponInfo.getUseFor().equals(CouponUseForEnum.MEMBER_GRADE.getKey())) {
  904. canUse = false;
  905. }
  906. }
  907. }
  908. if (canUse) {
  909. String useCode = couponService.useCoupon(couponId, orderDto.getUserId(), orderDto.getStoreId(), orderInfo.getId(), userCouponInfo.getAmount(), "核销");
  910. if (StringUtil.isNotEmpty(useCode)) {
  911. orderDto.setCouponId(couponId);
  912. orderDto.setDiscount(orderInfo.getDiscount().add(userCouponInfo.getAmount()));
  913. updateOrder(orderDto);
  914. }
  915. }
  916. } else if(couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  917. // 储值卡,减去余额
  918. BigDecimal useCouponAmount = userCouponInfo.getBalance();
  919. if (orderInfo.getPayAmount().compareTo(userCouponInfo.getBalance()) <= 0) {
  920. useCouponAmount = orderInfo.getPayAmount();
  921. }
  922. try {
  923. String useCode = couponService.useCoupon(couponId, orderDto.getUserId(), orderDto.getStoreId(), orderInfo.getId(), useCouponAmount, "核销");
  924. if (StringUtil.isNotEmpty(useCode)) {
  925. orderDto.setCouponId(couponId);
  926. orderDto.setDiscount(orderInfo.getDiscount().add(useCouponAmount));
  927. orderDto.setPayAmount(orderInfo.getPayAmount().subtract(useCouponAmount));
  928. updateOrder(orderDto);
  929. }
  930. } catch (BusinessCheckException e) {
  931. throw new BusinessCheckException(e.getMessage() == null ? "生成订单失败" : e.getMessage());
  932. }
  933. }
  934. }
  935. }
  936. }
  937. }
  938. }
  939. // 生成支付订单
  940. orderInfo = getOrderInfo(orderInfo.getId());
  941. BigDecimal realPayAmount = orderInfo.getAmount().subtract(new BigDecimal(orderInfo.getDiscount().toString())).subtract(new BigDecimal(orderInfo.getPointAmount().toString())).add(orderInfo.getDeliveryFee());
  942. // 支付类的订单,检查余额是否充足
  943. if (type.equals(OrderTypeEnum.PAYMENT.getKey()) && payType.equals(PayTypeEnum.BALANCE.getKey())) {
  944. if (userInfo.getBalance() == null || realPayAmount.compareTo(userInfo.getBalance()) > 0) {
  945. throw new BusinessCheckException("会员余额不足");
  946. }
  947. if (StringUtil.isNotEmpty(cashierPayAmount)) {
  948. if (userInfo.getBalance() == null || new BigDecimal(cashierPayAmount).compareTo(userInfo.getBalance()) > 0) {
  949. throw new BusinessCheckException("会员余额不足");
  950. }
  951. }
  952. }
  953. MtSetting delivery = settingService.querySettingByName(merchantId, SettingTypeEnum.ORDER.getKey(),OrderSettingEnum.DELIVERY_MIN_AMOUNT.getKey());
  954. if (delivery != null && orderInfo.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) {
  955. BigDecimal deliveryMinAmount = new BigDecimal(delivery.getValue());
  956. if (deliveryMinAmount.compareTo(new BigDecimal("0")) > 0 && deliveryMinAmount.compareTo(orderInfo.getAmount()) > 0) {
  957. throw new BusinessCheckException("订单起送金额:" + deliveryMinAmount + "元");
  958. }
  959. }
  960. ResponseObject paymentInfo = null;
  961. String errorMessage = "";
  962. // 应付金额大于0才提交微信支付
  963. if (realPayAmount.compareTo(new BigDecimal("0")) > 0) {
  964. if (payType.equals(PayTypeEnum.CASH.getKey()) && StringUtil.isNotEmpty(operator)) {
  965. // 收银台现金支付,更新为已支付
  966. setOrderPayed(orderInfo.getId(), null);
  967. } else if (payType.equals(PayTypeEnum.STORE.getKey())) {
  968. // 门店支付,不做任何操作
  969. } else if(payType.equals(PayTypeEnum.BALANCE.getKey())) {
  970. // 余额支付
  971. MtBalance balance = new MtBalance();
  972. balance.setMobile(userInfo.getMobile());
  973. balance.setOrderSn(orderInfo.getOrderSn());
  974. balance.setUserId(userInfo.getId());
  975. balance.setMerchantId(userInfo.getMerchantId());
  976. balance.setStoreId(orderInfo.getStoreId());
  977. BigDecimal balanceAmount = realPayAmount.subtract(realPayAmount).subtract(realPayAmount);
  978. balance.setAmount(balanceAmount);
  979. boolean isPay = balanceService.addBalance(balance, true);
  980. if (isPay) {
  981. setOrderPayed(orderInfo.getId(), realPayAmount);
  982. } else {
  983. errorMessage = PropertiesUtil.getResponseErrorMessageByCode(5001);
  984. }
  985. } else {
  986. BigDecimal wxPayAmount = realPayAmount.multiply(new BigDecimal("100"));
  987. // 扫码支付,先返回不处理,后面拿到支付二维码再处理
  988. if ((payType.equals(PayTypeEnum.MICROPAY.getKey()) || payType.equals(PayTypeEnum.ALISCAN.getKey())) && StringUtil.isEmpty(authCode)) {
  989. paymentInfo = new ResponseObject(200, "请求成功", new HashMap<>());
  990. } else {
  991. paymentInfo = paymentService.createPrepayOrder(userInfo, orderInfo, (wxPayAmount.intValue()), authCode, 0, ip, platform, isWechat);
  992. }
  993. if (paymentInfo.getData() == null) {
  994. errorMessage = StringUtil.isNotEmpty(paymentInfo.getMessage()) ? paymentInfo.getMessage() : PropertiesUtil.getResponseErrorMessageByCode(3000);
  995. }
  996. }
  997. } else {
  998. // 应付金额是0,直接更新为已支付
  999. setOrderPayed(orderInfo.getId(), null);
  1000. }
  1001. orderInfo = getOrderInfo(orderInfo.getId());
  1002. Map<String, Object> outParams = new HashMap();
  1003. outParams.put("isCreated", true);
  1004. outParams.put("orderInfo", orderInfo);
  1005. outParams.put("payType", payType);
  1006. if (paymentInfo != null) {
  1007. outParams.put("payment", paymentInfo.getData());
  1008. } else {
  1009. outParams.put("payment", null);
  1010. }
  1011. // 1分钟后发送小程序订阅消息
  1012. Date nowTime = new Date();
  1013. Date sendTime = new Date(nowTime.getTime() + 60000);
  1014. Map<String, Object> params = new HashMap<>();
  1015. String dateTime = DateUtil.formatDate(Calendar.getInstance().getTime(), "yyyy-MM-dd HH:mm");
  1016. params.put("time", dateTime);
  1017. params.put("orderSn", orderInfo.getOrderSn());
  1018. params.put("remark", "您的订单已生成,请留意~");
  1019. weixinService.sendSubscribeMessage(merchantId, userInfo.getId(), userInfo.getOpenId(), WxMessageEnum.ORDER_CREATED.getKey(), "pages/order/index", params, sendTime);
  1020. if (StringUtil.isNotEmpty(errorMessage)) {
  1021. throw new BusinessCheckException(errorMessage);
  1022. } else {
  1023. return outParams;
  1024. }
  1025. }
  1026. /**
  1027. * 获取订单详情
  1028. *
  1029. * @param orderId 订单ID
  1030. * @throws BusinessCheckException
  1031. * @return
  1032. */
  1033. @Override
  1034. public MtOrder getOrderInfo(Integer orderId) {
  1035. if (orderId == null || orderId <= 0) {
  1036. return null;
  1037. }
  1038. return mtOrderMapper.selectById(orderId);
  1039. }
  1040. /**
  1041. * 根据ID获取订单详情
  1042. *
  1043. * @param orderId 订单ID
  1044. * @throws BusinessCheckException
  1045. * @return
  1046. */
  1047. @Override
  1048. public UserOrderDto getOrderById(Integer orderId) throws BusinessCheckException {
  1049. if (orderId == null || orderId <= 0) {
  1050. return null;
  1051. }
  1052. MtOrder mtOrder = mtOrderMapper.selectById(orderId);
  1053. return getOrderDetail(mtOrder, true, true);
  1054. }
  1055. /**
  1056. * 根据ID获取我的订单详情
  1057. *
  1058. * @param orderId 订单ID
  1059. * @throws BusinessCheckException
  1060. * @return
  1061. */
  1062. @Override
  1063. public UserOrderDto getMyOrderById(Integer orderId) throws BusinessCheckException {
  1064. if (orderId == null || orderId <= 0) {
  1065. return null;
  1066. }
  1067. MtOrder mtOrder = mtOrderMapper.selectById(orderId);
  1068. UserOrderDto orderInfo = getOrderDetail(mtOrder, true, true);
  1069. // 售后订单
  1070. MtRefund refund = refundService.getRefundByOrderId(orderId);
  1071. orderInfo.setRefundInfo(refund);
  1072. orderInfo.setVerifyCode(mtOrder.getVerifyCode());
  1073. return orderInfo;
  1074. }
  1075. /**
  1076. * 取消订单
  1077. *
  1078. * @param orderId 订单ID
  1079. * @param remark 取消备注
  1080. * @throws BusinessCheckException
  1081. * @return
  1082. * */
  1083. @Override
  1084. @Transactional(rollbackFor = Exception.class)
  1085. @OperationServiceLog(description = "取消订单")
  1086. public MtOrder cancelOrder(Integer orderId, String remark) throws BusinessCheckException {
  1087. MtOrder mtOrder = mtOrderMapper.selectById(orderId);
  1088. logger.info("orderService.cancelOrder orderId = {}, remark = {}", orderId, remark);
  1089. if (mtOrder != null && mtOrder.getStatus().equals(OrderStatusEnum.CREATED.getKey()) && mtOrder.getPayStatus().equals(PayStatusEnum.WAIT.getKey())) {
  1090. if (StringUtil.isNotEmpty(remark)) {
  1091. mtOrder.setRemark(remark);
  1092. }
  1093. mtOrder.setStatus(OrderStatusEnum.CANCEL.getKey());
  1094. mtOrderMapper.updateById(mtOrder);
  1095. // 返还积分
  1096. if (mtOrder.getPointAmount() != null && mtOrder.getUsePoint() > 0) {
  1097. MtPoint reqPointDto = new MtPoint();
  1098. reqPointDto.setUserId(mtOrder.getUserId());
  1099. reqPointDto.setAmount(mtOrder.getUsePoint());
  1100. reqPointDto.setDescription("订单取消" + mtOrder.getOrderSn() + "退回"+ mtOrder.getUsePoint() +"积分");
  1101. reqPointDto.setOrderSn(mtOrder.getOrderSn());
  1102. reqPointDto.setOperator("");
  1103. pointService.addPoint(reqPointDto);
  1104. }
  1105. // 返还卡券
  1106. List<MtConfirmLog> confirmLogList = mtConfirmLogMapper.getOrderConfirmLogList(mtOrder.getId());
  1107. if (confirmLogList.size() > 0) {
  1108. for (MtConfirmLog log : confirmLogList) {
  1109. MtCoupon couponInfo = couponService.queryCouponById(log.getCouponId());
  1110. MtUserCoupon userCouponInfo = mtUserCouponMapper.selectById(log.getUserCouponId());
  1111. if (userCouponInfo != null) {
  1112. // 优惠券直接置为未使用
  1113. if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
  1114. userCouponInfo.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1115. mtUserCouponMapper.updateById(userCouponInfo);
  1116. }
  1117. // 储值卡把余额加回去
  1118. if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  1119. BigDecimal balance = userCouponInfo.getBalance();
  1120. BigDecimal newBalance = balance.add(log.getAmount());
  1121. if (newBalance.compareTo(userCouponInfo.getAmount()) <= 0) {
  1122. userCouponInfo.setBalance(newBalance);
  1123. userCouponInfo.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1124. }
  1125. mtUserCouponMapper.updateById(userCouponInfo);
  1126. }
  1127. // 撤销核销记录
  1128. log.setStatus(StatusEnum.DISABLE.getKey());
  1129. mtConfirmLogMapper.updateById(log);
  1130. }
  1131. }
  1132. }
  1133. // 返还库存
  1134. Map<String, Object> params = new HashMap<>();
  1135. params.put("ORDER_ID", mtOrder.getId());
  1136. List<MtOrderGoods> orderGoodsList = mtOrderGoodsMapper.selectByMap(params);
  1137. if (orderGoodsList != null && orderGoodsList.size() > 0) {
  1138. for (MtOrderGoods mtOrderGoods : orderGoodsList) {
  1139. MtGoods mtGoods = mtGoodsMapper.selectById(mtOrderGoods.getGoodsId());
  1140. // 商品已不存在
  1141. if (mtGoods == null) {
  1142. continue;
  1143. }
  1144. mtGoods.setStock(mtOrderGoods.getNum() + mtGoods.getStock());
  1145. mtGoodsMapper.updateById(mtGoods);
  1146. if (mtOrderGoods.getSkuId() != null && mtOrderGoods.getSkuId() > 0) {
  1147. MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(mtOrderGoods.getSkuId());
  1148. if (mtGoodsSku != null && mtGoodsSku.getStock() != null && mtOrderGoods.getNum() != null) {
  1149. mtGoodsSku.setStock(mtGoodsSku.getStock() + mtOrderGoods.getNum());
  1150. mtGoodsSkuMapper.updateById(mtGoodsSku);
  1151. }
  1152. }
  1153. }
  1154. }
  1155. }
  1156. return mtOrder;
  1157. }
  1158. /**
  1159. * 根据订单ID删除
  1160. *
  1161. * @param orderId 订单ID
  1162. * @param operator 操作人
  1163. * @return
  1164. */
  1165. @Override
  1166. @OperationServiceLog(description = "删除订单信息")
  1167. public void deleteOrder(Integer orderId, String operator) {
  1168. logger.info("orderService.deleteOrder orderId = {}, operator = {}", orderId, operator);
  1169. MtOrder mtOrder = mtOrderMapper.selectById(orderId);
  1170. if (mtOrder == null) {
  1171. return;
  1172. }
  1173. mtOrder.setStatus(OrderStatusEnum.DELETED.getKey());
  1174. mtOrder.setUpdateTime(new Date());
  1175. mtOrder.setOperator(operator);
  1176. mtOrderMapper.updateById(mtOrder);
  1177. }
  1178. /**
  1179. * 根据订单号获取订单详情
  1180. *
  1181. * @param orderSn 订单号
  1182. * @throws BusinessCheckException
  1183. * @return
  1184. */
  1185. @Override
  1186. public UserOrderDto getOrderByOrderSn(String orderSn) throws BusinessCheckException {
  1187. MtOrder orderInfo = mtOrderMapper.findByOrderSn(orderSn);
  1188. if (orderInfo == null) {
  1189. return null;
  1190. }
  1191. return getOrderDetail(orderInfo, true, true);
  1192. }
  1193. /**
  1194. * 根据订单号获取订单信息
  1195. *
  1196. * @param orderSn 订单号
  1197. * @return
  1198. */
  1199. @Override
  1200. public MtOrder getOrderInfoByOrderSn(String orderSn) {
  1201. return mtOrderMapper.findByOrderSn(orderSn);
  1202. }
  1203. /**
  1204. * 更新订单
  1205. *
  1206. * @param orderDto 订单参数
  1207. * @throws BusinessCheckException
  1208. * @return
  1209. */
  1210. @Override
  1211. @Transactional(rollbackFor = Exception.class)
  1212. @OperationServiceLog(description = "更新订单信息")
  1213. public MtOrder updateOrder(OrderDto orderDto) throws BusinessCheckException {
  1214. logger.info("orderService.updateOrder orderDto = {}", JsonUtil.toJSONString(orderDto));
  1215. MtOrder mtOrder = mtOrderMapper.selectById(orderDto.getId());
  1216. if (null == mtOrder || OrderStatusEnum.DELETED.getKey().equals(mtOrder.getStatus())) {
  1217. throw new BusinessCheckException("该订单状态异常");
  1218. }
  1219. mtOrder.setId(orderDto.getId());
  1220. mtOrder.setUpdateTime(new Date());
  1221. if (null != orderDto.getOperator()) {
  1222. mtOrder.setOperator(orderDto.getOperator());
  1223. }
  1224. if (null != orderDto.getStatus()) {
  1225. if (orderDto.getStatus().equals(OrderStatusEnum.CANCEL.getKey()) || orderDto.getStatus().equals(OrderStatusEnum.CREATED.getKey())) {
  1226. orderDto.setPayStatus(PayStatusEnum.WAIT.getKey());
  1227. }
  1228. if (orderDto.getStatus().equals(OrderStatusEnum.CANCEL.getKey())) {
  1229. cancelOrder(orderDto.getId(), "取消订单");
  1230. } else {
  1231. mtOrder.setStatus(orderDto.getStatus());
  1232. }
  1233. if (orderDto.getStatus().equals(OrderStatusEnum.PAID.getKey())) {
  1234. mtOrder.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  1235. mtOrder.setPayTime(new Date());
  1236. }
  1237. }
  1238. if (null != orderDto.getPayAmount()) {
  1239. mtOrder.setPayAmount(orderDto.getPayAmount());
  1240. }
  1241. if (null != orderDto.getAmount()) {
  1242. mtOrder.setAmount(orderDto.getAmount());
  1243. }
  1244. if (null != orderDto.getVerifyCode() && StringUtil.isNotEmpty(orderDto.getVerifyCode())) {
  1245. if (orderDto.getVerifyCode().equals(mtOrder.getVerifyCode()) || StringUtil.isEmpty(mtOrder.getVerifyCode())) {
  1246. mtOrder.setStatus(OrderStatusEnum.DELIVERED.getKey());
  1247. mtOrder.setVerifyCode("");
  1248. mtOrder.setConfirmStatus(YesOrNoEnum.YES.getKey());
  1249. mtOrder.setConfirmTime(new Date());
  1250. mtOrder.setConfirmRemark(orderDto.getConfirmRemark());
  1251. } else {
  1252. throw new BusinessCheckException("核销码错误,请确认!");
  1253. }
  1254. }
  1255. if (null != orderDto.getDiscount()) {
  1256. mtOrder.setDiscount(orderDto.getDiscount());
  1257. }
  1258. if (null != orderDto.getPayTime()) {
  1259. mtOrder.setPayTime(orderDto.getPayTime());
  1260. }
  1261. if (null != orderDto.getPayType()) {
  1262. mtOrder.setPayType(orderDto.getPayType());
  1263. }
  1264. if (null != orderDto.getPayStatus()) {
  1265. mtOrder.setPayStatus(orderDto.getPayStatus());
  1266. }
  1267. if (null != orderDto.getExpressInfo()) {
  1268. mtOrder.setExpressInfo(JSONObject.toJSONString(orderDto.getExpressInfo()));
  1269. }
  1270. if (null != orderDto.getOrderMode()) {
  1271. mtOrder.setOrderMode(orderDto.getOrderMode());
  1272. }
  1273. if (null != orderDto.getRemark()) {
  1274. mtOrder.setRemark(orderDto.getRemark());
  1275. }
  1276. mtOrderMapper.updateById(mtOrder);
  1277. return mtOrder;
  1278. }
  1279. /**
  1280. * 更新订单
  1281. *
  1282. * @param mtOrder 订单信息
  1283. * @return
  1284. * */
  1285. @Override
  1286. @Transactional(rollbackFor = Exception.class)
  1287. public MtOrder updateOrder(MtOrder mtOrder) {
  1288. mtOrder.setUpdateTime(new Date());
  1289. Integer id = mtOrderMapper.updateById(mtOrder);
  1290. if (id > 0) {
  1291. mtOrder = mtOrderMapper.selectById(mtOrder.getId());
  1292. }
  1293. return mtOrder;
  1294. }
  1295. /**
  1296. * 把订单置为已支付
  1297. *
  1298. * @param orderId 订单ID
  1299. * @param payAmount 支付金额
  1300. * @throws BusinessCheckException
  1301. * @return
  1302. * */
  1303. @Override
  1304. @Transactional(rollbackFor = Exception.class)
  1305. @OperationServiceLog(description = "修改订单为已支付")
  1306. public Boolean setOrderPayed(Integer orderId, BigDecimal payAmount) throws BusinessCheckException {
  1307. MtOrder mtOrder = mtOrderMapper.selectById(orderId);
  1308. if (mtOrder == null) {
  1309. return false;
  1310. }
  1311. if (mtOrder.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey())) {
  1312. return true;
  1313. }
  1314. OrderDto reqDto = new OrderDto();
  1315. reqDto.setId(orderId);
  1316. reqDto.setStatus(OrderStatusEnum.PAID.getKey());
  1317. reqDto.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  1318. if (payAmount != null) {
  1319. reqDto.setPayAmount(payAmount);
  1320. }
  1321. reqDto.setPayTime(new Date());
  1322. reqDto.setUpdateTime(new Date());
  1323. updateOrder(reqDto);
  1324. // 处理会员升级订单
  1325. if (mtOrder.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
  1326. openGiftService.openGift(mtOrder.getUserId(), Integer.parseInt(mtOrder.getParam()), false);
  1327. }
  1328. // 处理购物订单
  1329. UserOrderDto orderInfo = getOrderByOrderSn(mtOrder.getOrderSn());
  1330. if (orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey())) {
  1331. try {
  1332. List<OrderGoodsDto> goodsList = orderInfo.getGoods();
  1333. if (goodsList != null && goodsList.size() > 0) {
  1334. for (OrderGoodsDto goodsDto : goodsList) {
  1335. MtGoods mtGoods = goodsService.queryGoodsById(goodsDto.getGoodsId());
  1336. if (mtGoods != null) {
  1337. // 购买虚拟卡券商品发放处理
  1338. if (mtGoods.getType().equals(GoodsTypeEnum.COUPON.getKey()) && mtGoods.getCouponIds() != null && StringUtil.isNotEmpty(mtGoods.getCouponIds())) {
  1339. String couponIds[] = mtGoods.getCouponIds().split(",");
  1340. if (couponIds.length > 0) {
  1341. for (int i = 0; i < couponIds.length; i++) {
  1342. userCouponService.buyCouponItem(orderInfo.getId(), Integer.parseInt(couponIds[i]), orderInfo.getUserId(), orderInfo.getUserInfo().getMobile(), goodsDto.getNum());
  1343. }
  1344. }
  1345. }
  1346. // 将已销售数量+1
  1347. goodsService.updateInitSale(mtGoods.getId(), goodsDto.getNum());
  1348. }
  1349. }
  1350. }
  1351. } catch (BusinessCheckException e) {
  1352. logger.error("会员购买的卡券发送给会员失败......" + e.getMessage());
  1353. }
  1354. }
  1355. // 处理消费返积分,查询返1积分所需消费金额
  1356. MtSetting setting = settingService.querySettingByName(mtOrder.getMerchantId(), SettingTypeEnum.POINT.getKey(), PointSettingEnum.POINT_NEED_CONSUME.getKey());
  1357. if (setting != null && !orderInfo.getPayType().equals(PayTypeEnum.BALANCE.getKey()) && orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) {
  1358. String needPayAmount = setting.getValue();
  1359. Integer needPayAmountInt = Math.round(Integer.parseInt(needPayAmount));
  1360. Double pointNum = 0d;
  1361. if (needPayAmountInt > 0 && orderInfo.getPayAmount().compareTo(new BigDecimal(needPayAmountInt)) >= 0) {
  1362. BigDecimal point = orderInfo.getPayAmount().divide(new BigDecimal(needPayAmountInt), BigDecimal.ROUND_CEILING, 4);
  1363. pointNum = Math.ceil(point.doubleValue());
  1364. }
  1365. logger.info("PaymentService paymentCallback Point orderSn = {} , pointNum ={}", orderInfo.getOrderSn(), pointNum);
  1366. if (pointNum > 0) {
  1367. // 充值是否加倍返积分
  1368. if (orderInfo.getType().equals(OrderTypeEnum.RECHARGE.getKey())) {
  1369. MtSetting pointSpeedSetting = settingService.querySettingByName(mtOrder.getMerchantId(), SettingTypeEnum.POINT.getKey(), PointSettingEnum.RECHARGE_POINT_SPEED.getKey());
  1370. if (pointSpeedSetting != null && StringUtil.isNotEmpty(pointSpeedSetting.getValue())) {
  1371. BigDecimal pointSpeed = new BigDecimal(pointSpeedSetting.getValue());
  1372. if (pointSpeed.compareTo(new BigDecimal("0")) > 0) {
  1373. pointNum = pointNum * new Double(pointSpeedSetting.getValue());
  1374. }
  1375. }
  1376. }
  1377. MtUser userInfo = memberService.queryMemberById(orderInfo.getUserId());
  1378. MtUserGrade userGrade = userGradeService.queryUserGradeById(orderInfo.getMerchantId(), Integer.parseInt(userInfo.getGradeId()), orderInfo.getUserId());
  1379. // 是否会员积分加倍
  1380. if (userGrade != null && userGrade.getSpeedPoint() > 1) {
  1381. pointNum = pointNum * userGrade.getSpeedPoint();
  1382. }
  1383. MtPoint reqPointDto = new MtPoint();
  1384. reqPointDto.setAmount(pointNum.intValue());
  1385. reqPointDto.setUserId(orderInfo.getUserId());
  1386. reqPointDto.setOrderSn(orderInfo.getOrderSn());
  1387. reqPointDto.setDescription("支付¥"+orderInfo.getPayAmount()+"返"+pointNum+"积分");
  1388. reqPointDto.setOperator("系统");
  1389. pointService.addPoint(reqPointDto);
  1390. }
  1391. }
  1392. // 计算是否要升级(购物订单、付款订单、充值订单)
  1393. if (orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey()) && orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey()) || orderInfo.getType().equals(OrderTypeEnum.PAYMENT.getKey()) || orderInfo.getType().equals(OrderTypeEnum.RECHARGE.getKey())) {
  1394. try {
  1395. if (orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) {
  1396. Map<String, Object> param = new HashMap<>();
  1397. param.put("STATUS", StatusEnum.ENABLED.getKey());
  1398. param.put("MERCHANT_ID", mtOrder.getMerchantId());
  1399. MtUser mtUser = memberService.queryMemberById(orderInfo.getUserId());
  1400. MtUserGrade mtUserGrade = mtUserGradeMapper.selectById(mtUser.getGradeId());
  1401. if (mtUserGrade == null) {
  1402. mtUserGrade = userGradeService.getInitUserGrade(orderInfo.getMerchantId());
  1403. }
  1404. List<MtUserGrade> userGradeList = mtUserGradeMapper.selectByMap(param);
  1405. if (mtUserGrade != null && userGradeList != null && userGradeList.size() > 0) {
  1406. // 会员已支付金额
  1407. BigDecimal payMoney = getUserPayMoney(orderInfo.getUserId());
  1408. // 会员支付订单笔数
  1409. Integer payOrderCount = getUserPayOrderCount(orderInfo.getUserId());
  1410. BigDecimal payOrderCountValue = new BigDecimal(payOrderCount);
  1411. for (MtUserGrade grade : userGradeList) {
  1412. if (grade.getCatchValue() != null && grade.getCatchType() != null) {
  1413. // 累计消费金额已达到
  1414. if (grade.getCatchType().equals(UserGradeCatchTypeEnum.AMOUNT.getKey())) {
  1415. if (grade.getGrade().compareTo(mtUserGrade.getGrade()) > 0 && payMoney.compareTo(grade.getCatchValue()) >= 0) {
  1416. openGiftService.openGift(mtOrder.getUserId(), grade.getId(), false);
  1417. }
  1418. }
  1419. // 累计消费次数已达到
  1420. if (grade.getCatchType().equals(UserGradeCatchTypeEnum.FREQUENCY.getKey()) && payOrderCountValue.compareTo(grade.getCatchValue()) >= 0) {
  1421. if (grade.getGrade().compareTo(mtUserGrade.getGrade()) > 0) {
  1422. openGiftService.openGift(mtOrder.getUserId(), grade.getId(), false);
  1423. }
  1424. }
  1425. }
  1426. }
  1427. }
  1428. }
  1429. } catch (Exception ex) {
  1430. logger.error("会员升级出错啦,userId = {},message = {}", orderInfo.getUserId(), ex.getMessage());
  1431. }
  1432. }
  1433. try {
  1434. // 打印订单
  1435. printerService.printOrder(orderInfo, true);
  1436. // 给商家发送通知短信
  1437. MtStore mtStore = storeService.queryStoreById(mtOrder.getStoreId());
  1438. if (mtStore != null && orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) {
  1439. Map<String, String> params = new HashMap<>();
  1440. params.put("orderSn", mtOrder.getOrderSn());
  1441. List<String> mobileList = new ArrayList<>();
  1442. mobileList.add(mtStore.getPhone());
  1443. sendSmsService.sendSms(mtOrder.getMerchantId(), "new-order", mobileList, params);
  1444. }
  1445. } catch (Exception e) {
  1446. logger.info("打印订单或给商家发送短信出错啦,message = {}", e.getMessage());
  1447. }
  1448. return true;
  1449. }
  1450. /**
  1451. * 根据条件搜索订单
  1452. *
  1453. * @param params 查询参数
  1454. * @return
  1455. * */
  1456. @Override
  1457. public List<MtOrder> getOrderListByParams(Map<String, Object> params) {
  1458. return mtOrderMapper.selectByMap(params);
  1459. }
  1460. /**
  1461. * 处理订单详情
  1462. *
  1463. * @param orderInfo 订单信息
  1464. * @param needAddress 是否获取订单地址
  1465. * @param getPayStatus 是否获取支付状态
  1466. * @return UserOrderDto
  1467. * */
  1468. private UserOrderDto getOrderDetail(MtOrder orderInfo, boolean needAddress, boolean getPayStatus) throws BusinessCheckException {
  1469. UserOrderDto userOrderDto = new UserOrderDto();
  1470. userOrderDto.setId(orderInfo.getId());
  1471. userOrderDto.setMerchantId(orderInfo.getMerchantId());
  1472. userOrderDto.setStoreId(orderInfo.getStoreId());
  1473. userOrderDto.setUserId(orderInfo.getUserId());
  1474. userOrderDto.setCouponId(orderInfo.getCouponId());
  1475. userOrderDto.setOrderSn(orderInfo.getOrderSn());
  1476. userOrderDto.setRemark(orderInfo.getRemark());
  1477. userOrderDto.setType(orderInfo.getType());
  1478. userOrderDto.setPayType(orderInfo.getPayType());
  1479. userOrderDto.setOrderMode(orderInfo.getOrderMode());
  1480. userOrderDto.setCreateTime(DateUtil.formatDate(orderInfo.getCreateTime(), "yyyy.MM.dd HH:mm"));
  1481. userOrderDto.setUpdateTime(DateUtil.formatDate(orderInfo.getUpdateTime(), "yyyy.MM.dd HH:mm"));
  1482. userOrderDto.setAmount(orderInfo.getAmount());
  1483. userOrderDto.setIsVisitor(orderInfo.getIsVisitor());
  1484. userOrderDto.setStaffId(orderInfo.getStaffId());
  1485. userOrderDto.setVerifyCode("");
  1486. userOrderDto.setDeliveryFee(orderInfo.getDeliveryFee());
  1487. userOrderDto.setPlatform(orderInfo.getPlatform());
  1488. userOrderDto.setConfirmRemark(orderInfo.getConfirmRemark());
  1489. userOrderDto.setConfirmStatus(orderInfo.getConfirmStatus());
  1490. if (orderInfo.getConfirmTime() != null) {
  1491. userOrderDto.setConfirmTime(DateUtil.formatDate(orderInfo.getConfirmTime(), "yyyy.MM.dd HH:mm"));
  1492. }
  1493. if (orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey()) && orderInfo.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey()) && orderInfo.getConfirmStatus().equals(YesOrNoEnum.NO.getKey())) {
  1494. userOrderDto.setIsVerify(false);
  1495. } else {
  1496. userOrderDto.setIsVerify(true);
  1497. }
  1498. if (orderInfo.getPayAmount() != null) {
  1499. userOrderDto.setPayAmount(orderInfo.getPayAmount());
  1500. } else {
  1501. userOrderDto.setPayAmount(new BigDecimal("0"));
  1502. }
  1503. if (orderInfo.getDiscount() != null) {
  1504. userOrderDto.setDiscount(orderInfo.getDiscount());
  1505. } else {
  1506. userOrderDto.setDiscount(new BigDecimal("0"));
  1507. }
  1508. if (orderInfo.getPointAmount() != null) {
  1509. userOrderDto.setPointAmount(orderInfo.getPointAmount());
  1510. } else {
  1511. userOrderDto.setPointAmount(new BigDecimal("0"));
  1512. }
  1513. userOrderDto.setStatus(orderInfo.getStatus());
  1514. userOrderDto.setParam(orderInfo.getParam());
  1515. userOrderDto.setPayStatus(orderInfo.getPayStatus());
  1516. if (orderInfo.getUsePoint() != null) {
  1517. userOrderDto.setUsePoint(orderInfo.getUsePoint());
  1518. } else {
  1519. userOrderDto.setUsePoint(0);
  1520. }
  1521. if (orderInfo.getPayTime() != null) {
  1522. userOrderDto.setPayTime(DateUtil.formatDate(orderInfo.getPayTime(), "yyyy.MM.dd HH:mm"));
  1523. }
  1524. if (userOrderDto.getType().equals(OrderTypeEnum.PRESTORE.getKey())) {
  1525. userOrderDto.setTypeName(OrderTypeEnum.PRESTORE.getValue());
  1526. } else if(userOrderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) {
  1527. userOrderDto.setTypeName(OrderTypeEnum.PAYMENT.getValue());
  1528. } else if(userOrderDto.getType().equals(OrderTypeEnum.GOODS.getKey())) {
  1529. userOrderDto.setTypeName(OrderTypeEnum.GOODS.getValue());
  1530. } else if(userOrderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
  1531. userOrderDto.setTypeName(OrderTypeEnum.MEMBER.getValue());
  1532. } else if(userOrderDto.getType().equals(OrderTypeEnum.RECHARGE.getKey())) {
  1533. userOrderDto.setTypeName(OrderTypeEnum.RECHARGE.getValue());
  1534. }
  1535. if (userOrderDto.getStatus().equals(OrderStatusEnum.CREATED.getKey())) {
  1536. userOrderDto.setStatusText(OrderStatusEnum.CREATED.getValue());
  1537. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.CANCEL.getKey())) {
  1538. userOrderDto.setStatusText(OrderStatusEnum.CANCEL.getValue());
  1539. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.PAID.getKey())) {
  1540. userOrderDto.setStatusText(OrderStatusEnum.PAID.getValue());
  1541. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.DELIVERY.getKey())) {
  1542. userOrderDto.setStatusText(OrderStatusEnum.DELIVERY.getValue());
  1543. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.DELIVERED.getKey())) {
  1544. userOrderDto.setStatusText(OrderStatusEnum.DELIVERED.getValue());
  1545. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.RECEIVED.getKey())) {
  1546. userOrderDto.setStatusText(OrderStatusEnum.RECEIVED.getValue());
  1547. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.DELETED.getKey())) {
  1548. userOrderDto.setStatusText(OrderStatusEnum.DELETED.getValue());
  1549. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.REFUND.getKey())) {
  1550. userOrderDto.setStatusText(OrderStatusEnum.REFUND.getValue());
  1551. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.COMPLETE.getKey())) {
  1552. userOrderDto.setStatusText(OrderStatusEnum.COMPLETE.getValue());
  1553. }
  1554. // 订单所属店铺
  1555. MtStore storeInfo = storeService.queryStoreById(orderInfo.getStoreId());
  1556. userOrderDto.setStoreInfo(storeInfo);
  1557. // 所属员工
  1558. if (orderInfo.getStaffId() != null && orderInfo.getStaffId() > 0) {
  1559. MtStaff staffInfo = staffService.queryStaffById(orderInfo.getStaffId());
  1560. userOrderDto.setStaffInfo(staffInfo);
  1561. }
  1562. // 下单用户信息直接取会员个人信息
  1563. OrderUserDto userInfo = new OrderUserDto();
  1564. MtUser user = memberService.queryMemberById(orderInfo.getUserId());
  1565. if (user != null) {
  1566. userInfo.setId(user.getId());
  1567. userInfo.setNo(user.getUserNo());
  1568. userInfo.setName(user.getName());
  1569. if (StringUtil.isNotEmpty(user.getMobile())) {
  1570. userInfo.setMobile(user.getMobile().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
  1571. }
  1572. userInfo.setCardNo(user.getIdcard());
  1573. userInfo.setAddress(user.getAddress());
  1574. userInfo.setOpenId(user.getOpenId());
  1575. userOrderDto.setUserInfo(userInfo);
  1576. }
  1577. List<OrderGoodsDto> goodsList = new ArrayList<>();
  1578. String baseImage = settingService.getUploadBasePath();
  1579. // 储值卡的订单
  1580. if (orderInfo.getType().equals(OrderTypeEnum.PRESTORE.getKey())) {
  1581. MtCoupon coupon = couponService.queryCouponById(orderInfo.getCouponId());
  1582. if (coupon != null) {
  1583. String[] paramArr = orderInfo.getParam().split(",");
  1584. for (int i = 0; i < paramArr.length; i++) {
  1585. String[] item = paramArr[i].split("_");
  1586. if (Integer.parseInt(item[2]) > 0) {
  1587. OrderGoodsDto goodsDto = new OrderGoodsDto();
  1588. goodsDto.setId(coupon.getId());
  1589. goodsDto.setType(OrderTypeEnum.PRESTORE.getKey());
  1590. goodsDto.setName("预存¥" + item[0] + "到账¥" + item[1]);
  1591. goodsDto.setNum(Double.parseDouble(item[2]));
  1592. goodsDto.setPrice(item[0]);
  1593. goodsDto.setDiscount("0");
  1594. if (coupon.getImage().indexOf(baseImage) == -1) {
  1595. goodsDto.setImage(baseImage + coupon.getImage());
  1596. }
  1597. goodsList.add(goodsDto);
  1598. }
  1599. }
  1600. }
  1601. }
  1602. // 商品订单
  1603. if (orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey())) {
  1604. Map<String, Object> params = new HashMap<>();
  1605. params.put("ORDER_ID", orderInfo.getId());
  1606. List<MtOrderGoods> orderGoodsList = mtOrderGoodsMapper.selectByMap(params);
  1607. for (MtOrderGoods orderGoods : orderGoodsList) {
  1608. MtGoods goodsInfo = mtGoodsMapper.selectById(orderGoods.getGoodsId());
  1609. if (goodsInfo != null) {
  1610. OrderGoodsDto orderGoodsDto = new OrderGoodsDto();
  1611. orderGoodsDto.setId(orderGoods.getId());
  1612. orderGoodsDto.setName(goodsInfo.getName());
  1613. if (goodsInfo.getLogo().indexOf(baseImage) == -1) {
  1614. orderGoodsDto.setImage(baseImage + goodsInfo.getLogo());
  1615. }
  1616. orderGoodsDto.setType(OrderTypeEnum.GOODS.getKey());
  1617. orderGoodsDto.setNum(orderGoods.getNum());
  1618. orderGoodsDto.setSkuId(orderGoods.getSkuId());
  1619. orderGoodsDto.setPrice(orderGoods.getPrice().toString());
  1620. orderGoodsDto.setDiscount(orderGoods.getDiscount().toString());
  1621. orderGoodsDto.setGoodsId(orderGoods.getGoodsId());
  1622. if (orderGoods.getSkuId() > 0) {
  1623. List<GoodsSpecValueDto> specList = goodsService.getSpecListBySkuId(orderGoods.getSkuId());
  1624. orderGoodsDto.setSpecList(specList);
  1625. }
  1626. goodsList.add(orderGoodsDto);
  1627. }
  1628. }
  1629. }
  1630. // 配送地址
  1631. if (orderInfo.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey()) && needAddress) {
  1632. List<MtOrderAddress> orderAddressList = mtOrderAddressMapper.getOrderAddress(orderInfo.getId());
  1633. MtOrderAddress orderAddress = null;
  1634. if (orderAddressList.size() > 0) {
  1635. orderAddress = orderAddressList.get(0);
  1636. }
  1637. if (orderAddress != null) {
  1638. AddressDto address = new AddressDto();
  1639. address.setId(orderAddress.getId());
  1640. address.setName(orderAddress.getName());
  1641. address.setMobile(orderAddress.getMobile());
  1642. address.setDetail(orderAddress.getDetail());
  1643. address.setProvinceId(orderAddress.getProvinceId());
  1644. address.setCityId(orderAddress.getCityId());
  1645. address.setRegionId(orderAddress.getRegionId());
  1646. if (orderAddress.getProvinceId() > 0) {
  1647. MtRegion mtProvince = mtRegionMapper.selectById(orderAddress.getProvinceId());
  1648. if (mtProvince != null) {
  1649. address.setProvinceName(mtProvince.getName());
  1650. }
  1651. }
  1652. if (orderAddress.getCityId() > 0) {
  1653. MtRegion mtCity = mtRegionMapper.selectById(orderAddress.getCityId());
  1654. if (mtCity != null) {
  1655. address.setCityName(mtCity.getName());
  1656. }
  1657. }
  1658. if (orderAddress.getRegionId() > 0) {
  1659. MtRegion mtRegion = mtRegionMapper.selectById(orderAddress.getRegionId());
  1660. if (mtRegion != null) {
  1661. address.setRegionName(mtRegion.getName());
  1662. }
  1663. }
  1664. userOrderDto.setAddress(address);
  1665. }
  1666. }
  1667. // 物流信息
  1668. if (StringUtil.isNotEmpty(orderInfo.getExpressInfo())) {
  1669. JSONObject express = JSONObject.parseObject(orderInfo.getExpressInfo());
  1670. ExpressDto expressInfo = new ExpressDto();
  1671. expressInfo.setExpressNo(express.get("expressNo").toString());
  1672. expressInfo.setExpressCompany(express.get("expressCompany").toString());
  1673. expressInfo.setExpressTime(express.get("expressTime").toString());
  1674. expressInfo.setExpressCode(express.get("expressCode") == null ? "" : express.get("expressCode").toString());
  1675. userOrderDto.setExpressInfo(expressInfo);
  1676. }
  1677. // 使用的卡券
  1678. if (userOrderDto.getCouponId() != null && userOrderDto.getCouponId() > 0) {
  1679. MtUserCoupon mtUserCoupon = userCouponService.getUserCouponDetail(userOrderDto.getCouponId());
  1680. if (mtUserCoupon != null) {
  1681. MtCoupon mtCoupon = couponService.queryCouponById(mtUserCoupon.getCouponId());
  1682. if (mtCoupon != null) {
  1683. UserCouponDto couponInfo = new UserCouponDto();
  1684. couponInfo.setId(mtUserCoupon.getId());
  1685. couponInfo.setCouponId(mtCoupon.getId());
  1686. couponInfo.setName(mtCoupon.getName());
  1687. couponInfo.setAmount(mtUserCoupon.getAmount());
  1688. couponInfo.setBalance(mtUserCoupon.getBalance());
  1689. couponInfo.setStatus(mtUserCoupon.getStatus());
  1690. couponInfo.setType(mtCoupon.getType());
  1691. userOrderDto.setCouponInfo(couponInfo);
  1692. }
  1693. }
  1694. }
  1695. // 查询支付状态
  1696. if (getPayStatus && !orderInfo.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey())) {
  1697. // 微信支付
  1698. if (orderInfo.getPayType().equals(PayTypeEnum.MICROPAY.getKey()) || orderInfo.getPayType().equals(PayTypeEnum.JSAPI.getKey())) {
  1699. try {
  1700. Map<String, String> payResult = weixinService.queryPaidOrder(orderInfo.getStoreId(), "", orderInfo.getOrderSn());
  1701. if (payResult != null && payResult.get("trade_state").equals("SUCCESS")) {
  1702. BigDecimal payAmount = new BigDecimal(payResult.get("total_fee")).divide(new BigDecimal("100"));
  1703. setOrderPayed(orderInfo.getId(), payAmount);
  1704. userOrderDto.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  1705. }
  1706. } catch (Exception e) {
  1707. // empty
  1708. }
  1709. }
  1710. // 支付宝支付
  1711. if (orderInfo.getPayType().equals(PayTypeEnum.ALISCAN.getKey())) {
  1712. try {
  1713. Map<String, String> payResult = alipayService.queryPaidOrder(orderInfo.getStoreId(), "", orderInfo.getOrderSn());
  1714. if (payResult != null) {
  1715. BigDecimal payAmount = new BigDecimal(payResult.get("payAmount"));
  1716. setOrderPayed(orderInfo.getId(), payAmount);
  1717. userOrderDto.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  1718. }
  1719. } catch (Exception e) {
  1720. // empty
  1721. }
  1722. }
  1723. }
  1724. userOrderDto.setGoods(goodsList);
  1725. return userOrderDto;
  1726. }
  1727. /**
  1728. * 获取订单总数
  1729. *
  1730. * @param merchantId 商户ID
  1731. * @param storeId 店铺ID
  1732. * @return
  1733. * */
  1734. @Override
  1735. public BigDecimal getOrderCount(Integer merchantId, Integer storeId) {
  1736. if (storeId != null && storeId > 0) {
  1737. return mtOrderMapper.getStoreOrderCount(storeId);
  1738. } else {
  1739. return mtOrderMapper.getOrderCount(merchantId);
  1740. }
  1741. }
  1742. /**
  1743. * 获取订单数量
  1744. *
  1745. * @param merchantId 商户ID
  1746. * @param storeId 店铺ID
  1747. * @param beginTime 开始时间
  1748. * @param endTime 结束时间
  1749. * @return
  1750. * */
  1751. @Override
  1752. public BigDecimal getOrderCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) {
  1753. if (storeId != null && storeId > 0) {
  1754. return mtOrderMapper.getStoreOrderCountByTime(storeId, beginTime, endTime);
  1755. } else {
  1756. return mtOrderMapper.getOrderCountByTime(merchantId, beginTime, endTime);
  1757. }
  1758. }
  1759. /**
  1760. * 获取支付金额
  1761. *
  1762. * @param merchantId 商户ID
  1763. * @param storeId 店铺ID
  1764. * @param beginTime 开始时间
  1765. * @param endTime 结束时间
  1766. * @return
  1767. * */
  1768. @Override
  1769. public BigDecimal getPayMoney(Integer merchantId, Integer storeId, Date beginTime, Date endTime) {
  1770. BigDecimal payMoney;
  1771. if (storeId != null && storeId > 0) {
  1772. payMoney = mtOrderMapper.getStorePayMoneyByTime(storeId, beginTime, endTime);
  1773. } else {
  1774. payMoney = mtOrderMapper.getPayMoneyByTime(merchantId, beginTime, endTime);
  1775. }
  1776. if (payMoney == null) {
  1777. return new BigDecimal("0");
  1778. }
  1779. return payMoney;
  1780. }
  1781. /**
  1782. * 获取支付人数
  1783. *
  1784. * @param merchantId 商户ID
  1785. * @param storeId 店铺ID
  1786. * @return
  1787. * */
  1788. @Override
  1789. public Integer getPayUserCount(Integer merchantId, Integer storeId) {
  1790. if (storeId != null && storeId > 0) {
  1791. return mtOrderMapper.getStorePayUserCount(storeId);
  1792. } else {
  1793. return mtOrderMapper.getPayUserCount(merchantId);
  1794. }
  1795. }
  1796. /**
  1797. * 获取支付总金额
  1798. *
  1799. * @param merchantId 商户ID
  1800. * @param storeId 店铺ID
  1801. * @return
  1802. * */
  1803. @Override
  1804. public BigDecimal getPayMoney(Integer merchantId, Integer storeId) {
  1805. if (storeId != null && storeId > 0) {
  1806. return mtOrderMapper.getStorePayMoney(storeId);
  1807. } else {
  1808. return mtOrderMapper.getPayMoney(merchantId);
  1809. }
  1810. }
  1811. /**
  1812. * 计算商品总价
  1813. *
  1814. * @param merchantId 商户ID
  1815. * @param userId 会员ID
  1816. * @param cartList 购物车列表
  1817. * @param couponId 卡券ID
  1818. * @param isUsePoint 使用积分数量
  1819. * @param orderMode 订单模式
  1820. * @throws BusinessCheckException
  1821. * @return
  1822. * */
  1823. @Override
  1824. public Map<String, Object> calculateCartGoods(Integer merchantId, Integer userId, List<MtCart> cartList, Integer couponId, boolean isUsePoint, String platform, String orderMode) throws BusinessCheckException {
  1825. MtUser userInfo = memberService.queryMemberById(userId);
  1826. // 设置是否不能用积分抵扣
  1827. MtSetting pointSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.POINT.getKey(), PointSettingEnum.CAN_USE_AS_MONEY.getKey());
  1828. if (pointSetting != null && !pointSetting.getValue().equals(YesOrNoEnum.TRUE.getKey())) {
  1829. isUsePoint = false;
  1830. }
  1831. List<ResCartDto> cartDtoList = new ArrayList<>();
  1832. String basePath = settingService.getUploadBasePath();
  1833. Double totalNum = 0.0;
  1834. BigDecimal totalPrice = new BigDecimal("0");
  1835. BigDecimal totalCanUsePointAmount = new BigDecimal("0");
  1836. BigDecimal memberDiscount = new BigDecimal("0");
  1837. BigDecimal percent = new BigDecimal("0");
  1838. Integer storeId = 0;
  1839. if (cartList.size() > 0) {
  1840. // 会员折扣
  1841. MtUserGrade userGrade = userGradeService.queryUserGradeById(userInfo.getMerchantId(), userInfo.getGradeId() != null ? Integer.parseInt(userInfo.getGradeId()) : 1, userId);
  1842. if (userGrade != null && userGrade.getDiscount() != null && userGrade.getDiscount() > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) {
  1843. percent = new BigDecimal(userGrade.getDiscount()).divide(new BigDecimal("10"), BigDecimal.ROUND_CEILING, 4);
  1844. if (percent.compareTo(new BigDecimal("0")) <= 0) {
  1845. percent = new BigDecimal("1");
  1846. }
  1847. }
  1848. for (MtCart cart : cartList) {
  1849. if (storeId <= 0 && cart.getStoreId() != null) {
  1850. storeId = cart.getStoreId();
  1851. }
  1852. // 购物车商品信息
  1853. MtGoods mtGoodsInfo = goodsService.queryGoodsById(cart.getGoodsId());
  1854. if (mtGoodsInfo == null || !mtGoodsInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  1855. continue;
  1856. }
  1857. // 取对应sku的价格
  1858. if (cart.getSkuId() != null && cart.getSkuId() > 0) {
  1859. MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(cart.getSkuId());
  1860. if (mtGoodsSku != null && mtGoodsSku.getPrice().compareTo(new BigDecimal("0")) > 0) {
  1861. mtGoodsInfo.setPrice(mtGoodsSku.getPrice());
  1862. }
  1863. }
  1864. // 会员支付折扣
  1865. boolean isDiscount = mtGoodsInfo.getIsMemberDiscount().equals(YesOrNoEnum.YES.getKey()) ? true : false;
  1866. if (percent.compareTo(new BigDecimal("0")) > 0 && isDiscount) {
  1867. BigDecimal discount = mtGoodsInfo.getPrice().subtract(mtGoodsInfo.getPrice().multiply(percent)).multiply(new BigDecimal(cart.getNum()));
  1868. memberDiscount = memberDiscount.add(discount);
  1869. }
  1870. totalNum = totalNum + cart.getNum();
  1871. ResCartDto cartDto = new ResCartDto();
  1872. cartDto.setId(cart.getId());
  1873. cartDto.setGoodsId(cart.getGoodsId());
  1874. cartDto.setNum(cart.getNum());
  1875. cartDto.setSkuId(cart.getSkuId());
  1876. cartDto.setUserId(cart.getUserId());
  1877. // 购物车是否有效
  1878. Boolean isEffect = true;
  1879. if (cart.getSkuId() > 0) {
  1880. List<GoodsSpecValueDto> specList = goodsService.getSpecListBySkuId(cart.getSkuId());
  1881. cartDto.setSpecList(specList);
  1882. }
  1883. if (StringUtil.isNotEmpty(mtGoodsInfo.getLogo()) && (mtGoodsInfo.getLogo().indexOf(basePath) == -1)) {
  1884. mtGoodsInfo.setLogo(basePath + mtGoodsInfo.getLogo());
  1885. }
  1886. // 读取sku的数据
  1887. if (cart.getSkuId() > 0) {
  1888. MtGoods mtGoods = new MtGoods();
  1889. BeanUtils.copyProperties(mtGoodsInfo, mtGoods);
  1890. MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(cart.getSkuId());
  1891. if (mtGoodsSku != null) {
  1892. if (StringUtil.isNotEmpty(mtGoodsSku.getLogo()) && (mtGoodsSku.getLogo().indexOf(basePath) == -1)) {
  1893. mtGoods.setLogo(basePath + mtGoodsSku.getLogo());
  1894. }
  1895. if (mtGoodsSku.getWeight().compareTo(new BigDecimal("0")) > 0) {
  1896. mtGoods.setWeight(mtGoodsSku.getWeight());
  1897. }
  1898. mtGoods.setPrice(mtGoodsSku.getPrice());
  1899. mtGoods.setLinePrice(mtGoodsSku.getLinePrice());
  1900. mtGoods.setStock(mtGoodsSku.getStock());
  1901. }
  1902. cartDto.setGoodsInfo(mtGoods);
  1903. } else {
  1904. cartDto.setGoodsInfo(mtGoodsInfo);
  1905. }
  1906. if (mtGoodsInfo.getStock() != null && mtGoodsInfo.getStock() < cartDto.getNum()) {
  1907. isEffect = false;
  1908. }
  1909. cartDto.setIsEffect(isEffect);
  1910. // 计算总价
  1911. totalPrice = totalPrice.add(cartDto.getGoodsInfo().getPrice().multiply(new BigDecimal(cart.getNum())));
  1912. // 累加可用积分去抵扣的金额
  1913. if (mtGoodsInfo.getCanUsePoint() != null && mtGoodsInfo.getCanUsePoint().equals(YesOrNoEnum.YES.getKey())) {
  1914. totalCanUsePointAmount = totalCanUsePointAmount.add(cartDto.getGoodsInfo().getPrice().multiply(new BigDecimal(cart.getNum())));
  1915. }
  1916. cartDtoList.add(cartDto);
  1917. }
  1918. }
  1919. Map<String, Object> result = new HashMap<>();
  1920. // 可用卡券列表
  1921. List<CouponDto> couponList = new ArrayList<>();
  1922. List<String> statusList = Arrays.asList(UserCouponStatusEnum.UNUSED.getKey());
  1923. List<MtUserCoupon> userCouponList = userCouponService.getUserCouponList(userId, statusList);
  1924. if (userCouponList.size() > 0) {
  1925. for (MtUserCoupon userCoupon : userCouponList) {
  1926. MtCoupon couponInfo = couponService.queryCouponById(userCoupon.getCouponId());
  1927. // 优惠券和储值卡才能使用
  1928. if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey()) || couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  1929. CouponDto couponDto = new CouponDto();
  1930. couponDto.setId(couponInfo.getId());
  1931. couponDto.setUserCouponId(userCoupon.getId());
  1932. couponDto.setName(couponInfo.getName());
  1933. couponDto.setAmount(userCoupon.getAmount());
  1934. couponDto.setStatus(UserCouponStatusEnum.DISABLE.getKey());
  1935. // 购物不能用专用的卡券
  1936. if (couponInfo.getUseFor() != null && StringUtil.isNotEmpty(couponInfo.getUseFor())) {
  1937. if (couponInfo.getUseFor().equals(CouponUseForEnum.MEMBER_GRADE.getKey())) {
  1938. continue;
  1939. }
  1940. if (couponInfo.getUseFor().equals(CouponUseForEnum.OFF_LINE_PAYMENT.getKey())) {
  1941. // 只有PC收银端能用
  1942. if (!platform.equals(PlatformTypeEnum.PC.getCode())) {
  1943. continue;
  1944. }
  1945. }
  1946. }
  1947. // 判断在当前门店是否适用
  1948. if (StringUtil.isNotEmpty(couponInfo.getStoreIds())) {
  1949. String[] storeIds = couponInfo.getStoreIds().split(",");
  1950. if (storeIds.length > 0 && storeId != null && !Arrays.asList(storeIds).contains(storeId.toString())) {
  1951. continue;
  1952. }
  1953. }
  1954. boolean isEffective = couponService.isCouponEffective(couponInfo, userCoupon);
  1955. // 优惠券
  1956. if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
  1957. couponDto.setType(CouponTypeEnum.COUPON.getValue());
  1958. if (StringUtil.isEmpty(couponInfo.getOutRule()) || couponInfo.getOutRule().equals("0")) {
  1959. couponDto.setDescription("无使用门槛");
  1960. if (isEffective) {
  1961. couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1962. }
  1963. } else {
  1964. couponDto.setDescription("满" + couponInfo.getOutRule() + "元可用");
  1965. BigDecimal conditionAmount = new BigDecimal(couponInfo.getOutRule());
  1966. if (totalPrice.compareTo(conditionAmount) >= 0 && isEffective) {
  1967. couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1968. }
  1969. }
  1970. } else if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  1971. // 储值卡
  1972. couponDto.setType(CouponTypeEnum.PRESTORE.getValue());
  1973. couponDto.setDescription("无使用门槛");
  1974. couponDto.setAmount(userCoupon.getBalance());
  1975. // 余额须大于0
  1976. if (isEffective && (userCoupon.getBalance().compareTo(new BigDecimal("0")) > 0)) {
  1977. couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1978. }
  1979. }
  1980. // 适用商品
  1981. if (userCoupon != null) {
  1982. if (couponInfo.getApplyGoods() != null && couponInfo.getApplyGoods().equals(ApplyGoodsEnum.PARK_GOODS.getKey())) {
  1983. List<MtCouponGoods> couponGoodsList = mtCouponGoodsMapper.getCouponGoods(couponInfo.getId());
  1984. if (couponGoodsList != null && couponGoodsList.size() > 0 && cartList.size() > 0) {
  1985. List<Integer> applyGoodsIds = new ArrayList<>();
  1986. List<Integer> goodsIds = new ArrayList<>();
  1987. for (MtCouponGoods mtCouponGoods : couponGoodsList) {
  1988. applyGoodsIds.add(mtCouponGoods.getGoodsId());
  1989. }
  1990. for (MtCart mtCart : cartList) {
  1991. goodsIds.add(mtCart.getGoodsId());
  1992. }
  1993. List<Integer> intersection = applyGoodsIds.stream()
  1994. .filter(goodsIds::contains)
  1995. .collect(Collectors.toList());
  1996. if (intersection.size() == 0) {
  1997. couponDto.setStatus(UserCouponStatusEnum.DISABLE.getKey());
  1998. }
  1999. }
  2000. }
  2001. }
  2002. if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FIX.getKey())) {
  2003. couponDto.setEffectiveDate(DateUtil.formatDate(couponInfo.getBeginTime(), "yyyy.MM.dd HH:mm") + "~" + DateUtil.formatDate(couponInfo.getEndTime(), "yyyy.MM.dd HH:mm"));
  2004. }
  2005. if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) {
  2006. couponDto.setEffectiveDate(DateUtil.formatDate(userCoupon.getCreateTime(), "yyyy.MM.dd HH:mm") + "~" + DateUtil.formatDate(userCoupon.getExpireTime(), "yyyy.MM.dd HH:mm"));
  2007. }
  2008. couponList.add(couponDto);
  2009. }
  2010. }
  2011. }
  2012. // 使用的卡券
  2013. MtCoupon useCouponInfo = null;
  2014. BigDecimal couponAmount = new BigDecimal("0");
  2015. if (couponId > 0) {
  2016. MtUserCoupon userCouponInfo = userCouponService.getUserCouponDetail(couponId);
  2017. if (userCouponInfo != null) {
  2018. useCouponInfo = couponService.queryCouponById(userCouponInfo.getCouponId());
  2019. boolean isEffective = couponService.isCouponEffective(useCouponInfo, userCouponInfo);
  2020. if (isEffective) {
  2021. if (useCouponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
  2022. couponAmount = useCouponInfo.getAmount();
  2023. } else if(useCouponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  2024. BigDecimal couponTotalAmount = userCouponInfo.getBalance();
  2025. if (couponTotalAmount.compareTo(totalPrice) > 0) {
  2026. couponAmount = totalPrice;
  2027. useCouponInfo.setAmount(totalPrice);
  2028. } else {
  2029. couponAmount = couponTotalAmount;
  2030. useCouponInfo.setAmount(couponTotalAmount);
  2031. }
  2032. }
  2033. }
  2034. }
  2035. }
  2036. // 支付金额 = 商品总额 - 卡券抵扣金额
  2037. BigDecimal payPrice = totalPrice.subtract(couponAmount);
  2038. // 可用积分、可用积分金额
  2039. Integer myPoint = userInfo.getPoint() == null ? 0 : userInfo.getPoint();
  2040. Integer usePoint = 0;
  2041. BigDecimal usePointAmount = new BigDecimal("0");
  2042. MtSetting setting = settingService.querySettingByName(merchantId, SettingTypeEnum.POINT.getKey(), PointSettingEnum.EXCHANGE_NEED_POINT.getKey());
  2043. if (myPoint > 0 && setting != null && isUsePoint) {
  2044. if (StringUtil.isNotEmpty(setting.getValue()) && !setting.getValue().equals("0")) {
  2045. BigDecimal usePoints = new BigDecimal(myPoint);
  2046. usePointAmount = usePoints.divide(new BigDecimal(setting.getValue()), BigDecimal.ROUND_CEILING, 4);
  2047. usePoint = myPoint;
  2048. if (usePointAmount.compareTo(totalCanUsePointAmount) >= 0) {
  2049. usePointAmount = totalCanUsePointAmount;
  2050. usePoint = totalCanUsePointAmount.multiply(new BigDecimal(setting.getValue())).intValue();
  2051. }
  2052. }
  2053. }
  2054. // 积分金额不能大于支付金额
  2055. if (usePointAmount.compareTo(payPrice) > 0 && isUsePoint) {
  2056. usePointAmount = payPrice;
  2057. BigDecimal usePoints = payPrice.multiply(new BigDecimal(setting.getValue()));
  2058. usePoint = usePoints.intValue();
  2059. }
  2060. // 支付金额 = 商品总额 - 积分抵扣金额
  2061. payPrice = payPrice.subtract(usePointAmount);
  2062. // 配送费用
  2063. BigDecimal deliveryFee = new BigDecimal("0");
  2064. MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.DELIVERY_FEE.getKey());
  2065. if (mtSetting != null && StringUtil.isNotEmpty(mtSetting.getValue()) && orderMode.equals(OrderModeEnum.EXPRESS.getKey())) {
  2066. deliveryFee = new BigDecimal(mtSetting.getValue());
  2067. }
  2068. payPrice = payPrice.add(deliveryFee).subtract(memberDiscount);
  2069. BigDecimal discount = totalPrice.subtract(payPrice).divide(new BigDecimal("10"), BigDecimal.ROUND_CEILING, 2);
  2070. if (payPrice.compareTo(new BigDecimal("0")) < 0) {
  2071. payPrice = new BigDecimal("0");
  2072. }
  2073. result.put("list", cartDtoList);
  2074. result.put("totalNum", totalNum);
  2075. result.put("totalPrice", totalPrice);
  2076. result.put("payPrice", payPrice);
  2077. result.put("couponList", couponList);
  2078. result.put("useCouponInfo", useCouponInfo);
  2079. result.put("usePoint", usePoint);
  2080. result.put("myPoint", myPoint);
  2081. result.put("couponAmount", couponAmount);
  2082. result.put("usePointAmount", usePointAmount);
  2083. result.put("deliveryFee", deliveryFee);
  2084. result.put("discount", discount);
  2085. if (memberDiscount.compareTo(new BigDecimal("0")) > 0) {
  2086. result.put("memberDiscount", (new BigDecimal("10").multiply(percent)));
  2087. } else {
  2088. result.put("memberDiscount", 0);
  2089. }
  2090. return result;
  2091. }
  2092. /**
  2093. * 获取会员支付金额
  2094. *
  2095. * @param userId 会员ID
  2096. * @return
  2097. * */
  2098. @Override
  2099. public BigDecimal getUserPayMoney(Integer userId) {
  2100. return mtOrderMapper.getUserPayMoney(userId);
  2101. }
  2102. /**
  2103. * 获取会员订单数
  2104. *
  2105. * @param userId 会员ID
  2106. * @return
  2107. * */
  2108. @Override
  2109. public Integer getUserPayOrderCount(Integer userId) {
  2110. return mtOrderMapper.getUserPayOrderCount(userId);
  2111. }
  2112. /**
  2113. * 获取等待分佣的订单列表
  2114. *
  2115. * @param dateTime 时间
  2116. * @return
  2117. * */
  2118. @Override
  2119. public List<MtOrder> getTobeCommissionOrderList(String dateTime) {
  2120. return mtOrderMapper.getTobeCommissionOrderList(dateTime);
  2121. }
  2122. /**
  2123. * 提交充值订单
  2124. *
  2125. * @param request HttpServletRequest对象
  2126. * @param rechargeParam 充值参数
  2127. * @return
  2128. * */
  2129. @Override
  2130. public MtOrder doRecharge(HttpServletRequest request, RechargeParam rechargeParam) throws BusinessCheckException {
  2131. Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId"));
  2132. String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform");
  2133. String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo");
  2134. String rechargeAmount = rechargeParam.getRechargeAmount() == null ? "" : rechargeParam.getRechargeAmount();
  2135. String customAmount = rechargeParam.getCustomAmount() == null ? "" : rechargeParam.getCustomAmount();
  2136. if (StringUtil.isEmpty(rechargeAmount) && StringUtil.isEmpty(customAmount)) {
  2137. throw new BusinessCheckException("请确认充值金额");
  2138. }
  2139. if (rechargeParam.getMemberId() == null || rechargeParam.getMemberId() < 1) {
  2140. throw new BusinessCheckException("请确认充值会员信息");
  2141. }
  2142. Integer merchantId = merchantService.getMerchantId(merchantNo);
  2143. // 充值赠送金额
  2144. String ruleParam = "";
  2145. MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.BALANCE.getKey(), BalanceSettingEnum.RECHARGE_RULE.getKey());
  2146. if (StringUtil.isNotEmpty(rechargeAmount) && mtSetting != null) {
  2147. if (!mtSetting.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  2148. throw new BusinessCheckException("当前未开启充值功能");
  2149. }
  2150. if (mtSetting.getValue() != null && StringUtil.isNotEmpty(mtSetting.getValue())) {
  2151. String rules[] = mtSetting.getValue().split(",");
  2152. for (String rule : rules) {
  2153. String amountArr[] = rule.split("_");
  2154. if (amountArr.length == 2) {
  2155. if (amountArr[0].equals(rechargeAmount)) {
  2156. ruleParam = rule;
  2157. break;
  2158. }
  2159. }
  2160. }
  2161. }
  2162. }
  2163. // 自定义充值没有赠送金额
  2164. if (StringUtil.isNotEmpty(customAmount) && Integer.parseInt(customAmount) > 0 && (StringUtil.isEmpty(rechargeAmount) || Integer.parseInt(rechargeAmount) <= 0)) {
  2165. rechargeAmount = customAmount;
  2166. ruleParam = customAmount + "_0";
  2167. }
  2168. if (StringUtil.isEmpty(ruleParam)) {
  2169. ruleParam = rechargeAmount + "_0";
  2170. }
  2171. BigDecimal amount = new BigDecimal(rechargeAmount);
  2172. if (amount.compareTo(new BigDecimal("0")) <= 0) {
  2173. throw new BusinessCheckException("请确认充值金额");
  2174. }
  2175. OrderDto orderDto = new OrderDto();
  2176. orderDto.setType(OrderTypeEnum.RECHARGE.getKey());
  2177. orderDto.setUserId(rechargeParam.getMemberId());
  2178. orderDto.setStoreId(storeId);
  2179. orderDto.setAmount(amount);
  2180. orderDto.setUsePoint(0);
  2181. orderDto.setRemark("会员充值");
  2182. orderDto.setParam(ruleParam);
  2183. orderDto.setStatus(OrderStatusEnum.CREATED.getKey());
  2184. orderDto.setPayStatus(PayStatusEnum.WAIT.getKey());
  2185. orderDto.setPointAmount(new BigDecimal("0"));
  2186. orderDto.setOrderMode("");
  2187. orderDto.setCouponId(0);
  2188. orderDto.setPlatform(platform);
  2189. orderDto.setMerchantId(merchantId);
  2190. return saveOrder(orderDto);
  2191. }
  2192. }