1
0

OrderServiceImpl.java 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. package com.kmall.admin.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.google.common.collect.Maps;
  4. import com.kmall.admin.dao.*;
  5. import com.kmall.admin.entity.*;
  6. import com.kmall.admin.entity.OrderProcessRecordEntity;
  7. import com.kmall.admin.service.OrderService;
  8. import com.kmall.common.constant.Dict;
  9. import com.kmall.api.service.merch.OmsMerchPropertiesBuilder;
  10. import com.kmall.api.util.CommonUtil;
  11. import com.kmall.common.entity.SysUserEntity;
  12. import com.kmall.common.service.print.ticket.PrintTicketPropertiesBuilder;
  13. import com.kmall.common.utils.*;
  14. import com.kmall.common.utils.print.ticket.TicketPrintUtil;
  15. import com.kmall.common.utils.print.ticket.item.*;
  16. import com.kmall.common.utils.express.kdn.KdniaoUtil;
  17. import com.kmall.common.utils.wechat.WechatRefundApiResult;
  18. import com.kmall.common.utils.wechat.wxglobal.dto.WechatGlobalRefundApiResult;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import java.math.BigDecimal;
  23. import java.text.SimpleDateFormat;
  24. import java.util.*;
  25. @Service("orderService")
  26. public class OrderServiceImpl implements OrderService {
  27. @Autowired
  28. private OrderDao orderDao;
  29. @Autowired
  30. private ShippingDao shippingDao;
  31. @Autowired
  32. private OrderGoodsDao orderGoodsDao;
  33. @Autowired
  34. private SysPrinterDao printerDao;
  35. @Autowired
  36. private UserDao userDao;
  37. @Autowired
  38. private UserCouponDao userCouponDao;
  39. @Autowired
  40. private ProductStoreRelaDao productStoreRelaDao;
  41. @Autowired
  42. private OrderProcessRecordDao orderProcessRecordDao;
  43. @Autowired
  44. private OrderRefundDao orderRefundDao;
  45. @Autowired
  46. private StoreDao storeDao;
  47. @Autowired
  48. private OfflineCartDao offlineCartDao;
  49. @Autowired
  50. private GoodsDao goodsDao;
  51. @Autowired
  52. private MerchDao merchDao;
  53. @Override
  54. public OrderEntity queryObject(Long id) {
  55. return orderDao.queryObject(id);
  56. }
  57. @Override
  58. public Double getTotalActualPrice(String merchOrderSn) {
  59. return orderDao.getTotalActualPrice(merchOrderSn);
  60. }
  61. @Override
  62. public List<OrderEntity> queryList(Map<String, Object> map) {
  63. return orderDao.queryList(map);
  64. }
  65. @Override
  66. public int queryTotal(Map<String, Object> map) {
  67. return orderDao.queryTotal(map);
  68. }
  69. @Override
  70. public int save(OrderEntity order) {
  71. return orderDao.save(order);
  72. }
  73. @Override
  74. public int update(OrderEntity order) {
  75. return orderDao.update(order);
  76. }
  77. /**
  78. * 取消订单
  79. *
  80. * @param order
  81. */
  82. @Override
  83. public void cancelOrder(OrderEntity order) {
  84. boolean needUpdateStock = true;
  85. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
  86. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_101.getItem()));
  87. }
  88. // 判断是否有优惠券
  89. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  90. if (null != couponVo) {
  91. userCouponDao.cancelOrder(couponVo);
  92. }
  93. orderDao.update(order);
  94. if (!needUpdateStock) {
  95. return;
  96. }
  97. // 更新库存
  98. updateStock(order);
  99. }
  100. @Override
  101. public int delete(Long id) {
  102. return orderDao.delete(id);
  103. }
  104. @Override
  105. public int deleteBatch(Long[] ids) {
  106. return orderDao.deleteBatch(ids);
  107. }
  108. @Override
  109. public int confirm(Long id) {
  110. OrderEntity orderEntity = queryObject(id);
  111. Integer shippingStatus = orderEntity.getShippingStatus();//发货状态
  112. Integer payStatus = orderEntity.getPayStatus();//付款状态
  113. if (2 != payStatus) {
  114. throw new RRException("此订单未付款,不能确认收货!");
  115. }
  116. if (4 == shippingStatus) {
  117. throw new RRException("此订单处于退货状态,不能确认收货!");
  118. }
  119. if (0 == shippingStatus) {
  120. throw new RRException("此订单未发货,不能确认收货!");
  121. }
  122. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_301.getItem())) {
  123. throw new RRException("此订单已完成!");
  124. }
  125. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
  126. throw new RRException("此订单待付款!");
  127. }
  128. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_100.getItem())) {
  129. throw new RRException("此订单付款中!");
  130. }
  131. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_101.getItem())) {
  132. throw new RRException("此订单已取消!");
  133. }
  134. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_102.getItem())) {
  135. throw new RRException("此订单已删除!");
  136. }
  137. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  138. throw new RRException("此订单还未发货!");
  139. }
  140. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem())) {
  141. throw new RRException("此订单已退款!");
  142. }
  143. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
  144. throw new RRException("此订单已退款!");
  145. }
  146. orderEntity.setShippingStatus(2);
  147. orderEntity.setOrderStatus(301);
  148. orderEntity.setConfirmTime(new Date());
  149. orderDao.update(orderEntity);
  150. return 0;
  151. }
  152. @Override
  153. public int sendGoods(OrderEntity order) {
  154. Integer payStatus = order.getPayStatus();//付款状态
  155. if (2 != payStatus) {
  156. throw new RRException("此订单未付款!");
  157. }
  158. ShippingEntity shippingEntity = shippingDao.queryObject(order.getShippingId());
  159. if (null != shippingEntity) {
  160. order.setShippingName(shippingEntity.getName());
  161. }
  162. order.setOrderStatus(300);//订单已发货
  163. order.setShippingStatus(1);//已发货
  164. return orderDao.update(order);
  165. }
  166. @Override
  167. public Ticket printMsg(Long id) {
  168. OrderEntity orderEntity = queryInfos(id);
  169. List<OrderGoodsEntity> orderGoodsEntityList = orderEntity.getOrderGoodsEntityList();
  170. // 获取门店
  171. StoreEntity storeEntity = storeDao.queryObject(orderEntity.getStoreId());
  172. // 获取清关信息
  173. OrderProcessRecordEntity orderProcessRecordEntity =
  174. orderProcessRecordDao.queryObjectByOrderSn(orderEntity.getOrderSn());
  175. // 小票头
  176. TicketHead head = new TicketHead();
  177. head.setTitle(OmsMerchPropertiesBuilder.instance().getMerchName() + storeEntity.getStoreName());
  178. // head.setMemberId(orderEntity.getUserName().toString());
  179. head.setOrderId(orderEntity.getOrderSn());
  180. head.setTradeTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE").format(new Date()));
  181. // 商品信息
  182. Integer goodsTotal = 0; // 商品总个数
  183. BigDecimal total = Constant.ZERO; // 商品总计
  184. List<Goods> goodsList = new ArrayList<>();
  185. for (OrderGoodsEntity orderGoods : orderGoodsEntityList) {
  186. goodsTotal += orderGoods.getNumber();
  187. total = total.add(orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber())))
  188. .setScale(2, BigDecimal.ROUND_HALF_UP);
  189. Goods goods = new Goods(orderGoods.getGoodsName(), orderGoods.getRetailPrice().toString(),
  190. orderGoods.getNumber().toString(),
  191. orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber()))
  192. .setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  193. goodsList.add(goods);
  194. }
  195. // 收银信息
  196. CashInfo cashInfo = new CashInfo();
  197. cashInfo.setGoodsTotal(goodsTotal.toString());
  198. cashInfo.setTotal(total.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  199. cashInfo.setReceipts(orderEntity.getActualPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  200. cashInfo.setOddChange("0.00");
  201. cashInfo.setCoupon(orderEntity.getCouponPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  202. cashInfo.setFreight(
  203. new BigDecimal(orderEntity.getFreightPrice()).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
  204. cashInfo.setPaymentMode("微信支付");
  205. // 海关清单
  206. CusListing cusListing = new CusListing();
  207. cusListing.setOrderId(orderEntity.getOrderSn());
  208. if (!orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())) {
  209. cusListing.setWaybillId(orderProcessRecordEntity.getLogisticsNo());
  210. cusListing.setInvtNo(orderProcessRecordEntity.getInvtNo());
  211. cusListing.setConsignee(orderEntity.getConsignee());
  212. cusListing.setConsigneeTel(orderEntity.getMobile());
  213. }
  214. cusListing.setOriginAddress(PrintTicketPropertiesBuilder.instance().getAddress());
  215. cusListing.setDeliveryAddress(storeEntity.getStoreAddress());
  216. return TicketPrintUtil.print(head, goodsList, cashInfo, cusListing);
  217. }
  218. /**
  219. * 退款
  220. */
  221. @Transactional
  222. public void refund(OrderEntity order, WechatRefundApiResult result) {
  223. boolean needUpdateStock = true;
  224. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  225. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  226. }
  227. if (Dict.payFlag.item_cash.getItem().equals(order.getPayFlag())) {
  228. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
  229. }else{
  230. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
  231. OrderRefundEntity mallOrderRefund = orderRefundDao.queryObjectByOrderId(order.getId());
  232. OrderRefundEntity orderRefund = new OrderRefundEntity();
  233. orderRefund.setRefundId(result.getRefund_id());
  234. orderRefund.setOutRefundNo(result.getOut_refund_no());
  235. orderRefund
  236. .setRefundMoney(BigDecimal.valueOf(Long.valueOf(result.getRefund_fee())).divide(Constant.ONE_HUNDRED));
  237. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));//退款处理中
  238. orderRefund.setModTime(new Date());
  239. if (mallOrderRefund != null) {
  240. orderRefund.setId(mallOrderRefund.getId());
  241. orderRefund.setRefundType(mallOrderRefund.getRefundType());
  242. orderRefundDao.update(orderRefund);
  243. } else {
  244. orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
  245. orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
  246. orderRefund.setCreateTime(new Date());
  247. List<OrderEntity> list = orderDao.queryObjectByMerchOrderSn(order.getMerchOrderSn());
  248. if(list.size()>1){//多条订单
  249. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
  250. }else{
  251. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
  252. }
  253. orderRefundDao.save(orderRefund);//退款记录
  254. }
  255. }
  256. orderDao.update(order);//修改为退款中
  257. // 判断是否有优惠券
  258. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  259. if (null != couponVo) {
  260. userCouponDao.cancelOrder(couponVo);
  261. }
  262. if (!needUpdateStock) {
  263. return;
  264. }
  265. // 更新库存
  266. updateStock(order);
  267. }
  268. /**
  269. * 平安退款逻辑处理
  270. * @param order
  271. * @param result
  272. */
  273. @Transactional
  274. public void pinganRefund(OrderEntity order, net.sf.json.JSONObject result, String refundId) {
  275. boolean needUpdateStock = true;
  276. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  277. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  278. }
  279. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
  280. OrderRefundEntity orderRefund = new OrderRefundEntity();
  281. orderRefund.setRefundId(refundId);
  282. orderRefund.setOutRefundNo(result.getString("ord_no"));
  283. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));//退款处理中
  284. orderRefund.setModTime(new Date());
  285. orderRefund.setRefundMoney(BigDecimal.valueOf(result.getInt("trade_amount")).divide(Constant.ONE_HUNDRED));
  286. OrderRefundEntity mallOrderRefund = orderRefundDao.queryObjectByOrderId(order.getId());
  287. if (mallOrderRefund != null) {
  288. orderRefund.setRefundType(mallOrderRefund.getRefundType());
  289. orderRefund.setId(mallOrderRefund.getId());
  290. orderRefundDao.update(orderRefund);
  291. } else {//退款记录不存在
  292. orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
  293. orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
  294. orderRefund.setCreateTime(new Date());
  295. orderRefundDao.save(orderRefund);//退款记录
  296. }
  297. orderDao.update(order);//修改为退款中
  298. // 判断是否有优惠券
  299. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  300. if (null != couponVo) {
  301. userCouponDao.cancelOrder(couponVo);
  302. }
  303. if (!needUpdateStock) {
  304. return;
  305. }
  306. // 更新库存
  307. updateStock(order);
  308. }
  309. /**
  310. * 微信国际退款逻辑处理
  311. * @param order
  312. * @param result
  313. */
  314. @Transactional
  315. public void globalRefund(OrderEntity order, WechatGlobalRefundApiResult result) {
  316. boolean needUpdateStock = true;
  317. if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  318. order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  319. }
  320. order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
  321. OrderRefundEntity orderRefund = new OrderRefundEntity();
  322. orderRefund.setRefundId(result.getRefund_id());
  323. orderRefund.setOutRefundNo(result.getOut_refund_no());
  324. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));//退款处理中
  325. orderRefund.setModTime(new Date());
  326. orderRefund.setRefundMoney(BigDecimal.valueOf(Long.valueOf(result.getRefund_fee())).divide(Constant.ONE_HUNDRED));
  327. orderRefund.setRefundFeeType(result.getRefund_fee_type());
  328. if(org.apache.commons.lang3.StringUtils.isNotEmpty(result.getTotal_fee())) {
  329. orderRefund.setTotalFee(Integer.parseInt(BigDecimal.valueOf(Long.valueOf(result.getTotal_fee())).divide(Constant.ONE_HUNDRED).toString()));
  330. }
  331. orderRefund.setFeeType(result.getFee_type());
  332. if(org.apache.commons.lang3.StringUtils.isNotEmpty(result.getCash_fee())) {
  333. orderRefund.setCashFee(Integer.parseInt(BigDecimal.valueOf(Long.valueOf(result.getCash_fee())).divide(Constant.ONE_HUNDRED).toString()));
  334. }
  335. orderRefund.setCashFeeType(result.getCash_fee_type());
  336. if(org.apache.commons.lang3.StringUtils.isNotEmpty(result.getCash_refund_fee())) {
  337. orderRefund.setCashRefundFee(Integer.parseInt(BigDecimal.valueOf(Long.valueOf(result.getCash_refund_fee())).divide(Constant.ONE_HUNDRED).toString()));
  338. }
  339. orderRefund.setCashRefundFeeType(result.getCash_refund_fee_type());
  340. OrderRefundEntity mallOrderRefund = orderRefundDao.queryObjectByOrderId(order.getId());
  341. if (mallOrderRefund != null) {
  342. orderRefund.setRefundType(mallOrderRefund.getRefundType());
  343. orderRefund.setId(mallOrderRefund.getId());
  344. orderRefundDao.update(orderRefund);
  345. } else {//退款记录不存在
  346. orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
  347. orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
  348. orderRefund.setCreateTime(new Date());
  349. orderRefundDao.save(orderRefund);//退款记录
  350. }
  351. orderDao.update(order);//修改为退款中
  352. // 判断是否有优惠券
  353. UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
  354. if (null != couponVo) {
  355. userCouponDao.cancelOrder(couponVo);
  356. }
  357. if (!needUpdateStock) {
  358. return;
  359. }
  360. // 更新库存
  361. updateStock(order);
  362. }
  363. private void updateStock(OrderEntity order){
  364. Map<String, Object> map = new HashMap<String, Object>();
  365. map.put("orderId", order.getId());
  366. List<OrderGoodsEntity> orderGoodsVoList = orderGoodsDao.queryList(map);
  367. for (OrderGoodsEntity orderGoodsEntity : orderGoodsVoList) {
  368. ProductStoreRelaEntity storeRelaEntity = productStoreRelaDao
  369. .queryByStoreIdProductId(Long.valueOf(order.getStoreId()),
  370. Long.valueOf(orderGoodsEntity.getProductId()));
  371. if (null == storeRelaEntity || null == storeRelaEntity.getSellVolume()) {
  372. storeRelaEntity.setSellVolume(0);
  373. }
  374. BigDecimal sellVolume = new BigDecimal(storeRelaEntity.getSellVolume() - orderGoodsEntity.getNumber());//销售量
  375. if (sellVolume.compareTo(Constant.ZERO) < 0) {
  376. sellVolume = Constant.ZERO;
  377. }
  378. storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
  379. if (null == storeRelaEntity.getStockNum()) {
  380. storeRelaEntity.setStockNum(0);
  381. }
  382. storeRelaEntity.setStockNum(storeRelaEntity.getStockNum() + orderGoodsEntity.getNumber());//库存数量
  383. productStoreRelaDao.update(storeRelaEntity);
  384. }
  385. }
  386. /**
  387. * 处理用户退款申请
  388. *
  389. * @param orderInfo
  390. */
  391. @Transactional
  392. public void applyRefundDeal(OrderEntity orderInfo, OrderRefundEntity refundEntity) {
  393. refundEntity.setApprovalTime(new Date());
  394. // refundEntity.setApprover(ShiroUtils.getUserId());
  395. // 退积分
  396. try {
  397. Integer integral = 1;
  398. if (orderInfo.getActualPrice().intValue() > 0) {
  399. integral = orderInfo.getActualPrice().intValue();
  400. }
  401. if (refundEntity.getRefundStatus() == 2) {
  402. orderInfo.setOrderStatus(401);
  403. UserEntity entity = userDao.queryObject(orderInfo.getUserId());
  404. } else {
  405. orderInfo.setOrderStatus(201);
  406. }
  407. } catch (Exception e) {
  408. e.printStackTrace();
  409. }
  410. orderRefundDao.update(refundEntity);
  411. orderDao.update(orderInfo);
  412. }
  413. @Override
  414. public OrderRefundEntity queryRefundObject(Long refundId) {
  415. return orderRefundDao.queryObject(refundId);
  416. }
  417. @Override
  418. public List<OrderRefundEntity> queryRefundList(Map<String, Object> map) {
  419. return orderRefundDao.queryList(map);
  420. }
  421. @Override
  422. public int queryRefundTotal(Map<String, Object> map) {
  423. return orderRefundDao.queryTotal(map);
  424. }
  425. @Override
  426. public int getUserOrderInfo(Map<String, Object> map) {
  427. int result = 0;
  428. String type = (String) map.get("type");
  429. if ("yfkOrderUserSum".equals(type)) {
  430. result = orderDao.getYfkOrderUserSum(map);
  431. } else if ("oderUserSum".equals(type)) {
  432. result = orderDao.getOderUserSum(map);
  433. } else if ("todayUserOrder".equals(type)) {
  434. result = orderDao.getTodayUserOrder(map);
  435. } else if ("todayUserSales".equals(type)) {
  436. result = orderDao.getTodayUserSales(map);
  437. } else if ("incomeSum".equals(type)) {
  438. result = orderDao.getIncomeSum(map);
  439. } else if ("payedOrderCount".equals(type)) {
  440. result = orderDao.getPayedOrderCount(map);
  441. }
  442. return result;
  443. }
  444. @Override
  445. public Map getLogistics(Long id) {
  446. OrderEntity orderEntity = queryObject(id);
  447. if (orderEntity == null) {
  448. throw new RRException("此订单不存在!");
  449. }
  450. if (orderEntity.getShippingStatus() == 0) {
  451. if (orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) ||
  452. orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_02.getItem())) {
  453. throw new RRException("此订单还未发货!");
  454. } else {
  455. if (StringUtils.isNullOrEmpty(orderEntity.getShippingNo())) {
  456. throw new RRException("此订单还未发货!");
  457. }
  458. }
  459. }
  460. Map logisticsInfo = Maps.newHashMap();
  461. List<WuliuEntity> wuliuEntityList = new ArrayList<>();
  462. OrderProcessRecordEntity orderProcessRecordEntity =
  463. orderProcessRecordDao.queryObjectByOrderSn(orderEntity.getOrderSn());
  464. if (orderProcessRecordEntity != null) {
  465. if (orderEntity.getOrderBizType().equals(Dict.orderBizType.item_10.getItem()) ||
  466. orderEntity.getOrderBizType().equals(Dict.orderBizType.item_02.getItem())) {
  467. WuliuEntity wuliuEntity = new WuliuEntity();
  468. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  469. .format(orderProcessRecordEntity.getCustomsSuccTime()));
  470. wuliuEntity.setAcceptStation(PrintTicketPropertiesBuilder.instance().getAddress() + "送达" +
  471. storeDao.queryObject(orderEntity.getStoreId()).getStoreAddress() +
  472. ";交易完成,用户已提走");
  473. wuliuEntityList.add(wuliuEntity);
  474. }
  475. if (StringUtils.isNotEmpty(orderEntity.getShippingCode()) &&
  476. StringUtils.isNotEmpty(orderEntity.getShippingNo()) &&
  477. orderProcessRecordEntity.getShipmentStartTime() != null) {
  478. JSONObject traces =
  479. KdniaoUtil.getOrderTracesByJson(orderEntity.getShippingCode(), orderEntity.getShippingNo());
  480. List<Map> mapList = (List<Map>) traces.get("Traces");
  481. if (mapList != null && mapList.size() > 0) {
  482. for (Map map : mapList) {
  483. WuliuEntity wuliuEntity = new WuliuEntity();
  484. wuliuEntity.setAcceptTime(map.get("AcceptTime").toString());
  485. wuliuEntity.setAcceptStation(map.get("AcceptStation").toString());
  486. wuliuEntityList.add(wuliuEntity);
  487. }
  488. }
  489. String state = traces.get("State") + "";
  490. if (Dict.logisticsStatus.item_0.getItem().equals(state) && traces.getBoolean("Success")) {
  491. String reason = traces.get("Reason") + "";
  492. WuliuEntity wuliuEntity = new WuliuEntity();
  493. wuliuEntity.setAcceptStation(reason);
  494. wuliuEntityList.add(wuliuEntity);
  495. }
  496. }
  497. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsCustomsSend()) &&
  498. orderProcessRecordEntity.getShipmentStartTime() != null) {
  499. WuliuEntity wuliuEntity = new WuliuEntity();
  500. wuliuEntity.setAcceptStation("订单已出库");
  501. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  502. .format(orderProcessRecordEntity.getShipmentStartTime()));
  503. wuliuEntityList.add(wuliuEntity);
  504. }
  505. if (Dict.isSend.item_1.getItem().equals(orderProcessRecordEntity.getIsCustomsSend())) {
  506. WuliuEntity wuliuEntity = new WuliuEntity();
  507. wuliuEntity.setAcceptStation("订单清关完成,等待仓库发货");
  508. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  509. .format(orderProcessRecordEntity.getCustomsSuccTime()));
  510. wuliuEntityList.add(wuliuEntity);
  511. }
  512. if (Dict.isSend.item_0.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsCustomsSend())) {
  513. WuliuEntity wuliuEntity = new WuliuEntity();
  514. wuliuEntity.setAcceptStation("订单清关失败");
  515. wuliuEntityList.add(wuliuEntity);
  516. }
  517. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsEleOrderSend()) &&
  518. orderProcessRecordEntity.getWaybillSuccTime() != null) {
  519. WuliuEntity wuliuEntity = new WuliuEntity();
  520. wuliuEntity.setAcceptStation("海关三单发送成功");
  521. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  522. .format(orderProcessRecordEntity.getWaybillSuccTime()));
  523. wuliuEntityList.add(wuliuEntity);
  524. }
  525. if (Dict.isSend.item_1.getItem().equals(orderProcessRecordEntity.getIsPaymentSend())) {
  526. WuliuEntity wuliuEntity = new WuliuEntity();
  527. wuliuEntity.setAcceptStation("订单支付成功");
  528. wuliuEntity.setAcceptTime(
  529. new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(orderProcessRecordEntity.getPaySuccTime()));
  530. wuliuEntityList.add(wuliuEntity);
  531. }
  532. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(orderProcessRecordEntity.getIsAddOrderSend())) {
  533. WuliuEntity wuliuEntity = new WuliuEntity();
  534. wuliuEntity.setAcceptStation("订单下单成功");
  535. wuliuEntity.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  536. .format(orderProcessRecordEntity.getAddOrderSuccTime()));
  537. wuliuEntityList.add(wuliuEntity);
  538. }
  539. }
  540. logisticsInfo.put("tracesList", wuliuEntityList);
  541. logisticsInfo.put("logisticCode", orderEntity.getShippingNo());
  542. logisticsInfo.put("shipperCode", orderEntity.getShippingCode());
  543. return logisticsInfo;
  544. }
  545. @Override
  546. public OrderEntity queryInfos(Long id) {
  547. OrderEntity orderEntity = orderDao.queryObject(id);
  548. Map<String, Object> map = new HashMap<String, Object>();
  549. map.put("orderId", id);
  550. List<OrderGoodsEntity> orderGoodsEntityList = orderGoodsDao.queryList(map);
  551. orderEntity.setOrderGoodsEntityList(orderGoodsEntityList);
  552. return orderEntity;
  553. }
  554. /**
  555. * 普货商品生成线下订单
  556. * @param offlineCartList
  557. * @param user
  558. * @return
  559. */
  560. @Transactional
  561. @Override
  562. public Map orderSubmit(List<OfflineCartEntity> offlineCartList, SysUserEntity user) {
  563. Map resultObj = Maps.newHashMap();
  564. try {
  565. if (user == null) {
  566. resultObj.put("errno", 400);
  567. resultObj.put("errmsg", "用户登录超时,请重新登录");
  568. return resultObj;
  569. }
  570. if (!user.getRoleType().equalsIgnoreCase("2")) {
  571. resultObj.put("errno", 400);
  572. resultObj.put("errmsg", "该操作只允许店员账户操作");
  573. return resultObj;
  574. }
  575. if (org.apache.commons.lang3.StringUtils.isEmpty(user.getMerchSn())) {
  576. resultObj.put("errno", 400);
  577. resultObj.put("errmsg", "操作用户的商户编号为空,请先维护用户商户编号信息再来操作");
  578. return resultObj;
  579. }
  580. Long userId = user.getUserId();
  581. Integer storeId = user.getStoreId();
  582. //获取要购买的商品
  583. Map param = Maps.newHashMap();
  584. param.put("userId", userId);
  585. param.put("storeId", storeId);
  586. if (null == offlineCartList && offlineCartList.size() == 0) {
  587. resultObj.put("errno", 400);
  588. resultObj.put("errmsg", "购买商品数据为空");
  589. return resultObj;
  590. }
  591. List<OfflineCartEntity> offlineCartEntityList = offlineCartDao.queryOfflineCartByBizType(param);
  592. if (offlineCartEntityList.size() == 0 && offlineCartList.size() > 0) {
  593. resultObj.put("errno", 0);
  594. resultObj.put("errmsg", "该单已下单成功,请重新扫描商品进行购买");
  595. return resultObj;
  596. }
  597. // 检查库存和更新库存
  598. for (OfflineCartEntity cartEntity : offlineCartEntityList) {
  599. if (goodsDao.queryObject(cartEntity.getGoodsId()) == null) {
  600. resultObj.put("errno", 400);
  601. resultObj.put("errmsg", "订单提交失败:商品不存在");
  602. return resultObj;
  603. }
  604. //取得规格的信息,判断规格库存
  605. ProductStoreRelaEntity productInfo = productStoreRelaDao
  606. .queryByGoodsIdAndStoreId(Long.valueOf(storeId), Long.valueOf(cartEntity.getGoodsId()));
  607. synchronized (productInfo) {
  608. if (null == productInfo || null == productInfo.getStockNum() ||
  609. productInfo.getStockNum() < cartEntity.getNumber()) {
  610. resultObj.put("errno", 400);
  611. resultObj.put("errmsg", "库存不足,仅剩余" + productInfo.getStockNum());
  612. return resultObj;
  613. } else {
  614. productInfo.setStockNum(productInfo.getStockNum() - cartEntity.getNumber());
  615. productInfo.setStoreId(Long.valueOf(storeId));
  616. productInfo.addSellVolume();
  617. productStoreRelaDao.updateStockNum(productInfo);
  618. }
  619. }
  620. }
  621. String merchOrderSn = "EMATO" + CommonUtil.generateOrderNumber();
  622. OrderEntity order = setOrderVo(user, offlineCartEntityList, user.getMerchSn());
  623. order.setStoreId(storeId);
  624. order.setMerchOrderSn(merchOrderSn);
  625. //开启事务,插入订单信息和订单商品
  626. if (order != null) {
  627. orderDao.save(order);
  628. if (null == order.getId()) {
  629. resultObj.put("errno", 400);
  630. resultObj.put("errmsg", "订单提交失败");
  631. return resultObj;
  632. }
  633. for (OfflineCartEntity cartEntity : offlineCartEntityList) {
  634. OrderGoodsEntity orderGoodsEntity = setOrderGoodsVo(order, cartEntity);
  635. //新增订单详情
  636. orderGoodsDao.save(orderGoodsEntity);
  637. }
  638. //清空预订单商品临时表
  639. offlineCartDao.deleteByUserId(userId);
  640. Map orderInfoMap = Maps.newHashMap();
  641. orderInfoMap.put("orderInfo", order);
  642. resultObj.put("errno", 0);
  643. resultObj.put("errmsg", "订单提交成功");
  644. resultObj.put("data", orderInfoMap);
  645. }
  646. } catch (Exception e) {
  647. e.printStackTrace();
  648. resultObj.put("errno", 400);
  649. resultObj.put("errmsg", "订单异常");
  650. return resultObj;
  651. }
  652. return resultObj;
  653. }
  654. /**
  655. * 设置订单数据
  656. *
  657. * @param loginUser
  658. * @return
  659. */
  660. public OrderEntity setOrderVo(SysUserEntity loginUser, List<OfflineCartEntity> offlineCartEntityList,
  661. String merchSn) {
  662. OrderEntity orderInfo = new OrderEntity();
  663. BigDecimal freightPrice = new BigDecimal(0.00);
  664. BigDecimal goodsTotalPrice = new BigDecimal(0.00);
  665. for (OfflineCartEntity offlineCartEntity : offlineCartEntityList) {
  666. goodsTotalPrice = goodsTotalPrice
  667. .add(offlineCartEntity.getRetailPrice().multiply(new BigDecimal(offlineCartEntity.getNumber())));
  668. }
  669. //订单价格计算:订单的总价+运费
  670. BigDecimal orderTotalPrice = goodsTotalPrice.add(freightPrice);
  671. //查询未使用的优惠券
  672. /*String couponName = "";
  673. BigDecimal fullCutCouponDec = Constant.ZERO;
  674. UserCouponVo couponVo = null;*/
  675. BigDecimal couponPrice = new BigDecimal(0.00);
  676. //减去其它支付的金额后,要实际支付的金额 订单的总价+运费-优惠券金额
  677. BigDecimal actualPrice = orderTotalPrice.subtract(couponPrice);
  678. //商户(拼音首字母)+业务类型+编号
  679. // String merchSn = OmsMerchPropertiesBuilder.instance().getMerchSn();
  680. // String merchShortName = OmsMerchPropertiesBuilder.instance().getMerchShortName();
  681. MerchEntity merchEntity = merchDao.findByMerchSn(merchSn);
  682. String merchShortName = "";
  683. if (merchEntity != null) {
  684. merchShortName = merchEntity.getMerchShortName();
  685. }
  686. String orderSn = merchShortName + Dict.orderBizType.item_11.getItem() + CommonUtil.generateOrderNumber();
  687. orderInfo.setOrderSn(orderSn);
  688. orderInfo.setMerchSn(merchSn);
  689. orderInfo.setUserId(Integer.parseInt(loginUser.getUserId() + ""));
  690. orderInfo.setFreightPrice(freightPrice.intValue());
  691. orderInfo.setOrderBizType(Dict.orderBizType.item_11.getItem());
  692. /*orderInfo.setCoupon_id(userCouponId);
  693. orderInfo.setCoupon_name(couponName);*/
  694. // orderInfo.setFullCutPrice(fullCutCouponDec);//使用的优惠券
  695. orderInfo.setCouponPrice(couponPrice);
  696. orderInfo.setPostscript("");//留言
  697. orderInfo.setAddTime(new Date());
  698. orderInfo.setGoodsPrice(goodsTotalPrice);
  699. orderInfo.setOrderPrice(orderTotalPrice);
  700. orderInfo.setActualPrice(actualPrice);
  701. orderInfo.setOrderType("1");
  702. orderInfo.setOrderStatus(0);// 待付款
  703. orderInfo.setShippingStatus(0);
  704. orderInfo.setPayStatus(0);
  705. orderInfo.setShippingId(0L);
  706. orderInfo.setShippingFee(Constant.ZERO);
  707. orderInfo.setIntegral(0);
  708. orderInfo.setIntegralMoney(Constant.ZERO);
  709. orderInfo.setCreateTime(new Date());
  710. orderInfo.setModTime(new Date());
  711. orderInfo.setIsOnfflineOrder(Dict.isOnfflineOrder.item_1.getItem());//线下购买
  712. /*//标记该订单已使用优惠券
  713. if(couponVo != null){
  714. couponVo.setUsed_time(new Date());
  715. couponVo.setIsUsed(Dict.isUsed.item_1.getItem());
  716. apiUserCouponMapper.update(couponVo);
  717. }*/
  718. return orderInfo;
  719. }
  720. public OrderGoodsEntity setOrderGoodsVo(OrderEntity orderInfo, OfflineCartEntity goodsItem) {
  721. GoodsEntity goodsVo = goodsDao.queryObject(goodsItem.getGoodsId());
  722. OrderGoodsEntity orderGoodsVo = new OrderGoodsEntity();
  723. orderGoodsVo.setOrderId(Integer.parseInt(orderInfo.getId() + ""));
  724. orderGoodsVo.setGoodsId(goodsItem.getGoodsId());
  725. orderGoodsVo.setGoodsSn(goodsItem.getGoodsSn());
  726. orderGoodsVo.setProductId(goodsItem.getProductId());
  727. orderGoodsVo.setGoodsName(goodsItem.getGoodsName());
  728. orderGoodsVo.setListPicUrl(goodsItem.getListPicUrl());
  729. orderGoodsVo.setMarketPrice(goodsItem.getMarketPrice());
  730. orderGoodsVo.setRetailPrice(goodsItem.getRetailPrice());
  731. orderGoodsVo.setNumber(goodsItem.getNumber());
  732. orderGoodsVo.setOrderBizType(Dict.orderBizType.item_11.getItem());
  733. orderGoodsVo.setCreateTime(new Date());
  734. orderGoodsVo.setModTime(new Date());
  735. orderGoodsVo.setGoodsRate(goodsVo.getGoodsRate());
  736. orderGoodsVo.setSku(goodsVo.getSku());
  737. return orderGoodsVo;
  738. }
  739. @Override
  740. public OrderEntity queryObjectBySysUser(Long id) {
  741. OrderEntity orderEntity = orderDao.queryObjectBySysUser(id);
  742. Map<String, Object> map = new HashMap<String, Object>();
  743. map.put("orderId", id);
  744. List<OrderGoodsEntity> orderGoodsEntityList = orderGoodsDao.queryList(map);
  745. orderEntity.setOrderGoodsEntityList(orderGoodsEntityList);
  746. return orderEntity;
  747. }
  748. @Override
  749. public int confirmPay(Long id, String payFlag,String orderSnWx) {
  750. SysUserEntity user = ShiroUtils.getUserEntity();
  751. if (user == null) {
  752. throw new RRException("用户登录超时,请重新登录");
  753. }
  754. if (!user.getRoleType().equalsIgnoreCase("2")) {
  755. throw new RRException("该操作只允许店员账户操作");
  756. }
  757. OrderEntity orderEntity = queryObject(id);
  758. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  759. throw new RRException("此订单已付款!");
  760. }
  761. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_301.getItem())) {
  762. throw new RRException("此订单已完成!");
  763. }
  764. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_101.getItem())) {
  765. throw new RRException("此订单已取消!");
  766. }
  767. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_102.getItem())) {
  768. throw new RRException("此订单已删除!");
  769. }
  770. orderEntity.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_201.getItem()));
  771. orderEntity.setPayStatus(Integer.parseInt(Dict.payStatus.item_2.getItem()));
  772. orderEntity.setPayFlag(payFlag);
  773. orderEntity.setPayTime(new Date());
  774. if(orderSnWx != null){
  775. orderEntity.setOrderSnWx(orderSnWx);
  776. }
  777. orderDao.update(orderEntity);
  778. return 0;
  779. }
  780. @Override
  781. public List<OrderEntity> queryExportList(Map<String, Object> map) {
  782. List<OrderEntity> list = orderDao.queryExportList(map);
  783. for (OrderEntity order : list) {
  784. OrderProcessRecordEntity orderProcessRecord = orderProcessRecordDao.queryObjectByOrderSn(order.getOrderSn());
  785. order.setOrderProcessRecord(orderProcessRecord);
  786. }
  787. return list;
  788. }
  789. @Override
  790. public List<OrderEntity> queryOffilineOrderList(Map<String, Object> map) {
  791. return orderDao.queryOffilineOrderList(map);
  792. }
  793. }