OrderController.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  1. package com.kmall.admin.controller;
  2. import com.google.common.collect.Lists;
  3. import com.google.common.collect.Maps;
  4. import com.kmall.admin.entity.*;
  5. import com.kmall.admin.service.*;
  6. import com.kmall.admin.service.OrderExceptionRecordService;
  7. import com.kmall.admin.service.OrderProcessRecordService;
  8. import com.kmall.admin.service.OrderService;
  9. import com.kmall.admin.utils.ParamUtils;
  10. import com.kmall.common.constant.Dict;
  11. import com.kmall.common.entity.SysUserEntity;
  12. import com.kmall.common.utils.*;
  13. import com.kmall.common.utils.excel.ExcelExport;
  14. import com.kmall.common.utils.excel.ExcelUtil;
  15. import com.kmall.common.utils.pingan.PinganUtil;
  16. import com.kmall.common.utils.pingan.dto.PinganResponseDto;
  17. import com.kmall.common.utils.print.ticket.item.Ticket;
  18. import com.kmall.common.utils.wechat.WechatMicropayApiResult;
  19. import com.kmall.common.utils.wechat.WechatRefundApiResult;
  20. import com.kmall.common.utils.wechat.WechatReverseApiResult;
  21. import com.kmall.common.utils.wechat.WechatUtil;
  22. import com.kmall.common.utils.wechat.wxglobal.WechatGlobalUtil;
  23. import com.kmall.common.utils.wechat.wxglobal.dto.WechatGlobalRefundApiResult;
  24. import net.sf.json.JSONObject;
  25. import org.apache.commons.lang3.StringUtils;
  26. import org.apache.commons.logging.Log;
  27. import org.apache.commons.logging.LogFactory;
  28. import org.apache.shiro.authz.annotation.RequiresPermissions;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.web.bind.annotation.*;
  31. import javax.servlet.http.HttpServletRequest;
  32. import javax.servlet.http.HttpServletResponse;
  33. import java.io.IOException;
  34. import java.math.BigDecimal;
  35. import java.text.ParseException;
  36. import java.text.SimpleDateFormat;
  37. import java.util.*;
  38. /**
  39. * @author Scott
  40. * @email
  41. * @date 2017-08-13 10:41:09
  42. */
  43. @RestController
  44. @RequestMapping("order")
  45. public class OrderController {
  46. private Log logger = LogFactory.getLog(OrderController.class);
  47. @Autowired
  48. private OrderService orderService;
  49. @Autowired
  50. private OrderProcessRecordService orderProcessRecordService;
  51. @Autowired
  52. private OrderRefundService orderRefundService;
  53. @Autowired
  54. private OrderExceptionRecordService orderExceptionRecordService;
  55. @Autowired
  56. private StoreService storeService;
  57. @Autowired
  58. private OrderWXPayRecordService orderWXPayRecordService;
  59. @Autowired
  60. private PinganResponseService pinganResponseService;
  61. /**
  62. * 列表
  63. */
  64. @RequestMapping("/list")
  65. @RequiresPermissions("order:list")
  66. public R list(@RequestParam Map<String, Object> params) {
  67. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", false);
  68. //查询列表数据
  69. Query query = new Query(params);
  70. query.put("isOnfiilineOrder", Dict.isOnfflineOrder.item_0.getItem());
  71. String startTime = (String) params.get("startTime");
  72. String endTime = (String) params.get("endTime");
  73. if(org.apache.commons.lang.StringUtils.isNotEmpty(startTime)) {
  74. try {
  75. startTime = new String(startTime.getBytes("iso-8859-1"), "utf-8");
  76. } catch (Exception e) {
  77. e.printStackTrace();
  78. }
  79. startTime = getDate(startTime);
  80. query.put("startTime", startTime + " 00:00:00");
  81. }
  82. if(org.apache.commons.lang.StringUtils.isNotEmpty(endTime)) {
  83. try {
  84. endTime = new String(endTime.getBytes("iso-8859-1"), "utf-8");
  85. } catch (Exception e) {
  86. e.printStackTrace();
  87. }
  88. endTime = getDate(endTime);
  89. query.put("endTime", endTime + " 59:59:59");
  90. }
  91. List<OrderEntity> orderList = orderService.queryList(query);
  92. int total = orderService.queryTotal(query);
  93. PageUtils pageUtil = new PageUtils(orderList, total, query.getLimit(), query.getPage());
  94. return R.ok().put("page", pageUtil);
  95. }
  96. /**
  97. * 信息
  98. */
  99. @RequestMapping("/info/{id}")
  100. @RequiresPermissions("order:info")
  101. public R info(@PathVariable("id") Long id) {
  102. OrderEntity order = orderService.queryObject(id);
  103. return R.ok().put("order", order);
  104. }
  105. /**
  106. * 信息
  107. */
  108. @RequestMapping("/infos/{id}")
  109. @RequiresPermissions("order:infos")
  110. public R infos(@PathVariable("id") Long id) {
  111. OrderEntity order = orderService.queryInfos(id);
  112. return R.ok().put("order", order);
  113. }
  114. /**
  115. * 保存
  116. */
  117. @RequestMapping("/save")
  118. @RequiresPermissions("order:save")
  119. public R save(@RequestBody OrderEntity order) {
  120. orderService.save(order);
  121. return R.ok();
  122. }
  123. /**
  124. * 修改
  125. */
  126. @RequestMapping("/update")
  127. @RequiresPermissions("order:update")
  128. public R update(@RequestBody OrderEntity order) {
  129. orderService.update(order);
  130. return R.ok();
  131. }
  132. /**
  133. * 删除
  134. */
  135. @RequestMapping("/delete")
  136. @RequiresPermissions("order:delete")
  137. public R delete(@RequestBody Long[] ids) {
  138. orderService.deleteBatch(ids);
  139. return R.ok();
  140. }
  141. /**
  142. * 查看所有列表
  143. */
  144. @RequestMapping("/queryAll")
  145. public R queryAll(@RequestParam Map<String, Object> params) {
  146. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", false);
  147. List<OrderEntity> list = orderService.queryList(params);
  148. return R.ok().put("list", list);
  149. }
  150. /**
  151. * 总计
  152. */
  153. @RequestMapping("/queryTotal")
  154. public R queryTotal(@RequestParam Map<String, Object> params) {
  155. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", false);
  156. int sum = orderService.queryTotal(params);
  157. return R.ok().put("sum", sum);
  158. }
  159. /**
  160. * 确定收货
  161. *
  162. * @param id
  163. * @return
  164. */
  165. @RequestMapping("/confirm")
  166. @RequiresPermissions("order:confirm")
  167. public R confirm(@RequestBody Long id) {
  168. orderService.confirm(id);
  169. return R.ok();
  170. }
  171. /**
  172. * 发货
  173. *
  174. * @param order
  175. * @return
  176. */
  177. @RequestMapping("/sendGoods")
  178. @RequiresPermissions("order:sendGoods")
  179. public R sendGoods(@RequestBody OrderEntity order) {
  180. orderService.sendGoods(order);
  181. return R.ok();
  182. }
  183. /**
  184. * 跟踪快递轨迹
  185. *
  186. * @param id
  187. * @return
  188. */
  189. @RequestMapping("/getLogistics/{id}")
  190. @RequiresPermissions("order:getLogistics")
  191. public R getLogistics(@PathVariable("id") Long id) {
  192. Map result = orderService.getLogistics(id);
  193. return R.ok().put("result", result);
  194. }
  195. /**
  196. * 获取订单清关信息
  197. *
  198. * @param orderSn
  199. * @return
  200. */
  201. @RequestMapping("/getProcess/{orderSn}")
  202. @RequiresPermissions("order:getProcess")
  203. public R getProcess(@PathVariable("orderSn") String orderSn) {
  204. OrderProcessRecordEntity orderProcessRecordEntity = orderProcessRecordService.queryObjectByOrderSn(orderSn);
  205. if (orderProcessRecordEntity != null) {
  206. if (orderProcessRecordEntity.getShipmentStartTime() != null) {
  207. orderProcessRecordEntity.setShipmentStartTimeStr(
  208. DateUtils.format(orderProcessRecordEntity.getShipmentStartTime(), DateUtils.DATE_TIME_PATTERN));
  209. }
  210. if (orderProcessRecordEntity.getShipmentSuccTime() != null) {
  211. orderProcessRecordEntity.setShipmentSuccTimeStr(
  212. DateUtils.format(orderProcessRecordEntity.getShipmentSuccTime(), DateUtils.DATE_TIME_PATTERN));
  213. }
  214. if (orderProcessRecordEntity.getCustomsStartTime() != null) {
  215. orderProcessRecordEntity.setCustomsStartTimeStr(
  216. DateUtils.format(orderProcessRecordEntity.getCustomsStartTime(), DateUtils.DATE_TIME_PATTERN));
  217. }
  218. if (orderProcessRecordEntity.getCustomsSuccTime() != null) {
  219. orderProcessRecordEntity.setCustomsSuccTimeStr(
  220. DateUtils.format(orderProcessRecordEntity.getCustomsSuccTime(), DateUtils.DATE_TIME_PATTERN));
  221. }
  222. if (orderProcessRecordEntity.getWaybillStartTime() != null) {
  223. orderProcessRecordEntity.setWaybillStartTimeStr(
  224. DateUtils.format(orderProcessRecordEntity.getWaybillStartTime(), DateUtils.DATE_TIME_PATTERN));
  225. }
  226. if (orderProcessRecordEntity.getWaybillSuccTime() != null) {
  227. orderProcessRecordEntity.setWaybillSuccTimeStr(
  228. DateUtils.format(orderProcessRecordEntity.getWaybillSuccTime(), DateUtils.DATE_TIME_PATTERN));
  229. }
  230. if (orderProcessRecordEntity.getEleOrderStartTime() != null) {
  231. orderProcessRecordEntity.setEleOrderStartTimeStr(
  232. DateUtils.format(orderProcessRecordEntity.getEleOrderStartTime(), DateUtils.DATE_TIME_PATTERN));
  233. }
  234. if (orderProcessRecordEntity.getEleOrderSuccTime() != null) {
  235. orderProcessRecordEntity.setEleOrderSuccTimeStr(
  236. DateUtils.format(orderProcessRecordEntity.getEleOrderSuccTime(), DateUtils.DATE_TIME_PATTERN));
  237. }
  238. if (orderProcessRecordEntity.getAddOrderStartTime() != null) {
  239. orderProcessRecordEntity.setAddOrderStartTimeStr(
  240. DateUtils.format(orderProcessRecordEntity.getAddOrderStartTime(), DateUtils.DATE_TIME_PATTERN));
  241. }
  242. if (orderProcessRecordEntity.getAddOrderSuccTime() != null) {
  243. orderProcessRecordEntity.setAddOrderSuccTimeStr(
  244. DateUtils.format(orderProcessRecordEntity.getAddOrderSuccTime(), DateUtils.DATE_TIME_PATTERN));
  245. }
  246. if (orderProcessRecordEntity.getPaySuccTime() != null) {
  247. orderProcessRecordEntity.setPaySuccTimeStr(
  248. DateUtils.format(orderProcessRecordEntity.getPaySuccTime(), DateUtils.DATE_TIME_PATTERN));
  249. }
  250. if (orderProcessRecordEntity.getPayStartTime() != null) {
  251. orderProcessRecordEntity.setPayStartTimeStr(
  252. DateUtils.format(orderProcessRecordEntity.getPayStartTime(), DateUtils.DATE_TIME_PATTERN));
  253. }
  254. if (orderProcessRecordEntity.getPaymentStartTime() != null) {
  255. orderProcessRecordEntity.setPaymentStartTimeStr(
  256. DateUtils.format(orderProcessRecordEntity.getPaymentStartTime(), DateUtils.DATE_TIME_PATTERN));
  257. }
  258. if (orderProcessRecordEntity.getPaymentSuccTime() != null) {
  259. orderProcessRecordEntity.setPaymentSuccTimeStr(
  260. DateUtils.format(orderProcessRecordEntity.getPaymentSuccTime(), DateUtils.DATE_TIME_PATTERN));
  261. }
  262. }
  263. return R.ok().put("orderProcessRecordEntity", orderProcessRecordEntity);
  264. }
  265. /**
  266. * 打印小票
  267. *
  268. * @param id
  269. * @return
  270. */
  271. @RequestMapping("/printMsg")
  272. public R printMsg(@RequestBody Long id) {
  273. Ticket ticket = orderService.printMsg(id);
  274. return R.ok().put("ticket", ticket);
  275. }
  276. /**
  277. * 订单取消请求
  278. */
  279. @RequiresPermissions(value = {"order:refund"})
  280. @RequestMapping(value = "cancel", method = RequestMethod.POST)
  281. public Object cancel(Long orderId) {
  282. OrderEntity orderInfo = orderService.queryObject(orderId);
  283. if (null == orderInfo) {
  284. return R.error("订单不存在");
  285. }
  286. if (orderInfo.getOrderStatus() != 0) {
  287. return R.error("订单状态不支持取消");
  288. }
  289. orderService.cancelOrder(orderInfo);
  290. return R.ok();
  291. }
  292. /**
  293. * 订单退款请求
  294. */
  295. @RequiresPermissions(value = {"order:refund"})
  296. @RequestMapping(value = "refund", method = RequestMethod.POST)
  297. public Object refund(Long orderId, String refundId, BigDecimal refundMoney) {
  298. OrderEntity orderInfo = orderService.queryObject(orderId);
  299. if (null == orderInfo) {
  300. return R.error("订单不存在");
  301. }
  302. if (orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem()) ||
  303. orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
  304. return R.error("订单已退款");
  305. }
  306. Double totalActualPrice = orderService.getTotalActualPrice(orderInfo.getMerchOrderSn());
  307. if (totalActualPrice == null) {
  308. totalActualPrice = 0d;
  309. }
  310. OrderProcessRecordEntity processRecordEntity = orderProcessRecordService.queryObjectByOrderSn(orderInfo.getOrderSn());
  311. if(org.apache.commons.lang.StringUtils.isNotEmpty(processRecordEntity.getIsCustomsSend())) {
  312. if (processRecordEntity.getIsCustomsSend().equalsIgnoreCase("2")) {
  313. return R.error("订单正在清关中,不能退款");
  314. }
  315. if (processRecordEntity.getIsCustomsSend().equalsIgnoreCase("1")) {
  316. return R.error("订单已清关完成,不能退款");
  317. }
  318. }
  319. String refundResult = "";
  320. if (orderInfo.getOrderStatus() != Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
  321. if (orderInfo.getPayFlag().equalsIgnoreCase(Dict.payFlag.item_wxglobalpay.getItem())) {
  322. refundResult = wxGlobalRefund(orderInfo, totalActualPrice);
  323. if (StringUtils.isNotBlank(refundResult)) {
  324. return R.error(refundResult);
  325. }
  326. } else if (orderInfo.getPayFlag().equalsIgnoreCase(Dict.payFlag.item_pingan.getItem())) {
  327. refundResult = pinganRefund(orderInfo, refundId);
  328. if (StringUtils.isNotBlank(refundResult)) {
  329. return R.error(refundResult);
  330. }
  331. } else{
  332. refundResult = wxRefund(orderInfo,totalActualPrice);
  333. if(StringUtils.isNotBlank(refundResult)){
  334. return R.error(refundResult);
  335. }
  336. }
  337. }
  338. return R.ok("退款成功");
  339. }
  340. /**
  341. * 平安申请退款
  342. * @param orderInfo
  343. * @return
  344. */
  345. private String pinganRefund(OrderEntity orderInfo, String refundId){
  346. Integer refundAmount = orderInfo.getActualPrice().multiply(new BigDecimal(100)).intValue();
  347. PinganResponseDto responseDto = PinganUtil.pinganPayRefund(orderInfo.getMerchOrderSn(), refundId, refundAmount, null);
  348. if (!Objects.isNull(responseDto)) {
  349. responseDto.setOutNo(orderInfo.getMerchOrderSn());
  350. responseDto.setCreateTime(new Date());
  351. pinganResponseService.save(responseDto);
  352. if ("0".equals(responseDto.getErrcode())) {
  353. JSONObject tradeResult = JSONObject.fromObject(responseDto.getDatajson());
  354. if (Dict.pinganRefundStatus.item_1.getItem().equals(tradeResult.getString("status"))) {
  355. orderService.pinganRefund(orderInfo, tradeResult, refundId);
  356. } else {
  357. OrderRefundEntity mallOrderRefund = orderRefundService.queryObjectByOrderId(orderInfo.getId());
  358. OrderRefundEntity orderRefund = new OrderRefundEntity();
  359. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));
  360. orderRefund.setRefundMoney(BigDecimal.valueOf(orderInfo.getActualPrice().doubleValue()));
  361. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
  362. orderRefund.setModTime(new Date());
  363. orderRefund.setOutRefundNo(tradeResult.getString("ord_no"));
  364. if (mallOrderRefund != null) {
  365. orderRefund.setId(mallOrderRefund.getId());
  366. orderRefundService.update(orderRefund);//退款记录
  367. }
  368. OrderExceptionRecordEntity mallOrderExceptionRecord = new OrderExceptionRecordEntity();
  369. mallOrderExceptionRecord.setUserId(Integer.parseInt(orderInfo.getUserId() + ""));
  370. mallOrderExceptionRecord.setOrderSn(orderInfo.getOrderSn());
  371. mallOrderExceptionRecord.setExceptionStatus(Dict.exceptionStatus.item_03.getItem());
  372. mallOrderExceptionRecord.setExceptionContent("退款失败");
  373. mallOrderExceptionRecord.setCreateTime(new Date());
  374. orderExceptionRecordService.save(mallOrderExceptionRecord);
  375. return "发起平安支付退款失败!";
  376. }
  377. } else {
  378. return responseDto.getMsg();
  379. }
  380. }
  381. return "";
  382. }
  383. /**
  384. * 微信申请退款
  385. * @param orderInfo
  386. * @param totalActualPrice
  387. * @return
  388. */
  389. private String wxRefund(OrderEntity orderInfo,Double totalActualPrice){
  390. WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getMerchOrderSn().toString(), totalActualPrice,
  391. orderInfo.getActualPrice().doubleValue());
  392. if (result.getResult_code().equals(WechatUtil.WXTradeState.SUCCESS.getCode())) {
  393. orderService.refund(orderInfo, result);
  394. } else {
  395. OrderRefundEntity mallOrderRefund = orderRefundService.queryObjectByOrderId(orderInfo.getId());
  396. OrderRefundEntity orderRefund = new OrderRefundEntity();
  397. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));
  398. orderRefund.setRefundMoney(BigDecimal.valueOf(orderInfo.getActualPrice().doubleValue()));
  399. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
  400. orderRefund.setModTime(new Date());
  401. orderRefund.setOutRefundNo(result.getOut_refund_no());
  402. if (mallOrderRefund != null) {
  403. orderRefund.setId(mallOrderRefund.getId());
  404. orderRefundService.update(orderRefund);//退款记录
  405. }
  406. OrderExceptionRecordEntity mallOrderExceptionRecord = new OrderExceptionRecordEntity();
  407. mallOrderExceptionRecord.setUserId(Integer.parseInt(orderInfo.getUserId() + ""));
  408. mallOrderExceptionRecord.setOrderSn(orderInfo.getOrderSn());
  409. mallOrderExceptionRecord.setExceptionStatus(Dict.exceptionStatus.item_03.getItem());
  410. mallOrderExceptionRecord.setExceptionContent("退款失败" + result.getErr_code_des());
  411. mallOrderExceptionRecord.setCreateTime(new Date());
  412. orderExceptionRecordService.save(mallOrderExceptionRecord);
  413. return result.getErr_code_des();
  414. }
  415. return "";
  416. }
  417. /**
  418. * 微信国际申请退款
  419. * @param orderInfo
  420. * @param totalActualPrice
  421. * @return
  422. */
  423. private String wxGlobalRefund(OrderEntity orderInfo,Double totalActualPrice){
  424. WechatGlobalRefundApiResult result = WechatGlobalUtil.wxRefund(orderInfo.getMerchOrderSn().toString(), totalActualPrice,
  425. orderInfo.getActualPrice().doubleValue());
  426. if (result.getResult_code().equals(WechatUtil.WXTradeState.SUCCESS.getCode())) {
  427. orderService.globalRefund(orderInfo, result);
  428. } else {
  429. OrderRefundEntity mallOrderRefund = orderRefundService.queryObjectByOrderId(orderInfo.getId());
  430. OrderRefundEntity orderRefund = new OrderRefundEntity();
  431. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));
  432. orderRefund.setRefundMoney(BigDecimal.valueOf(orderInfo.getActualPrice().doubleValue()));
  433. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
  434. orderRefund.setOutRefundNo(result.getOut_refund_no());
  435. orderRefund.setModTime(new Date());
  436. if (mallOrderRefund != null) {
  437. orderRefund.setId(mallOrderRefund.getId());
  438. orderRefundService.update(orderRefund);//退款记录
  439. }
  440. OrderExceptionRecordEntity mallOrderExceptionRecord = new OrderExceptionRecordEntity();
  441. mallOrderExceptionRecord.setUserId(Integer.parseInt(orderInfo.getUserId() + ""));
  442. mallOrderExceptionRecord.setOrderSn(orderInfo.getOrderSn());
  443. mallOrderExceptionRecord.setExceptionStatus(Dict.exceptionStatus.item_03.getItem());
  444. mallOrderExceptionRecord.setExceptionContent("退款失败" + result.getErr_code_des());
  445. mallOrderExceptionRecord.setCreateTime(new Date());
  446. orderExceptionRecordService.save(mallOrderExceptionRecord);
  447. return result.getErr_code_des();
  448. }
  449. return "";
  450. }
  451. /**
  452. * 订单退款请求
  453. */
  454. @RequiresPermissions(value = {"order:offilineRefund"})
  455. @RequestMapping(value = "offilineRefund", method = RequestMethod.POST)
  456. public Object offilineRefund(Long orderId) {
  457. OrderEntity orderInfo = orderService.queryObject(orderId);
  458. if (null == orderInfo) {
  459. return R.error("订单不存在");
  460. }
  461. if (orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem()) ||
  462. orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
  463. return R.error("订单已退款");
  464. }
  465. if (orderInfo.getOrderStatus() != Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
  466. if (Dict.payFlag.item_cash.getItem().equals(orderInfo.getPayFlag())) {
  467. //现金支付,直接修改订单状态
  468. orderService.refund(orderInfo, null);
  469. } else if (Dict.payFlag.item_weixin.getItem().equals(orderInfo.getPayFlag())) {
  470. //微信线下扫码支付
  471. WechatRefundApiResult result = WechatUtil
  472. .wxRefund(orderInfo.getOrderSnWx(), orderInfo.getActualPrice().doubleValue(),
  473. orderInfo.getActualPrice().doubleValue());
  474. if (result.getResult_code().equals(WechatUtil.WXTradeState.SUCCESS.getCode())) {
  475. orderService.refund(orderInfo, result);
  476. } else {
  477. OrderRefundEntity mallOrderRefund = orderRefundService.queryObjectByOrderId(orderInfo.getId());
  478. OrderRefundEntity orderRefund = new OrderRefundEntity();
  479. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));
  480. orderRefund.setRefundMoney(BigDecimal.valueOf(orderInfo.getActualPrice().doubleValue()));
  481. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
  482. orderRefund.setOutRefundNo(result.getOut_refund_no());
  483. orderRefund.setModTime(new Date());
  484. if (mallOrderRefund != null) {
  485. orderRefund.setId(mallOrderRefund.getId());
  486. orderRefundService.update(orderRefund);//退款记录
  487. }
  488. OrderExceptionRecordEntity mallOrderExceptionRecord = new OrderExceptionRecordEntity();
  489. mallOrderExceptionRecord.setUserId(Integer.parseInt(orderInfo.getUserId() + ""));
  490. mallOrderExceptionRecord.setOrderSn(orderInfo.getOrderSn());
  491. mallOrderExceptionRecord.setExceptionStatus(Dict.exceptionStatus.item_03.getItem());
  492. mallOrderExceptionRecord.setExceptionContent("退款失败" + result.getErr_code_des());
  493. mallOrderExceptionRecord.setCreateTime(new Date());
  494. orderExceptionRecordService.save(mallOrderExceptionRecord);
  495. return R.error(result.getErr_code_des());
  496. }
  497. }
  498. }
  499. return R.ok("退款成功");
  500. }
  501. /**
  502. * 获取首页展示信息--会员购买率相关
  503. *
  504. * @param params
  505. * @return
  506. */
  507. @RequestMapping("/getUserOrderInfo")
  508. public R getUserOrderInfo(@RequestParam Map<String, Object> params) {
  509. int result = orderService.getUserOrderInfo(params);
  510. return R.ok().put("result", result);
  511. }
  512. @RequiresPermissions(value = {"order:orderSubmit"})
  513. @RequestMapping(value = "orderSubmit", method = RequestMethod.POST)
  514. @ResponseBody
  515. public R orderSubmit(@RequestBody List<OfflineCartEntity> offlineCartEntityList) {
  516. Map resultObj = null;
  517. try {
  518. SysUserEntity user = ShiroUtils.getUserEntity();
  519. resultObj = orderService.orderSubmit(offlineCartEntityList, user);
  520. if (((Integer) resultObj.get("errno")) != 0) {
  521. return R.error((String) resultObj.get("errmsg"));
  522. }
  523. } catch (Exception e) {
  524. e.printStackTrace();
  525. }
  526. return R.ok("订单提交成功");
  527. }
  528. /**
  529. * 确认付款
  530. *
  531. * @param id
  532. * @return
  533. */
  534. @RequestMapping("/confirmPay")
  535. @RequiresPermissions("order:confirmPay")
  536. public R confirmPay(@RequestBody Long id) {
  537. orderService.confirmPay(id, Dict.payFlag.item_cash.getItem(), null);
  538. return R.ok();
  539. }
  540. @RequestMapping("/offilineOrderList")
  541. @RequiresPermissions("order:offilineOrderList")
  542. public R offilineOrderList(@RequestParam Map<String, Object> params) {
  543. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", false);
  544. //查询列表数据
  545. Query query = new Query(params);
  546. query.put("isOnfiilineOrder", Dict.isOnfflineOrder.item_1.getItem());
  547. List<OrderEntity> orderList = orderService.queryOffilineOrderList(query);
  548. int total = orderService.queryTotal(query);
  549. PageUtils pageUtil = new PageUtils(orderList, total, query.getLimit(), query.getPage());
  550. return R.ok().put("page", pageUtil);
  551. }
  552. @RequestMapping("/offlineInfos/{id}")
  553. @RequiresPermissions("order:offlineInfos")
  554. public R queryObjectBySysUser(@PathVariable("id") Long id) {
  555. OrderEntity order = orderService.queryObjectBySysUser(id);
  556. List<OrderWXPayRecordEntity> payRecords = orderWXPayRecordService.getRecordsByOutTradeNo(order.getOrderSn());
  557. order.setPayRecordList(payRecords);
  558. return R.ok().put("order", order);
  559. }
  560. @RequestMapping("/wxMicropayPay")
  561. @RequiresPermissions("order:wxMicropayPay")
  562. public R wxMicropayPay(Long id, String auth_code) {
  563. R r = null;
  564. SysUserEntity user = ShiroUtils.getUserEntity();
  565. if (user == null) {
  566. throw new RRException("用户登录超时,请重新登录");
  567. }
  568. if (!user.getRoleType().equalsIgnoreCase("2")) {
  569. throw new RRException("该操作只允许店员账户操作");
  570. }
  571. OrderEntity orderEntity = orderService.queryObject(id);
  572. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  573. throw new RRException("此订单已付款!");
  574. }
  575. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_301.getItem())) {
  576. throw new RRException("此订单已完成!");
  577. }
  578. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_101.getItem())) {
  579. throw new RRException("此订单已取消!");
  580. }
  581. if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_102.getItem())) {
  582. throw new RRException("此订单已删除!");
  583. }
  584. //保存支付记录
  585. OrderWXPayRecordEntity orderWXPayRecordCurrent = orderWXPayRecordService.saveRecord(orderEntity);
  586. StoreEntity store = storeService.queryObject(orderEntity.getStoreId());
  587. WechatMicropayApiResult wechatMicropayApiResult = WechatUtil
  588. .wxMicropay(store.getMerchName() + "-" + store.getStoreName(), orderEntity.getOrderBizType(), null,
  589. orderWXPayRecordCurrent.getOutTradeNoWX(), orderEntity.getActualPrice().doubleValue(),
  590. "127.0.0.1", auth_code);
  591. orderWXPayRecordService.updateRecord(orderWXPayRecordCurrent.getId(), wechatMicropayApiResult);
  592. //当支付成功时,修改订单,并把其他支付记录撤销
  593. if (WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatMicropayApiResult.getTrade_state())) {
  594. //查询当前订单所有的支付记录
  595. List<OrderWXPayRecordEntity> orderWXPayRecordEntitys =
  596. orderWXPayRecordService.getRecordsByOutTradeNo(orderEntity.getOrderSn());
  597. for (OrderWXPayRecordEntity orderWXPayRecordTemp : orderWXPayRecordEntitys) {
  598. //查询出来的记录不等于当前记录,并且未撤销,未关闭时,撤销订单
  599. if (orderWXPayRecordTemp.getId() != orderWXPayRecordCurrent.getId() &&
  600. (!WechatUtil.WXTradeState.REVOKED.getCode().equals(orderWXPayRecordTemp.getTradeState()) ||
  601. !WechatUtil.WXTradeState.CLOSED.getCode().equals(orderWXPayRecordTemp.getTradeState()))) {
  602. WechatReverseApiResult wechatReverseApiResult =
  603. WechatUtil.wxReverse(orderWXPayRecordTemp.getOutTradeNoWX());
  604. //撤销订单成功
  605. if (WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatReverseApiResult.getReturn_code()) &&
  606. WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatReverseApiResult.getResult_code())) {
  607. //调用订单查询接口
  608. WechatRefundApiResult wechatRefundApiResult =
  609. WechatUtil.wxOrderQuery(orderWXPayRecordTemp.getOutTradeNoWX());
  610. if (WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatRefundApiResult.getReturn_code()) &&
  611. WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatRefundApiResult.getResult_code())) {
  612. // 修改订单支付记录
  613. orderWXPayRecordService
  614. .updateWXPayRecordTradeState(orderWXPayRecordTemp.getId(), wechatRefundApiResult);
  615. }
  616. }
  617. }
  618. }
  619. orderService.confirmPay(id, Dict.payFlag.item_weixin.getItem(), orderWXPayRecordCurrent.getOutTradeNoWX());
  620. r = R.ok();
  621. //用户支付中
  622. } else if (WechatUtil.WXTradeState.USERPAYING.getCode().equals(wechatMicropayApiResult.getTrade_state())) {
  623. r = R.error(WechatUtil.WXTradeState.USERPAYING.getCodeZn() + ",稍等片刻后请刷新页面重新查看订单状态");
  624. //用户支付失败
  625. } else if (WechatUtil.WXTradeState.PAYERROR.getCode().equals(wechatMicropayApiResult.getTrade_state())) {
  626. WechatReverseApiResult wechatReverseApiResult =
  627. WechatUtil.wxReverse(orderWXPayRecordCurrent.getOutTradeNoWX());
  628. //撤销订单成功
  629. if (WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatReverseApiResult.getReturn_code()) &&
  630. WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatReverseApiResult.getResult_code())) {
  631. //调用订单查询接口
  632. WechatRefundApiResult wechatRefundApiResult =
  633. WechatUtil.wxOrderQuery(orderWXPayRecordCurrent.getOutTradeNoWX());
  634. if (WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatRefundApiResult.getReturn_code()) &&
  635. WechatUtil.WXTradeState.SUCCESS.getCode().equals(wechatRefundApiResult.getResult_code())) {
  636. // 修改订单支付记录
  637. orderWXPayRecordService
  638. .updateWXPayRecordTradeState(orderWXPayRecordCurrent.getId(), wechatRefundApiResult);
  639. }
  640. r = R.error(orderWXPayRecordCurrent.getErrCodeDes());
  641. } else {
  642. r = R.error(wechatReverseApiResult.getErr_code_des());
  643. }
  644. }
  645. return r;
  646. }
  647. /**
  648. * 订单导出请求
  649. */
  650. @RequiresPermissions(value = {"order:export"})
  651. @RequestMapping(value = "export")
  652. public Object export(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) {
  653. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", false);
  654. //查询列表数据
  655. params.put("isOnfiilineOrder", Dict.isOnfflineOrder.item_0.getItem());
  656. String startTime = (String) params.get("startTime");
  657. String endTime = (String) params.get("endTime");
  658. if(org.apache.commons.lang.StringUtils.isNotEmpty(startTime)) {
  659. try {
  660. startTime = new String(startTime.getBytes("iso-8859-1"), "utf-8");
  661. } catch (Exception e) {
  662. e.printStackTrace();
  663. }
  664. startTime = getDate(startTime);
  665. params.put("startTime", startTime + " 00:00:00");
  666. }
  667. if(org.apache.commons.lang.StringUtils.isNotEmpty(endTime)) {
  668. try {
  669. endTime = new String(endTime.getBytes("iso-8859-1"), "utf-8");
  670. } catch (Exception e) {
  671. e.printStackTrace();
  672. }
  673. endTime = getDate(endTime);
  674. params.put("endTime", endTime + " 59:59:59");
  675. }
  676. List<OrderEntity> orderList = orderService.queryExportList(params);
  677. ExcelExport ee = new ExcelExport("订单信息");
  678. String[] header = new String[]{"订单编号","商户订单编号", "订单状态", "SKU", "商品名称", "数量", "销售价", "实际支付金额", "保税模式", "快递公司名称", "快递单编号", "海关清单编号", "收货人姓名", "收件人手机", "收件人省份", "收件人城市", "收件人区县", "收件人地址", "下单时间", "支付流水号"};
  679. List<Map<String, Object>> list = new ArrayList<>();
  680. if (orderList != null && orderList.size() != 0) {
  681. for (OrderEntity orderEntity : orderList) {
  682. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  683. Integer orderStatus = orderEntity.getOrderStatus();
  684. String orderBizType = orderEntity.getOrderBizType();
  685. map.put("OrderSn", orderEntity.getOrderSn());
  686. map.put("MerchOrderSn", orderEntity.getMerchOrderSn());
  687. map.put("OrderStatus", StringUtils.isEmpty(orderStatus.toString())? "":Dict.orderStatus.valueOf("item_"+ orderStatus).getItemName());
  688. map.put("SKU", orderEntity.getSku());
  689. map.put("GoodsName", orderEntity.getGoodsName());
  690. map.put("Number", orderEntity.getNumber());
  691. map.put("RetailPrice", orderEntity.getRetailPrice());
  692. map.put("ActualPrice", orderEntity.getActualPrice());
  693. map.put("OrderBizType", StringUtils.isEmpty(orderBizType)? "":Dict.orderBizType.valueOf("item_"+orderBizType).getItemName());
  694. map.put("ShippingName", orderEntity.getShippingName());
  695. map.put("ShippingNo", orderEntity.getShippingNo());
  696. map.put("InvtNo", orderEntity.getOrderProcessRecord()==null?"":orderEntity.getOrderProcessRecord().getInvtNo());
  697. map.put("Consignee", orderEntity.getConsignee());
  698. map.put("Mobile", orderEntity.getMobile());
  699. map.put("Province", orderEntity.getProvince());
  700. map.put("City", orderEntity.getCity());
  701. map.put("District", orderEntity.getDistrict());
  702. map.put("Address", orderEntity.getAddress());
  703. map.put("OrderStartTime", orderEntity.getOrderProcessRecord()==null?"":DateUtils.format(orderEntity.getOrderProcessRecord().getAddOrderStartTime(),"yyyy-MM-dd HH:mm:ss"));
  704. map.put("PayId", orderEntity.getPayTransactionId());
  705. list.add(map);
  706. }
  707. }
  708. ee.addSheetByMap("订单信息", list, header);
  709. ee.export(response);
  710. return R.ok();
  711. }
  712. private String getDate(String datdString){
  713. datdString = datdString.replace("GMT", "").replaceAll("\\(.*\\)", "");
  714. //将字符串转化为date类型,格式2016-10-12
  715. SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss z", Locale.ENGLISH);
  716. Date dateTrans = null;
  717. try {
  718. dateTrans = format.parse(datdString);
  719. return new SimpleDateFormat("yyyy-MM-dd").format(dateTrans);
  720. } catch (ParseException e) {
  721. e.printStackTrace();
  722. }
  723. return datdString;
  724. }
  725. }