OrderServiceImpl.java 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207
  1. package com.kmall.admin.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.google.common.collect.ImmutableBiMap;
  4. import com.google.common.collect.Maps;
  5. import com.kmall.admin.dao.*;
  6. import com.kmall.admin.dao.mk.store.MkStorePromOrderRealDao;
  7. import com.kmall.admin.dto.OrderExpressDto;
  8. import com.kmall.admin.entity.*;
  9. import com.kmall.admin.entity.OrderProcessRecordEntity;
  10. import com.kmall.admin.entity.mk.store.MkStorePromOrderRealEntity;
  11. import com.kmall.admin.utils.ResponseData;
  12. import com.kmall.api.entity.mk.MkStorePromOrderRealVo;
  13. import com.kmall.manager.manager.express.sf.properties.SFPropertiesBuilder;
  14. import com.kmall.manager.manager.express.sf.properties.SFUtil;
  15. import com.kmall.manager.manager.express.sf.entity.SfRouteServiceResponseEntity;
  16. import com.kmall.manager.manager.express.sf.entity.RouteEntity;
  17. import com.kmall.manager.manager.express.sf.entity.RouteResponseEntity;
  18. import com.kmall.manager.manager.print.ticket.TicketPrintUtil;
  19. import com.kmall.manager.manager.wechat.wxglobal.dto.WechatGlobalRefundApiResult;
  20. import com.kmall.admin.service.OrderService;
  21. import com.kmall.admin.utils.ShiroUtils;
  22. import com.kmall.common.constant.Dict;
  23. import com.kmall.manager.manager.merch.OmsMerchPropertiesBuilder;
  24. import com.kmall.api.util.CommonUtil;
  25. import com.kmall.admin.fromcomm.entity.SysUserEntity;
  26. import com.kmall.manager.manager.print.ticket.PrintTicketPropertiesBuilder;
  27. import com.kmall.common.utils.*;
  28. import com.kmall.common.utils.print.ticket.item.*;
  29. import com.kmall.manager.manager.express.kdn.KdniaoUtil;
  30. import com.kmall.common.utils.wechat.WechatRefundApiResult;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.transaction.annotation.Transactional;
  34. import java.math.BigDecimal;
  35. import java.text.SimpleDateFormat;
  36. import java.util.*;
  37. @Service("orderService")
  38. public class OrderServiceImpl implements OrderService {
  39. @Autowired
  40. private OrderDao orderDao;
  41. @Autowired
  42. private ShippingDao shippingDao;
  43. @Autowired
  44. private OrderGoodsDao orderGoodsDao;
  45. @Autowired
  46. private SysPrinterDao printerDao;
  47. @Autowired
  48. private UserDao userDao;
  49. @Autowired
  50. private UserCouponDao userCouponDao;
  51. @Autowired
  52. private ProductStoreRelaDao productStoreRelaDao;
  53. @Autowired
  54. private OrderProcessRecordDao orderProcessRecordDao;
  55. @Autowired
  56. private OrderRefundDao orderRefundDao;
  57. @Autowired
  58. private StoreDao storeDao;
  59. @Autowired
  60. private OfflineCartDao offlineCartDao;
  61. @Autowired
  62. private GoodsDao goodsDao;
  63. @Autowired
  64. private MerchDao merchDao;
  65. @Autowired
  66. private MngChangeDao mngChangeDao;
  67. @Autowired
  68. private StoreMngChangeDao storeMngChangeDao;
  69. @Autowired
  70. private ThirdMerchExpressDao thirdMerchExpressDao;
  71. @Autowired
  72. private MkStorePromOrderRealDao mkStorePromOrderRealDao;
  73. @Autowired
  74. private UserCampMinusDao userCampMinusDao;
  75. @Override
  76. public OrderEntity queryObject(Long id) {
  77. return orderDao.queryObject(id);
  78. }
  79. @Override
  80. public Double getTotalActualPrice(String merchOrderSn) {
  81. return orderDao.getTotalActualPrice(merchOrderSn);
  82. }
  83. @Override
  84. public List<OrderEntity> queryList(Map<String, Object> map) {
  85. return orderDao.queryList(map);
  86. }
  87. @Override
  88. public int queryTotal(Map<String, Object> map) {
  89. return orderDao.queryTotal(map);
  90. }
  91. @Override
  92. public int save(OrderEntity order) {
  93. return orderDao.save(order);
  94. }
  95. @Override
  96. public int update(OrderEntity order) {
  97. return orderDao.update(order);
  98. }
  99. /**
  100. * 取消订单
  101. *
  102. * @param order
  103. */
  104. @Override
  105. public void cancelOrder(OrderEntity order) {
  106. boolean needUpdateStock = true;
  107. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
  108. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_101.getItem()));
  109. }
  110. orderDao.update(order);
  111. if (!needUpdateStock) {
  112. return;
  113. }
  114. // 更新库存
  115. updateStock(order, "管理后台取消订单");
  116. // 释放优惠券
  117. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  118. if (null != couponVo) {
  119. userCouponDao.cancelOrder(couponVo);
  120. }
  121. //释放促销满减券
  122. UserCampMinusEntity userCampMinusVo = userCampMinusDao.queryUserCampByOrderId(order.getId());
  123. if (null != userCampMinusVo) {
  124. userCampMinusDao.cancelUserCampOrder(userCampMinusVo);
  125. }
  126. }
  127. @Override
  128. public int delete(Long id) {
  129. return orderDao.delete(id);
  130. }
  131. @Override
  132. public int deleteBatch(Long[] ids) {
  133. return orderDao.deleteBatch(ids);
  134. }
  135. @Override
  136. public int confirm(Long id) {
  137. OrderEntity orderEntity = queryObject(id);
  138. Integer shippingStatus = orderEntity.getShippingStatus();//发货状态
  139. Integer payStatus = orderEntity.getPayStatus();//付款状态
  140. if (2 != payStatus) {
  141. throw new RRException("此订单未付款,不能确认收货!");
  142. }
  143. if (4 == shippingStatus) {
  144. throw new RRException("此订单处于退货状态,不能确认收货!");
  145. }
  146. if (0 == shippingStatus) {
  147. throw new RRException("此订单未发货,不能确认收货!");
  148. }
  149. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_301.getItem())) {
  150. throw new RRException("此订单已完成!");
  151. }
  152. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
  153. throw new RRException("此订单待付款!");
  154. }
  155. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_100.getItem())) {
  156. throw new RRException("此订单付款中!");
  157. }
  158. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_101.getItem())) {
  159. throw new RRException("此订单已取消!");
  160. }
  161. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_102.getItem())) {
  162. throw new RRException("此订单已删除!");
  163. }
  164. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  165. throw new RRException("此订单还未发货!");
  166. }
  167. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem())) {
  168. throw new RRException("此订单已退款!");
  169. }
  170. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
  171. throw new RRException("此订单已退款!");
  172. }
  173. orderEntity.setShippingStatus(2);
  174. orderEntity.setOrderStatus(301);
  175. orderEntity.setConfirmTime(new Date());
  176. orderDao.update(orderEntity);
  177. return 0;
  178. }
  179. @Override
  180. public int sendGoods(OrderEntity order) {
  181. Integer payStatus = order.getPayStatus();//付款状态
  182. if (2 != payStatus) {
  183. throw new RRException("此订单未付款!");
  184. }
  185. ShippingEntity shippingEntity = shippingDao.queryObject(order.getShippingId());
  186. if (null != shippingEntity) {
  187. order.setShippingName(shippingEntity.getName());
  188. }
  189. order.setOrderStatus(300);//订单已发货
  190. order.setShippingStatus(1);//已发货
  191. return orderDao.update(order);
  192. }
  193. @Override
  194. public Ticket printMsg(Long id) {
  195. OrderEntity orderEntity = queryInfos(id);
  196. List<OrderGoodsEntity> orderGoodsEntityList = orderEntity.getOrderGoodsEntityList();
  197. // 获取门店
  198. StoreEntity storeEntity = storeDao.queryObject(orderEntity.getStoreId());
  199. // 获取清关信息
  200. OrderProcessRecordEntity orderProcessRecordEntity =
  201. orderProcessRecordDao.queryObjectByOrderSn(orderEntity.getOrderSn());
  202. // 小票头
  203. TicketHead head = new TicketHead();
  204. head.setTitle(OmsMerchPropertiesBuilder.instance().getMerchName() + storeEntity.getStoreName());
  205. // head.setMemberId(orderEntity.getUserName().toString());
  206. head.setOrderId(orderEntity.getOrderSn());
  207. head.setTradeTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE").format(new Date()));
  208. // 商品信息
  209. Integer goodsTotal = 0; // 商品总个数
  210. BigDecimal total = Constant.ZERO; // 商品总计
  211. List<Goods> goodsList = new ArrayList<>();
  212. for (OrderGoodsEntity orderGoods : orderGoodsEntityList) {
  213. goodsTotal += orderGoods.getNumber();
  214. total = total.add(orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber())))
  215. .setScale(2, BigDecimal.ROUND_HALF_UP);
  216. Goods goods = new Goods(orderGoods.getGoodsName(), orderGoods.getRetailPrice().toString(),
  217. orderGoods.getNumber().toString(),
  218. orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber()))
  219. .setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  220. goodsList.add(goods);
  221. }
  222. // 收银信息
  223. CashInfo cashInfo = new CashInfo();
  224. cashInfo.setGoodsTotal(goodsTotal.toString());
  225. cashInfo.setTotal(total.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  226. cashInfo.setReceipts(orderEntity.getActualPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  227. cashInfo.setOddChange("0.00");
  228. cashInfo.setCoupon(orderEntity.getCouponPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  229. cashInfo.setFreight(
  230. new BigDecimal(orderEntity.getFreightPrice()).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  231. cashInfo.setPaymentMode("微信支付");
  232. // 海关清单
  233. CusListing cusListing = new CusListing();
  234. cusListing.setOrderId(orderEntity.getOrderSn());
  235. if (!orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())) {
  236. cusListing.setWaybillId(orderProcessRecordEntity.getLogisticsNo());
  237. cusListing.setInvtNo(orderProcessRecordEntity.getInvtNo());
  238. cusListing.setConsignee(orderEntity.getConsignee());
  239. cusListing.setConsigneeTel(orderEntity.getMobile());
  240. }
  241. cusListing.setOriginAddress(PrintTicketPropertiesBuilder.instance().getAddress());
  242. cusListing.setDeliveryAddress(storeEntity.getStoreAddress());
  243. return TicketPrintUtil.print(head, goodsList, cashInfo, cusListing);
  244. }
  245. /**
  246. * 退款
  247. */
  248. @Transactional
  249. public void refund(OrderEntity order, WechatRefundApiResult result) {
  250. boolean needUpdateStock = true;
  251. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  252. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  253. }
  254. if (Dict.payFlag.item_cash.getItem().equals(order.getPayFlag())) {
  255. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
  256. }else{
  257. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
  258. OrderRefundEntity mallOrderRefund = orderRefundDao.queryObjectByOrderId(order.getId());
  259. OrderRefundEntity orderRefund = new OrderRefundEntity();
  260. orderRefund.setRefundId(result.getRefund_id());
  261. orderRefund.setOutRefundNo(result.getOut_refund_no());
  262. orderRefund
  263. .setRefundMoney(BigDecimal.valueOf(Long.valueOf(result.getRefund_fee())).divide(Constant.ONE_HUNDRED));
  264. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));//退款处理中
  265. orderRefund.setModTime(new Date());
  266. if (mallOrderRefund != null) {
  267. orderRefund.setId(mallOrderRefund.getId());
  268. orderRefund.setRefundType(mallOrderRefund.getRefundType());
  269. orderRefundDao.update(orderRefund);
  270. } else {
  271. orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
  272. orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
  273. orderRefund.setCreateTime(new Date());
  274. List<OrderEntity> list = orderDao.queryObjectByMerchOrderSn(order.getMerchOrderSn());
  275. if(list.size()>1){//多条订单
  276. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
  277. }else{
  278. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
  279. }
  280. orderRefundDao.save(orderRefund);//退款记录
  281. }
  282. }
  283. orderDao.update(order);//修改为退款中
  284. // TODO: 2019/6/13 定时任务查询退款成功后释放库存、优惠券
  285. /*// 判断是否有优惠券
  286. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  287. if (null != couponVo) {
  288. userCouponDao.cancelOrder(couponVo);
  289. }
  290. if (!needUpdateStock) {
  291. return;
  292. }
  293. // 更新库存
  294. updateStock(order, "管理后台订单退款");*/
  295. queryStorePromRealUpdateIsScan(order);
  296. }
  297. /**
  298. * 平安退款逻辑处理
  299. * @param order
  300. * @param result
  301. */
  302. @Transactional
  303. public void pinganRefund(OrderEntity order, net.sf.json.JSONObject result, String refundId) {
  304. boolean needUpdateStock = true;
  305. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  306. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  307. }
  308. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
  309. OrderRefundEntity orderRefund = new OrderRefundEntity();
  310. orderRefund.setRefundId(refundId);
  311. orderRefund.setOutRefundNo(result.getString("ord_no"));
  312. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));//退款处理中
  313. orderRefund.setModTime(new Date());
  314. orderRefund.setRefundMoney(BigDecimal.valueOf(result.getInt("trade_amount")).divide(Constant.ONE_HUNDRED));
  315. OrderRefundEntity mallOrderRefund = orderRefundDao.queryObjectByOrderId(order.getId());
  316. if (mallOrderRefund != null) {
  317. orderRefund.setRefundType(mallOrderRefund.getRefundType());
  318. orderRefund.setId(mallOrderRefund.getId());
  319. orderRefundDao.update(orderRefund);
  320. } else {//退款记录不存在
  321. orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
  322. orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
  323. orderRefund.setCreateTime(new Date());
  324. orderRefundDao.save(orderRefund);//退款记录
  325. }
  326. orderDao.update(order);//修改为退款中
  327. // TODO: 2019/6/13 定时任务查询退款成功后释放库存、优惠券
  328. /*// 判断是否有优惠券
  329. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  330. if (null != couponVo) {
  331. userCouponDao.cancelOrder(couponVo);
  332. }
  333. if (!needUpdateStock) {
  334. return;
  335. }
  336. // 更新库存
  337. updateStock(order, "管理后台平安退款订单");*/
  338. queryStorePromRealUpdateIsScan(order);
  339. }
  340. /**
  341. * 微信国际退款逻辑处理
  342. * @param order
  343. * @param result
  344. */
  345. @Transactional
  346. public void globalRefund(OrderEntity order, WechatGlobalRefundApiResult result) {
  347. boolean needUpdateStock = true;
  348. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  349. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  350. }
  351. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
  352. OrderRefundEntity orderRefund = new OrderRefundEntity();
  353. orderRefund.setRefundId(result.getRefund_id());
  354. orderRefund.setOutRefundNo(result.getOut_refund_no());
  355. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));//退款处理中
  356. orderRefund.setModTime(new Date());
  357. orderRefund.setRefundMoney(BigDecimal.valueOf(Long.valueOf(result.getRefund_fee())).divide(Constant.ONE_HUNDRED));
  358. orderRefund.setRefundFeeType(result.getRefund_fee_type());
  359. if(org.apache.commons.lang3.StringUtils.isNotEmpty(result.getTotal_fee())) {
  360. orderRefund.setTotalFee(Integer.parseInt(BigDecimal.valueOf(Long.valueOf(result.getTotal_fee())).divide(Constant.ONE_HUNDRED).toString()));
  361. }
  362. orderRefund.setFeeType(result.getFee_type());
  363. if(org.apache.commons.lang3.StringUtils.isNotEmpty(result.getCash_fee())) {
  364. orderRefund.setCashFee(Integer.parseInt(BigDecimal.valueOf(Long.valueOf(result.getCash_fee())).divide(Constant.ONE_HUNDRED).toString()));
  365. }
  366. orderRefund.setCashFeeType(result.getCash_fee_type());
  367. if(org.apache.commons.lang3.StringUtils.isNotEmpty(result.getCash_refund_fee())) {
  368. orderRefund.setCashRefundFee(Integer.parseInt(BigDecimal.valueOf(Long.valueOf(result.getCash_refund_fee())).divide(Constant.ONE_HUNDRED).toString()));
  369. }
  370. orderRefund.setCashRefundFeeType(result.getCash_refund_fee_type());
  371. OrderRefundEntity mallOrderRefund = orderRefundDao.queryObjectByOrderId(order.getId());
  372. if (mallOrderRefund != null) {
  373. orderRefund.setRefundType(mallOrderRefund.getRefundType());
  374. orderRefund.setId(mallOrderRefund.getId());
  375. orderRefundDao.update(orderRefund);
  376. } else {//退款记录不存在
  377. orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
  378. orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
  379. orderRefund.setCreateTime(new Date());
  380. orderRefundDao.save(orderRefund);//退款记录
  381. }
  382. orderDao.update(order);//修改为退款中
  383. // TODO: 2019/6/13 定时任务查询退款成功后释放库存、优惠券
  384. /*// 判断是否有优惠券
  385. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  386. if (null != couponVo) {
  387. userCouponDao.cancelOrder(couponVo);
  388. }
  389. if (!needUpdateStock) {
  390. return;
  391. }
  392. // 更新库存
  393. updateStock(order, "管理后台微信国际退款订单");*/
  394. queryStorePromRealUpdateIsScan(order);
  395. }
  396. private void updateStock(OrderEntity order, String changeReason){
  397. Map<String, Object> map = new HashMap();
  398. SysUserEntity user = ShiroUtils.getUserEntity();
  399. map.put("orderId", order.getId());
  400. List<OrderGoodsEntity> orderGoodsVoList = orderGoodsDao.queryList(map);
  401. for (OrderGoodsEntity orderGoodsEntity : orderGoodsVoList) {
  402. ProductStoreRelaEntity storeRelaEntity = productStoreRelaDao
  403. .queryByStoreIdProductId(Long.valueOf(order.getStoreId()),Long.valueOf(orderGoodsEntity.getProductId()));
  404. if (null == storeRelaEntity || null == storeRelaEntity.getSellVolume()) {
  405. storeRelaEntity.setSellVolume(0);
  406. }
  407. BigDecimal sellVolume = new BigDecimal(storeRelaEntity.getSellVolume() - orderGoodsEntity.getNumber());//销售量
  408. if (sellVolume.compareTo(Constant.ZERO) < 0) {
  409. sellVolume = Constant.ZERO;
  410. }
  411. Integer stockNum = 0;
  412. GoodsEntity goodsEntity = goodsDao.queryObject(orderGoodsEntity.getGoodsId());
  413. if(goodsEntity != null){
  414. stockNum = goodsEntity.getGoodsNumber();
  415. //还原商户商品库存
  416. resetGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);
  417. }
  418. if (null != storeRelaEntity.getStockNum()) {
  419. stockNum = storeRelaEntity.getStockNum();
  420. //普通商品不受共享库存影响,直接取门店配置库存
  421. //该商品所属第三方商户不是共享库存
  422. if(goodsEntity.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
  423. resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);//还原门店库存
  424. }else{
  425. //该商品所属第三方商户是共享库存,但商品业务类型不是00保税备货
  426. if(!goodsEntity.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
  427. resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);//还原门店库存
  428. }
  429. }
  430. }
  431. //该商品所属第三方商户为共享库存,且是保税备货商品,取消订单时改变
  432. updateGoodsByIsShareStock(goodsEntity);
  433. }
  434. }
  435. /**
  436. * 更新商品库存数量变化后是否已共享为0“未共享”
  437. * @param goodsInfo
  438. */
  439. private void updateGoodsByIsShareStock(GoodsEntity goodsInfo){
  440. //该商品所属第三方商户为共享库存,且是保税备货商品
  441. if(goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())
  442. && goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
  443. GoodsEntity goodsVo = new GoodsEntity();
  444. goodsVo.setId(goodsInfo.getId());
  445. //商品库存数量变化后是否已共享,0:否,1:是(下单、退款、取消订单触发)
  446. goodsVo.setIsGoodsShareStock(Dict.isGoodsShareStock.item_0.getItem());
  447. goodsDao.update(goodsVo);
  448. }
  449. }
  450. /**
  451. * 还原商品总库存
  452. * @param stockNum
  453. * @param storeRelaEntity
  454. * @param orderGoodsEntity
  455. * @param sellVolume
  456. * @param changeReason
  457. * @param user
  458. */
  459. private void resetGoodsStock(Integer stockNum, ProductStoreRelaEntity storeRelaEntity,
  460. OrderGoodsEntity orderGoodsEntity, BigDecimal sellVolume, String changeReason, SysUserEntity user){
  461. GoodsEntity goodsEntity = goodsDao.queryObject(storeRelaEntity.getGoodsId());
  462. if(goodsEntity!=null){
  463. goodsEntity.setGoodsNumber(stockNum + orderGoodsEntity.getNumber());
  464. // goodsEntity.setSellVolume(Integer.parseInt(goodsSellVolume.toString()));
  465. goodsDao.update(goodsEntity);
  466. // storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
  467. // productStoreRelaDao.update(storeRelaEntity);
  468. MngChangeEntity mngChangeEntity = new MngChangeEntity();
  469. mngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(goodsEntity.getId())));
  470. mngChangeEntity.setThirdPartyMerchCode(goodsEntity.getThirdPartyMerchCode());
  471. mngChangeEntity.setChangeReason(changeReason);
  472. mngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
  473. mngChangeEntity.setChangeNum(orderGoodsEntity.getNumber());//变化数
  474. mngChangeEntity.setOriginalNum(stockNum);//原库存数
  475. mngChangeEntity.setValidNum(stockNum + orderGoodsEntity.getNumber());//可用数
  476. mngChangeEntity.setCreateTime(new Date());
  477. mngChangeEntity.setModTime(new Date());
  478. mngChangeEntity.setCreaterSn(user.getUsername());
  479. mngChangeEntity.setModerSn(user.getUsername());
  480. mngChangeEntity.setIsValid(0);
  481. mngChangeEntity.setMerchSn(goodsEntity.getMerchSn());
  482. mngChangeDao.save(mngChangeEntity);
  483. }
  484. }
  485. /**
  486. * 还原门店商品库存
  487. * @param stockNum
  488. * @param storeRelaEntity
  489. * @param orderGoodsEntity
  490. * @param sellVolume
  491. * @param changeReason
  492. * @param user
  493. */
  494. private void resetStoreGoodsStock(Integer stockNum, ProductStoreRelaEntity storeRelaEntity,
  495. OrderGoodsEntity orderGoodsEntity, BigDecimal sellVolume, String changeReason, SysUserEntity user){
  496. storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
  497. storeRelaEntity.setStockNum(stockNum + orderGoodsEntity.getNumber());//库存数量
  498. productStoreRelaDao.update(storeRelaEntity);
  499. StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
  500. storeMngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
  501. storeMngChangeEntity.setChangeReason(changeReason);
  502. storeMngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(storeRelaEntity.getGoodsId())));
  503. storeMngChangeEntity.setStoreId(Integer.parseInt(String.valueOf(storeRelaEntity.getStoreId())));
  504. storeMngChangeEntity.setMerchSn(storeRelaEntity.getMerchSn());
  505. storeMngChangeEntity.setStoreChangeNum(orderGoodsEntity.getNumber());
  506. storeMngChangeEntity.setStoreOriginalNum(stockNum);
  507. storeMngChangeEntity.setStoreValidNum(stockNum + orderGoodsEntity.getNumber());
  508. storeMngChangeEntity.setCreateTime(new Date());
  509. storeMngChangeEntity.setModTime(new Date());
  510. storeMngChangeEntity.setCreaterSn(user.getUsername());
  511. storeMngChangeEntity.setModerSn(user.getUsername());
  512. storeMngChangeEntity.setIsValid(0);
  513. storeMngChangeDao.save(storeMngChangeEntity);
  514. }
  515. /**
  516. * 查询该退款订单编号是否是推广渠道订单,是则修改渠道定时扫描状态
  517. * @param orderInfo
  518. */
  519. private void queryStorePromRealUpdateIsScan(OrderEntity orderInfo){
  520. Map map = new HashMap();
  521. map.put("orderId", orderInfo.getId());
  522. List<MkStorePromOrderRealEntity> list = mkStorePromOrderRealDao.queryPromRealListByMap(map);
  523. if(list.size() > 0) {
  524. for (MkStorePromOrderRealEntity mkStorePromOrderRealEntity : list) {
  525. mkStorePromOrderRealEntity.setIsPromStatScan(Dict.isDistSellScan.item_0.getItem());
  526. mkStorePromOrderRealDao.update(mkStorePromOrderRealEntity);
  527. }
  528. }
  529. }
  530. /**
  531. * 处理用户退款申请
  532. *
  533. * @param orderInfo
  534. */
  535. @Transactional
  536. public void applyRefundDeal(OrderEntity orderInfo, OrderRefundEntity refundEntity) {
  537. refundEntity.setApprovalTime(new Date());
  538. // refundEntity.setApprover(ShiroUtils.getUserId());
  539. // 退积分
  540. try {
  541. Integer integral = 1;
  542. if (orderInfo.getActualPrice().intValue() > 0) {
  543. integral = orderInfo.getActualPrice().intValue();
  544. }
  545. if (refundEntity.getRefundStatus() == 2) {
  546. orderInfo.setOrderStatus(401);
  547. // UserEntity entity = userDao.queryObject(orderInfo.getUserId());
  548. } else {
  549. orderInfo.setOrderStatus(201);
  550. }
  551. } catch (Exception e) {
  552. e.printStackTrace();
  553. }
  554. orderRefundDao.update(refundEntity);
  555. orderDao.update(orderInfo);
  556. }
  557. @Override
  558. public OrderRefundEntity queryRefundObject(Long refundId) {
  559. return orderRefundDao.queryObject(refundId);
  560. }
  561. @Override
  562. public List<OrderRefundEntity> queryRefundList(Map<String, Object> map) {
  563. return orderRefundDao.queryList(map);
  564. }
  565. @Override
  566. public int queryRefundTotal(Map<String, Object> map) {
  567. return orderRefundDao.queryTotal(map);
  568. }
  569. @Override
  570. public int getUserOrderInfo(Map<String, Object> map) {
  571. int result = 0;
  572. String type = (String) map.get("type");
  573. if ("yfkOrderUserSum".equals(type)) {
  574. result = orderDao.getYfkOrderUserSum(map);
  575. } else if ("oderUserSum".equals(type)) {
  576. result = orderDao.getOderUserSum(map);
  577. } else if ("todayUserOrder".equals(type)) {
  578. result = orderDao.getTodayUserOrder(map);
  579. } else if ("todayUserSales".equals(type)) {
  580. result = orderDao.getTodayUserSales(map);
  581. } else if ("incomeSum".equals(type)) {
  582. result = orderDao.getIncomeSum(map);
  583. } else if ("payedOrderCount".equals(type)) {
  584. result = orderDao.getPayedOrderCount(map);
  585. }
  586. return result;
  587. }
  588. @Override
  589. public Map getLogistics(Long id) {
  590. OrderEntity orderEntity = queryObject(id);
  591. if (orderEntity == null) {
  592. throw new RRException("此订单不存在!");
  593. }
  594. if (orderEntity.getShippingStatus() == 0) {
  595. if (orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) ||
  596. orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_02.getItem())) {
  597. throw new RRException("此订单还未发货!");
  598. } else {
  599. if (StringUtils.isNullOrEmpty(orderEntity.getShippingNo())) {
  600. throw new RRException("此订单还未发货!");
  601. }
  602. }
  603. }
  604. Map logisticsInfo = Maps.newHashMap();
  605. List<WuliuEntity> wuliuEntityList = new ArrayList<>();
  606. OrderProcessRecordEntity orderProcessRecordEntity =
  607. orderProcessRecordDao.queryObjectByOrderSn(orderEntity.getOrderSn());
  608. if (orderProcessRecordEntity != null) {
  609. if (orderEntity.getOrderBizType().equals(Dict.orderBizType.item_10.getItem()) ||
  610. orderEntity.getOrderBizType().equals(Dict.orderBizType.item_02.getItem())) {
  611. WuliuEntity wuliuEntity = new WuliuEntity();
  612. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  613. .format(orderProcessRecordEntity.getCustomsSuccTime()));
  614. wuliuEntity.setAcceptStation(PrintTicketPropertiesBuilder.instance().getAddress() + "送达" +
  615. storeDao.queryObject(orderEntity.getStoreId()).getStoreAddress() +
  616. ";交易完成,用户已提走");
  617. wuliuEntityList.add(wuliuEntity);
  618. }
  619. if (StringUtils.isNotEmpty(orderEntity.getShippingCode()) &&
  620. StringUtils.isNotEmpty(orderEntity.getShippingNo()) &&
  621. orderProcessRecordEntity.getShipmentStartTime() != null) {
  622. if(orderEntity.getShippingCode().equalsIgnoreCase("SF")){
  623. StoreEntity storeEntity = storeDao.queryObject(orderEntity.getStoreId());
  624. if(storeEntity == null){
  625. throw new RRException("查询顺丰订单异常,订单的门店信息不存在");
  626. }
  627. ThirdMerchExpressEntity thirdMerchExpressEntity = thirdMerchExpressDao.getThirdMerchExpressByThirdCode(storeEntity.getThirdPartyMerchCode());
  628. if(thirdMerchExpressEntity == null){
  629. throw new RRException("查询顺丰订单异常,缺失商户快递账号信息");
  630. }
  631. SfRouteServiceResponseEntity entity = SFUtil.routeService(orderEntity.getShippingNo(), thirdMerchExpressEntity.getExpressAccount(),
  632. thirdMerchExpressEntity.getExpressPwd(), SFPropertiesBuilder.instance().getUrl());
  633. // SfRouteServiceResponseEntity entity = SFUtil.routeService("254355029325", thirdMerchExpressEntity.getExpressAccount(),
  634. // thirdMerchExpressEntity.getExpressPwd(), SFPropertiesBuilder.instance().getUrl());//444072971585
  635. if(entity.getHead().equalsIgnoreCase("OK")){
  636. if(entity.getBody() == null){
  637. WuliuEntity wuliuEntity = new WuliuEntity();
  638. wuliuEntity.setAcceptStation("暂无物流轨迹");
  639. wuliuEntityList.add(wuliuEntity);
  640. }else{
  641. if(entity.getBody().getRouteResponse() == null){
  642. WuliuEntity wuliuEntity = new WuliuEntity();
  643. wuliuEntity.setAcceptStation("暂无物流轨迹");
  644. wuliuEntityList.add(wuliuEntity);
  645. }else{
  646. RouteResponseEntity routeResponseEntity = entity.getBody().getRouteResponse().get(0);
  647. if(routeResponseEntity != null){
  648. List<RouteEntity> entityList = routeResponseEntity.getRouteResponse();
  649. for (RouteEntity route : entityList) {
  650. WuliuEntity wuliuEntity = new WuliuEntity();
  651. wuliuEntity.setAcceptTime(route.getAccept_time());
  652. wuliuEntity.setAcceptStation(route.getAccept_address() + route.getRemark());
  653. wuliuEntityList.add(wuliuEntity);
  654. }
  655. }
  656. }
  657. }
  658. }else{
  659. throw new RRException("查询顺丰订单异常,"+entity.getErrors());
  660. }
  661. }else{
  662. JSONObject traces =
  663. KdniaoUtil.getOrderTracesByJson(orderEntity.getShippingCode(), orderEntity.getShippingNo());
  664. List<Map> mapList = (List<Map>) traces.get("Traces");
  665. if (mapList != null && mapList.size() > 0) {
  666. for (Map map : mapList) {
  667. WuliuEntity wuliuEntity = new WuliuEntity();
  668. wuliuEntity.setAcceptTime(map.get("AcceptTime").toString());
  669. wuliuEntity.setAcceptStation(map.get("AcceptStation").toString());
  670. wuliuEntityList.add(wuliuEntity);
  671. }
  672. }
  673. String state = traces.get("State") + "";
  674. if (Dict.logisticsStatus.item_0.getItem().equals(state) && traces.getBoolean("Success")) {
  675. String reason = traces.get("Reason") + "";
  676. WuliuEntity wuliuEntity = new WuliuEntity();
  677. wuliuEntity.setAcceptStation(reason);
  678. wuliuEntityList.add(wuliuEntity);
  679. }
  680. }
  681. }
  682. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsCustomsSend()) &&
  683. orderProcessRecordEntity.getShipmentStartTime() != null) {
  684. WuliuEntity wuliuEntity = new WuliuEntity();
  685. wuliuEntity.setAcceptStation("订单已出库");
  686. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  687. .format(orderProcessRecordEntity.getShipmentStartTime()));
  688. wuliuEntityList.add(wuliuEntity);
  689. }
  690. if (Dict.isSend.item_1.getItem().equals(orderProcessRecordEntity.getIsCustomsSend())) {
  691. WuliuEntity wuliuEntity = new WuliuEntity();
  692. wuliuEntity.setAcceptStation("订单清关完成,等待仓库发货");
  693. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  694. .format(orderProcessRecordEntity.getCustomsSuccTime()));
  695. wuliuEntityList.add(wuliuEntity);
  696. }
  697. if (Dict.isSend.item_0.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsCustomsSend())) {
  698. WuliuEntity wuliuEntity = new WuliuEntity();
  699. wuliuEntity.setAcceptStation("订单清关失败");
  700. wuliuEntityList.add(wuliuEntity);
  701. }
  702. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsEleOrderSend()) &&
  703. orderProcessRecordEntity.getWaybillSuccTime() != null) {
  704. WuliuEntity wuliuEntity = new WuliuEntity();
  705. wuliuEntity.setAcceptStation("海关三单发送成功");
  706. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  707. .format(orderProcessRecordEntity.getWaybillSuccTime()));
  708. wuliuEntityList.add(wuliuEntity);
  709. }
  710. if (Dict.isSend.item_1.getItem().equals(orderProcessRecordEntity.getIsPaymentSend())) {
  711. WuliuEntity wuliuEntity = new WuliuEntity();
  712. wuliuEntity.setAcceptStation("订单支付成功");
  713. wuliuEntity.setAcceptTime(
  714. new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(orderProcessRecordEntity.getPaySuccTime()));
  715. wuliuEntityList.add(wuliuEntity);
  716. }
  717. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsAddOrderSend())) {
  718. WuliuEntity wuliuEntity = new WuliuEntity();
  719. wuliuEntity.setAcceptStation("订单下单成功");
  720. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  721. .format(orderProcessRecordEntity.getAddOrderSuccTime()));
  722. wuliuEntityList.add(wuliuEntity);
  723. }
  724. }
  725. logisticsInfo.put("tracesList", wuliuEntityList);
  726. logisticsInfo.put("logisticCode", orderEntity.getShippingNo());
  727. logisticsInfo.put("shipperCode", orderEntity.getShippingCode());
  728. return logisticsInfo;
  729. }
  730. @Override
  731. public OrderEntity queryInfos(Long id) {
  732. OrderEntity orderEntity = orderDao.queryObject(id);
  733. Map<String, Object> map = new HashMap<String, Object>();
  734. map.put("orderId", id);
  735. List<OrderGoodsEntity> orderGoodsEntityList = orderGoodsDao.queryList(map);
  736. orderEntity.setOrderGoodsEntityList(orderGoodsEntityList);
  737. return orderEntity;
  738. }
  739. /**
  740. * 普货商品生成线下订单
  741. * @param offlineCartList
  742. * @param user
  743. * @return
  744. */
  745. @Transactional
  746. @Override
  747. public Map orderSubmit(List<OfflineCartEntity> offlineCartList, SysUserEntity user) {
  748. Map resultObj = Maps.newHashMap();
  749. try {
  750. if (user == null) {
  751. resultObj.put("errno", 400);
  752. resultObj.put("errmsg", "用户登录超时,请重新登录");
  753. return resultObj;
  754. }
  755. if (!user.getRoleType().equalsIgnoreCase("2")) {
  756. resultObj.put("errno", 400);
  757. resultObj.put("errmsg", "该操作只允许店员账户操作");
  758. return resultObj;
  759. }
  760. if (org.apache.commons.lang3.StringUtils.isEmpty(user.getMerchSn())) {
  761. resultObj.put("errno", 400);
  762. resultObj.put("errmsg", "操作用户的商户编号为空,请先维护用户商户编号信息再来操作");
  763. return resultObj;
  764. }
  765. Long userId = user.getUserId();
  766. Integer storeId = user.getStoreId();
  767. //获取要购买的商品
  768. Map param = Maps.newHashMap();
  769. param.put("userId", userId);
  770. param.put("storeId", storeId);
  771. if (null == offlineCartList && offlineCartList.size() == 0) {
  772. resultObj.put("errno", 400);
  773. resultObj.put("errmsg", "购买商品数据为空");
  774. return resultObj;
  775. }
  776. List<OfflineCartEntity> offlineCartEntityList = offlineCartDao.queryOfflineCartByBizType(param);
  777. if (offlineCartEntityList.size() == 0 && offlineCartList.size() > 0) {
  778. resultObj.put("errno", 0);
  779. resultObj.put("errmsg", "该单已下单成功,请重新扫描商品进行购买");
  780. return resultObj;
  781. }
  782. // 检查库存和更新库存
  783. for (OfflineCartEntity cartEntity : offlineCartEntityList) {
  784. GoodsEntity goodsEntity = goodsDao.queryObject(cartEntity.getGoodsId());
  785. if (goodsEntity == null) {
  786. resultObj.put("errno", 400);
  787. resultObj.put("errmsg", "订单提交失败:商品不存在");
  788. return resultObj;
  789. }
  790. //取得规格的信息,判断规格库存
  791. ProductStoreRelaEntity productInfo = productStoreRelaDao
  792. .queryByGoodsIdAndStoreId(Long.valueOf(storeId), Long.valueOf(cartEntity.getGoodsId()));
  793. synchronized (productInfo) {
  794. if (null == productInfo || null == productInfo.getStockNum() ||
  795. productInfo.getStockNum() < cartEntity.getNumber()) {
  796. resultObj.put("errno", 400);
  797. resultObj.put("errmsg", "库存不足,仅剩余" + productInfo.getStockNum());
  798. return resultObj;
  799. } else {
  800. productInfo.setStockNum(productInfo.getStockNum() - cartEntity.getNumber());
  801. productInfo.setStoreId(Long.valueOf(storeId));
  802. productInfo.addSellVolume();
  803. productStoreRelaDao.updateStockNum(productInfo);//修改普通商品库存
  804. if(goodsEntity != null) {
  805. goodsEntity.setGoodsNumber(goodsEntity.getGoodsNumber() - cartEntity.getNumber());
  806. goodsDao.update(goodsEntity);
  807. }
  808. }
  809. }
  810. }
  811. String merchOrderSn = "EMATO" + CommonUtil.generateOrderNumber();
  812. OrderEntity order = setOrderVo(user, offlineCartEntityList, user.getMerchSn());
  813. order.setStoreId(storeId);
  814. order.setMerchOrderSn(merchOrderSn);
  815. //开启事务,插入订单信息和订单商品
  816. if (order != null) {
  817. orderDao.save(order);
  818. if (null == order.getId()) {
  819. resultObj.put("errno", 400);
  820. resultObj.put("errmsg", "订单提交失败");
  821. return resultObj;
  822. }
  823. for (OfflineCartEntity cartEntity : offlineCartEntityList) {
  824. OrderGoodsEntity orderGoodsEntity = setOrderGoodsVo(order, cartEntity);
  825. //新增订单详情
  826. orderGoodsDao.save(orderGoodsEntity);
  827. }
  828. //清空预订单商品临时表
  829. offlineCartDao.deleteByUserId(userId);
  830. Map orderInfoMap = Maps.newHashMap();
  831. orderInfoMap.put("orderInfo", order);
  832. resultObj.put("errno", 0);
  833. resultObj.put("errmsg", "订单提交成功");
  834. resultObj.put("data", orderInfoMap);
  835. }
  836. } catch (Exception e) {
  837. e.printStackTrace();
  838. resultObj.put("errno", 400);
  839. resultObj.put("errmsg", "订单异常");
  840. return resultObj;
  841. }
  842. return resultObj;
  843. }
  844. /**
  845. * 设置订单数据
  846. *
  847. * @param loginUser
  848. * @return
  849. */
  850. public OrderEntity setOrderVo(SysUserEntity loginUser, List<OfflineCartEntity> offlineCartEntityList,
  851. String merchSn) {
  852. OrderEntity orderInfo = new OrderEntity();
  853. BigDecimal freightPrice = new BigDecimal(0.00);
  854. BigDecimal goodsTotalPrice = new BigDecimal(0.00);
  855. for (OfflineCartEntity offlineCartEntity : offlineCartEntityList) {
  856. goodsTotalPrice = goodsTotalPrice
  857. .add(offlineCartEntity.getRetailPrice().multiply(new BigDecimal(offlineCartEntity.getNumber())));
  858. }
  859. //订单价格计算:订单的总价+运费
  860. BigDecimal orderTotalPrice = goodsTotalPrice.add(freightPrice);
  861. //查询未使用的优惠券
  862. /*String couponName = "";
  863. BigDecimal fullCutCouponDec = Constant.ZERO;
  864. UserCouponVo couponVo = null;*/
  865. BigDecimal couponPrice = new BigDecimal(0.00);
  866. //减去其它支付的金额后,要实际支付的金额 订单的总价+运费-优惠券金额
  867. BigDecimal actualPrice = orderTotalPrice.subtract(couponPrice);
  868. //商户(拼音首字母)+业务类型+编号
  869. // String merchSn = OmsMerchPropertiesBuilder.instance().getMerchSn();
  870. // String merchShortName = OmsMerchPropertiesBuilder.instance().getMerchShortName();
  871. MerchEntity merchEntity = merchDao.findByMerchSn(merchSn);
  872. String merchShortName = "";
  873. if (merchEntity != null) {
  874. merchShortName = merchEntity.getMerchShortName();
  875. }
  876. String orderSn = merchShortName + Dict.orderBizType.item_11.getItem() + CommonUtil.generateOrderNumber();
  877. orderInfo.setOrderSn(orderSn);
  878. orderInfo.setMerchSn(merchSn);
  879. orderInfo.setUserId(Integer.parseInt(loginUser.getUserId() + ""));
  880. orderInfo.setFreightPrice(freightPrice.intValue());
  881. orderInfo.setOrderBizType(Dict.orderBizType.item_11.getItem());
  882. /*orderInfo.setCoupon_id(userCouponId);
  883. orderInfo.setCoupon_name(couponName);*/
  884. // orderInfo.setFullCutPrice(fullCutCouponDec);//使用的优惠券
  885. orderInfo.setCouponPrice(couponPrice);
  886. orderInfo.setPostscript("");//留言
  887. orderInfo.setAddTime(new Date());
  888. orderInfo.setGoodsPrice(goodsTotalPrice);
  889. orderInfo.setOrderPrice(orderTotalPrice);
  890. orderInfo.setActualPrice(actualPrice);
  891. orderInfo.setOrderType("1");
  892. orderInfo.setOrderStatus(0);// 待付款
  893. orderInfo.setShippingStatus(0);
  894. orderInfo.setPayStatus(0);
  895. orderInfo.setShippingId(0L);
  896. orderInfo.setShippingFee(Constant.ZERO);
  897. orderInfo.setIntegral(0);
  898. orderInfo.setIntegralMoney(Constant.ZERO);
  899. orderInfo.setCreateTime(new Date());
  900. orderInfo.setModTime(new Date());
  901. orderInfo.setIsOnfflineOrder(Dict.isOnfflineOrder.item_1.getItem());//线下购买
  902. /*//标记该订单已使用优惠券
  903. if(couponVo != null){
  904. couponVo.setUsed_time(new Date());
  905. couponVo.setIsUsed(Dict.isUsed.item_1.getItem());
  906. apiUserCouponMapper.update(couponVo);
  907. }*/
  908. return orderInfo;
  909. }
  910. public OrderGoodsEntity setOrderGoodsVo(OrderEntity orderInfo, OfflineCartEntity goodsItem) {
  911. GoodsEntity goodsVo = goodsDao.queryObject(goodsItem.getGoodsId());
  912. OrderGoodsEntity orderGoodsVo = new OrderGoodsEntity();
  913. orderGoodsVo.setOrderId(Integer.parseInt(orderInfo.getId() + ""));
  914. orderGoodsVo.setGoodsId(goodsItem.getGoodsId());
  915. orderGoodsVo.setGoodsSn(goodsItem.getGoodsSn());
  916. orderGoodsVo.setProductId(goodsItem.getProductId());
  917. orderGoodsVo.setGoodsName(goodsItem.getGoodsName());
  918. orderGoodsVo.setListPicUrl(goodsItem.getListPicUrl());
  919. orderGoodsVo.setMarketPrice(goodsItem.getMarketPrice());
  920. orderGoodsVo.setRetailPrice(goodsItem.getRetailPrice());
  921. orderGoodsVo.setNumber(goodsItem.getNumber());
  922. orderGoodsVo.setOrderBizType(Dict.orderBizType.item_11.getItem());
  923. orderGoodsVo.setCreateTime(new Date());
  924. orderGoodsVo.setModTime(new Date());
  925. orderGoodsVo.setGoodsRate(goodsVo.getGoodsRate());
  926. orderGoodsVo.setSku(goodsVo.getSku());
  927. return orderGoodsVo;
  928. }
  929. @Override
  930. public OrderEntity queryObjectBySysUser(Long id) {
  931. OrderEntity orderEntity = orderDao.queryObjectBySysUser(id);
  932. Map<String, Object> map = new HashMap<String, Object>();
  933. map.put("orderId", id);
  934. List<OrderGoodsEntity> orderGoodsEntityList = orderGoodsDao.queryList(map);
  935. orderEntity.setOrderGoodsEntityList(orderGoodsEntityList);
  936. return orderEntity;
  937. }
  938. @Override
  939. public int confirmPay(Long id, String payFlag,String orderSnWx) {
  940. SysUserEntity user = ShiroUtils.getUserEntity();
  941. if (user == null) {
  942. throw new RRException("用户登录超时,请重新登录");
  943. }
  944. if (!user.getRoleType().equalsIgnoreCase("2")) {
  945. throw new RRException("该操作只允许店员账户操作");
  946. }
  947. OrderEntity orderEntity = queryObject(id);
  948. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  949. throw new RRException("此订单已付款!");
  950. }
  951. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_301.getItem())) {
  952. throw new RRException("此订单已完成!");
  953. }
  954. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_101.getItem())) {
  955. throw new RRException("此订单已取消!");
  956. }
  957. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_102.getItem())) {
  958. throw new RRException("此订单已删除!");
  959. }
  960. orderEntity.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_201.getItem()));
  961. orderEntity.setPayStatus(Integer.parseInt(Dict.payStatus.item_2.getItem()));
  962. orderEntity.setPayFlag(payFlag);
  963. orderEntity.setPayTime(new Date());
  964. if(orderSnWx != null){
  965. orderEntity.setOrderSnWx(orderSnWx);
  966. }
  967. orderDao.update(orderEntity);
  968. return 0;
  969. }
  970. @Override
  971. public List<OrderEntity> queryExportList(Map<String, Object> map) {
  972. List<OrderEntity> list = orderDao.queryExportList(map);
  973. for (OrderEntity order : list) {
  974. OrderProcessRecordEntity orderProcessRecord = orderProcessRecordDao.queryObjectByOrderSn(order.getOrderSn());
  975. order.setOrderProcessRecord(orderProcessRecord);
  976. }
  977. return list;
  978. }
  979. @Override
  980. public List<OrderEntity> queryOffilineOrderList(Map<String, Object> map) {
  981. return orderDao.queryOffilineOrderList(map);
  982. }
  983. @Override
  984. public int uploadExcel(List<OrderExpressDto> orderExpressDtoList) {
  985. SysUserEntity user = ShiroUtils.getUserEntity();
  986. boolean isFail = false;
  987. List<String> failShippingNameList = new ArrayList<>();
  988. List<String> failOrderSnList = new ArrayList<>();
  989. List<String> failShippingCodeList = new ArrayList<>();
  990. List<String> failCodeSnList = new ArrayList<>();
  991. List<String> failNameSnList = new ArrayList<>();
  992. List<String> failStatusOrderSnList = new ArrayList<>();
  993. if (orderExpressDtoList != null && orderExpressDtoList.size() > 0) {
  994. for (int i = 0; i < orderExpressDtoList.size(); i++) {
  995. OrderExpressDto orderExpressDto = orderExpressDtoList.get(i);
  996. OrderEntity orderEntity = new OrderEntity();
  997. Map<String, Object> valideDate = MapBeanUtil.fromObject(orderExpressDto);
  998. ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
  999. builder.put("orderSn", "订单编号");
  1000. builder.put("shippingNo", "快递单号");
  1001. builder.put("shippingName", "快递公司");
  1002. builder.put("shippingCode", "快递简写");
  1003. R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
  1004. if (Integer.valueOf(r.get("code").toString()) != 0) {
  1005. throw new RRException(r.get("msg").toString());
  1006. } else {
  1007. r = ValidatorUtil.isEmpty(builder.build(), valideDate);
  1008. if (Integer.valueOf(r.get("code").toString()) != 0) {
  1009. throw new RRException(r.get("msg").toString());
  1010. }
  1011. }
  1012. OrderEntity order = orderDao.queryObjectByOrderSn(orderExpressDto.getOrderSn());
  1013. if(order == null){
  1014. isFail = true;
  1015. failOrderSnList.add(orderExpressDto.getOrderSn());
  1016. }else{
  1017. if(!(order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())
  1018. && order.getPayStatus() == Integer.parseInt(Dict.payStatus.item_2.getItem()))){
  1019. isFail = true;
  1020. failStatusOrderSnList.add(orderExpressDto.getOrderSn());
  1021. }
  1022. }
  1023. ShippingEntity shippingEntity = shippingDao.queryObjectByCode(orderExpressDto.getShippingCode());
  1024. if(shippingEntity == null){
  1025. isFail = true;
  1026. failShippingCodeList.add(orderExpressDto.getShippingCode());
  1027. failCodeSnList.add(orderExpressDto.getOrderSn());
  1028. }else{
  1029. if(!orderExpressDto.getShippingName().equalsIgnoreCase(shippingEntity.getName())){
  1030. isFail = true;
  1031. failShippingNameList.add(orderExpressDto.getShippingName());
  1032. failNameSnList.add(orderExpressDto.getOrderSn());
  1033. }
  1034. }
  1035. if(!isFail){//false则有错误的数据
  1036. if(order != null) {// 修改商品
  1037. // orderEntity.setOrderSn(orderExpressDto.getOrderSn());
  1038. orderEntity.setShippingNo(orderExpressDto.getShippingNo());
  1039. orderEntity.setShippingCode(orderExpressDto.getShippingCode());
  1040. orderEntity.setShippingName(orderExpressDto.getShippingName());
  1041. orderEntity.setShippingStatus(Integer.parseInt(Dict.shippingStatus.item_1.getItem()));
  1042. orderEntity.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_300.getItem()));
  1043. orderEntity.setModerSn(user.getUsername());
  1044. orderEntity.setCreateTime(new Date());
  1045. orderEntity.setModTime(new Date());
  1046. orderEntity.setId(order.getId());
  1047. orderDao.update(orderEntity);
  1048. }
  1049. }
  1050. }
  1051. if(failOrderSnList != null && failOrderSnList.size() > 0){
  1052. throw new RRException("导入数据异常,订单编号不存在,不存在的订单编号【"+failOrderSnList+"】,请删除掉再继续操作");
  1053. }
  1054. if(failStatusOrderSnList != null && failStatusOrderSnList.size() > 0){
  1055. throw new RRException("导入数据异常,修改订单快递功能只支持已付款未发货的订单,以下订单编号无效【"+failStatusOrderSnList+"】,请删除掉再继续操作");
  1056. }
  1057. if(failShippingCodeList != null && failShippingCodeList.size() > 0){
  1058. throw new RRException("导入数据异常,快递简写不在可支持的范围中,简写错误的订单编号【"+failCodeSnList+"】,错误的快递简写【"+failShippingCodeList+"】," +
  1059. "正确数据可下载订单页面的快递公司简写Excel中查看");
  1060. }
  1061. if(failShippingNameList != null && failShippingNameList.size() > 0){
  1062. throw new RRException("导入数据异常,快递简写对应的快递公司不一致,快递公司错误的订单编号【"+failNameSnList+"】,请修改Excel数据中订单编号对应的快递公司错误信息," +
  1063. "正确数据可下载订单页面的快递公司简写Excel中查看");
  1064. }
  1065. // if(failFreightGoodsSnList != null && failFreightGoodsSnList.size() > 0){
  1066. // exportExceptionDataEntity.setExportExceptionData("运费信息请在商城配置》运费模板中维护,运费与商户信息对应,请检查该商品商户信息下的运费是否维护,不存在的商品编码【"+failFreightGoodsSnList+"】,运费【"+failFreightList+"】");
  1067. // exportExceptionDataDao.save(exportExceptionDataEntity);
  1068. // throw new RRException("导入数据异常,异常信息请在商品管理》》商品导入异常数据中查看检查");
  1069. // }
  1070. }else{
  1071. throw new RRException("导入数据为空,或者检查商品编码数据是否为空");
  1072. }
  1073. return 1;
  1074. }
  1075. @Override
  1076. public List<OrderEntity> promOrderList(Map<String, Object> map) {
  1077. Integer[] statusList = {201};
  1078. List<OrderEntity> list = orderDao.promOrderList(map);
  1079. for (OrderEntity orderEntity: list) {
  1080. Map<String, Object> queryMap = new HashMap<>();
  1081. queryMap.put("goodsId", orderEntity.getGoodsId());
  1082. queryMap.put("statusList", statusList);
  1083. queryMap.put("orderId", orderEntity.getId());
  1084. Double promActualPrice = orderDao.getActualPriceByOutProm(queryMap);
  1085. if(promActualPrice == null){
  1086. promActualPrice = 0d;
  1087. }
  1088. orderEntity.setPromActualPrice(BigDecimal.valueOf(promActualPrice));
  1089. }
  1090. return list;
  1091. }
  1092. @Override
  1093. public int queryPromOrderTotal(Map<String, Object> map) {
  1094. return orderDao.queryPromOrderTotal(map);
  1095. }
  1096. @Override
  1097. public List<OrderEntity> promOrderListExport(Map<String, Object> map){
  1098. Integer[] statusList = {201};
  1099. List<OrderEntity> list = orderDao.promOrderListExport(map);
  1100. for (OrderEntity orderEntity: list) {
  1101. Map<String, Object> queryMap = new HashMap<>();
  1102. queryMap.put("goodsId", orderEntity.getGoodsId());
  1103. queryMap.put("orderId", orderEntity.getId());
  1104. queryMap.put("statusList", statusList);
  1105. Double promActualPrice = orderDao.getActualPriceByOutProm(queryMap);
  1106. if(promActualPrice == null){
  1107. promActualPrice = 0d;
  1108. }
  1109. orderEntity.setPromActualPrice(BigDecimal.valueOf(promActualPrice));
  1110. }
  1111. return list;
  1112. }
  1113. @Override
  1114. public List<OrderEntity> storeTopicOrderList(Map<String, Object> map) {
  1115. List<OrderEntity> list = orderDao.storeTopicOrderList(map);
  1116. return list;
  1117. }
  1118. @Override
  1119. public int queryStoreTopicOrderTotal(Map<String, Object> map) {
  1120. return orderDao.queryStoreTopicOrderTotal(map);
  1121. }
  1122. @Override
  1123. public List<WxOrderEntity> wxOrderResendQueryAllList(Map<String, Object> map){
  1124. // String requestData = JacksonUtil.toJson(map);
  1125. String url = "http://120.78.152.8:9580/wx/wxOrderResendQueryAll";
  1126. // 同步访问,返回结果字符串
  1127. String response = OkHttpUtils.post(map, url, "SSL");
  1128. ResponseData responseData = JacksonUtils.fromStringJson(response, ResponseData.class);
  1129. if(responseData.getCode().equalsIgnoreCase("0")){
  1130. List<WxOrderEntity> list = responseData.getData().getRows();
  1131. return list;
  1132. }
  1133. return null;
  1134. }
  1135. }