package com.taoke.autopay.controller.admin; import com.alibaba.excel.EasyExcel; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.taoke.autopay.dao.KeyOrderMapper; import com.taoke.autopay.dto.admin.OrderExcelDataDto; import com.taoke.autopay.entity.ClientInfo; import com.taoke.autopay.entity.KeyOrder; import com.taoke.autopay.entity.OrderChannelEnum; import com.taoke.autopay.entity.agent.ChannelAgent; import com.taoke.autopay.factory.OrderFactory; import com.taoke.autopay.service.ClientInfoService; import com.taoke.autopay.service.KeyOrderService; import com.taoke.autopay.service.agent.ChannelAgentService; import com.taoke.autopay.utils.Constant; import com.taoke.autopay.utils.IPUtil; import com.taoke.autopay.utils.TimeUtil; import com.taoke.autopay.vo.admin.AdminOrderVO; import com.taoke.autopay.vo.admin.OrderSearchVO; import net.sf.json.JSONObject; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.yeshi.utils.JsonUtil; import org.yeshi.utils.NumberUtil; import org.yeshi.utils.StringUtil; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; import java.net.URLEncoder; import java.util.*; @Controller @RequestMapping("/admin/api/order") public class AdminOrderController { private Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new TypeAdapter() { @Override public void write(JsonWriter out, Date value) throws IOException { String desc = ""; if (value != null) { // 判断是否是同一天 desc = TimeUtil.getGernalTime(value.getTime(), "yyyy-MM-dd HH:mm:ss"); out.value(desc); } else { out.value(""); } } @Override public Date read(JsonReader in) throws IOException { return new Date(); } }).create(); @Resource private KeyOrderService keyOrderService; @Resource private ClientInfoService clientInfoService; @Resource private ChannelAgentService channelAgentService; private KeyOrderMapper.DaoQuery createOrderQuery(OrderSearchVO vo) throws Exception { // // // KeyOrderMapper.DaoQuery query = new KeyOrderMapper.DaoQuery(); if (!StringUtil.isNullOrEmpty(vo.getKey())) { switch (vo.getKeyType()) { case 0: // 老铁ID if (!NumberUtil.isNumeric(vo.getKey().trim())) { throw new Exception("老铁ID必须为数字"); } query.uid = Long.parseLong(vo.getKey()); break; case 1: // 代理ID if (!NumberUtil.isNumeric(vo.getKey().trim())) { throw new Exception("代理ID必须为数字"); } query.agentId = Long.parseLong(vo.getKey().trim()); break; case 2: // 订单号 query.orderNo = vo.getKey().trim(); break; case 3: // 支付设备ID if (!NumberUtil.isNumeric(vo.getKey().trim())) { throw new Exception("支付设备ID必须为数字"); } query.distributeClientUid = Long.parseLong(vo.getKey().trim()); break; } } if (!StringUtil.isNullOrEmpty(vo.getState())) { query.state = Integer.parseInt(vo.getState()); } if (!StringUtil.isNullOrEmpty(vo.getOrderChannel())) { query.orderChannel = OrderChannelEnum.valueOf(vo.getOrderChannel()).getKey(); } if (!StringUtil.isNullOrEmpty(vo.getStartDate())) { query.minCreateTime = new Date(TimeUtil.convertToTimeTemp(vo.getStartDate(), "yyyy-MM-dd")); } if (!StringUtil.isNullOrEmpty(vo.getEndDate())) { query.maxCreateTime = TimeUtil.getNextDay(1, new Date(TimeUtil.convertToTimeTemp(vo.getEndDate(), "yyyy-MM-dd")).getTime()); } query.ignore = vo.getIgnore(); return query; } @ResponseBody @RequestMapping("list") public String listOrder(OrderSearchVO search, int page, int limit) { //先查询所有的数据 try { KeyOrderMapper.DaoQuery query = createOrderQuery(search); query.sortList = Arrays.asList(new String[]{"create_time desc"}); query.start = (page - 1) * limit; query.count = limit; List orderList = keyOrderService.list(query); long count = keyOrderService.count(query); // 统计设备 Map clientMap = new HashMap<>(); if (orderList.size() > 0) { List cids = new ArrayList<>(); for (KeyOrder u : orderList) { if (u.getDistributeClientUid() != null) { cids.add(u.getDistributeClientUid()); } } List clients = clientInfoService.listByIds(cids); for (ClientInfo client : clients) { clientMap.put(client.getId(), client); } } // 统计代理信息 Map agentMap = new HashMap<>(); List agengIds = new ArrayList<>(); for (KeyOrder u : orderList) { if (u.getAgentId() != null) { agengIds.add(u.getAgentId()); } } List agents = channelAgentService.listByIds(agengIds); for (ChannelAgent agent : agents) { agentMap.put(agent.getId(), agent); } // 转vo List voList = new ArrayList<>(); for (KeyOrder order : orderList) { voList.add(OrderFactory.createAdminVO(order, clientMap.get(order.getDistributeClientUid()), agentMap.get(order.getAgentId()))); } JSONObject data = new JSONObject(); data.put("count", count); data.put("list", gson.toJson(voList)); return JsonUtil.loadTrueResult(data); }catch(Exception e){ return JsonUtil.loadFalseResult(e.getMessage()); } } @RequestMapping("downLoadOrder") public void downLoadOrder(OrderSearchVO search, HttpServletResponse response) throws IOException { try { KeyOrderMapper.DaoQuery query = createOrderQuery(search); query.sortList = Arrays.asList(new String[]{"create_time desc"}); long count = keyOrderService.count(query); query.start = 0; query.count = (int) count; List orderList = keyOrderService.list(query); // 统计订单与金额 Map userOrderCountMap = new HashMap<>(); Map userOrderMoneyMap = new HashMap<>(); Map payDeviceMap = new HashMap<>(); // 统计代理信息 Map agentMap = new HashMap<>(); List agengIds = new ArrayList<>(); for (KeyOrder u : orderList) { if (u.getAgentId() != null) { agengIds.add(u.getAgentId()); } } List agents = channelAgentService.listByIds(agengIds); for (ChannelAgent agent : agents) { agentMap.put(agent.getId(), agent); } List dataList = new ArrayList<>(); for (KeyOrder order : orderList) { if (!userOrderCountMap.containsKey(order.getUid())) { userOrderCountMap.put(order.getUid(), 1); } else { userOrderCountMap.put(order.getUid(), userOrderCountMap.get(order.getUid()) + 1); } if (!userOrderMoneyMap.containsKey(order.getUid())) { userOrderMoneyMap.put(order.getUid(), new BigDecimal(0)); } if (order.getOrderMoney() != null) { userOrderMoneyMap.put(order.getUid(), userOrderMoneyMap.get(order.getUid()).add(order.getOrderMoney())); } if (!payDeviceMap.containsKey(order.getDistributeClientUid()) && order.getDistributeClientUid() != null) { ClientInfo clientInfo = clientInfoService.selectByPrimaryKey(order.getDistributeClientUid()); if (clientInfo != null) { payDeviceMap.put(clientInfo.getId(), clientInfo); } } } for (KeyOrder order : orderList) { OrderExcelDataDto dto = new OrderExcelDataDto(); dto.setId(order.getId()); dto.setAgent(agentMap.get(order.getAgentId()) == null ? "" : agentMap.get(order.getAgentId()).getName()); dto.setCreateTime(TimeUtil.getGernalTime(order.getCreateTime())); dto.setOrderMoney(order.getOrderMoney() == null ? "" : order.getOrderMoney().toString()); if (order.getOrderChannel() != null) { switch (order.getOrderChannel()) { case Constant .ORDER_CHANNEL_CYX: dto.setOrderChannel("超佣享"); break; case Constant .ORDER_CHANNEL_BPS: dto.setOrderChannel("爆品社"); break; default: dto.setOrderChannel(""); } } else { dto.setOrderChannel(""); } dto.setOrderNo(order.getOrderNo()); if (order.getOrderType() != null) { switch (order.getOrderType()) { case Constant.ORDER_TYPE_DY: dto.setPlatform("抖音"); break; case Constant.ORDER_TYPE_KS: dto.setPlatform("快手"); break; default: dto.setPlatform(""); } } else { dto.setPlatform(""); } if (order.getPayType() != null) { switch (order.getPayType()) { case Constant.PAY_TYPE_WITH_ORDER_NO: dto.setPayType("按订单"); break; case Constant.PAY_TYPE_WITH_MONEY: dto.setPayType("按金额"); break; default: dto.setPayType(""); } } else { dto.setPayType(""); } dto.setUid(order.getUid()); if (order.getState() == KeyOrder.STATE_PAY) { dto.setPaySuccess("是"); } else { dto.setPaySuccess("否"); } dto.setStateDesc(order.getStateDesc()); dto.setTotalCount(userOrderCountMap.get(order.getUid())); dto.setTotalMoney(userOrderMoneyMap.get(order.getUid()).toString()); dto.setKey(order.getKey()); if (order.getPayTime() != null) { dto.setPayTime(TimeUtil.getGernalTime(order.getPayTime().getTime(), "yyyy-MM-dd HH:mm:ss")); } ClientInfo device = payDeviceMap.get(order.getDistributeClientUid()); if (device != null) { dto.setPayDevice(device.getAccount()); } else { dto.setPayDevice(""); } dto.setPayMerchant(order.getPayMerchant()); if(StringUtil.isNullOrEmpty(order.getIpInfo())) { dto.setArea(""); }else{ IPUtil.IPInfo ipInfo = gson.fromJson(order.getIpInfo(), IPUtil.IPInfo.class); dto.setArea(String.format("%s/%s",ipInfo.getProvince(),ipInfo.getCity())); } if(order.getIgnore()==null) { dto.setIgnore("未知"); }else{ dto.setIgnore(order.getIgnore()?"是":"否"); } dataList.add(dto); } response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode(TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyyMMdd_HHmmss"), "UTF-8"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); EasyExcel.write(response.getOutputStream(), OrderExcelDataDto.class).sheet("订单").doWrite(dataList); }catch(Exception e){ response.sendError(402,e.getMessage()); } } }