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

Commit 4d7f1db8 authored by wangyifan's avatar wangyifan

订单列表、退款订单列表 增加 各个状态汇总数量

parent 2dce8e88
package com.liquidnet.service.goblin.dto.vo;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 店铺退款列表接口返回体:分页数据 + 各审核状态 Tab 数量。
*/
@ApiModel("店铺退款列表分页结果")
@Data
public class GoblinStoreBackOrderListPageVo {
/** 当前页列表及分页信息 */
@ApiModelProperty("分页数据")
private PageInfo<GoblinStoreBackOrderListVo> pageInfo;
/** 顶部审核 Tab 角标数量,不受当前 status 筛选影响 */
@ApiModelProperty("各审核状态数量")
private GoblinStoreBackOrderStatusCountVo statusCount;
}
package com.liquidnet.service.goblin.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Map;
/**
* 店铺退款列表 - 各审核状态 Tab 数量。
* 对应前端 Tab:全部 / 待审核(1) / 已退款(2) / 已驳回(3)
*/
@ApiModel("店铺退款列表-各审核状态数量")
@Data
public class GoblinStoreBackOrderStatusCountVo {
/** 全部 */
@ApiModelProperty("全部")
private long all;
/** 待审核 status=1 退款申请 */
@ApiModelProperty("待审核[status=1-退款申请]")
private long pendingAudit;
/** 已退款 status=2 退款成功 */
@ApiModelProperty("已退款[status=2-退款成功]")
private long refunded;
/** 已驳回 status=3 退款拒绝 */
@ApiModelProperty("已驳回[status=3-退款拒绝]")
private long rejected;
/**
* 从 Mongo 按 status 分组统计结果组装 VO。
* 新增 Tab 时在此补充 getOrDefault 即可。
*/
public static GoblinStoreBackOrderStatusCountVo of(long all, Map<Integer, Long> grouped) {
GoblinStoreBackOrderStatusCountVo vo = new GoblinStoreBackOrderStatusCountVo();
vo.all = all;
vo.pendingAudit = grouped.getOrDefault(1, 0L);
vo.refunded = grouped.getOrDefault(2, 0L);
vo.rejected = grouped.getOrDefault(3, 0L);
return vo;
}
}
package com.liquidnet.service.goblin.dto.vo;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 店铺订单列表接口返回体:分页数据 + 各状态 Tab 数量。
*/
@ApiModel("店铺订单列表分页结果")
@Data
public class GoblinStoreOrderListPageVo {
/** 当前页列表及分页信息 */
@ApiModelProperty("分页数据")
private PageInfo<GoblinStoreOrderListVo> pageInfo;
/** 顶部状态 Tab 角标数量,不受当前 status 筛选影响 */
@ApiModelProperty("各状态数量")
private GoblinStoreOrderStatusCountVo statusCount;
}
package com.liquidnet.service.goblin.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Map;
/**
* 店铺订单列表 - 各状态 Tab 数量。
* 对应前端 statusTabs:全部 / 待支付(0) / 待发货(2) / 已发货(3) / 已完成(4) / 已退款(6)
*/
@ApiModel("店铺订单列表-各状态数量")
@Data
public class GoblinStoreOrderStatusCountVo {
/** 全部(含其他 status,如取消单等) */
@ApiModelProperty("全部")
private long all;
/** 待支付 status=0 */
@ApiModelProperty("待支付[status=0]")
private long pendingPay;
/** 待发货 status=2 */
@ApiModelProperty("待发货[status=2]")
private long pendingShip;
/** 已发货 status=3 */
@ApiModelProperty("已发货[status=3]")
private long shipped;
/** 已完成 status=4 */
@ApiModelProperty("已完成[status=4]")
private long completed;
/** 已退款 status=6 */
@ApiModelProperty("已退款[status=6]")
private long refunded;
/**
* 从 Mongo 按 status 分组统计结果组装 VO。
* 新增 Tab 时在此补充 getOrDefault 即可。
*/
public static GoblinStoreOrderStatusCountVo of(long all, Map<Integer, Long> grouped) {
GoblinStoreOrderStatusCountVo vo = new GoblinStoreOrderStatusCountVo();
vo.all = all;
vo.pendingPay = grouped.getOrDefault(0, 0L);
vo.pendingShip = grouped.getOrDefault(2, 0L);
vo.shipped = grouped.getOrDefault(3, 0L);
vo.completed = grouped.getOrDefault(4, 0L);
vo.refunded = grouped.getOrDefault(6, 0L);
return vo;
}
}
package com.liquidnet.service.goblin.service.manage;
import com.github.pagehelper.PageInfo;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinBackOrderDetailsVo;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreBackOrderListPageVo;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreBackOrderListVo;
import com.liquidnet.service.goblin.param.GoblinStoreOrderRefundParam;
import java.math.BigDecimal;
public interface IGoblinStoreBackOrderService {
ResponseDto<PageInfo<GoblinStoreBackOrderListVo>> orderBackList(Integer page,
ResponseDto<GoblinStoreBackOrderListPageVo> orderBackList(Integer page,
String orderBackCode,
Integer type,
String cst,
......
package com.liquidnet.service.goblin.service.manage;
import com.github.pagehelper.PageInfo;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreOrderListPageVo;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreOrderListVo;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
public interface IGoblinStoreOrderService {
ResponseDto<PageInfo<GoblinStoreOrderListVo>> orderList(Integer page,
ResponseDto<GoblinStoreOrderListPageVo> orderList(Integer page,
String orderCode,
Integer type,
String cst,
......
package com.liquidnet.service.goblin.controller.manage;
import com.github.pagehelper.PageInfo;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.service.base.ResponseDto;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinBackOrderDetailsVo;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreBackOrderListPageVo;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreBackOrderListVo;
import com.liquidnet.service.goblin.param.GoblinStoreOrderRefundParam;
import com.liquidnet.service.goblin.service.manage.IGoblinStoreBackOrderService;
......@@ -38,10 +37,10 @@ public class GoblinStoreBackOrderController {
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "cet", value = "申请终止时间"),
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "orderCode", value = "订单编号"),
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "spuName", value = "商品名称"),
@ApiImplicitParam(type = "form", required = false, dataType = "Integer", name = "status", value = "订单状态[1-待处理|2-已退款|9-已拒绝|11-已取消|0-退款中|7-退货中]"),
@ApiImplicitParam(type = "form", required = false, dataType = "Integer", name = "status", value = "审核状态[1-待审核(退款申请)|2-已退款(退款成功)|3-已驳回(退款拒绝)]"),
})
@GetMapping(value = "list")
public ResponseDto<PageInfo<GoblinStoreBackOrderListVo>> orderBackList(@RequestParam(value = "page", required = true) @Valid Integer page,
public ResponseDto<GoblinStoreBackOrderListPageVo> orderBackList(@RequestParam(value = "page", required = true) @Valid Integer page,
@RequestParam(value = "orderBackCode", required = false) String orderBackCode,
@RequestParam(value = "type", required = false) Integer type,
@RequestParam(value = "cst", required = false) String cst,
......
package com.liquidnet.service.goblin.controller.manage;
import com.github.pagehelper.PageInfo;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreOrderListPageVo;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreOrderListVo;
import com.liquidnet.service.goblin.service.manage.IGoblinStoreOrderService;
import io.swagger.annotations.Api;
......@@ -43,10 +43,10 @@ public class GoblinStoreOrderController {
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "cet", value = "下单终止时间"),
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "expressContacts", value = "收货人姓名"),
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "phone", value = "手机号"),
@ApiImplicitParam(type = "form", required = false, dataType = "Integer", name = "status", value = "订单状态[0-代付款|2-待发货|3-已发货|4-已完成]"),
@ApiImplicitParam(type = "form", required = false, dataType = "Integer", name = "status", value = "订单状态[0-待支付|2-待发货|3-已发货|4-已完成|6-已退款]"),
})
@GetMapping(value = "list")
public ResponseDto<PageInfo<GoblinStoreOrderListVo>> orderList(@RequestParam(value = "page", required = true) @Valid Integer page,
public ResponseDto<GoblinStoreOrderListPageVo> orderList(@RequestParam(value = "page", required = true) @Valid Integer page,
@RequestParam(value = "orderCode", required = false) String orderCode,
@RequestParam(value = "type", required = false) Integer type,
@RequestParam(value = "cst", required = false) String cst,
......
......@@ -44,14 +44,15 @@ public class GoblinStoreBackOrderServiceImpl implements IGoblinStoreBackOrderSer
GoblinRefundHelper refundHelper;
@Override
public ResponseDto<PageInfo<GoblinStoreBackOrderListVo>> orderBackList(Integer page, String orderBackCode, Integer type, String cst, String cet, String orderCode, String spuName, Integer status) {
public ResponseDto<GoblinStoreBackOrderListPageVo> orderBackList(Integer page, String orderBackCode, Integer type, String cst, String cet, String orderCode, String spuName, Integer status) {
List<GoblinStoreBackOrderListVo> listVos = ObjectUtil.goblinStoreBackOrderListVoArrayList();
String uid = CurrentUtil.getCurrentUid();
GoblinStoreInfoVo storeInfoVo = redisUtils.getStoreInfoVoByUid(uid);
if (storeInfoVo == null) {
return ResponseDto.failure("无法查看");
}
HashMap<String, Object> map = mongoUtils.storeBackOrderList(storeInfoVo.getStoreId(), page, orderBackCode, type, cst, cet, orderCode, spuName, status);
String storeId = storeInfoVo.getStoreId();
HashMap<String, Object> map = mongoUtils.storeBackOrderList(storeId, page, orderBackCode, type, cst, cet, orderCode, spuName, status);
long total = (long) map.get("total");
List<GoblinBackOrderVo> voList = (List<GoblinBackOrderVo>) map.get("data");
for (GoblinBackOrderVo item : voList) {
......@@ -59,7 +60,12 @@ public class GoblinStoreBackOrderServiceImpl implements IGoblinStoreBackOrderSer
}
PageInfo<GoblinStoreBackOrderListVo> pageInfo = new PageInfo(listVos);
pageInfo.setTotal(total);
return ResponseDto.success(pageInfo);
GoblinStoreBackOrderListPageVo result = new GoblinStoreBackOrderListPageVo();
result.setPageInfo(pageInfo);
// 审核 Tab 数量:与列表共用筛选条件,但不带 status 参数
result.setStatusCount(mongoUtils.storeBackOrderStatusCount(storeId, orderBackCode, type, cst, cet, orderCode, spuName));
return ResponseDto.success(result);
}
@Override
......
......@@ -61,19 +61,25 @@ public class GoblinStoreOrderServiceImpl implements IGoblinStoreOrderService {
@Override
public ResponseDto<PageInfo<GoblinStoreOrderListVo>> orderList(Integer page, String orderCode, Integer type, String cst, String cet, String expressContacts, String phone, Integer status) {
public ResponseDto<GoblinStoreOrderListPageVo> orderList(Integer page, String orderCode, Integer type, String cst, String cet, String expressContacts, String phone, Integer status) {
String uid = CurrentUtil.getCurrentUid();
GoblinStoreInfoVo storeInfoVo = redisUtils.getStoreInfoVoByUid(uid);
if (storeInfoVo == null) {
return ResponseDto.failure("无法查看");
}
HashMap<String, Object> map = mongoUtils.storeOrderList(storeInfoVo.getStoreId(), page, orderCode, cst, cet, expressContacts, phone, status);
String storeId = storeInfoVo.getStoreId();
HashMap<String, Object> map = mongoUtils.storeOrderList(storeId, page, orderCode, cst, cet, expressContacts, phone, status);
long total = (long) map.get("total");
List<GoblinStoreOrderVo> voList = (List<GoblinStoreOrderVo>) map.get("data");
List<GoblinStoreOrderListVo> listVos = buildStoreOrderListVos(voList, false);
PageInfo<GoblinStoreOrderListVo> pageInfo = new PageInfo(listVos);
pageInfo.setTotal(total);
return ResponseDto.success(pageInfo);
GoblinStoreOrderListPageVo result = new GoblinStoreOrderListPageVo();
result.setPageInfo(pageInfo);
// 状态 Tab 数量:与列表共用筛选条件,但不带 status 参数
result.setStatusCount(mongoUtils.storeOrderStatusCount(storeId, orderCode, cst, cet, expressContacts, phone));
return ResponseDto.success(result);
}
@Override
......
......@@ -40,6 +40,7 @@ import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
......@@ -1448,7 +1449,17 @@ public class GoblinMongoUtils {
return mongoTemplate.find(query, GoblinStoreOrderVo.class, GoblinStoreOrderVo.class.getSimpleName());
}
/** 列表查询条件(含 status Tab 筛选) */
private Criteria storeOrderListCriteria(String storeId, String orderCode, String cst, String cet, String expressContacts, String phone, Integer status) {
Criteria criteria = storeOrderListBaseCriteria(storeId, orderCode, cst, cet, expressContacts, phone);
if (status != null) {
criteria = criteria.and("status").is(status);
}
return criteria;
}
/** 列表/统计共用基础条件(不含 status,保证 Tab 数量不受当前 Tab 影响) */
private Criteria storeOrderListBaseCriteria(String storeId, String orderCode, String cst, String cet, String expressContacts, String phone) {
Criteria criteria = Criteria.where("storeId").is(storeId);
if (cst != null && cet != null) {
criteria = criteria.and("createdAt").gte(cst).lt(cet);
......@@ -1459,15 +1470,20 @@ public class GoblinMongoUtils {
if (phone != null) {
criteria = criteria.and("userMobile").is(phone);
}
if (status != null) {
criteria = criteria.and("status").is(status);
}
if (expressContacts != null) {
criteria = criteria.and("orderAttrVo.expressContacts").is(expressContacts);
}
return criteria;
}
/** 统计订单各状态 Tab 数量(沿用列表筛选条件,忽略 status 参数) */
public GoblinStoreOrderStatusCountVo storeOrderStatusCount(String storeId, String orderCode, String cst, String cet, String expressContacts, String phone) {
Criteria criteria = storeOrderListBaseCriteria(storeId, orderCode, cst, cet, expressContacts, phone);
String collection = GoblinStoreOrderVo.class.getSimpleName();
long all = mongoTemplate.count(Query.query(criteria), GoblinStoreOrderVo.class, collection);
return GoblinStoreOrderStatusCountVo.of(all, groupCountByStatus(criteria, collection));
}
private void storeOrderListFields(Query query) {
query.fields().include("orderCode").include("createdAt").include("payType").include("payTime").include("status").include("orderSkuVoIds")
.include("orderId").include("userMobile").include("priceActual").include("priceExpress").include("priceCoupon").include("storePriceCoupon").include("marketId").include("marketType")
......@@ -1479,25 +1495,7 @@ public class GoblinMongoUtils {
//查询销量
int size = 20;
int skipCount = ((page - 1) * size);
Criteria criteria = Criteria.where("storeId").is(storeId);
if (cst != null && cet != null) {
criteria = criteria.and("createdAt").gte(cst).lt(cet);
}
if (orderCode != null) {
criteria = criteria.and("orderCode").is(orderCode);
}
if (orderBackCode != null) {
criteria = criteria.and("backCode").is(orderBackCode);
}
if (status != null) {
criteria = criteria.and("status").is(status);
}
if (type != null) {
criteria = criteria.and("type").is(type);
}
if (spuName != null) {
criteria = criteria.and("backOrderSkuVos.spuName").regex(".*?\\" + spuName);
}
Criteria criteria = storeBackOrderListCriteria(storeId, orderBackCode, type, cst, cet, orderCode, spuName, status);
Query query = Query.query(criteria);
query.skip(skipCount).limit(size).with(Sort.by(Sort.Order.desc("createdAt")));
;
......@@ -1519,6 +1517,63 @@ public class GoblinMongoUtils {
return map;
}
/** 列表查询条件(含 status Tab 筛选) */
private Criteria storeBackOrderListCriteria(String storeId, String orderBackCode, Integer type, String cst, String cet, String orderCode, String spuName, Integer status) {
Criteria criteria = storeBackOrderListBaseCriteria(storeId, orderBackCode, type, cst, cet, orderCode, spuName);
if (status != null) {
criteria = criteria.and("status").is(status);
}
return criteria;
}
/** 列表/统计共用基础条件(不含 status) */
private Criteria storeBackOrderListBaseCriteria(String storeId, String orderBackCode, Integer type, String cst, String cet, String orderCode, String spuName) {
Criteria criteria = Criteria.where("storeId").is(storeId);
if (cst != null && cet != null) {
criteria = criteria.and("createdAt").gte(cst).lt(cet);
}
if (orderCode != null) {
criteria = criteria.and("orderCode").is(orderCode);
}
if (orderBackCode != null) {
criteria = criteria.and("backCode").is(orderBackCode);
}
if (type != null) {
criteria = criteria.and("type").is(type);
}
if (spuName != null) {
criteria = criteria.and("backOrderSkuVos.spuName").regex(".*?\\" + spuName);
}
return criteria;
}
/** 统计退款各审核 Tab 数量(沿用列表筛选条件,忽略 status 参数) */
public GoblinStoreBackOrderStatusCountVo storeBackOrderStatusCount(String storeId, String orderBackCode, Integer type, String cst, String cet, String orderCode, String spuName) {
Criteria criteria = storeBackOrderListBaseCriteria(storeId, orderBackCode, type, cst, cet, orderCode, spuName);
String collection = GoblinBackOrderVo.class.getSimpleName();
long all = mongoTemplate.count(Query.query(criteria), GoblinBackOrderVo.class, collection);
return GoblinStoreBackOrderStatusCountVo.of(all, groupCountByStatus(criteria, collection));
}
/** 按 status 分组计数,订单/退款列表统计共用 */
private Map<Integer, Long> groupCountByStatus(Criteria criteria, String collection) {
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(criteria),
Aggregation.group("status").count().as("count")
);
AggregationResults<Document> results = mongoTemplate.aggregate(aggregation, collection, Document.class);
Map<Integer, Long> grouped = new HashMap<>();
for (Document doc : results.getMappedResults()) {
Object statusKey = doc.get("_id");
if (statusKey == null) {
continue;
}
Number count = doc.get("count", Number.class);
grouped.put(((Number) statusKey).intValue(), count == null ? 0L : count.longValue());
}
return grouped;
}
//商户 正在下单列表
public List<GoblinStoreOrderVo> storeZhengzaiOrderList(int page, String storeId) {
//查询销量
......
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