ApiOrderController.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. package com.kmall.api.api;
  2. import com.alibaba.druid.util.StringUtils;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.google.common.collect.Maps;
  5. import com.kmall.api.annotation.IgnoreAuth;
  6. import com.kmall.api.annotation.LoginUser;
  7. import com.kmall.api.contants.Dict;
  8. import com.kmall.api.dao.ApiOrderRefundMapper;
  9. import com.kmall.api.entity.*;
  10. import com.kmall.api.service.*;
  11. import com.kmall.api.service.express.kdn.ApiKdniaoService;
  12. import com.kmall.api.util.ApiBaseAction;
  13. import com.kmall.api.util.ApiPageUtils;
  14. import com.kmall.common.utils.Constant;
  15. import com.kmall.common.utils.DateUtils;
  16. import com.kmall.common.utils.Query;
  17. import com.kmall.common.utils.wechat.WechatRefundApiResult;
  18. import com.kmall.common.utils.wechat.WechatUtil;
  19. import io.swagger.models.auth.In;
  20. import org.apache.commons.collections.MapUtils;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.web.bind.annotation.*;
  23. import java.math.BigDecimal;
  24. import java.text.SimpleDateFormat;
  25. import java.util.*;
  26. /**
  27. * 作者: @author Scott <br>
  28. * 时间: 2017-08-11 08:32<br>
  29. * 描述: ApiIndexController <br>
  30. */
  31. @RestController
  32. @RequestMapping("/api/order")
  33. public class ApiOrderController extends ApiBaseAction {
  34. @Autowired
  35. private ApiOrderService orderService;
  36. @Autowired
  37. private ApiOrderGoodsService orderGoodsService;
  38. @Autowired
  39. private ApiKD100Service apiKD100Service;
  40. @Autowired
  41. private ApiKdniaoService apiKdniaoService;
  42. @Autowired
  43. private ApiAddressService apiAddressService;
  44. @Autowired
  45. private ApiCommentService apiCommentService;
  46. @Autowired
  47. private ApiOrderProcessRecordService orderProcessRecordService;
  48. @Autowired
  49. private ApiOrderRefundService apiOrderRefundService;
  50. /**
  51. */
  52. @IgnoreAuth
  53. @GetMapping("index")
  54. public Object index(@LoginUser UserVo loginUser) {
  55. //
  56. return toResponsSuccess("");
  57. }
  58. /**
  59. * 获取订单列表
  60. */
  61. @GetMapping("list")
  62. public Object list(@LoginUser UserVo loginUser,
  63. @RequestParam(value = "page", defaultValue = "1") Integer page,
  64. @RequestParam(value = "size", defaultValue = "10") Integer size,
  65. Integer evaluate_status, Integer order_status) {
  66. //
  67. Map params = new HashMap();
  68. params.put("user_id", loginUser.getId());
  69. params.put("page", page);
  70. params.put("order_status", order_status);
  71. params.put("evaluate_status", evaluate_status);
  72. params.put("limit", size);
  73. params.put("sidx", "add_time");
  74. params.put("order", "desc");
  75. params.put("size", "desc");
  76. //查询列表数据
  77. Query query = new Query(params);
  78. List<OrderVo> orderEntityList = orderService.queryList(query);
  79. int total = orderService.queryTotal(query);
  80. //
  81. for (OrderVo item : orderEntityList) {
  82. Map orderGoodsParam = new HashMap();
  83. orderGoodsParam.put("order_id", item.getId());
  84. if(item.getRefundStatus() !=null){
  85. if(item.getRefundStatus().equalsIgnoreCase(Dict.RefundStatus.item_1.getItem()) ||
  86. item.getRefundStatus().equalsIgnoreCase(Dict.RefundStatus.item_2.getItem())){
  87. item.setIsRefundStatus(true);
  88. }else{
  89. item.setIsRefundStatus(false);
  90. }
  91. }else{
  92. item.setIsRefundStatus(false);
  93. }
  94. //订单的商品
  95. List<OrderGoodsVo> goodsList = orderGoodsService.queryList(orderGoodsParam);
  96. Integer goodsCount = 0;
  97. for (OrderGoodsVo orderGoodsEntity : goodsList) {
  98. goodsCount += orderGoodsEntity.getNumber();
  99. item.setGoodsCount(goodsCount);
  100. }
  101. item.setGoodsList(goodsList);
  102. }
  103. ApiPageUtils pageUtil = new ApiPageUtils(orderEntityList, total, query.getLimit(), query.getPage());
  104. return toResponsSuccess(pageUtil);
  105. }
  106. /**
  107. * 获取订单详情
  108. */
  109. @GetMapping("detail")
  110. public Object detail(@LoginUser UserVo loginUser, Long orderId) {
  111. Map resultObj = new HashMap();
  112. //
  113. OrderVo orderInfo = orderService.queryObject(orderId);
  114. if (null == orderInfo) {
  115. return toResponsObject(400, "订单不存在", "");
  116. }
  117. Map orderGoodsParam = new HashMap();
  118. orderGoodsParam.put("order_id", orderId);
  119. //订单的商品
  120. List<OrderGoodsVo> orderGoods = orderGoodsService.queryList(orderGoodsParam);
  121. //订单可操作的选择,删除,支付,收货,评论,退换货
  122. Map handleOption = orderInfo.getHandleOption();
  123. resultObj.put("orderInfo", orderInfo);
  124. resultObj.put("orderGoods", orderGoods);
  125. resultObj.put("handleOption", handleOption);
  126. //查询物流轨迹
  127. List<Map> mapList = new ArrayList<>();
  128. OrderProcessRecordEntity entity = orderProcessRecordService.queryObjectByOrderSn(orderInfo.getOrder_sn());
  129. if (entity != null) {
  130. if((orderInfo.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_10.getItem()) ||
  131. orderInfo.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_02.getItem()))){
  132. Map map = new HashMap();
  133. map.put("AcceptStation", "交易完成,用户已提走");
  134. mapList.add(map);
  135. }else{
  136. if (!StringUtils.isEmpty(orderInfo.getShipping_code()) && !StringUtils.isEmpty(orderInfo.getShipping_no()) &&entity.getShipmentSuccTime()!=null) {
  137. JSONObject Traces = apiKdniaoService.getOrderTracesByJson(orderInfo.getShipping_code(), orderInfo.getShipping_no());
  138. if (Traces != null) {
  139. mapList = (List<Map>) Traces.get("Traces");
  140. String State = (String) Traces.get("State"); //物流状态:2-在途中,3-签收,4-问题件
  141. if (Dict.logisticsStatus.item_0.getItem().equalsIgnoreCase(State)) {
  142. Map noDataMap = new HashMap();
  143. noDataMap.put("AcceptTime", "");
  144. noDataMap.put("AcceptStation", Traces.get("Reason"));
  145. mapList.add(noDataMap);
  146. }
  147. }
  148. }
  149. }
  150. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(entity.getIsCustomsSend()) && entity.getShipmentSuccTime() != null) {
  151. Map map = new HashMap();
  152. map.put("AcceptTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(entity.getShipmentSuccTime()));
  153. map.put("AcceptStation", "订单已出库");
  154. mapList.add(map);
  155. }
  156. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(entity.getIsCustomsSend()) && entity.getShipmentStartTime() != null) {
  157. Map map = new HashMap();
  158. map.put("AcceptTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(entity.getShipmentStartTime()));
  159. map.put("AcceptStation", "订单正在打包中");
  160. mapList.add(map);
  161. }
  162. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(entity.getIsCustomsSend())) {
  163. Map map = new HashMap();
  164. map.put("AcceptTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(entity.getCustomsSuccTime()));
  165. map.put("AcceptStation", "订单清关完成,等待仓库发货");
  166. mapList.add(map);
  167. }
  168. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(entity.getIsPaymentSend())) {
  169. Map map = new HashMap();
  170. map.put("AcceptTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(entity.getPaySuccTime()));
  171. map.put("AcceptStation", "订单支付成功,等待海关清关");
  172. mapList.add(map);
  173. }
  174. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(entity.getIsAddOrderSend())) {
  175. Map map = new HashMap();
  176. map.put("AcceptTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(entity.getAddOrderSuccTime()));
  177. map.put("AcceptStation", "订单提交成功");
  178. mapList.add(map);
  179. }
  180. }
  181. resultObj.put("wuliu", mapList != null && mapList.size() > 0 ? mapList.get(0) : null);
  182. if(orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_401.getItem()) || orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_402.getItem()) ) {
  183. MallOrderRefund refundInfo = apiOrderRefundService.queryObjectByOrderId(String.valueOf(orderInfo.getId()));
  184. resultObj.put("refundInfo", refundInfo);
  185. }
  186. return toResponsSuccess(resultObj);
  187. }
  188. @GetMapping("detailList")
  189. public Object detailList(@LoginUser UserVo loginUser, Long[] orderIds,Integer status) {
  190. List<Long> orderIdList=new ArrayList<>();
  191. for(int i=0;i<orderIds.length;i++){
  192. orderIdList.add(orderIds[i]);
  193. }
  194. Map resultObj = new HashMap();
  195. List<OrderVo> orderVoList = orderService.queryObjectByIdList(orderIdList);
  196. BigDecimal actualPrice = Constant.ZERO;
  197. for (OrderVo orderInfo:orderVoList) {
  198. if (null == orderInfo) {
  199. return toResponsObject(400, "订单号为"+orderInfo.getOrder_sn()+"的订单不存在", "");
  200. }
  201. actualPrice = actualPrice.add(orderInfo.getActual_price());
  202. if (status == 0) {
  203. OrderVo orderVo = new OrderVo();
  204. orderVo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_0.getItem()));
  205. orderVo.setPay_status(Integer.parseInt(Dict.payStatus.item_0.getItem()));
  206. orderVo.setId(orderInfo.getId());
  207. orderService.update(orderVo);
  208. }
  209. }
  210. //订单的商品
  211. List<OrderGoodsVo> orderGoods = orderGoodsService.queryListByIds(orderIdList);
  212. resultObj.put("actualPrice", actualPrice);
  213. resultObj.put("orderGoods", orderGoods);
  214. return toResponsSuccess(resultObj);
  215. }
  216. /**
  217. * 获取订单列表
  218. */
  219. @PostMapping("submit")
  220. public Object submit(@LoginUser UserVo loginUser) {
  221. Map resultObj = null;
  222. try {
  223. resultObj = orderService.submit(getJsonRequest(), loginUser, getStoreId());
  224. if (null != resultObj) {
  225. return toResponsObject(MapUtils.getInteger(resultObj, "errno"), MapUtils.getString(resultObj, "errmsg"), resultObj.get("data"));
  226. }
  227. } catch (Exception e) {
  228. e.printStackTrace();
  229. }
  230. return toResponsFail("提交失败");
  231. }
  232. /**
  233. * 取消订单
  234. */
  235. @GetMapping("cancelOrder")
  236. public Object cancelOrder(@LoginUser UserVo loginUser, Long orderId) {
  237. try {
  238. OrderVo orderVo = orderService.queryObject(orderId);
  239. if (orderVo.getOrder_status() == 300) {
  240. return toResponsFail("已发货,不能取消");
  241. } else if (orderVo.getOrder_status() == 301) {
  242. return toResponsFail("已收货,不能取消");
  243. } else if (orderVo.getOrder_status() == 101 || orderVo.getOrder_status() == 401 || orderVo.getOrder_status() == 402) {
  244. return toResponsFail("当前订单不能取消");
  245. }
  246. // 需要退款
  247. if (orderVo.getPay_status() == 2) {
  248. WechatRefundApiResult result = WechatUtil.wxRefund(orderVo.getMerchOrderSn().toString(),
  249. orderVo.getActual_price().doubleValue(), orderVo.getActual_price().doubleValue());
  250. if (result.getResult_code().equals("SUCCESS")) {
  251. if (orderVo.getOrder_status() == 201) {
  252. orderVo.setOrder_status(401);
  253. } else if (orderVo.getOrder_status() == 300) {
  254. orderVo.setOrder_status(402);
  255. }
  256. orderVo.setPay_status(4);
  257. orderService.cancelOrder(orderVo);
  258. return toResponsMsgSuccess("取消成功");
  259. } else {
  260. return toResponsFail("取消失败");
  261. }
  262. } else {
  263. orderVo.setOrder_status(101);
  264. orderService.cancelOrder(orderVo);
  265. return toResponsSuccess("取消成功");
  266. }
  267. } catch (Exception e) {
  268. e.printStackTrace();
  269. }
  270. return toResponsFail("提交失败");
  271. }
  272. /**
  273. * 确认收货
  274. */
  275. @GetMapping("confirmOrder")
  276. public Object confirmOrder(@LoginUser UserVo loginUser, Long orderId) {
  277. try {
  278. if (null == orderId) {
  279. JSONObject params = getJsonRequest();
  280. orderId = params.getLong("orderId");
  281. }
  282. orderService.confirmOrder(orderId);
  283. return toResponsSuccess("取消成功");
  284. } catch (Exception e) {
  285. e.printStackTrace();
  286. }
  287. return toResponsFail("提交失败");
  288. }
  289. /**
  290. * 跟踪快递轨迹
  291. */
  292. @GetMapping("getLogistics")
  293. public Object getLogistics(Long orderId) {
  294. Map resultObj = new HashMap();
  295. Map map = new HashMap();
  296. OrderVo orderInfo = orderService.queryObject(orderId);
  297. if (null == orderInfo) {
  298. return toResponsObject(400, "订单不存在", "");
  299. }
  300. List<WuliuVo> wuliuList = new ArrayList<WuliuVo>();
  301. OrderProcessRecordEntity entity = orderProcessRecordService.queryObjectByOrderSn(orderInfo.getOrder_sn());
  302. if(entity !=null){
  303. if(orderInfo.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_10.getItem())
  304. || orderInfo.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_02.getItem())){
  305. WuliuVo vo = new WuliuVo();
  306. vo.setAcceptStation("交易完成,用户已提走");
  307. wuliuList.add(vo);
  308. }else {
  309. if (!StringUtils.isEmpty(orderInfo.getShipping_code()) && !StringUtils.isEmpty(orderInfo.getShipping_no()) && entity.getShipmentSuccTime() != null) {
  310. // 快递
  311. JSONObject Traces = apiKdniaoService.getOrderTracesByJson(orderInfo.getShipping_code(), orderInfo.getShipping_no());
  312. List<Map> mapList = (List<Map>) Traces.get("Traces");
  313. for (int i = 0; i < mapList.size(); i++) {
  314. WuliuVo vo = new WuliuVo();
  315. vo.setAcceptTime((String) mapList.get(i).get("AcceptTime"));
  316. vo.setAcceptStation((String) mapList.get(i).get("AcceptStation"));
  317. wuliuList.add(vo);
  318. }
  319. String State = (String) Traces.get("State"); //物流状态:2-在途中,3-签收,4-问题件
  320. String Reason = (String) Traces.get("Reason");
  321. if (Dict.logisticsStatus.item_0.getItem().equalsIgnoreCase(State)) {
  322. WuliuVo wuliuVo = new WuliuVo();
  323. wuliuVo.setAcceptStation(Reason);
  324. wuliuList.add(wuliuVo);
  325. }
  326. map.put("State", Traces.get("State")); //物流状态:2-在途中,3-签收,4-问题件
  327. map.put("Reason", Traces.get("Reason"));
  328. }
  329. }
  330. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(entity.getIsCustomsSend()) && entity.getShipmentSuccTime() != null) {
  331. WuliuVo wuliuVo = new WuliuVo();
  332. wuliuVo.setAcceptStation("订单已出库");
  333. wuliuVo.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(entity.getShipmentSuccTime()));
  334. wuliuList.add(wuliuVo);
  335. }
  336. if (Dict.isSend.item_1.getItem().equalsIgnoreCase(entity.getIsCustomsSend()) && entity.getShipmentStartTime() != null) {
  337. WuliuVo wuliuVo = new WuliuVo();
  338. wuliuVo.setAcceptStation("订单正在打包中");
  339. wuliuVo.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(entity.getShipmentStartTime()));
  340. wuliuList.add(wuliuVo);
  341. }
  342. if(Dict.isSend.item_1.getItem().equalsIgnoreCase(entity.getIsCustomsSend())){
  343. WuliuVo wuliuVo = new WuliuVo();
  344. wuliuVo.setAcceptStation("订单清关完成,等待仓库发货");
  345. wuliuVo.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(entity.getCustomsSuccTime()));
  346. wuliuList.add(wuliuVo);
  347. }
  348. if(Dict.isSend.item_1.getItem().equalsIgnoreCase(entity.getIsPaymentSend())){
  349. WuliuVo wuliuVo = new WuliuVo();
  350. wuliuVo.setAcceptStation("订单支付成功,等待海关清关");
  351. wuliuVo.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(entity.getPaySuccTime()));
  352. wuliuList.add(wuliuVo);
  353. }
  354. if(Dict.isSend.item_1.getItem().equalsIgnoreCase(entity.getIsAddOrderSend())){
  355. WuliuVo wuliuVo = new WuliuVo();
  356. wuliuVo.setAcceptStation("订单提交成功");
  357. wuliuVo.setAcceptTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(entity.getAddOrderSuccTime()));
  358. wuliuList.add(wuliuVo);
  359. }
  360. }
  361. map.put("TracesList",wuliuList);
  362. map.put("LogisticCode", orderInfo.getShipping_no());
  363. map.put("ShipperCode", orderInfo.getShipping_code());
  364. resultObj.put("wuliu", map);
  365. return toResponsSuccess(resultObj);
  366. }
  367. /**
  368. * 申请退款
  369. * @param loginUser
  370. * @return
  371. */
  372. @PostMapping("saveApplyRefund")
  373. public Object saveApplyRefund(@LoginUser UserVo loginUser) {
  374. try {
  375. JSONObject json = getJsonRequest();
  376. String orderId = json.getString("orderId");
  377. String merchOrderSn = json.getString("merchOrderSn");
  378. String refundReason = json.getString("refundReason");
  379. List<OrderVo> list = orderService.queryObjectByMerchOrderSn(merchOrderSn);
  380. OrderVo orderInfo = null;
  381. if(list!=null && list.size()>0){
  382. for (OrderVo vo: list) {
  383. if(Long.valueOf(orderId).equals(vo.getId())){
  384. orderInfo = vo;
  385. }
  386. }
  387. }
  388. if (null == orderInfo) {
  389. return toResponsObject(400, "订单不存在", "");
  390. }
  391. // OrderVo orderVo = new OrderVo();
  392. // orderVo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_400.getItem()));
  393. // orderVo.setId(orderInfo.getId());
  394. // orderService.update(orderVo);//修改状态为维权申请中
  395. MallOrderRefund mallOrderRefund = apiOrderRefundService.queryObjectByOrderId(orderInfo.getId()+"");
  396. MallOrderRefund orderRefund = new MallOrderRefund();
  397. orderRefund.setOrderId(Integer.parseInt(orderId));
  398. orderRefund.setUserId(Integer.parseInt(orderInfo.getUser_id()+""));
  399. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_1.getItem()));
  400. orderRefund.setRefundReason(refundReason);
  401. orderRefund.setModTime(new Date());
  402. if(list.size()>1){//多条订单
  403. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
  404. }else{
  405. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
  406. }
  407. orderRefund.setRefundMoney(orderInfo.getActual_price());
  408. if(mallOrderRefund !=null){
  409. if(mallOrderRefund.getRefundStatus() == Integer.parseInt(Dict.RefundStatus.item_2.getItem()) ){
  410. return toResponsFail("该订单已退款成功,请勿重复申请");
  411. }
  412. if(mallOrderRefund.getRefundStatus() == Integer.parseInt(Dict.RefundStatus.item_5.getItem()) ){
  413. return toResponsFail("该订单在退款处理中,请勿重复申请");
  414. }
  415. if(mallOrderRefund.getRefundStatus() == Integer.parseInt(Dict.RefundStatus.item_1.getItem()) ){
  416. return toResponsFail("该订单在退款申请中,请勿重复申请");
  417. }
  418. orderRefund.setId(mallOrderRefund.getId());
  419. apiOrderRefundService.update(orderRefund);
  420. if(mallOrderRefund.getRefundStatus() == Integer.parseInt(Dict.RefundStatus.item_4.getItem()) ||
  421. mallOrderRefund.getRefundStatus() == Integer.parseInt(Dict.RefundStatus.item_3.getItem())){
  422. return toResponsMsgSuccess("重新申请订单成功");
  423. }
  424. }else{
  425. orderRefund.setCreateTime(new Date());
  426. apiOrderRefundService.save(orderRefund);
  427. }
  428. return toResponsMsgSuccess("退款申请成功");
  429. } catch (Exception e) {
  430. e.printStackTrace();
  431. }
  432. return toResponsFail("提交失败");
  433. }
  434. }