mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-22 23:31:52 +08:00
拼团记录(APP):新增一个取消拼团的接口
This commit is contained in:
parent
1a0fda23b1
commit
6636ee7420
@ -25,6 +25,14 @@ public class CollectionUtils {
|
|||||||
return Arrays.stream(collections).anyMatch(CollectionUtil::isEmpty);
|
return Arrays.stream(collections).anyMatch(CollectionUtil::isEmpty);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T, U extends Comparable<? super U>> List<T> sortedAsc(
|
||||||
|
Collection<T> from, Function<? super T, ? extends U> keyExtractor) {
|
||||||
|
// 按照升序排序
|
||||||
|
return from.stream()
|
||||||
|
.sorted(Comparator.comparing(keyExtractor))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
public static <T> boolean anyMatch(Collection<T> from, Predicate<T> predicate) {
|
public static <T> boolean anyMatch(Collection<T> from, Predicate<T> predicate) {
|
||||||
return from.stream().anyMatch(predicate);
|
return from.stream().anyMatch(predicate);
|
||||||
}
|
}
|
||||||
|
@ -6,11 +6,14 @@ import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.record.Ap
|
|||||||
import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.record.AppCombinationRecordSummaryRespVO;
|
import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.record.AppCombinationRecordSummaryRespVO;
|
||||||
import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
|
import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
|
||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO;
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
|
||||||
import cn.iocoder.yudao.module.promotion.service.combination.CombinationRecordService;
|
import cn.iocoder.yudao.module.promotion.service.combination.CombinationRecordService;
|
||||||
|
import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
import io.swagger.v3.oas.annotations.Parameters;
|
import io.swagger.v3.oas.annotations.Parameters;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
@ -35,6 +38,9 @@ public class AppCombinationRecordController {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CombinationRecordService combinationRecordService;
|
private CombinationRecordService combinationRecordService;
|
||||||
|
@Resource
|
||||||
|
@Lazy
|
||||||
|
private TradeOrderApi tradeOrderApi;
|
||||||
|
|
||||||
@GetMapping("/get-summary")
|
@GetMapping("/get-summary")
|
||||||
@Operation(summary = "获得拼团记录的概要信息", description = "用于小程序首页")
|
@Operation(summary = "获得拼团记录的概要信息", description = "用于小程序首页")
|
||||||
@ -96,9 +102,26 @@ public class AppCombinationRecordController {
|
|||||||
return success(CombinationActivityConvert.INSTANCE.convert(getLoginUserId(), headRecord, memberRecords));
|
return success(CombinationActivityConvert.INSTANCE.convert(getLoginUserId(), headRecord, memberRecords));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO @puhui:新增一个取消拼团的接口,cancel
|
@GetMapping("/cancel")
|
||||||
// 1. 需要先校验拼团记录未完成;
|
@Operation(summary = "取消拼团")
|
||||||
// 2. 在 Order 那增加一个 cancelPaidOrder 接口,用于取消已支付的订单
|
@Parameter(name = "id", description = "拼团记录编号", required = true, example = "1024")
|
||||||
// 3. order 完成后,取消拼团记录。另外,如果它是团长,则顺序(下单时间)继承
|
public CommonResult<Boolean> cancelCombinationRecord(@RequestParam("id") Long id) {
|
||||||
|
Long userId = getLoginUserId();
|
||||||
|
// 1、查找这条拼团记录
|
||||||
|
CombinationRecordDO record = combinationRecordService.getCombinationRecordByIdAndUser(userId, id);
|
||||||
|
if (record == null) {
|
||||||
|
return success(Boolean.FALSE);
|
||||||
|
}
|
||||||
|
// 1.1、需要先校验拼团记录未完成;
|
||||||
|
if (!CombinationRecordStatusEnum.isInProgress(record.getStatus())) {
|
||||||
|
return success(Boolean.FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 取消已支付的订单
|
||||||
|
tradeOrderApi.cancelPaidOrder(userId, record.getOrderId());
|
||||||
|
// 3. 取消拼团记录
|
||||||
|
combinationRecordService.cancelCombinationRecord(userId, record.getId(), record.getHeadId());
|
||||||
|
return success(Boolean.TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -159,20 +159,4 @@ public interface CombinationRecordMapper extends BaseMapperX<CombinationRecordDO
|
|||||||
.betweenIfPresent(CombinationRecordDO::getCreateTime, builderQueryTime(dateType)));
|
.betweenIfPresent(CombinationRecordDO::getCreateTime, builderQueryTime(dateType)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询指定团长的拼团记录(包括团长)
|
|
||||||
*
|
|
||||||
* @param activityId 活动编号
|
|
||||||
* @param headId 团长编号
|
|
||||||
* @return 拼团记录
|
|
||||||
*/
|
|
||||||
default List<CombinationRecordDO> selectList(Long activityId, Long headId) {
|
|
||||||
return selectList(new LambdaQueryWrapperX<CombinationRecordDO>()
|
|
||||||
.eq(CombinationRecordDO::getActivityId, activityId)
|
|
||||||
.eq(CombinationRecordDO::getHeadId, headId)
|
|
||||||
.or()
|
|
||||||
.eq(CombinationRecordDO::getId, headId));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -158,12 +158,32 @@ public interface CombinationRecordService {
|
|||||||
* 【拼团活动】获得拼团记录数量 Map
|
* 【拼团活动】获得拼团记录数量 Map
|
||||||
*
|
*
|
||||||
* @param activityIds 活动记录编号数组
|
* @param activityIds 活动记录编号数组
|
||||||
* @param status 拼团状态,允许空
|
* @param status 拼团状态,允许空
|
||||||
* @param headId 团长编号,允许空。目的 headId 设置为 {@link CombinationRecordDO#HEAD_ID_GROUP} 时,可以设置
|
* @param headId 团长编号,允许空。目的 headId 设置为 {@link CombinationRecordDO#HEAD_ID_GROUP} 时,可以设置
|
||||||
* @return 拼团记录数量 Map
|
* @return 拼团记录数量 Map
|
||||||
*/
|
*/
|
||||||
Map<Long, Integer> getCombinationRecordCountMapByActivity(Collection<Long> activityIds,
|
Map<Long, Integer> getCombinationRecordCountMapByActivity(Collection<Long> activityIds,
|
||||||
@Nullable Integer status,
|
@Nullable Integer status,
|
||||||
@Nullable Long headId);
|
@Nullable Long headId);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取拼团记录
|
||||||
|
*
|
||||||
|
* @param userId 用户编号
|
||||||
|
* @param id 拼团记录编号
|
||||||
|
* @return 拼团记录
|
||||||
|
*/
|
||||||
|
CombinationRecordDO getCombinationRecordByIdAndUser(Long userId, Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消拼团
|
||||||
|
*
|
||||||
|
* @param userId 用户编号
|
||||||
|
* @param id 拼团记录编号
|
||||||
|
* @param headId 团长编号
|
||||||
|
*/
|
||||||
|
void cancelCombinationRecord(Long userId, Long id, Long headId);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -28,10 +28,7 @@ import org.springframework.validation.annotation.Validated;
|
|||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
||||||
@ -180,7 +177,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
|
|||||||
recordMapper.insert(recordDO);
|
recordMapper.insert(recordDO);
|
||||||
|
|
||||||
// 3、如果是团长需要设置 headId 为 CombinationRecordDO#HEAD_ID_GROUP
|
// 3、如果是团长需要设置 headId 为 CombinationRecordDO#HEAD_ID_GROUP
|
||||||
if (reqDTO.getHeadId() == null) {
|
if (ObjUtil.equal(CombinationRecordDO.HEAD_ID_GROUP, reqDTO.getHeadId())) {
|
||||||
recordMapper.updateById(new CombinationRecordDO().setId(recordDO.getId()).setHeadId(CombinationRecordDO.HEAD_ID_GROUP));
|
recordMapper.updateById(new CombinationRecordDO().setId(recordDO.getId()).setHeadId(CombinationRecordDO.HEAD_ID_GROUP));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -212,13 +209,17 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
|
|||||||
* @param headId 团长编号
|
* @param headId 团长编号
|
||||||
*/
|
*/
|
||||||
private void updateCombinationRecords(CombinationActivityDO activity, Long headId) {
|
private void updateCombinationRecords(CombinationActivityDO activity, Long headId) {
|
||||||
List<CombinationRecordDO> records = recordMapper.selectList(CombinationRecordDO::getHeadId, headId);
|
// 团长
|
||||||
|
CombinationRecordDO recordHead = recordMapper.selectById(headId);
|
||||||
|
// 团员
|
||||||
|
List<CombinationRecordDO> records = getCombinationRecordListByHeadId(headId);
|
||||||
|
// 需要更新的记录
|
||||||
List<CombinationRecordDO> updateRecords = new ArrayList<>();
|
List<CombinationRecordDO> updateRecords = new ArrayList<>();
|
||||||
|
|
||||||
if (CollUtil.isEmpty(records)) {
|
if (CollUtil.isEmpty(records)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
records.add(recordHead); // 加入团长,团长也需要更新
|
||||||
boolean isEqual = ObjUtil.equal(records.size(), activity.getUserSize());
|
boolean isEqual = ObjUtil.equal(records.size(), activity.getUserSize());
|
||||||
records.forEach(item -> {
|
records.forEach(item -> {
|
||||||
CombinationRecordDO recordDO = new CombinationRecordDO();
|
CombinationRecordDO recordDO = new CombinationRecordDO();
|
||||||
@ -305,4 +306,59 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
|
|||||||
return recordMapper.selectCombinationRecordCountMapByActivityIdAndStatusAndHeadId(activityIds, status, headId);
|
return recordMapper.selectCombinationRecordCountMapByActivityIdAndStatusAndHeadId(activityIds, status, headId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CombinationRecordDO getCombinationRecordByIdAndUser(Long userId, Long id) {
|
||||||
|
return recordMapper.selectOne(CombinationRecordDO::getUserId, userId, CombinationRecordDO::getId, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void cancelCombinationRecord(Long userId, Long id, Long headId) {
|
||||||
|
// 删除记录
|
||||||
|
recordMapper.deleteById(id);
|
||||||
|
|
||||||
|
// 需要更新的记录
|
||||||
|
List<CombinationRecordDO> updateRecords = new ArrayList<>();
|
||||||
|
// 如果它是团长,则顺序(下单时间)继承
|
||||||
|
if (Objects.equals(headId, CombinationRecordDO.HEAD_ID_GROUP)) { // 情况一:团长
|
||||||
|
// 团员
|
||||||
|
List<CombinationRecordDO> list = getCombinationRecordListByHeadId(id);
|
||||||
|
if (CollUtil.isEmpty(list)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 按照创建时间升序排序
|
||||||
|
List<CombinationRecordDO> recordsSort = sortedAsc(list, CombinationRecordDO::getCreateTime);
|
||||||
|
CombinationRecordDO newHead = recordsSort.get(0); // 新团长继位
|
||||||
|
recordsSort.forEach(item -> {
|
||||||
|
CombinationRecordDO recordDO = new CombinationRecordDO();
|
||||||
|
recordDO.setId(item.getId());
|
||||||
|
if (ObjUtil.equal(item.getId(), newHead.getId())) { // 新团长
|
||||||
|
recordDO.setHeadId(CombinationRecordDO.HEAD_ID_GROUP);
|
||||||
|
} else {
|
||||||
|
recordDO.setHeadId(newHead.getId());
|
||||||
|
}
|
||||||
|
recordDO.setUserCount(recordsSort.size());
|
||||||
|
updateRecords.add(recordDO);
|
||||||
|
});
|
||||||
|
} else { // 情况二:团员
|
||||||
|
// 团长
|
||||||
|
CombinationRecordDO recordHead = recordMapper.selectById(headId);
|
||||||
|
// 团员
|
||||||
|
List<CombinationRecordDO> records = getCombinationRecordListByHeadId(headId);
|
||||||
|
if (CollUtil.isEmpty(records)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
records.add(recordHead); // 加入团长,团长数据也需要更新
|
||||||
|
records.forEach(item -> {
|
||||||
|
CombinationRecordDO recordDO = new CombinationRecordDO();
|
||||||
|
recordDO.setId(item.getId());
|
||||||
|
recordDO.setUserCount(records.size());
|
||||||
|
updateRecords.add(recordDO);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新拼团记录
|
||||||
|
recordMapper.updateBatch(updateRecords);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -49,4 +49,12 @@ public interface TradeOrderApi {
|
|||||||
*/
|
*/
|
||||||
void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId);
|
void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消支付订单
|
||||||
|
*
|
||||||
|
* @param userId 用户编号
|
||||||
|
* @param orderId 订单编号
|
||||||
|
*/
|
||||||
|
void cancelPaidOrder(Long userId, Long orderId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -47,4 +47,9 @@ public class TradeOrderApiImpl implements TradeOrderApi {
|
|||||||
tradeOrderUpdateService.updateOrderCombinationInfo(orderId, activityId, combinationRecordId, headId);
|
tradeOrderUpdateService.updateOrderCombinationInfo(orderId, activityId, combinationRecordId, headId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void cancelPaidOrder(Long userId, Long orderId) {
|
||||||
|
tradeOrderUpdateService.cancelPaidOrder(userId, orderId);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -180,4 +180,12 @@ public interface TradeOrderUpdateService {
|
|||||||
*/
|
*/
|
||||||
void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId);
|
void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消支付订单
|
||||||
|
*
|
||||||
|
* @param userId 用户编号
|
||||||
|
* @param orderId 订单编号
|
||||||
|
*/
|
||||||
|
void cancelPaidOrder(Long userId, Long orderId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -918,6 +918,17 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|||||||
.setCombinationRecordId(combinationRecordId).setCombinationHeadId(headId));
|
.setCombinationRecordId(combinationRecordId).setCombinationHeadId(headId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void cancelPaidOrder(Long userId, Long orderId) {
|
||||||
|
TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderId, userId);
|
||||||
|
if (order == null) {
|
||||||
|
throw exception(ORDER_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
cancelOrder0(order, TradeOrderCancelTypeEnum.MEMBER_CANCEL);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建单个订单的评论
|
* 创建单个订单的评论
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user