package com.yeshi.fanli.controller.client.v1; import java.io.PrintWriter; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.yeshi.utils.DateUtil; import org.yeshi.utils.IPUtil; import org.yeshi.utils.JsonUtil; import org.yeshi.utils.encrypt.DESUtil; import com.yeshi.fanli.entity.AppVersionInfo; import com.yeshi.fanli.entity.accept.AcceptData; import com.yeshi.fanli.entity.bus.user.HongBaoV2; import com.yeshi.fanli.entity.bus.user.LostOrder; import com.yeshi.fanli.entity.bus.user.Order; import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo; import com.yeshi.fanli.entity.bus.user.UserInfo; import com.yeshi.fanli.entity.order.CommonOrder; import com.yeshi.fanli.entity.taobao.TaoBaoOrder; import com.yeshi.fanli.exception.order.CommonOrderException; import com.yeshi.fanli.log.LogHelper; import com.yeshi.fanli.service.inter.config.AppVersionService; import com.yeshi.fanli.service.inter.config.ConfigService; import com.yeshi.fanli.service.inter.count.HongBaoV2CountService; import com.yeshi.fanli.service.inter.order.CommonOrderService; import com.yeshi.fanli.service.inter.order.LostOrderService; import com.yeshi.fanli.service.inter.order.OrderService; import com.yeshi.fanli.service.inter.order.tb.TaoBaoOrderService; import com.yeshi.fanli.service.inter.user.UserInfoExtraService; import com.yeshi.fanli.service.inter.user.UserInfoService; import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService; import com.yeshi.fanli.util.CMQManager; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.RedisManager; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.TimeUtil; import com.yeshi.fanli.util.VersionUtil; import com.yeshi.fanli.util.account.UserUtil; import com.yeshi.fanli.vo.order.CommonOrderVO; import com.yeshi.fanli.vo.user.UserInfoExtraVO; import net.sf.json.JSONObject; @Controller @RequestMapping("api/v1/user/order") public class UserOrderController { @Resource private ConfigService configService; @Resource private AppVersionService appVersionService; @Resource private UserInfoService userInfoService; @Resource private UserInfoExtraService userInfoExtraService; @Resource private CommonOrderService commonOrderService; @Resource private HongBaoV2CountService hongBaoV2CountService; @Resource private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService; @Resource private TaoBaoOrderService taoBaoOrderService; @Resource private OrderService orderService; @Resource private LostOrderService lostOrderService; @Resource private RedisManager redisManager; /** * 订单列表 * * @param acceptData * @param page * @param uid * @param state * 状态:0全部 1-未到账 2-已到账 3-已失效 4已收货 * @param type * 类型:1-返利订单 2-分享订单 3-邀请订单 * @param orderState * 1有效订单 2 维权订单 3失效订单 * @param orderNo * 订单号 * @param startTime * 起始时间 * @param endTime * 结束时间 * @param slotTime * 时间段:1-最近三天 2-最近七天 3最近半月 4本月 5近三月 6近半年 * @param dateType * 1-今日 2-昨天 3-本月 4-上个月 | * @param needCount * @param out */ @RequestMapping(value = "getorder", method = RequestMethod.POST) public void getOrder(AcceptData acceptData, Integer page, Long uid, Integer state, @RequestParam(name = "type", required = false) String type1, Integer orderState, String orderNo, String startTime, String endTime, Integer slotTime, Boolean needCount, Integer dateType, Integer goodsType, PrintWriter out) { Integer type = null; if (StringUtil.isNullOrEmpty(type1)) { type = null; } else { type = Integer.parseInt(type1); } if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } if (needCount == null) needCount = false; if (page == null || page < 1) { page = 1; } if (state != null && state == 0) { state = null;// 所有状态 } // 转换状态 if (state != null && state == 4) { orderState = state; // 已收货状态 state = null; // 清空 } // 转换状态 if (state != null && state == 5) { orderState = 2; // 已维权 state = null; // 清空 } if (type != null && type == 0) { type = null; // 所有类型订单 } Integer tempState = state; // 转换状态 if (state != null && orderState != null && (orderState == 2 || orderState == 3)) { state = null; // 清空 } if (!VersionUtil.greaterThan_1_6_0(acceptData.getPlatform(), acceptData.getVersion())) { goodsType = Constant.SOURCE_TYPE_TAOBAO; } else if (goodsType != null && goodsType == 0) { goodsType = null; // 所有平台订单 } try { if (slotTime != null) { SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd"); endTime = sd.format(new Date()); startTime = convertDate(slotTime, endTime); } } catch (Exception e) { e.printStackTrace(); } if (endTime != null && endTime.trim().length() > 0) { endTime += " 23:59:59"; } String orderFindUrl = null; try { long count = 0; long totalValid = 0; long totalProces = 0; long totalInvite = 0; long todayTotal = 0; BigDecimal todayMoney = null; // 查询列表 List list = commonOrderService.getOrderByUid(acceptData, page, uid, state, type, orderState, orderNo, startTime, endTime, dateType, goodsType); if (list != null && list.size() > 0) { // 统计总数 count = commonOrderService.countGroupOrderNoByUid(uid, state, type, orderState, orderNo, startTime, endTime, dateType, goodsType); } // 需要统计筛选信息 :未失效的总金额 以及订单 if (needCount && page == 1) { todayMoney = commonOrderService.countBonusOrderMoney(uid, type, dateType, startTime, endTime, goodsType); todayTotal = commonOrderService.countBonusOrderNumber(uid, type, dateType, startTime, endTime, goodsType); // 有效订单 totalValid = commonOrderService.countUserOrderToApp(uid, type, startTime, endTime, dateType, goodsType, tempState, 1); // 维权订单 totalProces = commonOrderService.countUserOrderToApp(uid, type, startTime, endTime, dateType, goodsType, null, 2); // 失效订单 totalInvite = commonOrderService.countUserOrderToApp(uid, type, startTime, endTime, dateType, goodsType, null, 3); } if (todayMoney == null) { todayMoney = new BigDecimal(0.00); } // 判断是否需要显示订单找回提示 if (VersionUtil.greaterThan_2_0_2(acceptData.getPlatform(), acceptData.getVersion())) if (state ==null && page == 1) { if (redisManager.frequencyLimit("orderlist-" + acceptData.getDevice(), 8, 4)||count==0L) {// 8秒内请求3次触发 orderFindUrl = configService.get("order_find_notify_url"); } } JSONObject data = new JSONObject(); data.put("count", count); data.put("result_list", JsonUtil.getApiCommonGson().toJson(list)); data.put("helpUrl", configService.get("order_list_help")); if (type != null && type == 1) { data.put("todayMoney", "预估返利总额 ¥" + todayMoney.setScale(2, BigDecimal.ROUND_DOWN).toString()); } else if (type != null && (type == 2 || type == 3)) { data.put("todayMoney", "预估奖金总额 ¥" + todayMoney.setScale(2, BigDecimal.ROUND_DOWN).toString()); } else { data.put("todayMoney", "预估总额 ¥" + todayMoney.setScale(2, BigDecimal.ROUND_DOWN).toString()); } data.put("todayTotal", "共" + todayTotal + "笔"); data.put("totalValid", totalValid); // 有效数量 data.put("totalProces", totalProces); // 维权数量 data.put("totalInvite", totalInvite); // 失效数量 if (orderFindUrl != null) data.put("findOrderHelpUrl", orderFindUrl); out.print(JsonUtil.loadTrueResult(data)); } catch (CommonOrderException e) { out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg())); } catch (Exception e) { out.print(JsonUtil.loadFalseResult(1, "查询失败")); LogHelper.errorDetailInfo(e); } } /** * 用户订单统计 * * @param acceptData * @param uid * 用户id * @param out */ @RequestMapping(value = "countorder", method = RequestMethod.POST) public void countOrder(AcceptData acceptData, Long uid, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } try { UserInfo user = userInfoService.selectByPKey(uid); if (user == null) { out.print(JsonUtil.loadFalseResult(1, "用户不存在")); return; } UserInfo userInfo = UserUtil.filterForClientUser(user); // 1.5.0 版本之后返回新的等级 String version = acceptData.getVersion(); if (version != null && version.trim().length() > 0) { int versionCode = Integer.parseInt(version); String platform = acceptData.getPlatform(); AppVersionInfo versionInfo = appVersionService.getByPlatformAndVersion(platform, "1.5.0"); if (versionInfo != null) { int versionCode150 = versionInfo.getVersionCode(); if (versionCode >= versionCode150) { UserInfoExtraVO userInfoExtra = userInfoExtraService.getInfoExtraVOByUid(user.getId()); if (userInfoExtra != null && userInfoExtra.getUserRank() != null) { String picture = userInfoExtra.getUserRank().getPicture(); String icon = userInfoExtra.getUserRank().getIcon(); userInfo.setRankIcon(icon); userInfo.setRankNamePicture(picture); } } } } JSONObject data = new JSONObject(); data.put("userInfo", userInfo); Integer goodsType = null; // 版本区分 if (!VersionUtil.greaterThan_1_6_0(acceptData.getPlatform(), acceptData.getVersion())) { goodsType = Constant.SOURCE_TYPE_TAOBAO; } /* 总订单统计 */ Map countOrder = commonOrderService.countHistoryOrder(uid, null, goodsType); int self = 0; if (countOrder.get("totalSelf") != null) { self = countOrder.get("totalSelf").intValue(); } int shared = 0; if (countOrder.get("totalShared") != null) { shared = countOrder.get("totalShared").intValue(); } int invite = 0; if (countOrder.get("totalInvite") != null) { invite = countOrder.get("totalInvite").intValue(); } int total = self + shared + invite; data.put("total", total); data.put("self", self); data.put("shared", shared); data.put("invite", invite); /* 今日订单统计 */ Map countToday = commonOrderService.countHistoryOrder(uid, 1, goodsType); int todaySelf = 0; if (countToday.get("totalSelf") != null) { todaySelf = countToday.get("totalSelf").intValue(); } int todayShared = 0; if (countToday.get("totalShared") != null) { todayShared = countToday.get("totalShared").intValue(); } int todayInvite = 0; if (countToday.get("totalInvite") != null) { todayInvite = countToday.get("totalInvite").intValue(); } int todayTotal = todaySelf + todayShared + todayInvite; JSONObject todaydata = new JSONObject(); todaydata.put("total", todayTotal); todaydata.put("self", todaySelf); todaydata.put("shared", todayShared); todaydata.put("invite", todayInvite); data.put("today", todaydata); /* 昨日订单统计 */ Map countYesterday = commonOrderService.countHistoryOrder(uid, 2, goodsType); int yesterdaySelf = 0; if (countYesterday.get("totalSelf") != null) { yesterdaySelf = countYesterday.get("totalSelf").intValue(); } int yesterdayShared = 0; if (countYesterday.get("totalShared") != null) { yesterdayShared = countYesterday.get("totalShared").intValue(); } int yesterdayInvite = 0; if (countYesterday.get("totalInvite") != null) { yesterdayInvite = countYesterday.get("totalInvite").intValue(); } int yesterdayTotal = yesterdaySelf + yesterdayShared + yesterdayInvite; JSONObject yesterdaydata = new JSONObject(); yesterdaydata.put("total", yesterdayTotal); yesterdaydata.put("self", yesterdaySelf); yesterdaydata.put("shared", yesterdayShared); yesterdaydata.put("invite", yesterdayInvite); data.put("yesterday", yesterdaydata); out.print(JsonUtil.loadTrueResult(data)); } catch (Exception e) { out.print(JsonUtil.loadFalseResult(1, "获取信息失败")); e.printStackTrace(); } } /** * 统计各个平台数据 * * @param acceptData * @param uid * @param goodsType * @param out */ @RequestMapping(value = "getNearOrderNum", method = RequestMethod.POST) public void getNearOrderNum(AcceptData acceptData, Long uid, Integer goodsType, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } if (goodsType == null || goodsType > 3 || goodsType < 1) { out.print(JsonUtil.loadFalseResult(1, "平台类型缺失或不正确")); return; } /* 今日订单统计 */ Map countToday = commonOrderService.countHistoryOrder(uid, 1, goodsType); int todaySelf = 0; if (countToday.get("totalSelf") != null) { todaySelf = countToday.get("totalSelf").intValue(); } int todayShared = 0; if (countToday.get("totalShared") != null) { todayShared = countToday.get("totalShared").intValue(); } int todayInvite = 0; if (countToday.get("totalInvite") != null) { todayInvite = countToday.get("totalInvite").intValue(); } int todayTotal = todaySelf + todayShared + todayInvite; JSONObject todaydata = new JSONObject(); todaydata.put("total", todayTotal); todaydata.put("self", todaySelf); todaydata.put("shared", todayShared); todaydata.put("invite", todayInvite); /* 昨日订单统计 */ Map countYesterday = commonOrderService.countHistoryOrder(uid, 2, goodsType); int yesterdaySelf = 0; if (countYesterday.get("totalSelf") != null) { yesterdaySelf = countYesterday.get("totalSelf").intValue(); } int yesterdayShared = 0; if (countYesterday.get("totalShared") != null) { yesterdayShared = countYesterday.get("totalShared").intValue(); } int yesterdayInvite = 0; if (countYesterday.get("totalInvite") != null) { yesterdayInvite = countYesterday.get("totalInvite").intValue(); } int yesterdayTotal = yesterdaySelf + yesterdayShared + yesterdayInvite; JSONObject yesterdaydata = new JSONObject(); yesterdaydata.put("total", yesterdayTotal); yesterdaydata.put("self", yesterdaySelf); yesterdaydata.put("shared", yesterdayShared); yesterdaydata.put("invite", yesterdayInvite); JSONObject data = new JSONObject(); data.put("today", todaydata); data.put("yesterday", yesterdaydata); out.print(JsonUtil.loadTrueResult(data)); } /** * 统计奖金 * * @param acceptData * @param uid * @param out */ @RequestMapping(value = "countBonus", method = RequestMethod.POST) public void countBonus(AcceptData acceptData, Long uid, Integer dateType, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } long nowTime = System.currentTimeMillis(); long recievedTime = TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(nowTime, "yyyy-MM") + "-25 10", "yyyy-MM-dd HH"); try { Object shareCount = 0; BigDecimal sharemoney = new BigDecimal(0.00); Object inviteCount = 0; BigDecimal inviteMoney = new BigDecimal(0.00); if (nowTime > recievedTime && dateType == 4) {// 实际到账 List inviteTypes = new ArrayList<>(); inviteTypes.add(HongBaoV2.TYPE_YIJI); inviteTypes.add(HongBaoV2.TYPE_ERJI); inviteTypes.add(HongBaoV2.TYPE_SHARE_YIJI); inviteTypes.add(HongBaoV2.TYPE_SHARE_ERJI); List shareTypes = new ArrayList<>(); shareTypes.add(HongBaoV2.TYPE_SHARE_GOODS); Date minGetTime = new Date( TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(nowTime, "yyyy-MM") + "-25", "yyyy-MM-dd")); Date maxGetTime = new Date(nowTime); inviteMoney = hongBaoV2CountService.sumAlreadyGetMoneyByUid(uid, inviteTypes, minGetTime, maxGetTime); inviteCount = hongBaoV2CountService.countAlreadyGetMoneyByUid(uid, inviteTypes, minGetTime, maxGetTime); sharemoney = hongBaoV2CountService.sumAlreadyGetMoneyByUid(uid, shareTypes, minGetTime, maxGetTime); shareCount = hongBaoV2CountService.countAlreadyGetMoneyByUid(uid, shareTypes, minGetTime, maxGetTime); } else {// 预估到账 Integer goodsType = null; // 版本区分 if (!VersionUtil.greaterThan_1_6_0(acceptData.getPlatform(), acceptData.getVersion())) { goodsType = Constant.SOURCE_TYPE_TAOBAO; } Map shareMap = commonOrderService.countBonusOrderMoneyAndNumber(uid, 2, dateType, null, null, goodsType); if (shareMap != null) { Object totalNum = shareMap.get("totalNum"); if (totalNum != null) { shareCount = totalNum; } Object totalmoney = shareMap.get("totalmoney"); if (totalmoney != null) { sharemoney = (BigDecimal) totalmoney; } } // 邀请统计 Map inviteMap = commonOrderService.countBonusOrderMoneyAndNumber(uid, 3, dateType, null, null, goodsType); if (inviteMap != null) { Object totalNum = inviteMap.get("totalNum"); if (totalNum != null) { inviteCount = totalNum; } Object totalmoney = inviteMap.get("totalmoney"); if (totalmoney != null) { inviteMoney = (BigDecimal) totalmoney; } } } JSONObject data = new JSONObject(); data.put("shareCount", shareCount); data.put("sharemoney", sharemoney.setScale(2, BigDecimal.ROUND_DOWN).toString()); data.put("inviteCount", inviteCount); data.put("inviteMoney", inviteMoney.setScale(2, BigDecimal.ROUND_DOWN).toString()); data.put("showTiCheng", hongBaoV2CountService.getTotalTiChengCount(uid) > 0); out.print(JsonUtil.loadTrueResult(data)); } catch (Exception e) { out.print(JsonUtil.loadFalseResult(1, "获取信息失败")); e.printStackTrace(); } } /** * 上传解析到的淘宝订单 * * @param acceptData * @param uid * @param orderData * @param source * @param out */ @RequestMapping(value = "uploadParsedOrder", method = RequestMethod.POST) public void uploadParsedOrder(AcceptData acceptData, Long uid, String orderData, String source, HttpServletRequest request, PrintWriter out) { if (uid == null || StringUtil.isNullOrEmpty(orderData)) { out.print(JsonUtil.loadFalseResult(1, "数据错误")); return; } String[] orders = null; try { String orderIds = DESUtil.decode(orderData, StringUtil.getBase64String("YeShiFANLI889*+"), StringUtil.getBase64String("*M#34f?,")); orders = orderIds.split(","); } catch (Exception e) { e.printStackTrace(); } if ("findOrder".equalsIgnoreCase(source)) { boolean success = false; // 匹配订单 for (String order : orders) { if (!StringUtil.isNullOrEmpty(order)) { List orderList = taoBaoOrderService.getTaoBaoOrderByOrderId(order); // 计算订单状态 if (orderList != null && orderList.size() > 0) { int inValid = 0; for (TaoBaoOrder taoBaoOrder : orderList) { if (taoBaoOrder.getOrderState().equalsIgnoreCase("订单失效")) { inValid++; } } // 订单全是失效 if (inValid == orderList.size()) continue; List commonOrderList = commonOrderService .listBySourceTypeAndOrderId(Constant.SOURCE_TYPE_TAOBAO, order); if (commonOrderList == null || commonOrderList.size() == 0) { Order o = orderService.findOrderByOrderIdAndType(order, Order.ORDER_TYPE_TAOBAO); if (o != null)// 原来已经存在,则不需要找回 continue; Order or = new Order(); or.setBeizhu("人工自动找回补单"); or.setCreatetime(System.currentTimeMillis()); or.setOrderId(order); or.setOrderType(1); or.setState(Order.STATE_YIZHIFU); or.setUserInfo(new UserInfo(uid)); or.setVersion(2); // 加入到订单表 boolean isS; try { isS = orderService.addOrder(or); if (isS) { CMQManager.getInstance().addTaoBaoOrderMsg(order); // 加入到LostOrder LostOrder lo = new LostOrder(); lo.setCreateTime(System.currentTimeMillis()); lo.setHandleTime(System.currentTimeMillis()); lo.setIpInfo(IPUtil.getRemotIP(request) + ":" + request.getRemotePort()); lo.setOrder(or); lo.setOrderId(order); lo.setState(LostOrder.STATE_PASS); lo.setResultCode(LostOrder.RESULT_CODE_VERFING); lo.setType(LostOrder.TYPE_TAOBAO); lo.setUserInfo(new UserInfo(uid)); lostOrderService.saveLostOrder(lo); if (success == false) success = true; } } catch (Exception e) { try { LogHelper.errorDetailInfo(e, order, ""); } catch (Exception e1) { e1.printStackTrace(); } } } } } } if (success) { out.print(JsonUtil.loadTrue(0, null, "订单找回成功,请到“我的-订单”中查看")); return; } else { out.print(JsonUtil.loadFalseResult("没有可找回的订单,请尝试手动找回")); return; } } else { String orderId = null; if (orders != null && orders.length > 0) orderId = orders[0]; if (!StringUtil.isNullOrEmpty(orderId) && orderId.length() > 6) { orderId = orderId.substring(orderId.length() - 6, orderId.length()); UserExtraTaoBaoInfo info = userExtraTaoBaoInfoService.getByUid(uid); if (info != null) { UserExtraTaoBaoInfo update = new UserExtraTaoBaoInfo(); update.setId(info.getId()); update.setTaoBaoOrderEnd6Num(orderId); userExtraTaoBaoInfoService.updateSelective(update); } } } out.print(JsonUtil.loadTrueResult("")); } /** * 时间转换 * * @param slotTime * @param startTime * @return * @throws Exception */ public String convertDate(Integer slotTime, String endTime) throws Exception { String startTime = null; switch (slotTime) { case 1: // 最近三天 startTime = DateUtil.reduceDay(2, endTime); break; case 2: // 最近七天 startTime = DateUtil.reduceDay(6, endTime); break; case 3: // 最近15天 (半月) startTime = DateUtil.reduceDay(14, endTime); break; case 4: // 最近三十天 (本月) startTime = DateUtil.reduceDay(29, endTime); break; case 5: // 最近九十天(近三月) startTime = DateUtil.reduceDay(3 * 30 - 1, endTime); break; case 6: // 最近一百八十天(近半年) startTime = DateUtil.reduceDay(6 * 30 - 1, endTime); break; default: break; } return startTime; } }