记得上下班打卡 | git大法好,push需谨慎

Commit 7b1f5153 authored by wangyifan's avatar wangyifan

slime:拼团订单管理

parent dd624d7d
package com.liquidnet.service.kylin.dto.vo.groupbuy;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* 管理端拼团订单详情 VO(与列表 VO 分离)。
*/
@Data
public class KylinGroupBuyPartnerOrderDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "拼团订单号")
private String groupOrderId;
@ApiModelProperty(value = "活动ID")
private String activityId;
@ApiModelProperty(value = "拼团活动名称")
private String activityName;
@ApiModelProperty(value = "订单状态 0拼团中 1拼团成功 2拼团失败 -1待支付发起 3已取消")
private Integer status;
@ApiModelProperty(value = "订单金额(团长票单实付)")
private BigDecimal orderAmount;
@ApiModelProperty(value = "创建时间")
private String createdAt;
@ApiModelProperty(value = "当前参团人数")
private Integer currentCount;
@ApiModelProperty(value = "成团目标人数")
private Integer targetCount;
@ApiModelProperty(value = "参团成员")
private List<KylinGroupBuyPartnerOrderMemberVo> members;
@ApiModelProperty(value = "发起人用户ID")
private String leaderUserId;
@ApiModelProperty(value = "发起人昵称")
private String leaderNickname;
@ApiModelProperty(value = "发起人头像")
private String leaderAvatar;
}
package com.liquidnet.service.kylin.dto.vo.groupbuy;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 管理端拼团订单列表 VO(与详情 VO 分离)。
*/
@Data
public class KylinGroupBuyPartnerOrderListVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "拼团订单号 groupOrderId")
private String groupOrderId;
@ApiModelProperty(value = "拼团活动名称")
private String activityName;
@ApiModelProperty(value = "发起人用户ID")
private String leaderUserId;
@ApiModelProperty(value = "发起人昵称")
private String leaderNickname;
@ApiModelProperty(value = "发起人头像")
private String leaderAvatar;
@ApiModelProperty(value = "当前参团人数")
private Integer currentCount;
@ApiModelProperty(value = "成团目标人数")
private Integer targetCount;
@ApiModelProperty(value = "订单金额(团长票单实付)")
private BigDecimal orderAmount;
@ApiModelProperty(value = "创建时间 yyyy-MM-dd HH:mm:ss")
private String createdAt;
@ApiModelProperty(value = "状态 0拼团中 1拼团成功 2拼团失败;列表可能出现 -1待支付发起 3已取消")
private Integer status;
}
package com.liquidnet.service.kylin.dto.vo.groupbuy;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 管理端拼团订单详情-成员项。
*/
@Data
public class KylinGroupBuyPartnerOrderMemberVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用户ID")
private String userId;
@ApiModelProperty(value = "昵称")
private String nickname;
@ApiModelProperty(value = "头像")
private String avatar;
@ApiModelProperty(value = "是否团长 1是 0否")
private Integer isLeader;
@ApiModelProperty(value = "成员状态 -1待支付 0已加入 1已退款 2已取消")
private Integer status;
}
package com.liquidnet.service.kylin.dto.vo.groupbuy;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 管理端拼团订单统计。
*/
@Data
public class KylinGroupBuyPartnerOrderStatsVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "订单总数(含待支付发起、已取消)")
private Long total;
@ApiModelProperty(value = "拼团中数量 status=0")
private Long pending;
@ApiModelProperty(value = "拼团成功数量 status=1")
private Long success;
@ApiModelProperty(value = "拼团失败数量 status=2")
private Long failed;
}
...@@ -5,9 +5,11 @@ import com.liquidnet.service.base.ResponseDto; ...@@ -5,9 +5,11 @@ import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityCreateParam; import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityCreateParam;
import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityUpdateParam; import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityUpdateParam;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyActivityVo; import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyActivityVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyOrderVo; import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyPartnerOrderDetailVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyPartnerOrderListVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyPartnerOrderStatsVo;
import java.util.List; import javax.servlet.http.HttpServletResponse;
import java.util.Map; import java.util.Map;
public interface IKylinGroupBuyPartnerService { public interface IKylinGroupBuyPartnerService {
...@@ -26,5 +28,24 @@ public interface IKylinGroupBuyPartnerService { ...@@ -26,5 +28,24 @@ public interface IKylinGroupBuyPartnerService {
ResponseDto<Boolean> toggle(String activityId, Integer targetStatus); ResponseDto<Boolean> toggle(String activityId, Integer targetStatus);
ResponseDto<List<KylinGroupBuyOrderVo>> orders(String activityId, Integer status, Integer page, Integer size); /**
* 拼团订单顶部统计:总数 + 拼团中/成功/失败。
*/
ResponseDto<KylinGroupBuyPartnerOrderStatsVo> orderStats();
/**
* 拼团订单分页列表。status 仅允许 0/1/2 或空(空=全部含 -1/3)。
*/
ResponseDto<PageInfo<KylinGroupBuyPartnerOrderListVo>> orderList(String keyword, Integer status,
Integer page, Integer size);
/**
* 拼团订单详情。
*/
ResponseDto<KylinGroupBuyPartnerOrderDetailVo> orderDetail(String groupOrderId);
/**
* 导出拼团订单(列同列表,筛选同列表)。
*/
void exportOrders(String keyword, Integer status, HttpServletResponse response);
} }
...@@ -50,6 +50,10 @@ ...@@ -50,6 +50,10 @@
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -5,6 +5,9 @@ import com.liquidnet.service.base.ResponseDto; ...@@ -5,6 +5,9 @@ import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityCreateParam; import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityCreateParam;
import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityUpdateParam; import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityUpdateParam;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyActivityVo; import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyActivityVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyPartnerOrderDetailVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyPartnerOrderListVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyPartnerOrderStatsVo;
import com.liquidnet.service.kylin.service.partner.IKylinGroupBuyPartnerService; import com.liquidnet.service.kylin.service.partner.IKylinGroupBuyPartnerService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -20,6 +23,7 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -20,6 +23,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Map; import java.util.Map;
...@@ -81,4 +85,39 @@ public class KylinGroupBuyPartnerController { ...@@ -81,4 +85,39 @@ public class KylinGroupBuyPartnerController {
@RequestParam("targetStatus") @NotNull(message = "目标状态不能为空") Integer targetStatus) { @RequestParam("targetStatus") @NotNull(message = "目标状态不能为空") Integer targetStatus) {
return groupBuyPartnerService.toggle(activityId, targetStatus); return groupBuyPartnerService.toggle(activityId, targetStatus);
} }
@GetMapping("/orders/stats")
@ApiOperation(value = "拼团订单统计", position = 10)
@ApiResponse(response = KylinGroupBuyPartnerOrderStatsVo.class, code = 200, message = "接口返回对象参数")
public ResponseDto<KylinGroupBuyPartnerOrderStatsVo> orderStats() {
return groupBuyPartnerService.orderStats();
}
@GetMapping("/orders")
@ApiOperation(value = "拼团订单列表", position = 11)
@ApiResponse(response = KylinGroupBuyPartnerOrderListVo.class, code = 200, message = "接口返回对象参数")
public ResponseDto<PageInfo<KylinGroupBuyPartnerOrderListVo>> orderList(
@RequestParam(value = "keyword", required = false) String keyword,
@RequestParam(value = "status", required = false) Integer status,
@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
@RequestParam(value = "size", required = false, defaultValue = "20") Integer size) {
return groupBuyPartnerService.orderList(keyword, status, page, size);
}
@GetMapping("/orders/details")
@ApiOperation(value = "拼团订单详情", position = 12)
@ApiResponse(response = KylinGroupBuyPartnerOrderDetailVo.class, code = 200, message = "接口返回对象参数")
public ResponseDto<KylinGroupBuyPartnerOrderDetailVo> orderDetail(
@RequestParam("groupOrderId") @NotNull(message = "拼团订单号不能为空") String groupOrderId) {
return groupBuyPartnerService.orderDetail(groupOrderId);
}
@GetMapping("/orders/export")
@ApiOperation(value = "导出拼团订单", position = 13)
public void exportOrders(
@RequestParam(value = "keyword", required = false) String keyword,
@RequestParam(value = "status", required = false) Integer status,
HttpServletResponse response) {
groupBuyPartnerService.exportOrders(keyword, status, response);
}
} }
...@@ -15,11 +15,18 @@ import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityCreateParam; ...@@ -15,11 +15,18 @@ import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityCreateParam;
import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityUpdateParam; import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityUpdateParam;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyActivityVo; import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyActivityVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyDiscountVo; import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyDiscountVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyMemberVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyOrderVo; import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyOrderVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyPartnerOrderDetailVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyPartnerOrderListVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyPartnerOrderMemberVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyPartnerOrderStatsVo;
import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketTimesVo; import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketTimesVo;
import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketVo; import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo; import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo;
import com.liquidnet.service.kylin.service.partner.IKylinGroupBuyPartnerService; import com.liquidnet.service.kylin.service.partner.IKylinGroupBuyPartnerService;
import com.liquidnet.service.slime.util.GroupBuyOrderExcelUtil;
import com.liquidnet.service.slime.util.ObjectUtil; import com.liquidnet.service.slime.util.ObjectUtil;
import com.liquidnet.service.slime.util.QueueUtil; import com.liquidnet.service.slime.util.QueueUtil;
import com.liquidnet.service.slime.util.RedisSlimeUtils; import com.liquidnet.service.slime.util.RedisSlimeUtils;
...@@ -31,14 +38,19 @@ import org.springframework.data.mongodb.core.query.Criteria; ...@@ -31,14 +38,19 @@ import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
...@@ -193,18 +205,270 @@ public class KylinGroupBuyPartnerServiceImpl implements IKylinGroupBuyPartnerSer ...@@ -193,18 +205,270 @@ public class KylinGroupBuyPartnerServiceImpl implements IKylinGroupBuyPartnerSer
return ResponseDto.success(true); return ResponseDto.success(true);
} }
private static final int EXPORT_MAX_SIZE = 10000;
@Override
public ResponseDto<KylinGroupBuyPartnerOrderStatsVo> orderStats() {
String collection = KylinGroupBuyOrderVo.class.getSimpleName();
KylinGroupBuyPartnerOrderStatsVo result = new KylinGroupBuyPartnerOrderStatsVo();
result.setTotal(mongoTemplate.count(Query.query(new Criteria()), collection));
result.setPending(mongoTemplate.count(
Query.query(Criteria.where("status").is(GroupBuyStatusConst.OrderStatus.PENDING)), collection));
result.setSuccess(mongoTemplate.count(
Query.query(Criteria.where("status").is(GroupBuyStatusConst.OrderStatus.SUCCESS)), collection));
result.setFailed(mongoTemplate.count(
Query.query(Criteria.where("status").is(GroupBuyStatusConst.OrderStatus.FAILED)), collection));
return ResponseDto.success(result);
}
@Override @Override
public ResponseDto<List<KylinGroupBuyOrderVo>> orders(String activityId, Integer status, Integer page, Integer size) { public ResponseDto<PageInfo<KylinGroupBuyPartnerOrderListVo>> orderList(String keyword, Integer status,
Criteria criteria = Criteria.where("activityId").is(activityId); Integer page, Integer size) {
ResponseDto<Boolean> statusCheck = validateOrderListStatus(status);
if (!statusCheck.isSuccess()) {
return ResponseDto.failure(statusCheck.getMessage());
}
Criteria criteria = buildOrderListCriteria(keyword, status);
String collection = KylinGroupBuyOrderVo.class.getSimpleName();
long total = mongoTemplate.count(Query.query(criteria), collection);
Query dataQuery = Query.query(criteria).with(Sort.by(Sort.Direction.DESC, "createdAt"));
int pageNo = page == null || page < 1 ? 1 : page;
int pageSize = size == null || size < 1 ? 20 : size;
dataQuery.skip((long) (pageNo - 1) * pageSize).limit(pageSize);
List<KylinGroupBuyOrderVo> orders = mongoTemplate.find(dataQuery, KylinGroupBuyOrderVo.class, collection);
List<KylinGroupBuyPartnerOrderListVo> list = toPartnerOrderListVos(orders);
PageInfo<KylinGroupBuyPartnerOrderListVo> pageInfo = new PageInfo<>(list);
pageInfo.setTotal(total);
pageInfo.setPageNum(pageNo);
pageInfo.setPageSize(pageSize);
return ResponseDto.success(pageInfo);
}
@Override
public ResponseDto<KylinGroupBuyPartnerOrderDetailVo> orderDetail(String groupOrderId) {
if (!StringUtils.hasText(groupOrderId)) {
return ResponseDto.failure("拼团订单号不能为空");
}
KylinGroupBuyOrderVo order = mongoTemplate.findOne(
Query.query(Criteria.where("groupOrderId").is(groupOrderId)),
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
if (order == null) {
return ResponseDto.failure("拼团订单不存在");
}
return ResponseDto.success(toPartnerOrderDetailVo(order));
}
@Override
public void exportOrders(String keyword, Integer status, HttpServletResponse response) {
ResponseDto<Boolean> statusCheck = validateOrderListStatus(status);
if (!statusCheck.isSuccess()) {
throw new IllegalArgumentException(statusCheck.getMessage());
}
Criteria criteria = buildOrderListCriteria(keyword, status);
Query query = Query.query(criteria).with(Sort.by(Sort.Direction.DESC, "createdAt")).limit(EXPORT_MAX_SIZE);
List<KylinGroupBuyOrderVo> orders = mongoTemplate.find(query,
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
List<KylinGroupBuyPartnerOrderListVo> rows = toPartnerOrderListVos(orders);
try {
GroupBuyOrderExcelUtil.export(rows, response);
} catch (Exception e) {
throw new IllegalStateException("导出拼团订单失败", e);
}
}
private ResponseDto<Boolean> validateOrderListStatus(Integer status) {
if (status == null) {
return ResponseDto.success(true);
}
if (GroupBuyStatusConst.OrderStatus.PENDING.equals(status)
|| GroupBuyStatusConst.OrderStatus.SUCCESS.equals(status)
|| GroupBuyStatusConst.OrderStatus.FAILED.equals(status)) {
return ResponseDto.success(true);
}
return ResponseDto.failure("状态仅支持:0拼团中、1拼团成功、2拼团失败");
}
private Criteria buildOrderListCriteria(String keyword, Integer status) {
List<Criteria> andList = new ArrayList<>();
if (status != null) { if (status != null) {
criteria.and("status").is(status); andList.add(Criteria.where("status").is(status));
} }
Query query = Query.query(criteria).with(Sort.by(Sort.Direction.DESC, "createdAt")); if (StringUtils.hasText(keyword)) {
if (page != null && size != null && page > 0 && size > 0) { String escaped = escapeRegex(keyword.trim());
query.skip((long) (page - 1) * size).limit(size); andList.add(new Criteria().orOperator(
Criteria.where("groupOrderId").regex(escaped, "i"),
Criteria.where("members.nickname").regex(escaped, "i"),
Criteria.where("leaderUserId").regex(escaped, "i")
));
} }
return ResponseDto.success(mongoTemplate.find(query, if (andList.isEmpty()) {
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName())); return new Criteria();
}
if (andList.size() == 1) {
return andList.get(0);
}
return new Criteria().andOperator(andList.toArray(new Criteria[0]));
}
private List<KylinGroupBuyPartnerOrderListVo> toPartnerOrderListVos(List<KylinGroupBuyOrderVo> orders) {
List<KylinGroupBuyPartnerOrderListVo> result = new ArrayList<>();
if (CollectionUtils.isEmpty(orders)) {
return result;
}
Map<String, String> activityNameMap = loadActivityNameMap(orders);
Map<String, BigDecimal> amountMap = loadLeaderAmountMap(orders);
for (KylinGroupBuyOrderVo order : orders) {
KylinGroupBuyPartnerOrderListVo vo = new KylinGroupBuyPartnerOrderListVo();
vo.setGroupOrderId(order.getGroupOrderId());
vo.setActivityName(activityNameMap.get(order.getActivityId()));
vo.setLeaderUserId(order.getLeaderUserId());
KylinGroupBuyMemberVo leader = findLeaderMember(order);
if (leader != null) {
vo.setLeaderNickname(leader.getNickname());
vo.setLeaderAvatar(leader.getAvatar());
}
vo.setCurrentCount(order.getCurrentCount());
vo.setTargetCount(order.getTargetCount());
vo.setOrderAmount(amountMap.get(order.getGroupOrderId()));
vo.setCreatedAt(order.getCreatedAt());
vo.setStatus(order.getStatus());
result.add(vo);
}
return result;
}
private KylinGroupBuyPartnerOrderDetailVo toPartnerOrderDetailVo(KylinGroupBuyOrderVo order) {
KylinGroupBuyPartnerOrderDetailVo vo = new KylinGroupBuyPartnerOrderDetailVo();
vo.setGroupOrderId(order.getGroupOrderId());
vo.setActivityId(order.getActivityId());
KylinGroupBuyActivityVo activity = findActivity(order.getActivityId());
vo.setActivityName(activity == null ? null : activity.getName());
vo.setStatus(order.getStatus());
vo.setOrderAmount(resolveLeaderAmount(order));
vo.setCreatedAt(order.getCreatedAt());
vo.setCurrentCount(order.getCurrentCount());
vo.setTargetCount(order.getTargetCount());
vo.setLeaderUserId(order.getLeaderUserId());
List<KylinGroupBuyPartnerOrderMemberVo> members = new ArrayList<>();
if (!CollectionUtils.isEmpty(order.getMembers())) {
for (KylinGroupBuyMemberVo m : order.getMembers()) {
KylinGroupBuyPartnerOrderMemberVo item = new KylinGroupBuyPartnerOrderMemberVo();
item.setUserId(m.getUserId());
item.setNickname(m.getNickname());
item.setAvatar(m.getAvatar());
item.setStatus(m.getStatus());
boolean isLeader = order.getLeaderUserId() != null && order.getLeaderUserId().equals(m.getUserId());
item.setIsLeader(isLeader ? 1 : 0);
members.add(item);
}
}
vo.setMembers(members);
KylinGroupBuyMemberVo leader = findLeaderMember(order);
if (leader != null) {
vo.setLeaderNickname(leader.getNickname());
vo.setLeaderAvatar(leader.getAvatar());
}
return vo;
}
private Map<String, String> loadActivityNameMap(List<KylinGroupBuyOrderVo> orders) {
Set<String> activityIds = new HashSet<>();
for (KylinGroupBuyOrderVo order : orders) {
if (StringUtils.hasText(order.getActivityId())) {
activityIds.add(order.getActivityId());
}
}
Map<String, String> map = new HashMap<>();
if (activityIds.isEmpty()) {
return map;
}
List<KylinGroupBuyActivityVo> activities = mongoTemplate.find(
Query.query(Criteria.where("activityId").in(activityIds)),
KylinGroupBuyActivityVo.class, KylinGroupBuyActivityVo.class.getSimpleName());
for (KylinGroupBuyActivityVo activity : activities) {
map.put(activity.getActivityId(), activity.getName());
}
return map;
}
private Map<String, BigDecimal> loadLeaderAmountMap(List<KylinGroupBuyOrderVo> orders) {
Map<String, String> groupToTicket = new HashMap<>();
Set<String> ticketIds = new HashSet<>();
for (KylinGroupBuyOrderVo order : orders) {
String ticketId = resolveLeaderOrderTicketsId(order);
if (StringUtils.hasText(ticketId)) {
groupToTicket.put(order.getGroupOrderId(), ticketId);
ticketIds.add(ticketId);
}
}
Map<String, BigDecimal> ticketAmount = new HashMap<>();
if (!ticketIds.isEmpty()) {
List<KylinOrderTicketVo> tickets = mongoTemplate.find(
Query.query(Criteria.where("orderTicketsId").in(ticketIds)),
KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
for (KylinOrderTicketVo ticket : tickets) {
ticketAmount.put(ticket.getOrderTicketsId(), ticket.getPriceActual());
}
for (String ticketId : ticketIds) {
if (!ticketAmount.containsKey(ticketId)) {
Object cached = redisUtil.get(KylinRedisConst.ORDER.concat(ticketId));
if (cached instanceof KylinOrderTicketVo) {
ticketAmount.put(ticketId, ((KylinOrderTicketVo) cached).getPriceActual());
}
}
}
}
Map<String, BigDecimal> result = new HashMap<>();
for (Map.Entry<String, String> e : groupToTicket.entrySet()) {
result.put(e.getKey(), ticketAmount.get(e.getValue()));
}
return result;
}
private BigDecimal resolveLeaderAmount(KylinGroupBuyOrderVo order) {
String ticketId = resolveLeaderOrderTicketsId(order);
if (!StringUtils.hasText(ticketId)) {
return null;
}
Object cached = redisUtil.get(KylinRedisConst.ORDER.concat(ticketId));
if (cached instanceof KylinOrderTicketVo) {
return ((KylinOrderTicketVo) cached).getPriceActual();
}
KylinOrderTicketVo ticket = mongoTemplate.findOne(
Query.query(Criteria.where("orderTicketsId").is(ticketId)),
KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
return ticket == null ? null : ticket.getPriceActual();
}
private String resolveLeaderOrderTicketsId(KylinGroupBuyOrderVo order) {
if (order == null) {
return null;
}
if (StringUtils.hasText(order.getOrderTicketsId())) {
return order.getOrderTicketsId();
}
KylinGroupBuyMemberVo leader = findLeaderMember(order);
return leader == null ? null : leader.getOrderTicketsId();
}
private KylinGroupBuyMemberVo findLeaderMember(KylinGroupBuyOrderVo order) {
if (order == null || !StringUtils.hasText(order.getLeaderUserId())
|| CollectionUtils.isEmpty(order.getMembers())) {
return null;
}
for (KylinGroupBuyMemberVo m : order.getMembers()) {
if (order.getLeaderUserId().equals(m.getUserId())) {
return m;
}
}
return null;
}
/** Mongo $regex 不支持 \\Q..\\E,手工转义特殊字符。 */
private static String escapeRegex(String input) {
return Pattern.compile("([\\\\.*+?^${}()|\\[\\]])").matcher(input).replaceAll("\\\\$1");
} }
private ResponseDto<Boolean> validateParam(KylinGroupBuyActivityCreateParam param) { private ResponseDto<Boolean> validateParam(KylinGroupBuyActivityCreateParam param) {
......
package com.liquidnet.service.slime.util;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.kylin.constant.GroupBuyStatusConst;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyPartnerOrderListVo;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.CollectionUtils;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 拼团订单列表导出(EasyExcel,对齐 goblin exportOrderList)。
*/
public final class GroupBuyOrderExcelUtil {
private GroupBuyOrderExcelUtil() {
}
public static void export(List<KylinGroupBuyPartnerOrderListVo> rows, HttpServletResponse response) throws IOException {
if (CollectionUtils.isEmpty(rows)) {
return;
}
ServletOutputStream outputStream = null;
try {
String fileName = DateUtil.Formatter.yyyyMMddHHmmssTrim.format(LocalDateTime.now())
.concat(new String(("拼团订单").getBytes("gb2312"), StandardCharsets.ISO_8859_1));
response.setHeader(HttpHeaders.CONTENT_DISPOSITION,
"attachment;filename=".concat(fileName).concat(ExcelTypeEnum.XLSX.getValue()));
response.setContentType(MediaType.MULTIPART_FORM_DATA_VALUE);
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
outputStream = response.getOutputStream();
EasyExcel.write(outputStream)
.head(buildHead())
.sheet("拼团订单")
.doWrite(buildRows(rows));
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (Exception ignored) {
}
}
}
}
private static List<List<String>> buildHead() {
List<List<String>> head = new ArrayList<>();
head.add(Collections.singletonList("订单号"));
head.add(Collections.singletonList("拼团活动"));
head.add(Collections.singletonList("发起人"));
head.add(Collections.singletonList("参团人数"));
head.add(Collections.singletonList("成团人数"));
head.add(Collections.singletonList("订单金额"));
head.add(Collections.singletonList("创建时间"));
head.add(Collections.singletonList("状态"));
return head;
}
private static List<List<String>> buildRows(List<KylinGroupBuyPartnerOrderListVo> list) {
List<List<String>> rows = new ArrayList<>(list.size());
for (KylinGroupBuyPartnerOrderListVo vo : list) {
List<String> row = new ArrayList<>(8);
row.add(nullToEmpty(vo.getGroupOrderId()));
row.add(nullToEmpty(vo.getActivityName()));
row.add(nullToEmpty(vo.getLeaderNickname()));
row.add(formatProgress(vo.getCurrentCount(), vo.getTargetCount()));
row.add(vo.getTargetCount() == null ? "" : vo.getTargetCount() + "人");
row.add(formatAmount(vo.getOrderAmount()));
row.add(nullToEmpty(vo.getCreatedAt()));
row.add(statusText(vo.getStatus()));
rows.add(row);
}
return rows;
}
private static String formatProgress(Integer current, Integer target) {
int c = current == null ? 0 : current;
int t = target == null ? 0 : target;
return c + "/" + t + "人";
}
private static String formatAmount(BigDecimal amount) {
if (amount == null) {
return "";
}
return amount.setScale(2, RoundingMode.HALF_UP).toPlainString();
}
private static String statusText(Integer status) {
if (status == null) {
return "";
}
if (GroupBuyStatusConst.OrderStatus.PENDING.equals(status)) {
return "拼团中";
}
if (GroupBuyStatusConst.OrderStatus.SUCCESS.equals(status)) {
return "拼团成功";
}
if (GroupBuyStatusConst.OrderStatus.FAILED.equals(status)) {
return "拼团失败";
}
if (GroupBuyStatusConst.OrderStatus.PREPARE.equals(status)) {
return "待支付发起";
}
if (GroupBuyStatusConst.OrderStatus.CANCELLED.equals(status)) {
return "已取消";
}
return String.valueOf(status);
}
private static String nullToEmpty(String s) {
return s == null ? "" : s;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment