OrderServiceImpl.java 104 KB

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