OrderServiceImpl.java 100 KB

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