1
0

OrderServiceImpl.java 122 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480
  1. package com.kmall.admin.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.google.common.collect.ImmutableBiMap;
  4. import com.google.common.collect.Maps;
  5. import com.kmall.admin.dao.*;
  6. import com.kmall.admin.dao.alarm.Mall2LowPriceWarningDao;
  7. import com.kmall.admin.dao.mk.Mk2GoodsTopicPriceDao;
  8. import com.kmall.admin.dao.mk.Mk2MemberBirthdayDao;
  9. import com.kmall.admin.dao.mk.store.MkStorePromOrderRealDao;
  10. import com.kmall.admin.dao.mk.store.MkStorePromTypeDao;
  11. import com.kmall.admin.dao.mk.store.StoreTopicDao;
  12. import com.kmall.admin.dao.vip.Mall2MemberConsumptionRecordsDao;
  13. import com.kmall.admin.dao.vip.Mall2MemberPointsDao;
  14. import com.kmall.admin.dao.vip.Mall2PointsRulesDao;
  15. import com.kmall.admin.dto.OrderExpressDto;
  16. import com.kmall.admin.dto.OrderRecognitionDto;
  17. import com.kmall.admin.entity.*;
  18. import com.kmall.admin.entity.OrderProcessRecordEntity;
  19. import com.kmall.admin.entity.alarm.Mall2LowPriceWarningEntity;
  20. import com.kmall.admin.entity.mk.Mk2GoodsTopicPriceEntity;
  21. import com.kmall.admin.entity.mk.store.*;
  22. import com.kmall.admin.entity.vip.Mall2MemberConsumptionRecordsEntity;
  23. import com.kmall.admin.entity.vip.Mall2MemberPointsEntity;
  24. import com.kmall.admin.entity.vip.Mall2PointsRulesEntity;
  25. import com.kmall.admin.fromcomm.dao.SysConfigDao;
  26. import com.kmall.admin.service.*;
  27. import com.kmall.admin.service.mk.store.MkStoreCampMinusService;
  28. import com.kmall.admin.service.mk.store.MkStoreTicketDiscountService;
  29. import com.kmall.admin.websocket.WebSocketServer;
  30. import com.kmall.api.entity.*;
  31. import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
  32. import com.kmall.common.utils.ResponseData;
  33. import com.kmall.common.utils.wechat.WechatMicropayApiResult;
  34. import com.kmall.common.utils.wechat.WechatReverseApiResult;
  35. import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
  36. import com.kmall.manager.manager.alipay.AliPayRequestParams;
  37. import com.kmall.manager.manager.alipay.AliPayUtil;
  38. import com.kmall.manager.manager.express.sf.properties.SFPropertiesBuilder;
  39. import com.kmall.manager.manager.express.sf.properties.SFUtil;
  40. import com.kmall.manager.manager.express.sf.entity.SfRouteServiceResponseEntity;
  41. import com.kmall.manager.manager.express.sf.entity.RouteEntity;
  42. import com.kmall.manager.manager.express.sf.entity.RouteResponseEntity;
  43. import com.kmall.manager.manager.print.ticket.TicketPrintUtil;
  44. import com.kmall.manager.manager.wechat.WechatUtil;
  45. import com.kmall.manager.manager.wechat.wxglobal.dto.WechatGlobalRefundApiResult;
  46. import com.kmall.admin.utils.ShiroUtils;
  47. import com.kmall.common.constant.Dict;
  48. import com.kmall.manager.manager.merch.OmsMerchPropertiesBuilder;
  49. import com.kmall.api.util.CommonUtil;
  50. import com.kmall.admin.fromcomm.entity.SysUserEntity;
  51. import com.kmall.manager.manager.print.ticket.PrintTicketPropertiesBuilder;
  52. import com.kmall.common.utils.*;
  53. import com.kmall.common.utils.print.ticket.item.*;
  54. import com.kmall.manager.manager.express.kdn.KdniaoUtil;
  55. import com.kmall.common.utils.wechat.WechatRefundApiResult;
  56. import org.slf4j.Logger;
  57. import org.slf4j.LoggerFactory;
  58. import org.springframework.beans.factory.annotation.Autowired;
  59. import org.springframework.stereotype.Service;
  60. import org.springframework.transaction.annotation.Transactional;
  61. import java.io.IOException;
  62. import java.io.UnsupportedEncodingException;
  63. import java.math.BigDecimal;
  64. import java.math.RoundingMode;
  65. import java.net.URLDecoder;
  66. import java.text.ParseException;
  67. import java.text.SimpleDateFormat;
  68. import java.util.*;
  69. @Service("orderService")
  70. public class OrderServiceImpl implements OrderService {
  71. private final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class);
  72. @Autowired
  73. private OrderDao orderDao;
  74. @Autowired
  75. private ShippingDao shippingDao;
  76. @Autowired
  77. private OrderGoodsDao orderGoodsDao;
  78. @Autowired
  79. private SysPrinterDao printerDao;
  80. @Autowired
  81. private UserDao userDao;
  82. @Autowired
  83. private UserCouponDao userCouponDao;
  84. @Autowired
  85. private ProductStoreRelaDao productStoreRelaDao;
  86. @Autowired
  87. private OrderProcessRecordDao orderProcessRecordDao;
  88. @Autowired
  89. private OrderRefundDao orderRefundDao;
  90. @Autowired
  91. private StoreDao storeDao;
  92. @Autowired
  93. private OfflineCartDao offlineCartDao;
  94. @Autowired
  95. private GoodsDao goodsDao;
  96. @Autowired
  97. private MerchDao merchDao;
  98. @Autowired
  99. private MngChangeDao mngChangeDao;
  100. @Autowired
  101. private StoreMngChangeDao storeMngChangeDao;
  102. @Autowired
  103. private ThirdMerchExpressDao thirdMerchExpressDao;
  104. @Autowired
  105. private MkStorePromOrderRealDao mkStorePromOrderRealDao;
  106. @Autowired
  107. private UserCampMinusDao userCampMinusDao;
  108. @Autowired
  109. private UserService userService;
  110. @Autowired
  111. private SysConfigDao sysConfigDao;
  112. @Autowired
  113. private ProductDao productDao;
  114. @Autowired
  115. private OrderWXPayRecordService orderWXPayRecordService;
  116. @Autowired
  117. private StoreService storeService;
  118. @Autowired
  119. private PickUpCodeService pickUpCodeService;
  120. @Autowired
  121. private MkStoreCampMinusService mkStoreCampMinusService;
  122. @Autowired
  123. private MkStoreTicketDiscountService mkStoreTicketDiscountService;
  124. @Autowired
  125. private CashierDao cashierDao; // 收银机查询
  126. @Autowired
  127. private CashierLoginRecordDao cashierLoginRecordDao; // 收银员登录记录
  128. @Autowired
  129. private SaleRecordDao saleRecordDao; // 销售记录
  130. @Autowired
  131. private StoreTopicDao storeTopicDao; // 查询是否有门店活动
  132. @Autowired
  133. private Mk2GoodsTopicPriceDao mk2GoodsTopicPriceDao; // 门店商品价格
  134. @Autowired
  135. private Mall2PointsRulesDao pointsRulesDao; // 积分规则
  136. @Autowired
  137. private Mall2MemberPointsDao memberPointsDao; // 用户积分
  138. @Autowired
  139. private Mall2MemberConsumptionRecordsDao memberConsumptionRecordsDao; // 会员消费记录
  140. @Autowired
  141. private MkStorePromTypeDao storePromTypeDao; // 优惠类型
  142. @Autowired
  143. private Mk2MemberBirthdayDao memberBirthdayDao; // 生日优惠
  144. @Autowired
  145. private MerchUserDao merchUserDao;
  146. @Autowired
  147. private Mall2LowPriceWarningDao lowPriceWarningDao;
  148. @Override
  149. public OrderEntity queryObject(Long id) {
  150. return orderDao.queryObject(id);
  151. }
  152. @Override
  153. public Double getTotalActualPrice(String merchOrderSn) {
  154. return orderDao.getTotalActualPrice(merchOrderSn);
  155. }
  156. @Override
  157. public List<OrderEntity> queryList(Map<String, Object> map) {
  158. return orderDao.queryList(map);
  159. }
  160. @Override
  161. public int queryTotal(Map<String, Object> map) {
  162. return orderDao.queryTotal(map);
  163. }
  164. @Override
  165. public int save(OrderEntity order) {
  166. return orderDao.save(order);
  167. }
  168. @Override
  169. public int update(OrderEntity order) {
  170. return orderDao.update(order);
  171. }
  172. /**
  173. * 取消订单
  174. *
  175. * @param order
  176. */
  177. @Override
  178. public void cancelOrder(OrderEntity order) {
  179. boolean needUpdateStock = true;
  180. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
  181. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_101.getItem()));
  182. }
  183. orderDao.update(order);
  184. if (!needUpdateStock) {
  185. return;
  186. }
  187. // 更新库存
  188. updateStock(order, "管理后台取消订单");
  189. // 释放优惠券
  190. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  191. if (null != couponVo) {
  192. userCouponDao.cancelOrder(couponVo);
  193. }
  194. //释放促销满减券
  195. UserCampMinusEntity userCampMinusVo = userCampMinusDao.queryUserCampByOrderId(order.getId());
  196. if (null != userCampMinusVo) {
  197. userCampMinusDao.cancelUserCampOrder(userCampMinusVo);
  198. }
  199. }
  200. @Override
  201. public int delete(Long id) {
  202. return orderDao.delete(id);
  203. }
  204. @Override
  205. public int deleteBatch(Long[] ids) {
  206. return orderDao.deleteBatch(ids);
  207. }
  208. @Override
  209. public int confirm(Long id) {
  210. OrderEntity orderEntity = queryObject(id);
  211. Integer shippingStatus = orderEntity.getShippingStatus();//发货状态
  212. Integer payStatus = orderEntity.getPayStatus();//付款状态
  213. if (2 != payStatus) {
  214. throw new RRException("此订单未付款,不能确认收货!");
  215. }
  216. if (4 == shippingStatus) {
  217. throw new RRException("此订单处于退货状态,不能确认收货!");
  218. }
  219. if (0 == shippingStatus) {
  220. throw new RRException("此订单未发货,不能确认收货!");
  221. }
  222. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_301.getItem())) {
  223. throw new RRException("此订单已完成!");
  224. }
  225. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
  226. throw new RRException("此订单待付款!");
  227. }
  228. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_100.getItem())) {
  229. throw new RRException("此订单付款中!");
  230. }
  231. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_101.getItem())) {
  232. throw new RRException("此订单已取消!");
  233. }
  234. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_102.getItem())) {
  235. throw new RRException("此订单已删除!");
  236. }
  237. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  238. throw new RRException("此订单还未发货!");
  239. }
  240. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem())) {
  241. throw new RRException("此订单已退款!");
  242. }
  243. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
  244. throw new RRException("此订单已退款!");
  245. }
  246. orderEntity.setShippingStatus(2);
  247. orderEntity.setOrderStatus(301);
  248. orderEntity.setConfirmTime(new Date());
  249. orderDao.update(orderEntity);
  250. return 0;
  251. }
  252. @Override
  253. public int sendGoods(OrderEntity order) {
  254. Integer payStatus = order.getPayStatus();//付款状态
  255. if (2 != payStatus) {
  256. throw new RRException("此订单未付款!");
  257. }
  258. ShippingEntity shippingEntity = shippingDao.queryObject(order.getShippingId());
  259. if (null != shippingEntity) {
  260. order.setShippingName(shippingEntity.getName());
  261. }
  262. order.setOrderStatus(300);//订单已发货
  263. order.setShippingStatus(1);//已发货
  264. return orderDao.update(order);
  265. }
  266. @Override
  267. public Ticket printMsg(Long id) {
  268. OrderEntity orderEntity = queryInfos(id);
  269. List<OrderGoodsEntity> orderGoodsEntityList = orderEntity.getOrderGoodsEntityList();
  270. // 获取门店
  271. StoreEntity storeEntity = storeDao.queryObject(orderEntity.getStoreId());
  272. // 获取清关信息
  273. OrderProcessRecordEntity orderProcessRecordEntity =
  274. orderProcessRecordDao.queryObjectByOrderSn(orderEntity.getOrderSn());
  275. // 小票头
  276. TicketHead head = new TicketHead();
  277. head.setTitle(OmsMerchPropertiesBuilder.instance().getMerchName() + storeEntity.getStoreName());
  278. // head.setMemberId(orderEntity.getUserName().toString());
  279. head.setOrderId(orderEntity.getOrderSn());
  280. head.setTradeTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE").format(new Date()));
  281. // 商品信息
  282. Integer goodsTotal = 0; // 商品总个数
  283. BigDecimal total = Constant.ZERO; // 商品总计
  284. List<Goods> goodsList = new ArrayList<>();
  285. for (OrderGoodsEntity orderGoods : orderGoodsEntityList) {
  286. goodsTotal += orderGoods.getNumber();
  287. total = total.add(orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber())))
  288. .setScale(2, BigDecimal.ROUND_HALF_UP);
  289. Goods goods = new Goods(orderGoods.getGoodsName(), orderGoods.getRetailPrice().toString(),
  290. orderGoods.getNumber().toString(),
  291. orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber()))
  292. .setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  293. goodsList.add(goods);
  294. }
  295. // 收银信息
  296. CashInfo cashInfo = new CashInfo();
  297. cashInfo.setGoodsTotal(goodsTotal.toString());
  298. cashInfo.setTotal(total.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  299. cashInfo.setReceipts(orderEntity.getActualPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  300. cashInfo.setOddChange("0.00");
  301. cashInfo.setCoupon(orderEntity.getCouponPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  302. cashInfo.setFreight(
  303. new BigDecimal(orderEntity.getFreightPrice()).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  304. cashInfo.setPaymentMode("微信支付");
  305. // 海关清单
  306. CusListing cusListing = new CusListing();
  307. cusListing.setOrderId(orderEntity.getOrderSn());
  308. if (!orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())) {
  309. cusListing.setWaybillId(orderProcessRecordEntity.getLogisticsNo());
  310. cusListing.setInvtNo(orderProcessRecordEntity.getInvtNo());
  311. cusListing.setConsignee(orderEntity.getConsignee());
  312. cusListing.setConsigneeTel(orderEntity.getMobile());
  313. }
  314. cusListing.setOriginAddress(PrintTicketPropertiesBuilder.instance().getAddress());
  315. cusListing.setDeliveryAddress(storeEntity.getStoreAddress());
  316. return TicketPrintUtil.print(head, goodsList, cashInfo, cusListing);
  317. }
  318. @Override
  319. public Ticket printMsg(Long id, String sessionId) {
  320. OrderEntity orderEntity = queryInfos(id);
  321. List<OrderGoodsEntity> orderGoodsEntityList = orderEntity.getOrderGoodsEntityList();
  322. // 获取门店
  323. StoreEntity storeEntity = storeDao.queryObject(orderEntity.getStoreId());
  324. // 获取清关信息
  325. OrderProcessRecordEntity orderProcessRecordEntity =
  326. orderProcessRecordDao.queryObjectByOrderSn(orderEntity.getOrderSn());
  327. // 小票头
  328. TicketHead head = new TicketHead();
  329. head.setTitle(OmsMerchPropertiesBuilder.instance().getMerchName() + storeEntity.getStoreName());
  330. // head.setMemberId(orderEntity.getUserName().toString());
  331. head.setOrderId(orderEntity.getOrderSn());
  332. head.setTradeTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE").format(new Date()));
  333. // 商品信息
  334. Integer goodsTotal = 0; // 商品总个数
  335. BigDecimal total = Constant.ZERO; // 商品总计
  336. List<Goods> goodsList = new ArrayList<>();
  337. for (OrderGoodsEntity orderGoods : orderGoodsEntityList) {
  338. goodsTotal += orderGoods.getNumber();
  339. total = total.add(orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber())))
  340. .setScale(2, BigDecimal.ROUND_HALF_UP);
  341. Goods goods = new Goods(orderGoods.getGoodsName(), orderGoods.getRetailPrice().toString(),
  342. orderGoods.getNumber().toString(),
  343. orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber()))
  344. .setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  345. goodsList.add(goods);
  346. }
  347. // 收银信息
  348. CashInfo cashInfo = new CashInfo();
  349. cashInfo.setGoodsTotal(goodsTotal.toString());
  350. cashInfo.setTotal(total.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  351. cashInfo.setReceipts(orderEntity.getActualPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  352. cashInfo.setOddChange("0.00");
  353. cashInfo.setCoupon(orderEntity.getCouponPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  354. cashInfo.setFreight(
  355. new BigDecimal(orderEntity.getFreightPrice()).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  356. cashInfo.setPaymentMode("微信支付");
  357. // 海关清单
  358. CusListing cusListing = new CusListing();
  359. cusListing.setOrderId(orderEntity.getOrderSn());
  360. if (!orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())) {
  361. cusListing.setWaybillId(orderProcessRecordEntity.getLogisticsNo());
  362. cusListing.setInvtNo(orderProcessRecordEntity.getInvtNo());
  363. cusListing.setConsignee(orderEntity.getConsignee());
  364. cusListing.setConsigneeTel(orderEntity.getMobile());
  365. }
  366. cusListing.setOriginAddress(PrintTicketPropertiesBuilder.instance().getAddress());
  367. cusListing.setDeliveryAddress(storeEntity.getStoreAddress());
  368. // 尝试在取货码表中查询数据,如果有的话就改变状态
  369. String orderSn = orderEntity.getOrderSn();
  370. PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(orderSn);
  371. if(pickUpCodeEntity != null){
  372. pickUpCodeEntity.setPickUpCodeStatus("1");
  373. pickUpCodeService.update(pickUpCodeEntity);
  374. // try {
  375. // WebSocketServer.delete(sessionId,orderEntity.getStoreId(),pickUpCodeEntity);
  376. // } catch (IOException e) {
  377. // e.printStackTrace();
  378. // }
  379. }
  380. return TicketPrintUtil.print(head, goodsList, cashInfo, cusListing);
  381. }
  382. /**
  383. * 退款
  384. */
  385. @Transactional
  386. public void refund(OrderEntity order) {
  387. boolean needUpdateStock = true;
  388. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  389. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  390. }
  391. if (Dict.payFlag.item_cash.getItem().equals(order.getPayFlag())) {
  392. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
  393. }
  394. orderDao.update(order);//修改为退款中
  395. // TODO: 2019/6/13 定时任务查询退款成功后释放库存、优惠券
  396. /*// 判断是否有优惠券
  397. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  398. if (null != couponVo) {
  399. userCouponDao.cancelOrder(couponVo);
  400. }
  401. if (!needUpdateStock) {
  402. return;
  403. }
  404. // 更新库存
  405. updateStock(order, "管理后台订单退款");*/
  406. // updateStock(order, "管理后台订单退款");
  407. queryStorePromRealUpdateIsScan(order);
  408. }
  409. /**
  410. * 退款
  411. */
  412. @Transactional
  413. public void refund(OrderEntity order, WechatRefundApiResult result) {
  414. boolean needUpdateStock = true;
  415. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  416. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  417. }
  418. if (Dict.payFlag.item_cash.getItem().equals(order.getPayFlag())) {
  419. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
  420. }else{
  421. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
  422. OrderRefundEntity mallOrderRefund = orderRefundDao.queryObjectByOrderId(order.getId());
  423. OrderRefundEntity orderRefund = new OrderRefundEntity();
  424. orderRefund.setRefundId(result.getRefund_id());
  425. orderRefund.setOutRefundNo(result.getOut_refund_no());
  426. orderRefund
  427. .setRefundMoney(BigDecimal.valueOf(Long.valueOf(result.getRefund_fee())).divide(Constant.ONE_HUNDRED));
  428. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));//退款处理中
  429. orderRefund.setModTime(new Date());
  430. if (mallOrderRefund != null) {
  431. orderRefund.setId(mallOrderRefund.getId());
  432. orderRefund.setRefundType(mallOrderRefund.getRefundType());
  433. orderRefundDao.update(orderRefund);
  434. } else {
  435. orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
  436. orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
  437. orderRefund.setCreateTime(new Date());
  438. List<OrderEntity> list = orderDao.queryObjectByMerchOrderSn(order.getMerchOrderSn());
  439. if(list.size()>1){//多条订单
  440. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
  441. }else{
  442. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
  443. }
  444. orderRefundDao.save(orderRefund);//退款记录
  445. }
  446. }
  447. orderDao.update(order);//修改为退款中
  448. // TODO: 2019/6/13 定时任务查询退款成功后释放库存、优惠券
  449. /*// 判断是否有优惠券
  450. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  451. if (null != couponVo) {
  452. userCouponDao.cancelOrder(couponVo);
  453. }
  454. if (!needUpdateStock) {
  455. return;
  456. }
  457. // 更新库存
  458. updateStock(order, "管理后台订单退款");*/
  459. // updateStock(order, "管理后台订单退款");
  460. queryStorePromRealUpdateIsScan(order);
  461. }
  462. @Transactional
  463. public void refund(OrderEntity order, AliPayMicropayApiResult result) {
  464. boolean needUpdateStock = true;
  465. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  466. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  467. }
  468. if (Dict.payFlag.item_cash.getItem().equals(order.getPayFlag())) {
  469. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
  470. }else{
  471. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
  472. OrderRefundEntity mallOrderRefund = orderRefundDao.queryObjectByOrderId(order.getId());
  473. OrderRefundEntity orderRefund = new OrderRefundEntity();
  474. orderRefund.setRefundId(result.getTradeNo());
  475. orderRefund.setOutRefundNo(result.getOutTradeNo());
  476. orderRefund
  477. .setRefundMoney(new BigDecimal(result.getRefundFee()).divide(Constant.ONE_HUNDRED));
  478. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));//退款处理中
  479. orderRefund.setModTime(new Date());
  480. if (mallOrderRefund != null) {
  481. orderRefund.setId(mallOrderRefund.getId());
  482. orderRefund.setRefundType(mallOrderRefund.getRefundType());
  483. orderRefundDao.update(orderRefund);
  484. } else {
  485. orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
  486. orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
  487. orderRefund.setCreateTime(new Date());
  488. List<OrderEntity> list = orderDao.queryObjectByMerchOrderSn(order.getMerchOrderSn());
  489. if(list.size()>1){//多条订单
  490. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
  491. }else{
  492. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
  493. }
  494. orderRefundDao.save(orderRefund);//退款记录
  495. }
  496. }
  497. orderDao.update(order);//修改为退款中
  498. // TODO: 2019/6/13 定时任务查询退款成功后释放库存、优惠券
  499. /*// 判断是否有优惠券
  500. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  501. if (null != couponVo) {
  502. userCouponDao.cancelOrder(couponVo);
  503. }
  504. if (!needUpdateStock) {
  505. return;
  506. }
  507. // 更新库存
  508. updateStock(order, "管理后台订单退款");*/
  509. // updateStock(order, "管理后台订单退款");
  510. // queryStorePromRealUpdateIsScan(order);
  511. }
  512. /**
  513. * 平安退款逻辑处理
  514. * @param order
  515. * @param result
  516. */
  517. @Transactional
  518. public void pinganRefund(OrderEntity order, net.sf.json.JSONObject result, String refundId) {
  519. boolean needUpdateStock = true;
  520. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  521. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  522. }
  523. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
  524. OrderRefundEntity orderRefund = new OrderRefundEntity();
  525. orderRefund.setRefundId(refundId);
  526. orderRefund.setOutRefundNo(result.getString("ord_no"));
  527. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));//退款处理中
  528. orderRefund.setModTime(new Date());
  529. orderRefund.setRefundMoney(BigDecimal.valueOf(result.getInt("trade_amount")).divide(Constant.ONE_HUNDRED));
  530. OrderRefundEntity mallOrderRefund = orderRefundDao.queryObjectByOrderId(order.getId());
  531. if (mallOrderRefund != null) {
  532. orderRefund.setRefundType(mallOrderRefund.getRefundType());
  533. orderRefund.setId(mallOrderRefund.getId());
  534. orderRefundDao.update(orderRefund);
  535. } else {//退款记录不存在
  536. orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
  537. orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
  538. orderRefund.setCreateTime(new Date());
  539. orderRefundDao.save(orderRefund);//退款记录
  540. }
  541. orderDao.update(order);//修改为退款中
  542. // TODO: 2019/6/13 定时任务查询退款成功后释放库存、优惠券
  543. /*// 判断是否有优惠券
  544. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  545. if (null != couponVo) {
  546. userCouponDao.cancelOrder(couponVo);
  547. }
  548. if (!needUpdateStock) {
  549. return;
  550. }
  551. // 更新库存
  552. updateStock(order, "管理后台平安退款订单");*/
  553. queryStorePromRealUpdateIsScan(order);
  554. }
  555. /**
  556. * 微信国际退款逻辑处理
  557. * @param order
  558. * @param result
  559. */
  560. @Transactional
  561. public void globalRefund(OrderEntity order, WechatGlobalRefundApiResult result) {
  562. boolean needUpdateStock = true;
  563. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  564. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  565. }
  566. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
  567. OrderRefundEntity orderRefund = new OrderRefundEntity();
  568. orderRefund.setRefundId(result.getRefund_id());
  569. orderRefund.setOutRefundNo(result.getOut_refund_no());
  570. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));//退款处理中
  571. orderRefund.setModTime(new Date());
  572. orderRefund.setRefundMoney(BigDecimal.valueOf(Long.valueOf(result.getRefund_fee())).divide(Constant.ONE_HUNDRED));
  573. orderRefund.setRefundFeeType(result.getRefund_fee_type());
  574. if(org.apache.commons.lang3.StringUtils.isNotEmpty(result.getTotal_fee())) {
  575. orderRefund.setTotalFee(Integer.parseInt(BigDecimal.valueOf(Long.valueOf(result.getTotal_fee())).divide(Constant.ONE_HUNDRED).toString()));
  576. }
  577. orderRefund.setFeeType(result.getFee_type());
  578. if(org.apache.commons.lang3.StringUtils.isNotEmpty(result.getCash_fee())) {
  579. orderRefund.setCashFee(Integer.parseInt(BigDecimal.valueOf(Long.valueOf(result.getCash_fee())).divide(Constant.ONE_HUNDRED).toString()));
  580. }
  581. orderRefund.setCashFeeType(result.getCash_fee_type());
  582. if(org.apache.commons.lang3.StringUtils.isNotEmpty(result.getCash_refund_fee())) {
  583. orderRefund.setCashRefundFee(Integer.parseInt(BigDecimal.valueOf(Long.valueOf(result.getCash_refund_fee())).divide(Constant.ONE_HUNDRED).toString()));
  584. }
  585. orderRefund.setCashRefundFeeType(result.getCash_refund_fee_type());
  586. OrderRefundEntity mallOrderRefund = orderRefundDao.queryObjectByOrderId(order.getId());
  587. if (mallOrderRefund != null) {
  588. orderRefund.setRefundType(mallOrderRefund.getRefundType());
  589. orderRefund.setId(mallOrderRefund.getId());
  590. orderRefundDao.update(orderRefund);
  591. } else {//退款记录不存在
  592. orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
  593. orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
  594. orderRefund.setCreateTime(new Date());
  595. orderRefundDao.save(orderRefund);//退款记录
  596. }
  597. orderDao.update(order);//修改为退款中
  598. // TODO: 2019/6/13 定时任务查询退款成功后释放库存、优惠券
  599. /*// 判断是否有优惠券
  600. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  601. if (null != couponVo) {
  602. userCouponDao.cancelOrder(couponVo);
  603. }
  604. if (!needUpdateStock) {
  605. return;
  606. }
  607. // 更新库存
  608. updateStock(order, "管理后台微信国际退款订单");*/
  609. queryStorePromRealUpdateIsScan(order);
  610. }
  611. private void updateStock(OrderEntity order, String changeReason){
  612. Map<String, Object> map = new HashMap();
  613. SysUserEntity user = ShiroUtils.getUserEntity();
  614. map.put("orderId", order.getId());
  615. List<OrderGoodsEntity> orderGoodsVoList = orderGoodsDao.queryList(map);
  616. for (OrderGoodsEntity orderGoodsEntity : orderGoodsVoList) {
  617. ProductStoreRelaEntity storeRelaEntity = productStoreRelaDao
  618. .queryByStoreIdProductId(Long.valueOf(order.getStoreId()),Long.valueOf(orderGoodsEntity.getProductId()));
  619. if (null == storeRelaEntity || null == storeRelaEntity.getSellVolume()) {
  620. storeRelaEntity.setSellVolume(0);
  621. }
  622. BigDecimal sellVolume = new BigDecimal(storeRelaEntity.getSellVolume() - orderGoodsEntity.getNumber());//销售量
  623. if (sellVolume.compareTo(Constant.ZERO) < 0) {
  624. sellVolume = Constant.ZERO;
  625. }
  626. Integer stockNum = 0;
  627. GoodsEntity goodsEntity = goodsDao.queryObject(orderGoodsEntity.getGoodsId());
  628. if(goodsEntity != null){
  629. stockNum = goodsEntity.getGoodsNumber();
  630. //还原商户商品库存
  631. resetGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);
  632. }
  633. if (null != storeRelaEntity.getStockNum()) {
  634. stockNum = storeRelaEntity.getStockNum();
  635. //普通商品不受共享库存影响,直接取门店配置库存
  636. //该商品所属第三方商户不是共享库存
  637. if(goodsEntity.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
  638. resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);//还原门店库存
  639. }else{
  640. //该商品所属第三方商户是共享库存,但商品业务类型不是00保税备货
  641. if(!goodsEntity.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
  642. resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);//还原门店库存
  643. }
  644. }
  645. }
  646. //该商品所属第三方商户为共享库存,且是保税备货商品,取消订单时改变
  647. updateGoodsByIsShareStock(goodsEntity);
  648. }
  649. }
  650. /**
  651. * 更新商品库存数量变化后是否已共享为0“未共享”
  652. * @param goodsInfo
  653. */
  654. private void updateGoodsByIsShareStock(GoodsEntity goodsInfo){
  655. //该商品所属第三方商户为共享库存,且是保税备货商品
  656. if(goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())
  657. && goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
  658. GoodsEntity goodsVo = new GoodsEntity();
  659. goodsVo.setId(goodsInfo.getId());
  660. //商品库存数量变化后是否已共享,0:否,1:是(下单、退款、取消订单触发)
  661. goodsVo.setIsGoodsShareStock(Dict.isGoodsShareStock.item_0.getItem());
  662. goodsDao.update(goodsVo);
  663. }
  664. }
  665. /**
  666. * 还原商品总库存
  667. * @param stockNum
  668. * @param storeRelaEntity
  669. * @param orderGoodsEntity
  670. * @param sellVolume
  671. * @param changeReason
  672. * @param user
  673. */
  674. private void resetGoodsStock(Integer stockNum, ProductStoreRelaEntity storeRelaEntity,
  675. OrderGoodsEntity orderGoodsEntity, BigDecimal sellVolume, String changeReason, SysUserEntity user){
  676. GoodsEntity goodsEntity = goodsDao.queryObject(storeRelaEntity.getGoodsId());
  677. if(goodsEntity!=null){
  678. goodsEntity.setGoodsNumber(stockNum + orderGoodsEntity.getNumber());
  679. // goodsEntity.setSellVolume(Integer.parseInt(goodsSellVolume.toString()));
  680. goodsDao.update(goodsEntity);
  681. // storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
  682. // productStoreRelaDao.update(storeRelaEntity);
  683. MngChangeEntity mngChangeEntity = new MngChangeEntity();
  684. mngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(goodsEntity.getId())));
  685. mngChangeEntity.setThirdPartyMerchCode(goodsEntity.getThirdPartyMerchCode());
  686. mngChangeEntity.setChangeReason(changeReason);
  687. mngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
  688. mngChangeEntity.setChangeNum(orderGoodsEntity.getNumber());//变化数
  689. mngChangeEntity.setOriginalNum(stockNum);//原库存数
  690. mngChangeEntity.setValidNum(stockNum + orderGoodsEntity.getNumber());//可用数
  691. mngChangeEntity.setCreateTime(new Date());
  692. mngChangeEntity.setModTime(new Date());
  693. mngChangeEntity.setCreaterSn(user.getUsername());
  694. mngChangeEntity.setModerSn(user.getUsername());
  695. mngChangeEntity.setIsValid(0);
  696. mngChangeEntity.setMerchSn(goodsEntity.getMerchSn());
  697. mngChangeDao.save(mngChangeEntity);
  698. }
  699. }
  700. /**
  701. * 还原门店商品库存
  702. * @param stockNum
  703. * @param storeRelaEntity
  704. * @param orderGoodsEntity
  705. * @param sellVolume
  706. * @param changeReason
  707. * @param user
  708. */
  709. private void resetStoreGoodsStock(Integer stockNum, ProductStoreRelaEntity storeRelaEntity,
  710. OrderGoodsEntity orderGoodsEntity, BigDecimal sellVolume, String changeReason, SysUserEntity user){
  711. storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
  712. storeRelaEntity.setStockNum(stockNum + orderGoodsEntity.getNumber());//库存数量
  713. productStoreRelaDao.update(storeRelaEntity);
  714. StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
  715. storeMngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
  716. storeMngChangeEntity.setChangeReason(changeReason);
  717. storeMngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(storeRelaEntity.getGoodsId())));
  718. storeMngChangeEntity.setStoreId(Integer.parseInt(String.valueOf(storeRelaEntity.getStoreId())));
  719. storeMngChangeEntity.setMerchSn(storeRelaEntity.getMerchSn());
  720. storeMngChangeEntity.setStoreChangeNum(orderGoodsEntity.getNumber());
  721. storeMngChangeEntity.setStoreOriginalNum(stockNum);
  722. storeMngChangeEntity.setStoreValidNum(stockNum + orderGoodsEntity.getNumber());
  723. storeMngChangeEntity.setCreateTime(new Date());
  724. storeMngChangeEntity.setModTime(new Date());
  725. storeMngChangeEntity.setCreaterSn(user.getUsername());
  726. storeMngChangeEntity.setModerSn(user.getUsername());
  727. storeMngChangeEntity.setIsValid(0);
  728. storeMngChangeDao.save(storeMngChangeEntity);
  729. }
  730. /**
  731. * 查询该退款订单编号是否是推广渠道订单,是则修改渠道定时扫描状态
  732. * @param orderInfo
  733. */
  734. private void queryStorePromRealUpdateIsScan(OrderEntity orderInfo){
  735. Map map = new HashMap();
  736. map.put("orderId", orderInfo.getId());
  737. List<MkStorePromOrderRealEntity> list = mkStorePromOrderRealDao.queryPromRealListByMap(map);
  738. if(list.size() > 0) {
  739. for (MkStorePromOrderRealEntity mkStorePromOrderRealEntity : list) {
  740. mkStorePromOrderRealEntity.setIsPromStatScan(Dict.isDistSellScan.item_0.getItem());
  741. mkStorePromOrderRealDao.update(mkStorePromOrderRealEntity);
  742. }
  743. }
  744. }
  745. /**
  746. * 处理用户退款申请
  747. *
  748. * @param orderInfo
  749. */
  750. @Transactional
  751. public void applyRefundDeal(OrderEntity orderInfo, OrderRefundEntity refundEntity) {
  752. refundEntity.setApprovalTime(new Date());
  753. // refundEntity.setApprover(ShiroUtils.getUserId());
  754. // 退积分
  755. try {
  756. Integer integral = 1;
  757. if (orderInfo.getActualPrice().intValue() > 0) {
  758. integral = orderInfo.getActualPrice().intValue();
  759. }
  760. if (refundEntity.getRefundStatus() == 2) {
  761. orderInfo.setOrderStatus(401);
  762. // UserEntity entity = userDao.queryObject(orderInfo.getUserId());
  763. } else {
  764. orderInfo.setOrderStatus(201);
  765. }
  766. } catch (Exception e) {
  767. e.printStackTrace();
  768. }
  769. orderRefundDao.update(refundEntity);
  770. orderDao.update(orderInfo);
  771. }
  772. @Override
  773. public OrderRefundEntity queryRefundObject(Long refundId) {
  774. return orderRefundDao.queryObject(refundId);
  775. }
  776. @Override
  777. public List<OrderRefundEntity> queryRefundList(Map<String, Object> map) {
  778. return orderRefundDao.queryList(map);
  779. }
  780. @Override
  781. public int queryRefundTotal(Map<String, Object> map) {
  782. return orderRefundDao.queryTotal(map);
  783. }
  784. @Override
  785. public int getUserOrderInfo(Map<String, Object> map) {
  786. int result = 0;
  787. String type = (String) map.get("type");
  788. if ("yfkOrderUserSum".equals(type)) {
  789. result = orderDao.getYfkOrderUserSum(map);
  790. } else if ("oderUserSum".equals(type)) {
  791. result = orderDao.getOderUserSum(map);
  792. } else if ("todayUserOrder".equals(type)) {
  793. result = orderDao.getTodayUserOrder(map);
  794. } else if ("todayUserSales".equals(type)) {
  795. result = orderDao.getTodayUserSales(map);
  796. } else if ("incomeSum".equals(type)) {
  797. result = orderDao.getIncomeSum(map);
  798. } else if ("payedOrderCount".equals(type)) {
  799. result = orderDao.getPayedOrderCount(map);
  800. }
  801. return result;
  802. }
  803. @Override
  804. public Map getLogistics(Long id) {
  805. OrderEntity orderEntity = queryObject(id);
  806. if (orderEntity == null) {
  807. throw new RRException("此订单不存在!");
  808. }
  809. if (orderEntity.getShippingStatus() == 0) {
  810. if (orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) ||
  811. orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_02.getItem())) {
  812. throw new RRException("此订单还未发货!");
  813. } else {
  814. if (StringUtils.isNullOrEmpty(orderEntity.getShippingNo())) {
  815. throw new RRException("此订单还未发货!");
  816. }
  817. }
  818. }
  819. Map logisticsInfo = Maps.newHashMap();
  820. List<WuliuEntity> wuliuEntityList = new ArrayList<>();
  821. OrderProcessRecordEntity orderProcessRecordEntity =
  822. orderProcessRecordDao.queryObjectByOrderSn(orderEntity.getOrderSn());
  823. if (orderProcessRecordEntity != null) {
  824. if (orderEntity.getOrderBizType().equals(Dict.orderBizType.item_10.getItem()) ||
  825. orderEntity.getOrderBizType().equals(Dict.orderBizType.item_02.getItem())) {
  826. WuliuEntity wuliuEntity = new WuliuEntity();
  827. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  828. .format(orderProcessRecordEntity.getCustomsSuccTime()));
  829. wuliuEntity.setAcceptStation(PrintTicketPropertiesBuilder.instance().getAddress() + "送达" +
  830. storeDao.queryObject(orderEntity.getStoreId()).getStoreAddress() +
  831. ";交易完成,用户已提走");
  832. wuliuEntityList.add(wuliuEntity);
  833. }
  834. if (StringUtils.isNotEmpty(orderEntity.getShippingCode()) &&
  835. StringUtils.isNotEmpty(orderEntity.getShippingNo()) &&
  836. orderProcessRecordEntity.getShipmentStartTime() != null) {
  837. if(orderEntity.getShippingCode().equalsIgnoreCase("SF")){
  838. StoreEntity storeEntity = storeDao.queryObject(orderEntity.getStoreId());
  839. if(storeEntity == null){
  840. throw new RRException("查询顺丰订单异常,订单的门店信息不存在");
  841. }
  842. ThirdMerchExpressEntity thirdMerchExpressEntity = thirdMerchExpressDao.getThirdMerchExpressByThirdCode(storeEntity.getThirdPartyMerchCode());
  843. if(thirdMerchExpressEntity == null){
  844. throw new RRException("查询顺丰订单异常,缺失商户快递账号信息");
  845. }
  846. SfRouteServiceResponseEntity entity = SFUtil.routeService(orderEntity.getShippingNo(), thirdMerchExpressEntity.getExpressAccount(),
  847. thirdMerchExpressEntity.getExpressPwd(), SFPropertiesBuilder.instance().getUrl());
  848. // SfRouteServiceResponseEntity entity = SFUtil.routeService("254355029325", thirdMerchExpressEntity.getExpressAccount(),
  849. // thirdMerchExpressEntity.getExpressPwd(), SFPropertiesBuilder.instance().getUrl());//444072971585
  850. if(entity.getHead().equalsIgnoreCase("OK")){
  851. if(entity.getBody() == null){
  852. WuliuEntity wuliuEntity = new WuliuEntity();
  853. wuliuEntity.setAcceptStation("暂无物流轨迹");
  854. wuliuEntityList.add(wuliuEntity);
  855. }else{
  856. if(entity.getBody().getRouteResponse() == null){
  857. WuliuEntity wuliuEntity = new WuliuEntity();
  858. wuliuEntity.setAcceptStation("暂无物流轨迹");
  859. wuliuEntityList.add(wuliuEntity);
  860. }else{
  861. RouteResponseEntity routeResponseEntity = entity.getBody().getRouteResponse().get(0);
  862. if(routeResponseEntity != null){
  863. List<RouteEntity> entityList = routeResponseEntity.getRouteResponse();
  864. for (RouteEntity route : entityList) {
  865. WuliuEntity wuliuEntity = new WuliuEntity();
  866. wuliuEntity.setAcceptTime(route.getAccept_time());
  867. wuliuEntity.setAcceptStation(route.getAccept_address() + route.getRemark());
  868. wuliuEntityList.add(wuliuEntity);
  869. }
  870. }
  871. }
  872. }
  873. }else{
  874. throw new RRException("查询顺丰订单异常,"+entity.getErrors());
  875. }
  876. }else{
  877. JSONObject traces =
  878. KdniaoUtil.getOrderTracesByJson(orderEntity.getShippingCode(), orderEntity.getShippingNo());
  879. List<Map> mapList = (List<Map>) traces.get("Traces");
  880. if (mapList != null && mapList.size() > 0) {
  881. for (Map map : mapList) {
  882. WuliuEntity wuliuEntity = new WuliuEntity();
  883. wuliuEntity.setAcceptTime(map.get("AcceptTime").toString());
  884. wuliuEntity.setAcceptStation(map.get("AcceptStation").toString());
  885. wuliuEntityList.add(wuliuEntity);
  886. }
  887. }
  888. String state = traces.get("State") + "";
  889. if (Dict.logisticsStatus.item_0.getItem().equals(state) && traces.getBoolean("Success")) {
  890. String reason = traces.get("Reason") + "";
  891. WuliuEntity wuliuEntity = new WuliuEntity();
  892. wuliuEntity.setAcceptStation(reason);
  893. wuliuEntityList.add(wuliuEntity);
  894. }
  895. }
  896. }
  897. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsCustomsSend()) &&
  898. orderProcessRecordEntity.getShipmentStartTime() != null) {
  899. WuliuEntity wuliuEntity = new WuliuEntity();
  900. wuliuEntity.setAcceptStation("订单已出库");
  901. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  902. .format(orderProcessRecordEntity.getShipmentStartTime()));
  903. wuliuEntityList.add(wuliuEntity);
  904. }
  905. if (Dict.isSend.item_1.getItem().equals(orderProcessRecordEntity.getIsCustomsSend())) {
  906. WuliuEntity wuliuEntity = new WuliuEntity();
  907. wuliuEntity.setAcceptStation("订单清关完成,等待仓库发货");
  908. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  909. .format(orderProcessRecordEntity.getCustomsSuccTime()));
  910. wuliuEntityList.add(wuliuEntity);
  911. }
  912. if (Dict.isSend.item_0.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsCustomsSend())) {
  913. WuliuEntity wuliuEntity = new WuliuEntity();
  914. wuliuEntity.setAcceptStation("订单清关失败");
  915. wuliuEntityList.add(wuliuEntity);
  916. }
  917. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsEleOrderSend()) &&
  918. orderProcessRecordEntity.getWaybillSuccTime() != null) {
  919. WuliuEntity wuliuEntity = new WuliuEntity();
  920. wuliuEntity.setAcceptStation("海关三单发送成功");
  921. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  922. .format(orderProcessRecordEntity.getWaybillSuccTime()));
  923. wuliuEntityList.add(wuliuEntity);
  924. }
  925. if (Dict.isSend.item_1.getItem().equals(orderProcessRecordEntity.getIsPaymentSend())) {
  926. WuliuEntity wuliuEntity = new WuliuEntity();
  927. wuliuEntity.setAcceptStation("订单支付成功");
  928. wuliuEntity.setAcceptTime(
  929. new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(orderProcessRecordEntity.getPaySuccTime()));
  930. wuliuEntityList.add(wuliuEntity);
  931. }
  932. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsAddOrderSend())) {
  933. WuliuEntity wuliuEntity = new WuliuEntity();
  934. wuliuEntity.setAcceptStation("订单下单成功");
  935. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  936. .format(orderProcessRecordEntity.getAddOrderSuccTime()));
  937. wuliuEntityList.add(wuliuEntity);
  938. }
  939. }
  940. logisticsInfo.put("tracesList", wuliuEntityList);
  941. logisticsInfo.put("logisticCode", orderEntity.getShippingNo());
  942. logisticsInfo.put("shipperCode", orderEntity.getShippingCode());
  943. return logisticsInfo;
  944. }
  945. @Override
  946. public OrderEntity queryInfos(Long id) {
  947. OrderEntity orderEntity = orderDao.queryObject(id);
  948. Map<String, Object> map = new HashMap<String, Object>();
  949. map.put("orderId", id);
  950. List<OrderGoodsEntity> orderGoodsEntityList = orderGoodsDao.queryList(map);
  951. orderEntity.setOrderGoodsEntityList(orderGoodsEntityList);
  952. return orderEntity;
  953. }
  954. /**
  955. * 普货商品生成线下订单
  956. * @param offlineCartList
  957. * @param user
  958. * @return
  959. */
  960. @Transactional
  961. @Override
  962. public Map orderSubmit(List<OfflineCartEntity> offlineCartList, SysUserEntity user) {
  963. Map resultObj = Maps.newHashMap();
  964. try {
  965. if (user == null) {
  966. resultObj.put("errno", 400);
  967. resultObj.put("errmsg", "用户登录超时,请重新登录");
  968. return resultObj;
  969. }
  970. if (!user.getRoleType().equalsIgnoreCase("2")) {
  971. resultObj.put("errno", 400);
  972. resultObj.put("errmsg", "该操作只允许店员账户操作");
  973. return resultObj;
  974. }
  975. if (org.apache.commons.lang3.StringUtils.isEmpty(user.getMerchSn())) {
  976. resultObj.put("errno", 400);
  977. resultObj.put("errmsg", "操作用户的商户编号为空,请先维护用户商户编号信息再来操作");
  978. return resultObj;
  979. }
  980. Long userId = user.getUserId();
  981. Integer storeId = user.getStoreId();
  982. //获取要购买的商品
  983. Map param = Maps.newHashMap();
  984. param.put("userId", userId);
  985. param.put("storeId", storeId);
  986. if (null == offlineCartList && offlineCartList.size() == 0) {
  987. resultObj.put("errno", 400);
  988. resultObj.put("errmsg", "购买商品数据为空");
  989. return resultObj;
  990. }
  991. List<OfflineCartEntity> offlineCartEntityList = offlineCartDao.queryOfflineCartByBizType(param);
  992. if (offlineCartEntityList.size() == 0 && offlineCartList.size() > 0) {
  993. resultObj.put("errno", 0);
  994. resultObj.put("errmsg", "该单已下单成功,请重新扫描商品进行购买");
  995. return resultObj;
  996. }
  997. // 检查库存和更新库存
  998. for (OfflineCartEntity cartEntity : offlineCartEntityList) {
  999. GoodsEntity goodsEntity = goodsDao.queryObject(cartEntity.getGoodsId());
  1000. if (goodsEntity == null) {
  1001. resultObj.put("errno", 400);
  1002. resultObj.put("errmsg", "订单提交失败:商品不存在");
  1003. return resultObj;
  1004. }
  1005. //取得规格的信息,判断规格库存
  1006. ProductStoreRelaEntity productInfo = productStoreRelaDao
  1007. .queryByGoodsIdAndStoreId(Long.valueOf(storeId), Long.valueOf(cartEntity.getGoodsId()));
  1008. synchronized (productInfo) {
  1009. if (null == productInfo || null == productInfo.getStockNum() ||
  1010. productInfo.getStockNum() < cartEntity.getNumber()) {
  1011. resultObj.put("errno", 400);
  1012. resultObj.put("errmsg", "库存不足,仅剩余" + productInfo.getStockNum());
  1013. return resultObj;
  1014. } else {
  1015. productInfo.setStockNum(productInfo.getStockNum() - cartEntity.getNumber());
  1016. productInfo.setStoreId(Long.valueOf(storeId));
  1017. productInfo.addSellVolume();
  1018. productStoreRelaDao.updateStockNum(productInfo);//修改普通商品库存
  1019. if(goodsEntity != null) {
  1020. goodsEntity.setGoodsNumber(goodsEntity.getGoodsNumber() - cartEntity.getNumber());
  1021. goodsDao.update(goodsEntity);
  1022. }
  1023. }
  1024. }
  1025. }
  1026. String merchOrderSn = "EMATO" + CommonUtil.generateOrderNumber();
  1027. OrderEntity order = setOrderVo(user, offlineCartEntityList, user.getMerchSn());
  1028. order.setStoreId(storeId);
  1029. order.setMerchOrderSn(merchOrderSn);
  1030. //开启事务,插入订单信息和订单商品
  1031. if (order != null) {
  1032. orderDao.save(order);
  1033. if (null == order.getId()) {
  1034. resultObj.put("errno", 400);
  1035. resultObj.put("errmsg", "订单提交失败");
  1036. return resultObj;
  1037. }
  1038. for (OfflineCartEntity cartEntity : offlineCartEntityList) {
  1039. OrderGoodsEntity orderGoodsEntity = setOrderGoodsVo(order, cartEntity);
  1040. //新增订单详情
  1041. orderGoodsDao.save(orderGoodsEntity);
  1042. }
  1043. //清空预订单商品临时表
  1044. offlineCartDao.deleteByUserId(userId);
  1045. Map orderInfoMap = Maps.newHashMap();
  1046. orderInfoMap.put("orderInfo", order);
  1047. resultObj.put("errno", 0);
  1048. resultObj.put("errmsg", "订单提交成功");
  1049. resultObj.put("data", orderInfoMap);
  1050. }
  1051. } catch (Exception e) {
  1052. e.printStackTrace();
  1053. resultObj.put("errno", 400);
  1054. resultObj.put("errmsg", "订单异常");
  1055. return resultObj;
  1056. }
  1057. return resultObj;
  1058. }
  1059. /**
  1060. * 设置订单数据
  1061. *
  1062. * @param loginUser
  1063. * @return
  1064. */
  1065. public OrderEntity setOrderVo(SysUserEntity loginUser, List<OfflineCartEntity> offlineCartEntityList,
  1066. String merchSn) {
  1067. OrderEntity orderInfo = new OrderEntity();
  1068. BigDecimal freightPrice = new BigDecimal(0.00);
  1069. BigDecimal goodsTotalPrice = new BigDecimal(0.00);
  1070. for (OfflineCartEntity offlineCartEntity : offlineCartEntityList) {
  1071. goodsTotalPrice = goodsTotalPrice
  1072. .add(offlineCartEntity.getRetailPrice().multiply(new BigDecimal(offlineCartEntity.getNumber())));
  1073. }
  1074. //订单价格计算:订单的总价+运费
  1075. BigDecimal orderTotalPrice = goodsTotalPrice.add(freightPrice);
  1076. //查询未使用的优惠券
  1077. /*String couponName = "";
  1078. BigDecimal fullCutCouponDec = Constant.ZERO;
  1079. UserCouponVo couponVo = null;*/
  1080. BigDecimal couponPrice = new BigDecimal(0.00);
  1081. //减去其它支付的金额后,要实际支付的金额 订单的总价+运费-优惠券金额
  1082. BigDecimal actualPrice = orderTotalPrice.subtract(couponPrice);
  1083. //商户(拼音首字母)+业务类型+编号
  1084. // String merchSn = OmsMerchPropertiesBuilder.instance().getMerchSn();
  1085. // String merchShortName = OmsMerchPropertiesBuilder.instance().getMerchShortName();
  1086. MerchEntity merchEntity = merchDao.findByMerchSn(merchSn);
  1087. String merchShortName = "";
  1088. if (merchEntity != null) {
  1089. merchShortName = merchEntity.getMerchShortName();
  1090. }
  1091. String orderSn = merchShortName + Dict.orderBizType.item_11.getItem() + CommonUtil.generateOrderNumber();
  1092. orderInfo.setOrderSn(orderSn);
  1093. orderInfo.setMerchSn(merchSn);
  1094. orderInfo.setUserId(Integer.parseInt(loginUser.getUserId() + ""));
  1095. orderInfo.setFreightPrice(freightPrice.intValue());
  1096. orderInfo.setOrderBizType(Dict.orderBizType.item_11.getItem());
  1097. /*orderInfo.setCoupon_id(userCouponId);
  1098. orderInfo.setCoupon_name(couponName);*/
  1099. // orderInfo.setFullCutPrice(fullCutCouponDec);//使用的优惠券
  1100. orderInfo.setCouponPrice(couponPrice);
  1101. orderInfo.setPostscript("");//留言
  1102. orderInfo.setAddTime(new Date());
  1103. orderInfo.setGoodsPrice(goodsTotalPrice);
  1104. orderInfo.setOrderPrice(orderTotalPrice);
  1105. orderInfo.setActualPrice(actualPrice);
  1106. orderInfo.setOrderType("1");
  1107. orderInfo.setOrderStatus(0);// 待付款
  1108. orderInfo.setShippingStatus(0);
  1109. orderInfo.setPayStatus(0);
  1110. orderInfo.setShippingId(0L);
  1111. orderInfo.setShippingFee(Constant.ZERO);
  1112. orderInfo.setIntegral(0);
  1113. orderInfo.setIntegralMoney(Constant.ZERO);
  1114. orderInfo.setCreateTime(new Date());
  1115. orderInfo.setModTime(new Date());
  1116. orderInfo.setIsOnfflineOrder(Dict.isOnfflineOrder.item_1.getItem());//线下购买
  1117. /*//标记该订单已使用优惠券
  1118. if(couponVo != null){
  1119. couponVo.setUsed_time(new Date());
  1120. couponVo.setIsUsed(Dict.isUsed.item_1.getItem());
  1121. apiUserCouponMapper.update(couponVo);
  1122. }*/
  1123. return orderInfo;
  1124. }
  1125. /**
  1126. * 设置订单数据
  1127. *
  1128. * @param
  1129. * @return
  1130. */
  1131. public OrderEntity setOrder(Integer userId, List<LinkedHashMap> goodsList,
  1132. String merchSn) {
  1133. OrderEntity orderInfo = new OrderEntity();
  1134. BigDecimal freightPrice = new BigDecimal(0.00);
  1135. BigDecimal goodsTotalPrice = new BigDecimal(0.00);
  1136. for (LinkedHashMap goods : goodsList) {
  1137. goodsTotalPrice = goodsTotalPrice
  1138. .add(new BigDecimal( goods.get("retailPrice").toString()).multiply(new BigDecimal( goods.get("sellVolume").toString())));
  1139. }
  1140. //订单价格计算:订单的总价+运费
  1141. BigDecimal orderTotalPrice = goodsTotalPrice.add(freightPrice);
  1142. //查询未使用的优惠券
  1143. /*String couponName = "";
  1144. BigDecimal fullCutCouponDec = Constant.ZERO;
  1145. UserCouponVo couponVo = null;*/
  1146. BigDecimal couponPrice = new BigDecimal(0.00);
  1147. //减去其它支付的金额后,要实际支付的金额 订单的总价+运费-优惠券金额
  1148. BigDecimal actualPrice = orderTotalPrice.subtract(couponPrice);
  1149. //商户(拼音首字母)+业务类型+编号
  1150. // String merchSn = OmsMerchPropertiesBuilder.instance().getMerchSn();
  1151. // String merchShortName = OmsMerchPropertiesBuilder.instance().getMerchShortName();
  1152. MerchEntity merchEntity = merchDao.findByMerchSn(merchSn);
  1153. String merchShortName = "";
  1154. if (merchEntity != null) {
  1155. merchShortName = merchEntity.getMerchShortName();
  1156. }
  1157. String orderSn = merchShortName + Dict.orderBizType.item_10.getItem() + CommonUtil.generateOrderNumber();
  1158. orderInfo.setOrderSn(orderSn);
  1159. orderInfo.setMerchSn(merchSn);
  1160. orderInfo.setUserId(userId);
  1161. orderInfo.setFreightPrice(freightPrice.intValue());
  1162. orderInfo.setOrderBizType(Dict.orderBizType.item_10.getItem());
  1163. /*orderInfo.setCoupon_id(userCouponId);
  1164. orderInfo.setCoupon_name(couponName);*/
  1165. // orderInfo.setFullCutPrice(fullCutCouponDec);//使用的优惠券
  1166. orderInfo.setCouponPrice(couponPrice);
  1167. orderInfo.setPostscript("");//留言
  1168. orderInfo.setAddTime(new Date());
  1169. orderInfo.setGoodsPrice(goodsTotalPrice);
  1170. orderInfo.setOrderPrice(orderTotalPrice);
  1171. orderInfo.setActualPrice(actualPrice);
  1172. orderInfo.setOrderType("1");
  1173. orderInfo.setOrderStatus(0);// 待付款
  1174. orderInfo.setShippingStatus(0);
  1175. orderInfo.setPayStatus(0);
  1176. orderInfo.setShippingId(0L);
  1177. orderInfo.setShippingFee(Constant.ZERO);
  1178. orderInfo.setIntegral(0);
  1179. orderInfo.setIntegralMoney(Constant.ZERO);
  1180. orderInfo.setCreateTime(new Date());
  1181. orderInfo.setModTime(new Date());
  1182. orderInfo.setIsOnfflineOrder(Dict.isOnfflineOrder.item_1.getItem());//线下购买
  1183. // orderInfo.setIsScan("0");//默认未扫描
  1184. /*//标记该订单已使用优惠券
  1185. if(couponVo != null){
  1186. couponVo.setUsed_time(new Date());
  1187. couponVo.setIsUsed(Dict.isUsed.item_1.getItem());
  1188. apiUserCouponMapper.update(couponVo);
  1189. }*/
  1190. return orderInfo;
  1191. }
  1192. public OrderGoodsEntity setOrderGoodsVo(OrderEntity orderInfo, OfflineCartEntity goodsItem) {
  1193. GoodsEntity goodsVo = goodsDao.queryObject(goodsItem.getGoodsId());
  1194. OrderGoodsEntity orderGoodsVo = new OrderGoodsEntity();
  1195. orderGoodsVo.setOrderId(Integer.parseInt(orderInfo.getId() + ""));
  1196. orderGoodsVo.setGoodsId(goodsItem.getGoodsId());
  1197. orderGoodsVo.setGoodsSn(goodsItem.getGoodsSn());
  1198. orderGoodsVo.setProductId(goodsItem.getProductId());
  1199. orderGoodsVo.setGoodsName(goodsItem.getGoodsName());
  1200. orderGoodsVo.setListPicUrl(goodsItem.getListPicUrl());
  1201. orderGoodsVo.setMarketPrice(goodsItem.getMarketPrice());
  1202. orderGoodsVo.setRetailPrice(goodsItem.getRetailPrice());
  1203. orderGoodsVo.setNumber(goodsItem.getNumber());
  1204. orderGoodsVo.setOrderBizType(Dict.orderBizType.item_11.getItem());
  1205. orderGoodsVo.setCreateTime(new Date());
  1206. orderGoodsVo.setModTime(new Date());
  1207. orderGoodsVo.setGoodsRate(goodsVo.getGoodsRate());
  1208. orderGoodsVo.setSku(goodsVo.getSku());
  1209. return orderGoodsVo;
  1210. }
  1211. // public OrderGoodsEntity setOrderGoods(OrderEntity orderInfo, LinkedHashMap goods) {
  1212. // GoodsEntity goodsVo = goodsDao.queryObject(goods.get("goodsId"));
  1213. // ProductEntity productEntity = productDao.queryObjectByGoodsIdAndStoreId(goodsVo.getId() + "", null);
  1214. // OrderGoodsEntity orderGoodsVo = new OrderGoodsEntity();
  1215. // orderGoodsVo.setOrderId(Integer.parseInt(orderInfo.getId() + ""));
  1216. // orderGoodsVo.setGoodsId(goodsVo.getId().intValue());
  1217. // orderGoodsVo.setGoodsSn(goodsVo.getGoodsSn());
  1218. // orderGoodsVo.setProductId(productEntity.getId().intValue());
  1219. // orderGoodsVo.setGoodsName(goodsVo.getName());
  1220. // orderGoodsVo.setListPicUrl(goodsVo.getListPicUrl());
  1221. //
  1222. //
  1223. // orderGoodsVo.setMarketPrice((BigDecimal) goods.get("storeMarketPrice"));
  1224. // orderGoodsVo.setRetailPrice((BigDecimal) goods.get("storeRetailPrice"));
  1225. // orderGoodsVo.setNumber((Integer) goods.get("sellVolume"));
  1226. // orderGoodsVo.setOrderBizType(Dict.orderBizType.item_10.getItem());
  1227. // orderGoodsVo.setCreateTime(new Date());
  1228. // orderGoodsVo.setModTime(new Date());
  1229. // orderGoodsVo.setGoodsRate(goodsVo.getGoodsRate());
  1230. // orderGoodsVo.setSku(goodsVo.getSku());
  1231. //
  1232. //
  1233. // BigDecimal number = new BigDecimal(Long.valueOf(goodsItem.getNumber()));
  1234. // BigDecimal goodsTotal = goodsItem.getRetail_price().multiply(number);//单商品总价
  1235. // BigDecimal rate = goodsTotal.divide(orderInfo.getGoods_price(),2, BigDecimal.ROUND_HALF_UP);//当前商品总价/订单总价(不含运费、不含优惠券)
  1236. // BigDecimal freightPrice = BigDecimal.valueOf(orderInfo.getFreight_price());
  1237. // BigDecimal settlePrice = Constant.ZERO;
  1238. // if(orderInfo.getFreight_price() != 0 && !"0".equalsIgnoreCase(orderInfo.getCoupon_price()+"")){
  1239. // //运费-优惠券
  1240. // BigDecimal rateTotal = freightPrice.subtract(orderInfo.getCoupon_price());
  1241. // //商品结算平摊价格(含优惠券、运费金额) = 单商品总价 + 当前商品总价/订单总价(不含运费、不含优惠券) * 运费与优惠券合计税率
  1242. // settlePrice = goodsTotal.add(rate.multiply(rateTotal));
  1243. // }else{
  1244. // if(orderInfo.getFreight_price()!=0){
  1245. // //运费税率 = 单商品总价/订单总价(不含运费)* 运费金额
  1246. // BigDecimal freightRate = rate.multiply(freightPrice);
  1247. // //商品结算平摊价格(含运费金额) = 单商品总价+运费税率
  1248. // settlePrice = goodsTotal.add(freightRate);
  1249. // }
  1250. // if(!"0".equalsIgnoreCase(orderInfo.getCoupon_price()+"")){
  1251. // //优惠券税率 = 单商品总价/订单总价(不含优惠券)* 优惠券金额
  1252. // BigDecimal couponRate = rate.multiply(orderInfo.getCoupon_price());
  1253. // //商品结算平摊价格(含优惠券金额) = 单商品总价-优惠券税率
  1254. // settlePrice = goodsTotal.subtract(couponRate);
  1255. // }
  1256. // }
  1257. // if(settlePrice.compareTo(BigDecimal.valueOf(0)) == 0){
  1258. // orderGoodsVo.setSettlePrice(goodsTotal);//商品结算平摊价格
  1259. // }else{
  1260. // orderGoodsVo.setSettlePrice(settlePrice);//商品结算平摊价格
  1261. // }
  1262. //
  1263. // return orderGoodsVo;
  1264. // }
  1265. @Override
  1266. public OrderEntity queryObjectBySysUser(Long id) {
  1267. OrderEntity orderEntity = orderDao.queryObjectBySysUser(id);
  1268. Map<String, Object> map = new HashMap<String, Object>();
  1269. map.put("orderId", id);
  1270. List<OrderGoodsEntity> orderGoodsEntityList = orderGoodsDao.queryList(map);
  1271. orderEntity.setOrderGoodsEntityList(orderGoodsEntityList);
  1272. return orderEntity;
  1273. }
  1274. @Override
  1275. public int confirmPay(Long id, String payFlag,String orderSnWx) {
  1276. SysUserEntity user = ShiroUtils.getUserEntity();
  1277. if (user == null) {
  1278. throw new RRException("用户登录超时,请重新登录");
  1279. }
  1280. if (!user.getRoleType().equalsIgnoreCase("2")) {
  1281. throw new RRException("该操作只允许店员账户操作");
  1282. }
  1283. OrderEntity orderEntity = queryObject(id);
  1284. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  1285. throw new RRException("此订单已付款!");
  1286. }
  1287. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_301.getItem())) {
  1288. throw new RRException("此订单已完成!");
  1289. }
  1290. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_101.getItem())) {
  1291. throw new RRException("此订单已取消!");
  1292. }
  1293. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_102.getItem())) {
  1294. throw new RRException("此订单已删除!");
  1295. }
  1296. orderEntity.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_201.getItem()));
  1297. orderEntity.setPayStatus(Integer.parseInt(Dict.payStatus.item_2.getItem()));
  1298. orderEntity.setPayFlag(payFlag);
  1299. orderEntity.setPayTime(new Date());
  1300. if(Dict.payFlag.item_alipay.getItem().equalsIgnoreCase(payFlag)){
  1301. orderEntity.setAliTradeNo(orderSnWx);
  1302. }else {
  1303. if (orderSnWx != null) {
  1304. orderEntity.setOrderSnWx(orderSnWx);
  1305. }
  1306. }
  1307. // Date now = new Date();
  1308. // Integer storeId = orderEntity.getStoreId();
  1309. // Map queryParams = new HashMap();
  1310. // queryParams.put("orderId", orderEntity.getId());
  1311. // List<OrderGoodsEntity> orderGoodsList = orderGoodsDao.queryList(queryParams);
  1312. // // 遍历订单下的详情商品,修改商品的最后销售时间
  1313. // if (orderGoodsList!=null && orderGoodsList.size()>0){
  1314. // orderGoodsList.forEach(orderGoods ->{
  1315. // Integer goodsId = orderGoods.getGoodsId();
  1316. // GoodsEntity goodsEntity = goodsDao.queryObject(goodsId);
  1317. // if (Objects.nonNull(goodsEntity)){
  1318. // goodsEntity.setLastSaleTime(now);
  1319. // goodsDao.update(goodsEntity);
  1320. // }
  1321. // if (Objects.nonNull(storeId)){
  1322. // ProductStoreRelaEntity productStoreRelaEntity = productStoreRelaDao.queryByGoodsIdAndStoreId(Long.valueOf(storeId), Long.valueOf(goodsId));
  1323. // if (Objects.nonNull(productStoreRelaEntity)){
  1324. // productStoreRelaEntity.setLastSaleTime(now);
  1325. // productStoreRelaDao.update(productStoreRelaEntity);
  1326. // }
  1327. // }
  1328. // });
  1329. // }
  1330. orderDao.update(orderEntity);
  1331. return 0;
  1332. }
  1333. @Override
  1334. public List<OrderEntity> queryExportList(Map<String, Object> map) {
  1335. List<OrderEntity> list = orderDao.queryExportList(map);
  1336. for (OrderEntity order : list) {
  1337. OrderProcessRecordEntity orderProcessRecord = orderProcessRecordDao.queryObjectByOrderSn(order.getOrderSn());
  1338. order.setOrderProcessRecord(orderProcessRecord);
  1339. // 查询活动价
  1340. BigDecimal topicPrice = orderDao.queryTopicPriceByOrderSnAndSku(order.getOrderSn(),order.getSku());
  1341. order.setTopicPrice(topicPrice);
  1342. }
  1343. return list;
  1344. }
  1345. @Override
  1346. public List<OrderEntity> queryOffilineOrderList(Map<String, Object> map) {
  1347. return orderDao.queryOffilineOrderList(map);
  1348. }
  1349. @Override
  1350. public int uploadExcel(List<OrderExpressDto> orderExpressDtoList) {
  1351. SysUserEntity user = ShiroUtils.getUserEntity();
  1352. boolean isFail = false;
  1353. List<String> failShippingNameList = new ArrayList<>();
  1354. List<String> failOrderSnList = new ArrayList<>();
  1355. List<String> failShippingCodeList = new ArrayList<>();
  1356. List<String> failCodeSnList = new ArrayList<>();
  1357. List<String> failNameSnList = new ArrayList<>();
  1358. List<String> failStatusOrderSnList = new ArrayList<>();
  1359. if (orderExpressDtoList != null && orderExpressDtoList.size() > 0) {
  1360. for (int i = 0; i < orderExpressDtoList.size(); i++) {
  1361. OrderExpressDto orderExpressDto = orderExpressDtoList.get(i);
  1362. OrderEntity orderEntity = new OrderEntity();
  1363. Map<String, Object> valideDate = MapBeanUtil.fromObject(orderExpressDto);
  1364. ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
  1365. builder.put("orderSn", "订单编号");
  1366. builder.put("shippingNo", "快递单号");
  1367. builder.put("shippingName", "快递公司");
  1368. builder.put("shippingCode", "快递简写");
  1369. R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
  1370. if (Integer.valueOf(r.get("code").toString()) != 0) {
  1371. throw new RRException(r.get("msg").toString());
  1372. } else {
  1373. r = ValidatorUtil.isEmpty(builder.build(), valideDate);
  1374. if (Integer.valueOf(r.get("code").toString()) != 0) {
  1375. throw new RRException(r.get("msg").toString());
  1376. }
  1377. }
  1378. OrderEntity order = orderDao.queryObjectByOrderSn(orderExpressDto.getOrderSn());
  1379. if(order == null){
  1380. isFail = true;
  1381. failOrderSnList.add(orderExpressDto.getOrderSn());
  1382. }else{
  1383. if(!(order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())
  1384. && order.getPayStatus() == Integer.parseInt(Dict.payStatus.item_2.getItem()))){
  1385. isFail = true;
  1386. failStatusOrderSnList.add(orderExpressDto.getOrderSn());
  1387. }
  1388. }
  1389. ShippingEntity shippingEntity = shippingDao.queryObjectByCode(orderExpressDto.getShippingCode());
  1390. if(shippingEntity == null){
  1391. isFail = true;
  1392. failShippingCodeList.add(orderExpressDto.getShippingCode());
  1393. failCodeSnList.add(orderExpressDto.getOrderSn());
  1394. }else{
  1395. if(!orderExpressDto.getShippingName().equalsIgnoreCase(shippingEntity.getName())){
  1396. isFail = true;
  1397. failShippingNameList.add(orderExpressDto.getShippingName());
  1398. failNameSnList.add(orderExpressDto.getOrderSn());
  1399. }
  1400. }
  1401. if(!isFail){//false则有错误的数据
  1402. if(order != null) {// 修改商品
  1403. // orderEntity.setOrderSn(orderExpressDto.getOrderSn());
  1404. orderEntity.setShippingNo(orderExpressDto.getShippingNo());
  1405. orderEntity.setShippingCode(orderExpressDto.getShippingCode());
  1406. orderEntity.setShippingName(orderExpressDto.getShippingName());
  1407. orderEntity.setShippingStatus(Integer.parseInt(Dict.shippingStatus.item_1.getItem()));
  1408. orderEntity.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_300.getItem()));
  1409. orderEntity.setModerSn(user.getUsername());
  1410. orderEntity.setCreateTime(new Date());
  1411. orderEntity.setModTime(new Date());
  1412. orderEntity.setId(order.getId());
  1413. orderDao.update(orderEntity);
  1414. }
  1415. }
  1416. }
  1417. if(failOrderSnList != null && failOrderSnList.size() > 0){
  1418. throw new RRException("导入数据异常,订单编号不存在,不存在的订单编号【"+failOrderSnList+"】,请删除掉再继续操作");
  1419. }
  1420. if(failStatusOrderSnList != null && failStatusOrderSnList.size() > 0){
  1421. throw new RRException("导入数据异常,修改订单快递功能只支持已付款未发货的订单,以下订单编号无效【"+failStatusOrderSnList+"】,请删除掉再继续操作");
  1422. }
  1423. if(failShippingCodeList != null && failShippingCodeList.size() > 0){
  1424. throw new RRException("导入数据异常,快递简写不在可支持的范围中,简写错误的订单编号【"+failCodeSnList+"】,错误的快递简写【"+failShippingCodeList+"】," +
  1425. "正确数据可下载订单页面的快递公司简写Excel中查看");
  1426. }
  1427. if(failShippingNameList != null && failShippingNameList.size() > 0){
  1428. throw new RRException("导入数据异常,快递简写对应的快递公司不一致,快递公司错误的订单编号【"+failNameSnList+"】,请修改Excel数据中订单编号对应的快递公司错误信息," +
  1429. "正确数据可下载订单页面的快递公司简写Excel中查看");
  1430. }
  1431. // if(failFreightGoodsSnList != null && failFreightGoodsSnList.size() > 0){
  1432. // exportExceptionDataEntity.setExportExceptionData("运费信息请在商城配置》运费模板中维护,运费与商户信息对应,请检查该商品商户信息下的运费是否维护,不存在的商品编码【"+failFreightGoodsSnList+"】,运费【"+failFreightList+"】");
  1433. // exportExceptionDataDao.save(exportExceptionDataEntity);
  1434. // throw new RRException("导入数据异常,异常信息请在商品管理》》商品导入异常数据中查看检查");
  1435. // }
  1436. }else{
  1437. throw new RRException("导入数据为空,或者检查商品编码数据是否为空");
  1438. }
  1439. return 1;
  1440. }
  1441. @Override
  1442. public List<OrderEntity> promOrderList(Map<String, Object> map) {
  1443. Integer[] statusList = {201};
  1444. List<OrderEntity> list = orderDao.promOrderList(map);
  1445. for (OrderEntity orderEntity: list) {
  1446. Map<String, Object> queryMap = new HashMap<>();
  1447. queryMap.put("goodsId", orderEntity.getGoodsId());
  1448. queryMap.put("statusList", statusList);
  1449. queryMap.put("orderId", orderEntity.getId());
  1450. Double promActualPrice = orderDao.getActualPriceByOutProm(queryMap);
  1451. if(promActualPrice == null){
  1452. promActualPrice = 0d;
  1453. }
  1454. orderEntity.setPromActualPrice(BigDecimal.valueOf(promActualPrice));
  1455. }
  1456. return list;
  1457. }
  1458. @Override
  1459. public int queryPromOrderTotal(Map<String, Object> map) {
  1460. return orderDao.queryPromOrderTotal(map);
  1461. }
  1462. @Override
  1463. public List<OrderEntity> promOrderListExport(Map<String, Object> map){
  1464. Integer[] statusList = {201};
  1465. List<OrderEntity> list = orderDao.promOrderListExport(map);
  1466. for (OrderEntity orderEntity: list) {
  1467. Map<String, Object> queryMap = new HashMap<>();
  1468. queryMap.put("goodsId", orderEntity.getGoodsId());
  1469. queryMap.put("orderId", orderEntity.getId());
  1470. queryMap.put("statusList", statusList);
  1471. Double promActualPrice = orderDao.getActualPriceByOutProm(queryMap);
  1472. if(promActualPrice == null){
  1473. promActualPrice = 0d;
  1474. }
  1475. orderEntity.setPromActualPrice(BigDecimal.valueOf(promActualPrice));
  1476. }
  1477. return list;
  1478. }
  1479. @Override
  1480. public List<OrderEntity> storeTopicOrderList(Map<String, Object> map) {
  1481. List<OrderEntity> list = orderDao.storeTopicOrderList(map);
  1482. return list;
  1483. }
  1484. @Override
  1485. public int queryStoreTopicOrderTotal(Map<String, Object> map) {
  1486. return orderDao.queryStoreTopicOrderTotal(map);
  1487. }
  1488. @Override
  1489. public List<WxOrderEntity> wxOrderResendQueryAllList(Map<String, Object> map){
  1490. // String requestData = JacksonUtil.toJson(map);
  1491. String url = OmsMerchPropertiesBuilder.instance().getWxOrderResendUrl();
  1492. // 同步访问,返回结果字符串
  1493. String response = OkHttpUtils.post(map, url, "SSL");
  1494. ResponseData responseData = JacksonUtils.fromStringJson(response, ResponseData.class);
  1495. if(responseData.getCode().equalsIgnoreCase("0")){
  1496. List<WxOrderEntity> list = responseData.getData().getRows();
  1497. return list;
  1498. }
  1499. return null;
  1500. }
  1501. @Override
  1502. public List<OrderRecognitionDto> queryOrderListByRecognition(Map<String, Object> map){
  1503. String value = sysConfigDao.queryByKey("FACE_COLLECT_FREQUENCY_TIME");
  1504. if(value==null){
  1505. throw new RRException("请联系管理员配系统参数置FACE_COLLECT_FREQUENCY_TIME信息!");
  1506. }
  1507. List<OrderRecognitionDto> list = orderDao.queryOrderListByRecognition(map);
  1508. for (OrderRecognitionDto orderRecognitionDto: list){
  1509. Integer frequencySecondTime = Integer.parseInt(value);
  1510. String lastFaceTime = orderRecognitionDto.getLastFaceTime();
  1511. if(StringUtils.isNotEmpty(lastFaceTime)) {
  1512. Date lastFaceDate = DateUtils.convertStringToDate(lastFaceTime, DateUtils.DATE_TIME_PATTERN);
  1513. Calendar calendar = Calendar.getInstance();
  1514. calendar.setTime(lastFaceDate);
  1515. calendar.add(Calendar.SECOND, frequencySecondTime);
  1516. Date addSecondTime = calendar.getTime();
  1517. Date nowDate = new Date();
  1518. if (addSecondTime.getTime() > nowDate.getTime()) {
  1519. orderRecognitionDto.setAddSecondTime(DateUtils.format(addSecondTime,DateUtils.DATE_TIME_PATTERN));
  1520. orderRecognitionDto.setIsDateLast("false");
  1521. } else {
  1522. //可调用身份验证范围内
  1523. orderRecognitionDto.setIsDateLast("true");
  1524. }
  1525. }else{//可调用身份验证范围内
  1526. orderRecognitionDto.setIsDateLast("true");
  1527. }
  1528. }
  1529. return list;
  1530. }
  1531. @Override
  1532. public int queryOrderListByRecognitionTotal(Map<String, Object> map){
  1533. return orderDao.queryOrderListByRecognitionTotal(map);
  1534. }
  1535. /**
  1536. * 提交订单并付款
  1537. *
  1538. * @param param
  1539. * @param user
  1540. * @return
  1541. */
  1542. @Override
  1543. @Transactional
  1544. public Map offlineRetailSubmit(Map param, SysUserEntity user) {
  1545. // 解析订单数据 List
  1546. List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList");
  1547. // 解析用户信息 LinkedHashMap
  1548. Map userInfo = (Map) param.get("userInfo");
  1549. // 解析支付码 String
  1550. String parCode = (String) param.get("payCode");
  1551. // 解析sessionId(WebSocket) String
  1552. String sessionId = (String) param.get("sessionId");
  1553. // machineCode
  1554. String machineCode = (String) param.get("machineCode");
  1555. try {
  1556. machineCode = URLDecoder.decode(machineCode,"UTF-8");
  1557. } catch (UnsupportedEncodingException e) {
  1558. e.printStackTrace();
  1559. }
  1560. Map resultObj = Maps.newHashMap();
  1561. try {
  1562. if (user == null) {
  1563. resultObj.put("errno", 400);
  1564. resultObj.put("errmsg", "用户登录超时,请重新登录");
  1565. return resultObj;
  1566. }
  1567. if (!user.getRoleType().equalsIgnoreCase("2")) {
  1568. resultObj.put("errno", 400);
  1569. resultObj.put("errmsg", "该操作只允许店员账户操作");
  1570. return resultObj;
  1571. }
  1572. if (org.apache.commons.lang3.StringUtils.isEmpty(user.getMerchSn())) {
  1573. resultObj.put("errno", 400);
  1574. resultObj.put("errmsg", "操作用户的商户编号为空,请先维护用户商户编号信息再来操作");
  1575. return resultObj;
  1576. }
  1577. Long userId = user.getUserId();
  1578. Integer storeId = user.getStoreId();
  1579. List<GoodsEntity> goodsEntities = new ArrayList<>();
  1580. // 检查库存和更新库存
  1581. for (LinkedHashMap goodsDto : goodsList) {
  1582. //
  1583. GoodsEntity goodsEntity = goodsDao.queryObjectByProdBarcodeAndStore((String) goodsDto.get("prodBarcode"),storeId);
  1584. if (goodsEntity == null) {
  1585. resultObj.put("errno", 400);
  1586. resultObj.put("errmsg", "订单提交失败:商品不存在");
  1587. return resultObj;
  1588. }
  1589. Integer sellVolume = (Integer)goodsDto.get("sellVolume");
  1590. goodsDto.put("goodsId",goodsEntity.getId());
  1591. goodsDto.put("goodsSn",goodsEntity.getGoodsSn());
  1592. goodsDto.put("productId",goodsEntity.getProductId());
  1593. goodsDto.put("storeMarketPrice",goodsEntity.getStoreMarketPrice());
  1594. goodsDto.put("storeRetailPrice",goodsEntity.getStoreRetailPrice());
  1595. //取得规格的信息,判断规格库存
  1596. ProductStoreRelaEntity productInfo = productStoreRelaDao
  1597. .queryByGoodsIdAndStoreId(Long.valueOf(storeId), Long.valueOf(goodsEntity.getId()));
  1598. synchronized (productInfo) {
  1599. if (null == productInfo || null == productInfo.getStockNum() ||
  1600. productInfo.getStockNum() < (sellVolume)) {
  1601. resultObj.put("errno", 400);
  1602. resultObj.put("errmsg", "库存不足,仅剩余" + productInfo.getStockNum());
  1603. return resultObj;
  1604. } else {
  1605. // 判断销售价是否低于底线价
  1606. BigDecimal bottomLinePrice = new BigDecimal(productInfo.getBottomLinePrice());
  1607. if (goodsEntity.getStoreRetailPrice().compareTo(bottomLinePrice) <= -1) {
  1608. LOGGER.error("销售价格小于底线价格");
  1609. // 记录该信息,到价格过低日志表中,这里没有活动id
  1610. Mall2LowPriceWarningEntity lowPriceWarningEntity = new Mall2LowPriceWarningEntity();
  1611. lowPriceWarningEntity.setSalePrice(goodsEntity.getStoreRetailPrice());
  1612. lowPriceWarningEntity.setWarningPrice(bottomLinePrice);
  1613. lowPriceWarningEntity.setSku(goodsEntity.getGoodsSn());
  1614. lowPriceWarningEntity.setWarningType("00");
  1615. lowPriceWarningEntity.setStoreId(storeId+"");
  1616. lowPriceWarningEntity.setCreateTime(new Date());
  1617. lowPriceWarningDao.save(lowPriceWarningEntity);
  1618. resultObj.put("errno", 400);
  1619. resultObj.put("errmsg", "商品"+goodsEntity.getName()+"的销售价格小于底线价格");
  1620. return resultObj;
  1621. }
  1622. productInfo.setStockNum(productInfo.getStockNum() - sellVolume);
  1623. productInfo.setStoreId(Long.valueOf(storeId));
  1624. productInfo.addSellVolume();
  1625. productInfo.setLastSaleTime(new Date());
  1626. productStoreRelaDao.updateStockNum(productInfo);//修改普通商品库存
  1627. if(goodsEntity != null) {
  1628. goodsEntity.setGoodsNumber(goodsEntity.getGoodsNumber() - sellVolume);
  1629. goodsEntity.setLastSaleTime(new Date());
  1630. goodsDao.update(goodsEntity);
  1631. }
  1632. }
  1633. // 实际取的是门店商品的价格,所以借这个字段来存储销售价
  1634. goodsEntity.setStoreRetailPrice(productInfo.getRetailPrice());
  1635. // 借用这个字段来存储购买数
  1636. goodsEntity.setGoodsNumber(sellVolume);
  1637. goodsEntities.add(goodsEntity);
  1638. }
  1639. }
  1640. UserEntity userEntity = userDao.queryByMobile((String) userInfo.get("customPhone"));
  1641. if(userEntity == null) {
  1642. // 保存用户信息
  1643. userEntity = new UserEntity();
  1644. userEntity.setUsername((String) userInfo.get("customName"));
  1645. userEntity.setPassword("");
  1646. userEntity.setIdNo((String) userInfo.get("customIDCard"));
  1647. userEntity.setMobile((String) userInfo.get("customPhone"));
  1648. userEntity.setGender(1);
  1649. userEntity.setRegisterTime(new Date());
  1650. userEntity.setLastLoginTime(new Date());
  1651. userEntity.setIdNo((String) userInfo.get("customIDCard"));
  1652. userDao.save(userEntity);
  1653. MerchUserEntity merchUserEntity = new MerchUserEntity();
  1654. merchUserEntity.setMerchSn(user.getMerchSn());
  1655. merchUserEntity.setStoreId(storeId);
  1656. merchUserEntity.setUserId(userEntity.getId());
  1657. merchUserEntity.setCreateTime(new Date());
  1658. merchUserEntity.setIsLoadGoods("0");
  1659. merchUserDao.save(merchUserEntity);
  1660. }
  1661. // 根据活动形式来查询
  1662. // 优惠金额
  1663. BigDecimal disCountAmount = new BigDecimal(0);
  1664. // 活动id
  1665. Integer topicId = 0;
  1666. // 查询活动类别id
  1667. MkStorePromTypeEntity mkStorePromEntity = storePromTypeDao.queryByName("周活动");
  1668. // 根据门店id和活动类别查询该门店是否有活动
  1669. StoreTopicEntity storeTopic = storeTopicDao.queryByStoreIdAndType(storeId,mkStorePromEntity.getPromTypeId());
  1670. // 判断是否启用了活动,如果启用了活动。则去查询活动价
  1671. if(storeTopic != null){
  1672. for(GoodsEntity goodsEntity :goodsEntities){
  1673. // 根据活动id跟商品id,查询该商品的价格
  1674. Mk2GoodsTopicPriceEntity goodsTopicPriceEntity =
  1675. mk2GoodsTopicPriceDao.queryByTopicIdAndGoodsId(storeTopic.getId(),goodsEntity.getSku());
  1676. if (goodsEntity.getStoreRetailPrice().compareTo(goodsTopicPriceEntity.getTopicPrice()) <= -1) {
  1677. LOGGER.error("销售价格小于活动价格");
  1678. // 记录该信息,到价格过低日志表中,这里有活动id
  1679. Mall2LowPriceWarningEntity lowPriceWarningEntity = new Mall2LowPriceWarningEntity();
  1680. lowPriceWarningEntity.setSalePrice(goodsEntity.getStoreRetailPrice());
  1681. lowPriceWarningEntity.setWarningPrice(goodsTopicPriceEntity.getTopicPrice());
  1682. lowPriceWarningEntity.setActivityId(goodsTopicPriceEntity.getTopicId());
  1683. lowPriceWarningEntity.setSku(goodsEntity.getGoodsSn());
  1684. lowPriceWarningEntity.setWarningType("00");
  1685. lowPriceWarningEntity.setStoreId(storeId+"");
  1686. lowPriceWarningEntity.setCreateTime(new Date());
  1687. lowPriceWarningDao.save(lowPriceWarningEntity);
  1688. resultObj.put("errno", 400);
  1689. resultObj.put("errmsg", "商品"+goodsEntity.getName()+"的销售价格小于活动价格");
  1690. return resultObj;
  1691. }
  1692. goodsEntity.setStoreRetailPrice(goodsTopicPriceEntity.getTopicPrice());
  1693. }
  1694. topicId = storeTopic.getId();
  1695. }else{
  1696. disCountAmount = getDisCountAmout(goodsEntities);
  1697. }
  1698. // 判断该用户是否是生日
  1699. Boolean isBirth = false;
  1700. String birthday = "";
  1701. if(userEntity.getIdNo().length() == 15){
  1702. birthday = userEntity.getIdNo().substring(8,10) + "-" + userEntity.getIdNo().substring(10,12);
  1703. }else if(userEntity.getIdNo().length() == 18){
  1704. birthday = userEntity.getIdNo().substring(10,12) + "-" + userEntity.getIdNo().substring(12,14);
  1705. }
  1706. SimpleDateFormat format = new SimpleDateFormat("MM-dd");
  1707. String today = format.format(new Date());
  1708. if(birthday.equalsIgnoreCase(today)){
  1709. isBirth = true;
  1710. }
  1711. // 生成订单
  1712. String merchOrderSn = "EMATO" + CommonUtil.generateOrderNumber();
  1713. OrderVo order = setOrderVo(goodsEntities, userEntity,storeId.longValue(), user.getMerchSn(),disCountAmount);
  1714. order.setStore_id(storeId.longValue());
  1715. if(storeTopic != null){
  1716. order.setActivity_id(storeTopic.getId().longValue());
  1717. }
  1718. order.setMerchOrderSn(merchOrderSn);
  1719. //插入订单信息和订单商品
  1720. orderDao.saveOrderVo(order);
  1721. // TODO 订单流转表
  1722. OrderProcessRecordEntity processRecordEntity = new OrderProcessRecordEntity();
  1723. processRecordEntity.setOrderSn(order.getOrder_sn());
  1724. processRecordEntity.setUserId(Integer.valueOf(userEntity.getId()+""));
  1725. processRecordEntity.setAddOrderStartTime(order.getCreateTime());
  1726. processRecordEntity.setIsAddOrderSend(Dict.isSend.item_1.getItem());
  1727. processRecordEntity.setOrderBizType(Dict.orderBizType.item_10.getItem());
  1728. if (null == order.getId()) {
  1729. resultObj.put("errno", 400);
  1730. resultObj.put("errmsg", "订单提交失败");
  1731. return resultObj;
  1732. }
  1733. for (GoodsEntity goodsDto : goodsEntities) {
  1734. OrderGoodsVo orderGoodsVo = setOrderGoodsVo(order,goodsDto);
  1735. //新增订单详情
  1736. orderGoodsDao.saveOrderGoodsVo(orderGoodsVo);
  1737. }
  1738. //清空预订单商品临时表
  1739. Map orderInfoMap = Maps.newHashMap();
  1740. orderInfoMap.put("orderInfo", order);
  1741. resultObj.put("errno", 0);
  1742. resultObj.put("errmsg", "订单提交成功");
  1743. resultObj.put("data", orderInfoMap);
  1744. //判断支付类型,并支付订单
  1745. R r = null;
  1746. //保存支付记录
  1747. OrderWXPayRecordEntity orderWXPayRecordCurrent = orderWXPayRecordService.saveRecordVo(order);
  1748. StoreEntity store = storeService.queryObject(order.getStore_id().intValue());
  1749. // 设置支付单开始时间
  1750. processRecordEntity.setPaymentStartTime(new Date());
  1751. // 微信支付
  1752. // wxPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
  1753. // 支付宝支付
  1754. AliPay(user, parCode , order, processRecordEntity, orderWXPayRecordCurrent, store);
  1755. resultObj.put("shopName",store.getStoreName()); // 根据门店编号查询
  1756. resultObj.put("userName",user.getUsername());
  1757. // 保存订单流转表
  1758. // 设置下单完成时间
  1759. processRecordEntity.setAddOrderSuccTime(order.getPay_time());
  1760. orderProcessRecordDao.save(processRecordEntity);
  1761. // 生成取票码
  1762. PickUpCodeEntity pickUpCodeEntity = new PickUpCodeEntity();
  1763. pickUpCodeEntity.setOrderSn(order.getOrder_sn());
  1764. pickUpCodeService.save(pickUpCodeEntity);
  1765. // 生成销售记录
  1766. SaleRecordEntity saleRecordEntity = new SaleRecordEntity();
  1767. // 根据收银机机器码,查询收银机
  1768. CashierEntity cashierEntity = cashierDao.queryByMachineCode(machineCode,storeId+"");
  1769. if(cashierEntity != null){
  1770. saleRecordEntity.setCashierSn(cashierEntity.getCashierSn());
  1771. saleRecordEntity.setOrderSn(order.getOrder_sn());
  1772. saleRecordEntity.setSallerId(userId+"");
  1773. saleRecordEntity.setSalesTime(new Date());
  1774. saleRecordEntity.setDiscountId(topicId + "");
  1775. saleRecordEntity.setCreateTime(new Date());
  1776. saleRecordDao.save(saleRecordEntity);
  1777. }
  1778. // 查询积分规则 ,默认先按消费金额1:1积分
  1779. Mall2PointsRulesEntity pointsRules = null;
  1780. // 增加该会员的积分
  1781. Mall2MemberPointsEntity memberPointsEntity = memberPointsDao.queryByUserId(userEntity.getId());
  1782. if(memberPointsEntity == null){
  1783. memberPointsEntity = new Mall2MemberPointsEntity();
  1784. memberPointsEntity.setUserId(userEntity.getId()+"");
  1785. memberPointsEntity.setPoints(order.getActual_price().intValue());
  1786. memberPointsEntity.setCreaterSn(userId+"");
  1787. memberPointsEntity.setCreateTime(new Date());
  1788. memberPointsDao.save(memberPointsEntity);
  1789. }else{
  1790. memberPointsEntity.setPoints(order.getActual_price().add(new BigDecimal(memberPointsEntity.getPoints())).intValue());
  1791. memberPointsEntity.setModerSn(userId+"");
  1792. memberPointsEntity.setModTime(new Date());
  1793. memberPointsDao.update(memberPointsEntity);
  1794. }
  1795. // 增加该会员的消费记录
  1796. Mall2MemberConsumptionRecordsEntity consumptionRecords = new Mall2MemberConsumptionRecordsEntity();
  1797. consumptionRecords.setUserId(userEntity.getId()+"");
  1798. consumptionRecords.setOrderSn(order.getOrder_sn());
  1799. consumptionRecords.setConsumptionTime(new Date());
  1800. consumptionRecords.setShopSn(storeId+"");
  1801. // TODO 判断是否有使用生日优惠
  1802. if(isBirth){
  1803. consumptionRecords.setIsUseBirthdayOffer("0"); // 使用生日优惠
  1804. }else{
  1805. consumptionRecords.setIsUseBirthdayOffer("1"); // 没使用生日优惠
  1806. }
  1807. consumptionRecords.setCreaterSn(userId+"");
  1808. consumptionRecords.setCreateTime(new Date());
  1809. memberConsumptionRecordsDao.save(consumptionRecords);
  1810. resultObj.put("code",pickUpCodeEntity.getPickUpCodeSn()); // 系统中累加
  1811. resultObj.put("time",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  1812. resultObj.put("orderNo",order.getOrder_sn()); //
  1813. // 通知WebSocket
  1814. WebSocketServer.sendMessage(sessionId,order.getOrder_sn(),order.getStore_id()
  1815. +"");
  1816. } catch (Exception e) {
  1817. e.printStackTrace();
  1818. resultObj.put("errno", 400);
  1819. resultObj.put("errmsg", "订单异常------"+e.getMessage());
  1820. throw new RuntimeException(e);
  1821. }
  1822. return resultObj;
  1823. }
  1824. private BigDecimal getDisCountAmout(List<GoodsEntity> goodsEntities) {
  1825. BigDecimal disCountAmount;
  1826. // TODO 生成订单之前,先查询是否有优惠券或者满减
  1827. // TODO 20200610 要修改成全部商品
  1828. // 优惠券的集合
  1829. List<MkStoreTicketDiscountEntity> mkStoreTicketDiscountEntities = new ArrayList<>();
  1830. // 满减的集合
  1831. List<MkStoreCampMinusLevelEntity> mkStoreCampMinusEntities = new ArrayList<>();
  1832. // 存商品跟金额的关系
  1833. Map<Long,BigDecimal> moneyMap = new HashMap<>();
  1834. // 商品总价
  1835. BigDecimal totalPrice = new BigDecimal(0);
  1836. for(GoodsEntity goodsEntity : goodsEntities){
  1837. Long goodsId = goodsEntity.getId();
  1838. // 计算该商品的价格
  1839. BigDecimal goodsPrice = goodsEntity.getStoreRetailPrice().multiply(new BigDecimal(goodsEntity.getGoodsNumber())).setScale(2, RoundingMode.HALF_UP);
  1840. moneyMap.put(goodsId,goodsPrice);
  1841. totalPrice = totalPrice.add(goodsPrice);
  1842. // 查询该商品id是否有优惠券
  1843. List<MkStoreTicketDiscountEntity> mkStoreTicketDiscountEntity = mkStoreTicketDiscountService.queryByGoodsId(goodsId);
  1844. if(mkStoreTicketDiscountEntity != null) {
  1845. mkStoreTicketDiscountEntities.addAll(mkStoreTicketDiscountEntity);
  1846. }
  1847. // 查询该商品id是否有满减
  1848. List<MkStoreCampMinusLevelEntity> mkStoreCampMinusEntity = mkStoreCampMinusService.queryByGoodsId(goodsId);
  1849. if(mkStoreCampMinusEntity != null) {
  1850. mkStoreCampMinusEntities.addAll(mkStoreCampMinusEntity);
  1851. }
  1852. }
  1853. // 满减优惠的金额
  1854. BigDecimal campDisCountAmount = new BigDecimal(0);
  1855. if(mkStoreCampMinusEntities.size() > 0){
  1856. // 上一次所需金额,用于取最大的优惠力度
  1857. BigDecimal lastAmount = new BigDecimal(0);
  1858. for (int i = 0 ; i < mkStoreCampMinusEntities.size() ; i++){
  1859. MkStoreCampMinusLevelEntity mkStoreCampMinusLevelEntity = mkStoreCampMinusEntities.get(i);
  1860. // TODO 20200610还有满多少件,跟满多少元打折的,逻辑复杂,下次开发
  1861. BigDecimal discCond = mkStoreCampMinusLevelEntity.getYuanMinusCond();
  1862. // 判断这次金额是否大于上次金额,如果不大于,直接continue
  1863. if(discCond.compareTo(lastAmount) > 0){
  1864. // 如果总金额大于所需金额,则可以使用该优惠券,记录该优惠券的角标,金额跟优惠的钱
  1865. if(totalPrice.compareTo(discCond) > 0){
  1866. // 记录上一次金额
  1867. lastAmount = discCond;
  1868. campDisCountAmount = mkStoreCampMinusLevelEntity.getYuanMinusPref();
  1869. }
  1870. }
  1871. }
  1872. }
  1873. // 优惠券优惠的金额
  1874. BigDecimal ticketDisCountAmount = new BigDecimal(0);
  1875. if(mkStoreTicketDiscountEntities.size() > 0){
  1876. // 上一次所需金额,用于取最大的优惠力度
  1877. BigDecimal lastAmount = new BigDecimal(0);
  1878. BigDecimal lastRadio = new BigDecimal(0);
  1879. for (int i = 0 ; i < mkStoreTicketDiscountEntities.size() ; i++){
  1880. MkStoreTicketDiscountEntity mkStoreTicketDiscountEntity = mkStoreTicketDiscountEntities.get(i);
  1881. // 代金券所需金额
  1882. // TODO 20200610还有折扣券的,逻辑较为复杂,下次在开发
  1883. if("00".equals(mkStoreTicketDiscountEntity.getApplyType())){
  1884. BigDecimal discCond = mkStoreTicketDiscountEntity.getVoucherCond();
  1885. // 判断这次金额是否大于上次金额,如果不大于,直接continue
  1886. if(discCond.compareTo(lastAmount) > 0){
  1887. // 如果总金额大于所需金额,则可以使用该优惠券,记录该优惠券的角标,金额跟优惠的钱
  1888. if(totalPrice.compareTo(discCond) > 0){
  1889. // 记录上一次金额
  1890. lastAmount = discCond;
  1891. ticketDisCountAmount = mkStoreTicketDiscountEntity.getVoucherMoney();
  1892. }
  1893. }
  1894. }else if("01".equals(mkStoreTicketDiscountEntity.getApplyType())){
  1895. BigDecimal discCond = mkStoreTicketDiscountEntity.getDiscCond();
  1896. if(totalPrice.compareTo(discCond) > 0){
  1897. // 打的折扣
  1898. lastRadio = mkStoreTicketDiscountEntity.getDiscRatio();
  1899. }
  1900. }
  1901. }
  1902. }
  1903. disCountAmount = ticketDisCountAmount.compareTo(campDisCountAmount) > 0 ? ticketDisCountAmount : campDisCountAmount;
  1904. return disCountAmount;
  1905. }
  1906. private void AliPay(SysUserEntity user, String parCode, OrderVo order, OrderProcessRecordEntity processRecordEntity, OrderWXPayRecordEntity orderWXPayRecordCurrent, StoreEntity store) throws Exception {
  1907. AliPayRequestParams params = new AliPayRequestParams();
  1908. params.setAuthCode(parCode);
  1909. params.setBody(order.getApprovalRemark());
  1910. params.setOutTradeNo(order.getOrder_sn());
  1911. params.setSubject("CW下单");
  1912. params.setStoreId(store.getId()+"");
  1913. params.setTotalAmount(order.getActual_price().setScale(2,BigDecimal.ROUND_HALF_UP)+"");
  1914. LOGGER.info("调用阿里支付接口的请求参数:"+JacksonUtils.toJson(params));
  1915. AliPayMicropayApiResult aliPayMicropayApiResult = AliPayUtil.aliTradePay(params);
  1916. orderWXPayRecordService.updateRecordByAli(orderWXPayRecordCurrent.getId(), aliPayMicropayApiResult);
  1917. LOGGER.info("调用阿里支付接口的同步返回结果:"+JacksonUtils.toJson(aliPayMicropayApiResult));
  1918. // 修改订单状态
  1919. //当支付成功时,修改订单,并把其他支付记录撤销
  1920. if (AliPayUtil.AliPayTradeState.SUCC.getCode().equals(aliPayMicropayApiResult.getCode())) {
  1921. // //查询当前订单所有的支付记录
  1922. // List<OrderWXPayRecordEntity> orderWXPayRecordEntitys =
  1923. // orderWXPayRecordService.getRecordsByOutTradeNo(order.getOrder_sn());
  1924. this.confirmPay(order.getId(), Dict.payFlag.item_alipay.getItem(), aliPayMicropayApiResult.getTradeNo());
  1925. // 设置支付单完成时间
  1926. processRecordEntity.setPaymentSuccTime(aliPayMicropayApiResult.getGmtPayment());
  1927. processRecordEntity.setPayTransactionId(aliPayMicropayApiResult.getTradeNo());
  1928. // 系统繁忙
  1929. } else if(AliPayUtil.AliPayTradeState.SERVER_FAIL.getCode().equals(aliPayMicropayApiResult.getCode())){
  1930. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1931. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请稍后再试");
  1932. // 支付失败
  1933. }else if(AliPayUtil.AliPayTradeState.BUSINESS_FAIL.getCode().equals(aliPayMicropayApiResult.getCode())){
  1934. // 系统异常
  1935. if(AliPayUtil.BusinessFailState.SYSTEM_ERROR.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1936. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1937. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请稍后再试");
  1938. // 订单总额超过限额
  1939. }else if(AliPayUtil.BusinessFailState.TOTAL_FEE_EXCEED.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1940. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1941. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请告知顾客");
  1942. // 授权码无效
  1943. }else if(AliPayUtil.BusinessFailState.PAYMENT_AUTH_CODE_INVALID.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1944. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1945. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请顾客刷新条码后,重新支付");
  1946. // 交易信息被篡改
  1947. }else if(AliPayUtil.BusinessFailState.CONTEXT_INCONSISTENT.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1948. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1949. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请重试");
  1950. // 余额支付功能关闭
  1951. }else if(AliPayUtil.BusinessFailState.ERROR_BALANCE_PAYMENT_DISABLE.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1952. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1953. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请用户打开余额支付");
  1954. // 交易买家不匹配
  1955. }else if(AliPayUtil.BusinessFailState.TRADE_BUYER_NOT_MATCH.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1956. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1957. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请重试");
  1958. // 买家状态非法
  1959. }else if(AliPayUtil.BusinessFailState.BUYER_ENABLE_STATUS_FORBID.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1960. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1961. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请买家联系支付宝小二,确认为什么非法");
  1962. // 唤起移动收银台失败
  1963. }else if(AliPayUtil.BusinessFailState.PULL_MOBILE_CASHIER_FAIL.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1964. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1965. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请用户刷新条码后,重新支付");
  1966. // 用户的无限支付开关关闭
  1967. }else if(AliPayUtil.BusinessFailState.MOBILE_PAYMENT_SWITCH_OFF.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1968. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1969. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请用户在PC上打开无线支付开关后,在发起支付");
  1970. // 支付失败
  1971. }else if(AliPayUtil.BusinessFailState.PAYMENT_FAIL.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1972. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1973. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请重试");
  1974. // 商户账号被冻结
  1975. }else if(AliPayUtil.BusinessFailState.SELLER_BEEN_BLOCKED.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1976. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1977. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请联系支付宝小二解冻");
  1978. // 买家未通过人行认证
  1979. }else if(AliPayUtil.BusinessFailState.ERROR_BUYER_CERTIFY_LEVEL_LIMIT.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1980. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1981. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请买家联系支付宝小二");
  1982. // 用户当面付付款开关管壁
  1983. }else if(AliPayUtil.BusinessFailState.USER_FACE_PAYMENT_SWITCH_OFF.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
  1984. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1985. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请买家打开当面付付款开关");
  1986. }else{
  1987. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1988. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg());
  1989. }
  1990. // 其他支付异常状态
  1991. } else {
  1992. LOGGER.info(aliPayMicropayApiResult.getSubMsg());
  1993. throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+"...........请联系管理员");
  1994. }
  1995. }
  1996. private void wxPay(SysUserEntity user, String parCode, Map resultObj, OrderVo order, OrderProcessRecordEntity processRecordEntity, OrderWXPayRecordEntity orderWXPayRecordCurrent, StoreEntity store) throws ParseException {
  1997. R r;
  1998. WechatMicropayApiResult wechatMicropayApiResult = WechatUtil
  1999. .wxMicropay(store.getMerchName() + "-" + store.getStoreName(), order.getOrderBizType(), null,
  2000. orderWXPayRecordCurrent.getOutTradeNoWX(), order.getActual_price().doubleValue(),
  2001. "127.0.0.1", parCode);
  2002. orderWXPayRecordService.updateRecord(orderWXPayRecordCurrent.getId(), wechatMicropayApiResult);
  2003. resultObj.put("shopName",store.getStoreName()); // 根据门店编号查询
  2004. resultObj.put("userName",user.getUsername());
  2005. // 修改订单状态
  2006. //当支付成功时,修改订单,并把其他支付记录撤销
  2007. if (WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatMicropayApiResult.getTrade_state())) {
  2008. //查询当前订单所有的支付记录
  2009. List<OrderWXPayRecordEntity> orderWXPayRecordEntitys =
  2010. orderWXPayRecordService.getRecordsByOutTradeNo(order.getOrder_sn());
  2011. for (OrderWXPayRecordEntity orderWXPayRecordTemp : orderWXPayRecordEntitys) {
  2012. //查询出来的记录排除当前已支付成功的记录,对其他记录交易状态为未撤销,未关闭的订单,调用撤销订单
  2013. if (orderWXPayRecordTemp.getId() != orderWXPayRecordCurrent.getId() &&
  2014. (!WechatUtil.WXTradeState.REVOKED.getCode().equals(orderWXPayRecordTemp.getTradeState()) ||
  2015. !WechatUtil.WXTradeState.CLOSED.getCode().equals(orderWXPayRecordTemp.getTradeState()))) {
  2016. WechatReverseApiResult wechatReverseApiResult =
  2017. WechatUtil.wxReverse(orderWXPayRecordTemp.getOutTradeNoWX());
  2018. //撤销订单成功
  2019. if (WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatReverseApiResult.getReturn_code()) &&
  2020. WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatReverseApiResult.getResult_code())) {
  2021. //调用订单查询接口
  2022. WechatRefundApiResult wechatRefundApiResult =
  2023. WechatUtil.wxOrderQuery(orderWXPayRecordTemp.getOutTradeNoWX());
  2024. if (WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatRefundApiResult.getReturn_code()) &&
  2025. WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatRefundApiResult.getResult_code())) {
  2026. // 修改订单支付记录
  2027. orderWXPayRecordService
  2028. .updateWXPayRecordTradeState(orderWXPayRecordTemp.getId(), wechatRefundApiResult);
  2029. }
  2030. }
  2031. }
  2032. }
  2033. this.confirmPay(order.getId(), Dict.payFlag.item_weixin.getItem(), orderWXPayRecordCurrent.getOutTradeNoWX());
  2034. // 设置支付单完成时间
  2035. processRecordEntity.setPaymentSuccTimeStr(wechatMicropayApiResult.getTime_end());
  2036. processRecordEntity.setPaymentSuccTime(
  2037. new SimpleDateFormat("yyyyMMddHHmmss").parse(wechatMicropayApiResult.getTime_end()));
  2038. processRecordEntity.setPayTransactionId(wechatMicropayApiResult.getTransaction_id());
  2039. //用户支付中
  2040. } else if (WechatUtil.WXTradeState.USERPAYING.getCode().equals(wechatMicropayApiResult.getTrade_state())) {
  2041. r = R.error(WechatUtil.WXTradeState.USERPAYING.getCodeZn() + ",稍等片刻后请刷新页面重新查看订单状态");
  2042. //用户支付失败
  2043. } else if (WechatUtil.WXTradeState.PAYERROR.getCode().equals(wechatMicropayApiResult.getTrade_state())) {
  2044. WechatReverseApiResult wechatReverseApiResult =
  2045. WechatUtil.wxReverse(orderWXPayRecordCurrent.getOutTradeNoWX());
  2046. //撤销订单成功
  2047. if (WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatReverseApiResult.getReturn_code()) &&
  2048. WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatReverseApiResult.getResult_code())) {
  2049. //调用订单查询接口
  2050. WechatRefundApiResult wechatRefundApiResult =
  2051. WechatUtil.wxOrderQuery(orderWXPayRecordCurrent.getOutTradeNoWX());
  2052. if (WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatRefundApiResult.getReturn_code()) &&
  2053. WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatRefundApiResult.getResult_code())) {
  2054. // 修改订单支付记录
  2055. orderWXPayRecordService
  2056. .updateWXPayRecordTradeState(orderWXPayRecordCurrent.getId(), wechatRefundApiResult);
  2057. }
  2058. r = R.error(orderWXPayRecordCurrent.getErrCodeDes());
  2059. } else {
  2060. r = R.error(wechatReverseApiResult.getErr_code_des());
  2061. }
  2062. }
  2063. }
  2064. @Override
  2065. public OrderEntity queryObjectByOrderSn(String orderSn) {
  2066. return orderDao.queryObjectByOrderSn(orderSn);
  2067. }
  2068. @Override
  2069. public void orderRefund(OrderEntity order, String sessionId) throws Exception {
  2070. boolean needUpdateStock = true;
  2071. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  2072. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  2073. }
  2074. if (Dict.payFlag.item_cash.getItem().equals(order.getPayFlag())) {
  2075. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
  2076. }else{
  2077. AliPayMicropayApiResult userRefund = AliPayUtil.aliTradeRefund(order.getMerchOrderSn(), "38.81",
  2078. "用户退款", order.getStoreId() + "");
  2079. LOGGER.info(userRefund.getSubMsg());
  2080. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
  2081. OrderRefundEntity orderRefund = new OrderRefundEntity();
  2082. orderRefund.setRefundId(userRefund.getTradeNo());
  2083. orderRefund.setOutRefundNo(userRefund.getOutTradeNo());
  2084. orderRefund
  2085. .setRefundMoney(new BigDecimal(userRefund.getRefundFee()));
  2086. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));//退款成功
  2087. orderRefund.setModTime(new Date());
  2088. orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
  2089. orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
  2090. orderRefund.setCreateTime(new Date());
  2091. List<OrderEntity> list = orderDao.queryObjectByMerchOrderSn(order.getMerchOrderSn());
  2092. if(list.size()>1){//多条订单
  2093. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
  2094. }else{
  2095. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
  2096. }
  2097. orderRefundDao.save(orderRefund);//退款记录
  2098. }
  2099. orderDao.update(order);//修改为退款成功
  2100. // 修改取货码
  2101. PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
  2102. pickUpCodeEntity.setPickUpCodeStatus("3");
  2103. pickUpCodeService.update(pickUpCodeEntity);
  2104. // WebSocketServer.delete(sessionId,order.getStoreId(),pickUpCodeEntity);
  2105. updateStock(order, "收银端退款");
  2106. }
  2107. @Override
  2108. public int queryOffilineOrderTotal(Query query) {
  2109. return orderDao.queryOffilineOrderTotal(query);
  2110. }
  2111. @Override
  2112. public List<PurchaseSalesInStockDetail> purchaseSalesInStockDetailList(Query query) {
  2113. return orderDao.purchaseSalesInStockDetailList(query);
  2114. }
  2115. @Override
  2116. public int purchaseSalesInStockDetailTotal(Query query) {
  2117. return orderDao.purchaseSalesInStockDetailTotal(query);
  2118. }
  2119. @Override
  2120. public List<OrderEntity> queryExportOffilineOrderList(Map<String, Object> params) {
  2121. List<OrderEntity> orderEntityList = orderDao.queryExportOffilineOrderList(params);
  2122. if (orderEntityList!=null && orderEntityList.size()>0){
  2123. for (OrderEntity orderEntity : orderEntityList) {
  2124. // 查询活动价
  2125. BigDecimal topicPrice = orderDao.queryTopicPriceByOrderSnAndSku(orderEntity.getOrderSn(),orderEntity.getSku());
  2126. orderEntity.setTopicPrice(topicPrice);
  2127. }
  2128. }
  2129. return orderEntityList;
  2130. }
  2131. @Override
  2132. public List<OrderEntity> queryMasterExportOffilineOrderList(Map<String, Object> params) {
  2133. return orderDao.queryMasterExportOffilineOrderList(params);
  2134. }
  2135. @Override
  2136. public List<OrderEntity> queryMasterExportList(Map<String, Object> params) {
  2137. return orderDao.queryMasterExportList(params);
  2138. }
  2139. /**
  2140. * 设置订单数据
  2141. * @return
  2142. */
  2143. public OrderVo setOrderVo(List<GoodsEntity> goodsList, UserEntity loginUser,Long storeId, String merchSn, BigDecimal disCountAmount){
  2144. OrderVo orderInfo = new OrderVo();
  2145. BigDecimal goodsTotalPrice = new BigDecimal(0.00);
  2146. BigDecimal freightPrice = Constant.ZERO;
  2147. for (GoodsEntity goodsEntity : goodsList) {
  2148. goodsTotalPrice = goodsTotalPrice
  2149. .add(goodsEntity.getStoreRetailPrice().multiply(new BigDecimal(goodsEntity.getGoodsNumber())));
  2150. }
  2151. //订单价格计算:订单的总价+运费
  2152. BigDecimal orderTotalPrice = goodsTotalPrice.add(new BigDecimal(0));
  2153. BigDecimal fullCutCouponDec = Constant.ZERO;
  2154. BigDecimal couponPrice = disCountAmount;
  2155. BigDecimal actualPrice = orderTotalPrice.subtract(couponPrice);
  2156. String orderSn = "CW" + CommonUtil.generateOrderNumber();
  2157. orderInfo.setOrder_sn(orderSn);
  2158. orderInfo.setMerchSn(merchSn);
  2159. orderInfo.setUser_id(loginUser.getId().longValue());
  2160. StoreEntity storeEntity = storeDao.queryObject(storeId);
  2161. //收货地址和运费
  2162. orderInfo.setConsignee(loginUser.getUsername());
  2163. orderInfo.setMobile(loginUser.getMobile());
  2164. orderInfo.setCountry("");
  2165. orderInfo.setProvince(storeEntity.getProvinceName());
  2166. orderInfo.setCity(storeEntity.getCityName());
  2167. orderInfo.setDistrict(storeEntity.getCountyName());
  2168. orderInfo.setAddress(storeEntity.getStoreName());
  2169. orderInfo.setAddress_id(1L);
  2170. orderInfo.setDelivery_date(new Date());
  2171. orderInfo.setDelivery_remark("无");
  2172. orderInfo.setStore_id(storeId);
  2173. orderInfo.setFreight_price(freightPrice.intValue());
  2174. orderInfo.setCoupon_id(Integer.parseInt(String.valueOf(0L)));
  2175. orderInfo.setCoupon_price(couponPrice);
  2176. orderInfo.setCoupon_name("无");
  2177. orderInfo.setActivity_id(0L);
  2178. //使用的促销费用
  2179. orderInfo.setFull_cut_price(fullCutCouponDec);
  2180. orderInfo.setCampMinusId(0);
  2181. orderInfo.setCampName("");
  2182. //留言
  2183. orderInfo.setPostscript("无");
  2184. orderInfo.setAdd_time(new Date());
  2185. orderInfo.setGoods_price(goodsTotalPrice);
  2186. orderInfo.setOrder_price(orderTotalPrice);
  2187. orderInfo.setActual_price(actualPrice);
  2188. orderInfo.setOrder_type("1");
  2189. orderInfo.setOrder_status(0);
  2190. orderInfo.setShipping_status(0);
  2191. orderInfo.setPay_status(0);
  2192. orderInfo.setShipping_id(0L);
  2193. orderInfo.setShipping_fee(Constant.ZERO);
  2194. orderInfo.setIntegral(0);
  2195. orderInfo.setIntegral_money(Constant.ZERO);
  2196. orderInfo.setCreateTime(new Date());
  2197. orderInfo.setModTime(new Date());
  2198. orderInfo.setPayMobile(loginUser.getMobile());
  2199. orderInfo.setPayTransactionId("");
  2200. orderInfo.setIsScan("0");//默认未扫描
  2201. orderInfo.setPayMobile(loginUser.getMobile());
  2202. orderInfo.setPay_name(loginUser.getUsername());
  2203. orderInfo.setIsOnfflineOrder(Dict.isOnfflineOrder.item_1.getItem());
  2204. orderInfo.setOrderBizType(Dict.orderBizType.item_10.getItem());
  2205. return orderInfo;
  2206. }
  2207. public OrderGoodsVo setOrderGoodsVo(OrderVo orderInfo,GoodsEntity goodsDto){
  2208. OrderGoodsVo orderGoodsVo = new OrderGoodsVo();
  2209. orderGoodsVo.setOrder_id(orderInfo.getId());
  2210. orderGoodsVo.setGoods_id(goodsDto.getId());
  2211. orderGoodsVo.setGoods_sn(goodsDto.getGoodsSn());
  2212. orderGoodsVo.setProduct_id(Long.valueOf(goodsDto.getProductId()));
  2213. orderGoodsVo.setGoods_name(goodsDto.getName());
  2214. orderGoodsVo.setList_pic_url(goodsDto.getListPicUrl());
  2215. orderGoodsVo.setMarket_price(goodsDto.getStoreMarketPrice());
  2216. orderGoodsVo.setRetail_price(goodsDto.getStoreRetailPrice());
  2217. orderGoodsVo.setNumber(goodsDto.getGoodsNumber());
  2218. // orderGoodsVo.setGoods_specification_name_value(goodsDto.get);
  2219. // orderGoodsVo.setGoods_specification_ids(goodsItem.getGoods_specification_ids());
  2220. orderGoodsVo.setOrderBizType(Dict.orderBizType.item_10.getItem());
  2221. orderGoodsVo.setCreateTime(new Date());
  2222. orderGoodsVo.setModTime(new Date());
  2223. orderGoodsVo.setGoodsRate(goodsDto.getGoodsRate());
  2224. orderGoodsVo.setSku(goodsDto.getSku());
  2225. BigDecimal number = new BigDecimal(Long.valueOf(goodsDto.getGoodsNumber()));
  2226. BigDecimal goodsTotal = goodsDto.getStoreRetailPrice().multiply(number);//单商品总价
  2227. BigDecimal rate = goodsTotal.divide(orderInfo.getGoods_price(),2, BigDecimal.ROUND_HALF_UP);//当前商品总价/订单总价(不含运费、不含优惠券)
  2228. BigDecimal freightPrice = BigDecimal.valueOf(orderInfo.getFreight_price());
  2229. BigDecimal settlePrice = Constant.ZERO;
  2230. if(orderInfo.getFreight_price() != 0 && !"0".equalsIgnoreCase(orderInfo.getCoupon_price()+"")){
  2231. //运费-优惠券
  2232. BigDecimal rateTotal = freightPrice.subtract(orderInfo.getCoupon_price());
  2233. //商品结算平摊价格(含优惠券、运费金额) = 单商品总价 + 当前商品总价/订单总价(不含运费、不含优惠券) * 运费与优惠券合计税率
  2234. settlePrice = goodsTotal.add(rate.multiply(rateTotal));
  2235. }else{
  2236. if(orderInfo.getFreight_price()!=0){
  2237. //运费税率 = 单商品总价/订单总价(不含运费)* 运费金额
  2238. BigDecimal freightRate = rate.multiply(freightPrice);
  2239. //商品结算平摊价格(含运费金额) = 单商品总价+运费税率
  2240. settlePrice = goodsTotal.add(freightRate);
  2241. }
  2242. if(!"0".equalsIgnoreCase(orderInfo.getCoupon_price()+"")){
  2243. //优惠券税率 = 单商品总价/订单总价(不含优惠券)* 优惠券金额
  2244. BigDecimal couponRate = rate.multiply(orderInfo.getCoupon_price());
  2245. //商品结算平摊价格(含优惠券金额) = 单商品总价-优惠券税率
  2246. settlePrice = goodsTotal.subtract(couponRate);
  2247. }
  2248. }
  2249. if(settlePrice.compareTo(BigDecimal.valueOf(0)) == 0){
  2250. orderGoodsVo.setSettlePrice(goodsTotal);//商品结算平摊价格
  2251. }else{
  2252. orderGoodsVo.setSettlePrice(settlePrice);//商品结算平摊价格
  2253. }
  2254. return orderGoodsVo;
  2255. }
  2256. }