AdminRentOrderHandler.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. package com.iamberry.rent.handlers.admin;
  2. import java.net.URLDecoder;
  3. import java.util.Date;
  4. import java.util.List;
  5. import java.util.Map;
  6. import javax.servlet.http.HttpServletRequest;
  7. import com.iamberry.wechat.core.entity.drp.PlaceInfo;
  8. import com.iamberry.wechat.core.entity.member.CashLog;
  9. import com.iamberry.wechat.core.entity.member.Member;
  10. import com.iamberry.wechat.core.entity.mq.MQMessage;
  11. import com.iamberry.wechat.core.entity.order.Order;
  12. import com.iamberry.wechat.core.entity.reback.RebackInfo;
  13. import com.iamberry.wechat.core.entity.relationship.DealerRelation;
  14. import com.iamberry.wechat.core.entity.relationship.WdRelation;
  15. import com.iamberry.wechat.tools.DateTimeUtil;
  16. import com.iamberry.wechat.tools.NameUtils;
  17. import com.iamberry.wechat.tools.ResultInfo;
  18. import org.apache.commons.lang3.StringUtils;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Controller;
  21. import org.springframework.web.bind.annotation.PathVariable;
  22. import org.springframework.web.bind.annotation.RequestMapping;
  23. import org.springframework.web.bind.annotation.RequestParam;
  24. import org.springframework.web.servlet.ModelAndView;
  25. import com.iamberry.rent.face.order.RentOrderService;
  26. import com.iamberry.wechat.core.entity.OrderUtil;
  27. import com.iamberry.wechat.core.entity.order.MessageDto;
  28. import com.iamberry.wechat.core.entity.order.OrderActionDto;
  29. import com.iamberry.wechat.core.entity.rent.RentOrder;
  30. import com.iamberry.wechat.core.entity.rent.RentOrderDTO;
  31. @Controller
  32. @RequestMapping("admin/rent_order")
  33. public class AdminRentOrderHandler {
  34. @Autowired
  35. RentOrderService rentOrderService;
  36. @Autowired
  37. private OrderUtil orderUtil;
  38. /**
  39. * 订单列表页 后台
  40. * 2017年3月16日
  41. * @author muzx
  42. * @return
  43. * @throws Exception
  44. */
  45. @SuppressWarnings("unchecked")
  46. @RequestMapping("/list")
  47. public ModelAndView listRentOrder(
  48. @RequestParam(value = "pageSize", defaultValue = "10", required = false) Integer pageSize,
  49. @RequestParam(value = "pageNO", defaultValue = "1", required = false) Integer pageNO,
  50. OrderActionDto actionDto,
  51. HttpServletRequest request) throws Exception{
  52. ModelAndView mv = new ModelAndView("admin/reserve/order/list");
  53. String rentStatus = request.getParameter("orderStatus");
  54. //url需要进行拼接,拼接的内容是页面上的时间条件
  55. StringBuilder url = new StringBuilder("/admin/rent_order/list?orderStatus=" + actionDto.getOrderStatus());
  56. //分页并带条件查询接收参数
  57. RentOrderDTO rentOrderDTO = new RentOrderDTO();
  58. if (StringUtils.isNotEmpty(actionDto.getText())) {
  59. mv.addObject("text", actionDto.getText());
  60. url.append("&text=" + actionDto.getText());
  61. rentOrderDTO.setRentOrderId(actionDto.getText());
  62. }
  63. if (StringUtils.isNotEmpty(actionDto.getProbationSendName())) {
  64. rentOrderDTO.setRentAddressName(actionDto.getProbationSendName());
  65. mv.addObject("probationSendName", actionDto.getProbationSendName());
  66. url.append("&probationSendName=" + actionDto.getProbationSendName());
  67. }
  68. if (StringUtils.isNotEmpty(actionDto.getProbationSendTel())) {
  69. rentOrderDTO.setRentAddressTel(actionDto.getProbationSendTel());
  70. mv.addObject("probationSendTel", actionDto.getProbationSendTel());
  71. url.append("&probationSendTel=" + actionDto.getProbationSendTel());
  72. }
  73. if (StringUtils.isNotEmpty(actionDto.getSendAddress())) {
  74. rentOrderDTO.setRentAddressInfo(actionDto.getSendAddress());
  75. mv.addObject("sendAddress", actionDto.getSendAddress());
  76. url.append("&sendAddress=" + actionDto.getSendAddress());
  77. }
  78. url.append("&pageSize=" + pageSize + "&pageNO=");
  79. if (rentStatus == null || "".equals(rentStatus)) {
  80. rentStatus = "paySuccess";
  81. }
  82. // 订单状态,数字标识
  83. int status = -1;
  84. if (!rentStatus.equals("allOrder")) {
  85. status = orderUtil.getOrderStatusByStr(rentStatus);
  86. }
  87. rentOrderDTO.setRentStatus(status);
  88. rentOrderDTO.getPage().setPageSize(pageSize);
  89. rentOrderDTO.getPage().setPageNumber(pageNO);
  90. Map<String, Object> map = rentOrderService.listRentOrder(rentOrderDTO);
  91. List<RentOrderDTO> dtoList = (List<RentOrderDTO>) map.get("list");
  92. // 订单是否按照状态查询的, 用于页面
  93. for (RentOrderDTO orders : dtoList) {
  94. // 获取用户的操作权限
  95. orders.setOperations(orderUtil.rentOrderStatusToOperation(orders.getRentStatus(), orders.getRentOrderId()));
  96. if (status == -1) {
  97. mv.addObject("orderListIsStatus", false);
  98. orders.setOrderLinkStatus(orderUtil.orderStatusToString(orders.getRentStatus())); // 订单状态描述,中文
  99. }else{
  100. mv.addObject("orderListIsStatus", true);
  101. }
  102. }
  103. int count = (int) map.get("countOrder");
  104. int pageCount = count % rentOrderDTO.getPage().getPageSize() == 0 ? count/rentOrderDTO.getPage().getPageSize():(count/rentOrderDTO.getPage().getPageSize()) + 1;
  105. //分页用
  106. mv.addObject("orderList", dtoList);
  107. mv.addObject("pageNO", pageNO);
  108. mv.addObject("pageSize", pageCount);
  109. mv.addObject("rentStatus", status);// 订单状态
  110. mv.addObject("url", url);
  111. mv.addObject("orderStatusStr", orderUtil.orderStatusIntToOrderStatusString(status));// 订单状态描述(用于选中订单头)
  112. mv.addObject("orderLinkStatus", orderUtil.orderStatusToString(status));// 订单状态描述,中文(显示给用户看)
  113. mv.addObject("statusUrl", "/admin/rent_order/list?bid=&sid=");
  114. return mv;
  115. }
  116. /**
  117. * 操作订单
  118. * @return
  119. * @throws Exception
  120. */
  121. @RequestMapping("/{action}/{orderId}")
  122. public synchronized ModelAndView actionOrder(
  123. @PathVariable("action") String action,
  124. @PathVariable("orderId") String orderId,
  125. OrderActionDto actionDto
  126. ) throws Exception {
  127. ModelAndView mv = new ModelAndView("admin/msg/msg");
  128. RentOrder rentOrder = new RentOrder();
  129. rentOrder.setRentOrderId(orderId);
  130. rentOrder.setRentPostFirm(actionDto.getPostFirm());
  131. rentOrder.setRentPostNum(actionDto.getPostNum());
  132. // 判断当前的订单,是否支持希望进行的操作
  133. RentOrder order = rentOrderService.getRentOrderByOrderId(rentOrder);
  134. order.setRentPostFirm(actionDto.getPostFirm());
  135. order.setRentPostNum(actionDto.getPostNum());
  136. rentOrder.setRentOldStatus(order.getRentStatus());
  137. if (!orderUtil.orderStatusIntToOrderStatusString(order.getRentStatus()).equals(actionDto.getOrderStatus())) {
  138. mv.addObject("msgObj", new MessageDto(false, "对不起,操作有误", "对不起,当前订单状态不支持此操作!请确定后重试!"));
  139. return mv;
  140. }
  141. switch (order.getRentStatus()) {
  142. case 0: // 取消的订单,不支持任何修改订单状态的操作
  143. return mv;
  144. case 1: // 待支付(管理员存在操作权限:取消订单,如果取消订单,订单状态修改为0)
  145. return mv;
  146. case 2: // 已支付、待发货(管理员的操作为:确认发货)
  147. mv = checkOrderOperation1(action, actionDto, 2, 5);
  148. if (!(boolean)mv.getModel().get("status")) return mv;
  149. // 执行修改操作
  150. rentOrder.setRentStatus(orderUtil.getOrderStatusByStr(actionDto.getToOrderStatus()));
  151. rentOrder.setRentSendDate(new Date());
  152. if(rentOrderService.deliverOrderByOrderId(rentOrder)){
  153. mv.addObject("msgObj", new MessageDto(true, "操作成功", "发货成功!"));
  154. }else{
  155. mv.addObject("msgObj", new MessageDto(false, "对不起,订单发货失败", "对不起,订单发货失败,请稍后重试!"));
  156. }
  157. return mv;
  158. case 3: // 退款申请中(管理员可以操作:确认退款、驳回退款)
  159. mv = checkOrderOperation2(action, actionDto, 4, 5, 2, 4);
  160. if (!(boolean)mv.getModel().get("status")) return mv;
  161. order.setRentStatus(orderUtil.getOrderStatusByStr(actionDto.getToOrderStatus()));
  162. order.getList().get(0).setItemStatus(orderUtil.getOrderStatusByStr(actionDto.getToOrderStatus()));
  163. try {
  164. boolean flag = rentOrderService.rentReturnMoneyRentOrder(order);
  165. if(flag){
  166. if(orderUtil.orderStatusIntToOrderStatusString(4).equals(actionDto.getToOrderStatus())){
  167. mv.addObject("msgObj", new MessageDto(true, "订单申请退款成功", "同意订单:" + orderId + "退款!"));
  168. }else{
  169. mv.addObject("msgObj", new MessageDto(true, "驳回退款成功!", "订单:" + orderId + "退款被驳回,状态返回已支付、待发货!"));
  170. }
  171. }else {
  172. mv.addObject("msgObj", new MessageDto(false, "对不起,操作有误", "对不起,您刚才的操作流程有误,请按照系统流程操作!"));
  173. }
  174. } catch (IllegalArgumentException e){
  175. mv.addObject("msgObj", new MessageDto(false, "对不起,操作有误", "微信企业转账失败,请确认余额是否充足!"));
  176. }finally {
  177. return mv;
  178. }
  179. case 4: // 已退款(管理员通过申请退款,此时订单任何人不能操作)
  180. return mv;
  181. case 5: // 已发货(管理员不具有权限)
  182. mv.addObject("msgObj", new MessageDto(false, "对不起,操作有误", "对不起,您刚才的操作流程有误,已发货的订单不能操作!"));
  183. return mv;
  184. case 6: // 申请退货中(只有管理员能操作 : 确认退货)
  185. mv = checkOrderOperation2(action, actionDto, 6, 10, 5, 7);
  186. if (!(boolean)mv.getModel().get("status")) return mv;
  187. // 执行修改操作
  188. order.setRentStatus(orderUtil.getOrderStatusByStr(actionDto.getToOrderStatus()));
  189. order.getList().get(0).setItemStatus(orderUtil.getOrderStatusByStr(actionDto.getToOrderStatus()));
  190. if (rentOrderService.updateOrderStatusAndItemStatus(order)) {
  191. if(orderUtil.orderStatusIntToOrderStatusString(7).equals(actionDto.getToOrderStatus())){
  192. mv.addObject("msgObj", new MessageDto(true, "订单申请退货成功", "恭喜您!同意订单:" + orderId + "退货,等待收到货物后确认退货!"));
  193. }else{
  194. mv.addObject("msgObj", new MessageDto(true, "成功驳回订单退货", "订单:" + orderId + "退货被驳回,状态返回已发货!"));
  195. }
  196. } else {
  197. mv.addObject("msgObj", new MessageDto(false, "对不起,处理订单退货失败", "对不起,处理订单退货失败,请稍后重试!"));
  198. }
  199. return mv;
  200. case 7: // 退货中(管理员具有操作能力:确认退货)
  201. mv = checkOrderOperation1(action, actionDto, 7, 8 );
  202. if (!(boolean)mv.getModel().get("status")) return mv;
  203. // 执行修改操作
  204. order.setRentStatus(orderUtil.getOrderStatusByStr(actionDto.getToOrderStatus()));
  205. order.getList().get(0).setItemStatus(orderUtil.getOrderStatusByStr(actionDto.getToOrderStatus()));
  206. if (rentOrderService.updateReturnRentOrder(order)) {
  207. mv.addObject("msgObj", new MessageDto(true, "确认订单退货成功", "恭喜您!同意订单:" + orderId + "退货,订单关闭!"));
  208. return mv;
  209. } else {
  210. mv.addObject("msgObj", new MessageDto(false, "对不起,订单退货失败", "对不起,订单退货失败,请稍后重试!"));
  211. return mv;
  212. }
  213. case 8: // 订单退货,订单关闭(管理员收到货后,确认退货,订单状态修改为此,订单不对外提供操作能力)
  214. return mv;
  215. case 9: // 换货中(管理员对申请换货的订单,确认换货时,订单状态为此,此时只有管理员具有操作权限,只能确认换货,录入物流信息)
  216. mv = checkOrderOperation1(action, actionDto,9, 5);
  217. if (!(boolean)mv.getModel().get("status")) return mv;
  218. order.setRentStatus(orderUtil.getOrderStatusByStr(actionDto.getToOrderStatus()));
  219. if (rentOrderService.deliverOrderByOrderId(order)) {
  220. mv.addObject("msgObj", new MessageDto(true, "订单发货成功", "恭喜您!订单:" + orderId + "订单发货成功!"));
  221. } else {
  222. mv.addObject("msgObj", new MessageDto(false, "对不起,订单发货失败", "对不起,订单发货失败,请稍后重试!"));
  223. }
  224. return mv;
  225. case 10: // 换货完成,当用户对换货中的订单,点击确认换货时,并录入物流信息,此订单进入已发货状态
  226. break;
  227. case 11: // 在订单为已发货时,用户具有的权限,用户申请换货
  228. mv = checkOrderOperation2(action, actionDto, 8, 11,9, 5);
  229. if (!(boolean)mv.getModel().get("status")) return mv;
  230. // 执行修改操作
  231. order.setRentStatus(orderUtil.getOrderStatusByStr(actionDto.getToOrderStatus()));
  232. order.getList().get(0).setItemStatus(orderUtil.getOrderStatusByStr(actionDto.getToOrderStatus()));
  233. order.setRentPostFirm(actionDto.getPostFirm());
  234. order.setRentPostNum(actionDto.getPostNum());
  235. if (rentOrderService.opertionRentExchangeOrder(order)) {
  236. if(orderUtil.orderStatusIntToOrderStatusString(9).equals(actionDto.getToOrderStatus())){
  237. mv.addObject("msgObj", new MessageDto(true, "同意换货成功", "恭喜您!同意订单:" + orderId + "换货,请收货后录入物流信息并同意换货!"));
  238. }else{
  239. mv.addObject("msgObj", new MessageDto(true, "驳回换货成功", "您已驳回订单:" + orderId + "换货,订单状态改为已发货!"));
  240. }
  241. return mv;
  242. } else {
  243. mv.addObject("msgObj", new MessageDto(false, "对不起,订单换货失败", "对不起,订单换货失败,请稍后重试!"));
  244. return mv;
  245. }
  246. default: // 报错
  247. mv.addObject("msgObj", new MessageDto(false, "对不起,操作有误", "对不起,您刚才的操作流程有误!"));
  248. }
  249. return mv;
  250. }
  251. /**
  252. * 订单操作校验
  253. * @param action
  254. * @param actionDto
  255. * @param actionId
  256. * @param toOrderStatus
  257. * @return
  258. */
  259. private ModelAndView checkOrderOperation1(String action, OrderActionDto actionDto, int actionId, int toOrderStatus){
  260. ModelAndView mv = new ModelAndView("admin/msg/msg");
  261. // 判断当前请求操作是否相符, 否则提示不成功
  262. if (!orderUtil.getOrderActin()[actionId].equals(action)) {
  263. mv.addObject("msgObj", new MessageDto(false, "对不起,操作有误", "对不起,您刚才的操作流程有误,请按照系统流程操作!"));
  264. mv.addObject("status", false);
  265. return mv;
  266. }
  267. // 判断请求修改的订单状态是否相符,否则提示不成功
  268. if (!orderUtil.orderStatusIntToOrderStatusString(toOrderStatus).equals(actionDto.getToOrderStatus())) {
  269. mv.addObject("msgObj", new MessageDto(false, "对不起,操作有误", "对不起,您刚才的操作流程有误,请按照系统流程操作!"));
  270. mv.addObject("status", false);
  271. return mv;
  272. }
  273. mv.addObject("status", true);
  274. return mv;
  275. }
  276. private ModelAndView checkOrderOperation2(String action, OrderActionDto actionDto,
  277. int action1, int action2, int toOrderStatus1, int toOrderStatus2){
  278. ModelAndView mv = new ModelAndView("admin/msg/msg");
  279. if ((!orderUtil.getOrderActin()[action1].equals(action))
  280. && (!orderUtil.getOrderActin()[action2].equals(action))) {// 判断当前请求操作是否相符, 否则提示不成功
  281. mv.addObject("status", false);
  282. mv.addObject("msgObj", new MessageDto(false, "对不起,操作有误", "对不起,您刚才的操作流程有误,请按照系统流程操作!"));
  283. return mv;
  284. }
  285. if ((!orderUtil.orderStatusIntToOrderStatusString(toOrderStatus1).equals(actionDto.getToOrderStatus())) &&
  286. (!orderUtil.orderStatusIntToOrderStatusString(toOrderStatus2).equals(actionDto.getToOrderStatus()))){
  287. mv.addObject("status", false);
  288. mv.addObject("msgObj", new MessageDto(false, "对不起,操作有误", "对不起,您刚才的操作流程有误,请按照系统流程操作!"));
  289. return mv;
  290. }
  291. mv.addObject("status", true);
  292. return mv;
  293. }
  294. }