OrderServiceImpl.java 127 KB

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