OrderServiceImpl.java 60 KB

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