记得上下班打卡 | 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;
import com.liquidnet.service.kylin.dto.param.KylinGroupBuyActivityCreateParam;
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.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;
public interface IKylinGroupBuyPartnerService {
......@@ -26,5 +28,24 @@ public interface IKylinGroupBuyPartnerService {
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 @@
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
</dependencies>
<build>
......
......@@ -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.KylinGroupBuyActivityUpdateParam;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -20,6 +23,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.Map;
......@@ -81,4 +85,39 @@ public class KylinGroupBuyPartnerController {
@RequestParam("targetStatus") @NotNull(message = "目标状态不能为空") Integer 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);
}
}
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