package com.bweb.controller; import com.alibaba.excel.EasyExcel; import com.alibaba.fastjson.JSONObject; import com.bweb.config.SysConst; import com.bweb.model.ExportOutRechargeOrder; import com.bweb.model.ExportOutRechargeOrderCount; import com.bweb.model.ExportOutRechargeUserOrderCount; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.hai.common.exception.ErrorCode; import com.hai.common.exception.ErrorHelp; import com.hai.common.exception.SysCode; import com.hai.common.pay.util.XmlUtil; import com.hai.common.pay.util.sdk.WXPayConstants; import com.hai.common.utils.ResponseMsgUtil; import com.hai.common.utils.WxUtils; import com.hai.config.HuiLianTongUnionCardConfig; import com.hai.entity.HighRefundAudit; import com.hai.entity.OutRechargeOrder; import com.hai.model.*; import com.hai.service.HighRefundAuditService; import com.hai.service.OutRechargeOrderService; import com.hai.service.pay.impl.GoodsOrderServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @Controller @RequestMapping(value = "/outRechargeOrder") @Api(value = "充值订单接口") public class OutRechargeOrderController { private static Logger log = LoggerFactory.getLogger(HighMerchantStoreController.class); @Resource private OutRechargeOrderService outRechargeOrderService; @Resource private GoodsOrderServiceImpl goodsOrderService; @Resource private HighRefundAuditService highRefundAuditService; @RequestMapping(value = "/getOrderById", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "根据id查询订单详情") public ResponseData getOrderById(@RequestParam(name = "orderId", required = true) Long orderId) { try { return ResponseMsgUtil.success(outRechargeOrderService.findByOrderId(orderId)); } catch (Exception e) { log.error("HighOrderController --> getOrderById() error!", e); return ResponseMsgUtil.exception(e); } } @RequestMapping(value = "/cancelOrder", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "取消订单") public ResponseData cancelOrder(@RequestParam(name = "orderId", required = true) Long orderId) { try { OutRechargeOrder outRechargeOrder = outRechargeOrderService.findByOrderId(orderId); if (outRechargeOrder.getStatus() == 1) { outRechargeOrderService.cancelOrder(orderId); } else { log.error("orderToPay error!"); throw ErrorHelp.genException(SysCode.System, ErrorCode.STATUS_ERROR, ""); } return ResponseMsgUtil.success("操作成功"); } catch (Exception e) { log.error("HighOrderController --> cancelOrder() error!", e); return ResponseMsgUtil.exception(e); } } @RequestMapping(value = "/finishOrder", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "完成充值") public ResponseData finishOrder(@RequestParam(name = "orderId", required = true) Long orderId) { try { OutRechargeOrder outRechargeOrder = outRechargeOrderService.findByOrderId(orderId); if (outRechargeOrder.getStatus() == 2) { outRechargeOrderService.finishOrder(orderId); } else { log.error("orderToPay error!"); throw ErrorHelp.genException(SysCode.System, ErrorCode.STATUS_ERROR, ""); } return ResponseMsgUtil.success("操作成功"); } catch (Exception e) { log.error("HighOrderController --> cancelOrder() error!", e); return ResponseMsgUtil.exception(e); } } @RequestMapping(value = "/getOrderList", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "获取订单") public ResponseData getUserOrderList( @RequestParam(name = "status", required = false) Integer status, @RequestParam(name = "orderNo", required = false) String orderNo, @RequestParam(name = "rechargeModel", required = false) String rechargeModel, @RequestParam(name = "rechargeContent", required = false) String rechargeContent, @RequestParam(name = "userPhone", required = false) String userPhone, @RequestParam(name = "idCard", required = false) String idCard, @RequestParam(name = "payType", required = false) Integer payType, @RequestParam(name = "code", required = false) Integer code, @RequestParam(name = "payTimeS", required = false) Long payTimeS, @RequestParam(name = "payTimeE", required = false) Long payTimeE, @RequestParam(name = "pageNum", required = true) Integer pageNum, @RequestParam(name = "pageSize", required = true) Integer pageSize, HttpServletRequest request) { try { Map map = new HashMap<>(); if (status != null) { map.put("status", status.toString()); } if (StringUtils.isNotBlank(orderNo)) { map.put("orderNo", orderNo); } if (StringUtils.isNotBlank(rechargeModel)) { map.put("rechargeModel", rechargeModel); } if (StringUtils.isNotBlank(rechargeContent)) { map.put("rechargeContent", rechargeContent); } if (StringUtils.isNotBlank(userPhone)) { map.put("userPhone", userPhone); } if (StringUtils.isNotBlank(idCard)) { map.put("idCard", idCard); } if (payType != null) { map.put("payType" , payType.toString()); } if (code != null) { map.put("code" , code.toString()); } if (payTimeS != null) { map.put("payTimeS", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(payTimeS)); } if (payTimeE != null) { map.put("payTimeE", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(payTimeE)); } PageHelper.startPage(pageNum,pageSize); return ResponseMsgUtil.success(new PageInfo<>(outRechargeOrderService.getListRechargeOrder(map))); } catch (Exception e) { log.error("HighOrderController --> getUserOrderList() error!", e); return ResponseMsgUtil.exception(e); } } @RequestMapping(value = "/countOrder", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "完成充值") public ResponseData countOrder() { try { return ResponseMsgUtil.success(outRechargeOrderService.CountOrder()); } catch (Exception e) { log.error("HighOrderController --> cancelOrder() error!", e); return ResponseMsgUtil.exception(e); } } @RequestMapping(value = "/exportOrderList", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "导出订单") public ResponseData exportOrderList(@RequestParam(name = "status", required = false) Integer status, @RequestParam(name = "orderNo", required = false) String orderNo, @RequestParam(name = "rechargeModel", required = false) String rechargeModel, @RequestParam(name = "rechargeContent", required = false) String rechargeContent, @RequestParam(name = "userPhone", required = false) String userPhone, @RequestParam(name = "idCard", required = false) String idCard, @RequestParam(name = "payType", required = false) Integer payType, @RequestParam(name = "code", required = false) Integer code, @RequestParam(name = "createTimeS", required = false) Long createTimeS, @RequestParam(name = "createTimeE", required = false) Long createTimeE, @RequestParam(name = "payTimeS", required = false) Long payTimeS, @RequestParam(name = "payTimeE", required = false) Long payTimeE) { try { Map map = new HashMap<>(); map.put("status", status); map.put("orderNo", orderNo); map.put("rechargeModel", rechargeModel); map.put("rechargeContent", rechargeContent); map.put("userPhone", userPhone); map.put("idCard", idCard); map.put("payType", payType); map.put("code", code); map.put("createTimeS", createTimeS); map.put("createTimeE", createTimeE); map.put("payTimeS", payTimeS); map.put("payTimeE", payTimeE); List list = outRechargeOrderService.getOrderCount(map); String name = "/outRechargeOrder/充值订单" + System.currentTimeMillis() + ".xlsx"; String fileName = SysConst.getSysConfig().getFileUrl() + name; EasyExcel.write(fileName, ExportOutRechargeOrder.class).sheet("充值订单").doWrite(list); return ResponseMsgUtil.success(name); } catch (Exception e) { log.error("HighOrderController --> exportOrderList() error!", e); return ResponseMsgUtil.exception(e); } } @RequestMapping(value = "/orderToRefund", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "订单退款") public ResponseData orderToRefund(@RequestParam(name = "orderId", required = false) Long orderId, HttpServletRequest request) { try { OutRechargeOrder order = outRechargeOrderService.findByOrderId(orderId); HighRefundAudit highRefundAudit = highRefundAuditService.findByOrderNo(order.getOrderNo()); if (order == null) { log.error("orderToPay error!", "未找到充值订单"); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到充值订单"); } // 订单状态 : 1.待支付 2.已支付 3.已完成 4.已取消 5.已退款 6:退款中 if (order.getStatus() != 6) { log.error("orderToPay error!", "无法退款,订单不处于退款中状态"); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "无法退款,订单不处于已支付状态"); } if (order.getPayType() == 2) { JSONObject jsonObject = HuiLianTongUnionCardConfig.refund( "HFR"+new Date().getTime() , order.getOrderNo()); JSONObject dataObject = HuiLianTongUnionCardConfig.resolveResponse(jsonObject.getString("data")); if (dataObject.getBoolean("success")) { order.setStatus(5); order.setRefundTime(new Date()); order.setOutRefundNo("HFR"+new Date().getTime() ); order.setRefundFee(order.getPayRealPrice()); order.setRefundId(dataObject.getString("orderId")); highRefundAudit.setStatus(1); highRefundAuditService.updateRefundAudit(highRefundAudit); outRechargeOrderService.updateOrder(order); return ResponseMsgUtil.success("退款成功"); } else { log.error("orderToPay error!", dataObject.getString("message")); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, dataObject.getString("message")); } } else { Map param = new HashMap<>(); param.put("appid", "wx637bd6f7314daa46"); param.put("mch_id", "1289663601"); param.put("sub_mch_id" , "1614670195"); param.put("nonce_str", WxUtils.makeNonStr()); param.put("transaction_id", order.getPaySerialNo()); param.put("out_refund_no", "HFR"+new Date().getTime()); param.put("total_fee", String.valueOf(order.getPayRealPrice().multiply(new BigDecimal("100")).intValue())); param.put("refund_fee", String.valueOf(order.getPayRealPrice().multiply(new BigDecimal("100")).intValue())); param.put("sign_type", "HMAC-SHA256"); String signStr = WxUtils.generateSignature(param, "Skufk5oi85wDFGl888i6wsRSTkdd5df5" , WXPayConstants.SignType.HMACSHA256); param.put("sign", signStr); String resultXmL = doRefundRequest(param.get("mch_id"), WxUtils.mapToXml(param)); OrderRefundModel orderRefundModel = XmlUtil.getObjectFromXML(resultXmL, OrderRefundModel.class); if(orderRefundModel.getResult_code().equals("SUCCESS")) { order.setStatus(5); order.setRefundTime(new Date()); order.setOutRefundNo(orderRefundModel.getOut_refund_no()); order.setRefundId(orderRefundModel.getRefund_id()); order.setRefundFee(new BigDecimal(orderRefundModel.getRefund_fee()).divide(new BigDecimal("100"))); outRechargeOrderService.updateOrder(order); highRefundAudit.setStatus(1); highRefundAuditService.updateRefundAudit(highRefundAudit); return ResponseMsgUtil.success("退款成功"); } else { log.error("orderToPay error!", "退款失败"); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "退款失败!错误代码:"+orderRefundModel.getErr_code()+",错误描述"+orderRefundModel.getErr_code_des()); } } } catch (Exception e) { log.error("HighOrderController --> getUserOrderList() error!", e); return ResponseMsgUtil.exception(e); } } public String doRefundRequest(String mchId,String data) throws Exception { //小程序退款需要调用双向证书的认证 CloseableHttpClient httpClient = goodsOrderService.readCertificate(mchId); try { HttpPost httpost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund"); // 设置响应头信息 httpost.addHeader("Connection", "keep-alive"); httpost.addHeader("Accept", "*/*"); httpost.addHeader("Content-Type", "text/xml"); httpost.addHeader("Host", "api.mch.weixin.qq.com"); httpost.addHeader("X-Requested-With", "XMLHttpRequest"); httpost.addHeader("Cache-Control", "max-age=0"); httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) "); httpost.setEntity(new StringEntity(data, "UTF-8")); CloseableHttpResponse response = httpClient.execute(httpost); try { HttpEntity entity = response.getEntity(); String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8"); EntityUtils.consume(entity); return jsonStr; } finally { response.close(); } } catch (Exception e){ throw new RuntimeException(e); } finally { httpClient.close(); } } @RequestMapping(value = "/getOrderCountList", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "查询时间订单统计") public ResponseData getOrderCountList( @RequestParam(name = "finishTimeS", required = false) Long finishTimeS, @RequestParam(name = "finishTimeE", required = false) Long finishTimeE, @RequestParam(name = "status", required = false) Integer status, @RequestParam(name = "pageNum", required = true) Integer pageNum, @RequestParam(name = "pageSize", required = true) Integer pageSize, HttpServletRequest request) { try { Map map = new HashMap<>(); if (finishTimeS != null){ map.put("finishTimeS", finishTimeS.toString()); } if (finishTimeE != null){ map.put("finishTimeE", finishTimeE.toString()); } if (status != null){ map.put("status", status.toString()); } PageHelper.startPage(pageNum,pageSize); return ResponseMsgUtil.success(new PageInfo<>(outRechargeOrderService.getListOrderCount(map))); } catch (Exception e) { log.error("HighOrderController --> getUserOrderList() error!", e); return ResponseMsgUtil.exception(e); } } @RequestMapping(value = "/exportOrderListCount", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "导出订单") public ResponseData exportOrderListCount(@RequestParam(name = "finishTimeS", required = false) Long finishTimeS, @RequestParam(name = "status", required = false) Integer status, @RequestParam(name = "finishTimeE", required = false) Long finishTimeE) { try { Map map = new HashMap<>(); if (finishTimeS != null){ map.put("finishTimeS", finishTimeS.toString()); } if (finishTimeE != null){ map.put("finishTimeE", finishTimeE.toString()); } if (status != null){ map.put("status", status.toString()); } List list = outRechargeOrderService.getListOrderCount(map); String name = "/outRechargeOrder/订单统计" + System.currentTimeMillis() + ".xlsx"; String fileName = SysConst.getSysConfig().getFileUrl() + name; EasyExcel.write(fileName, ExportOutRechargeOrderCount.class).sheet("订单统计").doWrite(list); return ResponseMsgUtil.success(name); } catch (Exception e) { log.error("HighOrderController --> exportOrderList() error!", e); return ResponseMsgUtil.exception(e); } } @RequestMapping(value = "/getUserCountList", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "查询员工订单统计") public ResponseData getUserCountList( @RequestParam(name = "finishTimeS", required = false) Long finishTimeS, @RequestParam(name = "finishTimeE", required = false) Long finishTimeE, @RequestParam(name = "pageNum", required = true) Integer pageNum, @RequestParam(name = "pageSize", required = true) Integer pageSize, HttpServletRequest request) { try { Map map = new HashMap<>(); if (finishTimeS != null){ map.put("finishTimeS", finishTimeS.toString()); } if (finishTimeE != null){ map.put("finishTimeE", finishTimeE.toString()); } PageHelper.startPage(pageNum,pageSize); return ResponseMsgUtil.success(new PageInfo<>(outRechargeOrderService.getUserCountList(map))); } catch (Exception e) { log.error("HighOrderController --> getUserOrderList() error!", e); return ResponseMsgUtil.exception(e); } } @RequestMapping(value = "/exportUserOrderListCount", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "导出员工订单") public ResponseData exportUserOrderListCount(@RequestParam(name = "finishTimeS", required = false) Long finishTimeS, @RequestParam(name = "finishTimeE", required = false) Long finishTimeE) { try { Map map = new HashMap<>(); if (finishTimeS != null){ map.put("finishTimeS", finishTimeS.toString()); } if (finishTimeE != null){ map.put("finishTimeE", finishTimeE.toString()); } List list = outRechargeOrderService.getUserCountList(map); String name = "/outRechargeOrder/员工订单统计" + System.currentTimeMillis() + ".xlsx"; String fileName = SysConst.getSysConfig().getFileUrl() + name; EasyExcel.write(fileName, ExportOutRechargeUserOrderCount.class).sheet("订单统计").doWrite(list); return ResponseMsgUtil.success(name); } catch (Exception e) { log.error("HighOrderController --> exportOrderList() error!", e); return ResponseMsgUtil.exception(e); } } }