feat:h5退款接口

This commit is contained in:
dzc committed 2025-01-09 13:02:18 +08:00
1 parent 964b9e87f6
commit 37a88b1d53
13 files changed
+254 -81

No files matched your search

@@ -0,0 +1,16 @@
package com.bsd.pjcloud.hard.api.constant.refund;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum HardSaleTypeEnum {
IN_SALE("10", "售中退款"),
AFTER_SALE("20", "售后退款"),
;
private final String type;
private final String name;
}
@@ -13,4 +13,9 @@ public class HardOrderDto extends HardOrderEntity {
*/
private List<Long> userIds;
/**
* 是否查询购物车列表
*/
private Boolean isFindCarList = false;
}
@@ -6,6 +6,8 @@ import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import com.bsd.pjcloud.wallet.api.vo.base.BaseMchInterface;
import lombok.Data;
import java.util.List;
@Data
public class HardOrderVo extends HardOrderEntity implements BaseUserInterface, BaseDeptInterface, BaseMchInterface {
/**
@@ -25,7 +27,6 @@ public class HardOrderVo extends HardOrderEntity implements BaseUserInterface, B
/**
* 商户相关
*/
private String merchantName;
private String logoPic;
@@ -36,4 +37,9 @@ public class HardOrderVo extends HardOrderEntity implements BaseUserInterface, B
private String hardName;
private String hardType;
/**
* 购物车
*/
private List<HardCarVo> carList;
}
@@ -44,6 +44,39 @@ public class HardAfterSaleController {
private final HardAfterSaleService hardAfterSaleService;
/* ************************************* start app start ************************************* */
@PostMapping(value = "/app/create")
@Operation(summary = "app申请售后")
@Idempotent(expireTime = 10, info = "正在申请中,请勿重复操作")
public R<Long> appCreate(@RequestBody HardAfterSaleDto dto) {
PjcloudUser user = SecurityUtils.getUser();
dto.setUserId(user.getId());
return R.ok(hardAfterSaleService.create(dto));
}
@GetMapping(value = "/app/cancel")
@Operation(summary = "app取消售后")
@Idempotent(expireTime = 10, info = "正在取消中,请勿重复操作")
public R<Boolean> appCancel(@RequestParam Long id) {
PjcloudUser user = SecurityUtils.getUser();
return R.ok(hardAfterSaleService.cancelAfterSale(user.getId(), id));
}
@GetMapping(value = "/app/history")
@Operation(summary = "app查询售后进度")
public R<List<HardAfterSaleLogEntity>> appHistory(@RequestParam Long id) {
return R.ok(hardAfterSaleService.getHistory(id));
}
@GetMapping(value = "/app/detail-by-order-id")
@Operation(summary = "app查询退款详情")
public R<HardAfterSaleVo> appDetail(@RequestParam Long orderId) {
HardAfterSaleDto dto = new HardAfterSaleDto();
dto.setOrderId(orderId);
return R.ok(hardAfterSaleService.join(dto));
}
/* ************************************* end app end ************************************* */
@GetMapping(value = "/history")
@Operation(summary = "查询售后进度")
public R<List<HardAfterSaleLogEntity>> history(@RequestParam Long id) {
@@ -50,6 +50,7 @@ public class HardOrderController {
public R appPageJoin(@ParameterObject Page page, @ParameterObject HardOrderDto dto) {
PjcloudUser user = SecurityUtils.getUser();
dto.setUserId(user.getId());
dto.setIsFindCarList(true);
return R.ok(hardwareOrderService.pageJoin(page, dto));
}
@@ -1,5 +1,7 @@
package com.bsd.pjcloud.hard.mapper.order;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper;
import com.bsd.pjcloud.hard.api.dto.order.HardAfterSaleLogDto;
@@ -8,6 +10,8 @@ import com.bsd.pjcloud.hard.api.vo.order.HardAfterSaleLogVo;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface HardAfterSaleLogMapper extends PjcloudBaseMapper<HardAfterSaleLogEntity> {
@@ -16,4 +20,13 @@ public interface HardAfterSaleLogMapper extends PjcloudBaseMapper<HardAfterSaleL
.selectAll(HardAfterSaleLogEntity.class);
return selectJoinPage(page, HardAfterSaleLogVo.class, wrapper);
}
default HardAfterSaleLogEntity getFirst(Long id) {
List<HardAfterSaleLogEntity> list = selectList(new LambdaQueryWrapper<HardAfterSaleLogEntity>()
.eq(HardAfterSaleLogEntity::getAfterSaleId, id)
.orderByAsc(HardAfterSaleLogEntity::getId)
);
if (ObjectUtil.isEmpty(list)) return null;
return list.stream().findFirst().get();
}
}
@@ -16,6 +16,21 @@ public interface HardAfterSaleService extends IService<HardAfterSaleEntity> {
HardAfterSaleVo join(HardAfterSaleDto dto);
/**
* 申请售后
* @param dto
* @return
*/
Long create(HardAfterSaleDto dto);
/**
* 取消售后
* @param userId 用户id
* @param afterSaleId 售后id
* @return
*/
Boolean cancelAfterSale(Long userId, Long afterSaleId);
/**
* 获取售后进度
*
@@ -3,6 +3,7 @@ package com.bsd.pjcloud.hard.service.impl.order;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.admin.api.dto.UserInfo;
@@ -19,6 +20,7 @@ import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum;
import com.bsd.pjcloud.hard.api.constant.refund.HardAfterSaleOperateTypeEnum;
import com.bsd.pjcloud.hard.api.constant.refund.HardRefundStatusEnum;
import com.bsd.pjcloud.hard.api.constant.refund.HardSaleStatusEnum;
import com.bsd.pjcloud.hard.api.constant.refund.HardSaleTypeEnum;
import com.bsd.pjcloud.hard.api.dto.order.HardAfterSaleDto;
import com.bsd.pjcloud.hard.api.dto.order.HardDisagreeDto;
import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleEntity;
@@ -86,6 +88,45 @@ public class HardAfterSaleServiceImpl extends ServiceImpl<HardAfterSaleMapper, H
return list;
}
@Override
public Long create(HardAfterSaleDto dto) {
HardOrderVo order = validateOrderCanRefund(dto.getOrderId());
HardAfterSaleEntity afterSale = createAfterSale(order, dto);
return afterSale.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean cancelAfterSale(Long userId, Long afterSaleId) {
HardAfterSaleEntity afterSale = baseMapper.selectById(afterSaleId);
if (ObjectUtil.isEmpty(afterSale)) throw new RuntimeException("售后单不存在");
HardOrderEntity order = hardOrderService.getById(afterSale.getOrderId());
if (ObjectUtil.isEmpty(order)) throw new RuntimeException("订单不存在");
if (!ObjectUtil.equals(HardSaleStatusEnum.APPLY.getStatus(), afterSale.getStatus())) {
throw new RuntimeException("取消售后单失败,售后单状态不是【待审核】");
}
// 更新售后单的状态为【已取消】
HardAfterSaleEntity updateRefundObj = HardAfterSaleEntity.builder().id(afterSale.getId()).status(HardSaleStatusEnum.BUYER_CANCEL.getStatus()).build();
baseMapper.updateById(updateRefundObj);
// 更改订单状态为已取消
HardAfterSaleLogEntity last = hardAfterSaleLogMapper.getFirst(afterSale.getId());
if (ObjectUtil.isNotEmpty(last) && ObjectUtil.isNotEmpty(last.getAfterStatus())) {
HardOrderEntity updateOrderObj = HardOrderEntity.builder().id(order.getId()).applyCancelTime(LocalDateTime.now()).orderStatus(last.getBeforeStatus()).build();
hardOrderService.updateById(updateOrderObj);
}
// 添加售后进度
HardAfterSaleLogEntity saveLogObj = HardAfterSaleLogEntity.builder()
.afterSaleId(afterSaleId)
.userId(userId)
.operateType(HardAfterSaleOperateTypeEnum.MEMBER_CANCEL.getType())
.beforeStatus(order.getOrderStatus())
.afterStatus(HardSaleStatusEnum.BUYER_CANCEL.getStatus())
.content(HardSaleStatusEnum.BUYER_CANCEL.getContent())
.build();
hardAfterSaleLogMapper.insert(saveLogObj);
return true;
}
@Override
public HardAfterSaleVo join(HardAfterSaleDto dto) {
HardAfterSaleVo detail = baseMapper.join(dto);
@@ -225,6 +266,41 @@ public class HardAfterSaleServiceImpl extends ServiceImpl<HardAfterSaleMapper, H
return afterSale;
}
@Transactional(rollbackFor = Exception.class)
public HardAfterSaleEntity createAfterSale(HardOrderVo order, HardAfterSaleDto dto) {
HardAfterSaleEntity saveObj = new HardAfterSaleEntity();
// 创建售后单
String refundCode = "hard_" + order.getId();
saveObj.setStatus(HardSaleStatusEnum.APPLY.getStatus());
saveObj.setNo(refundCode);
saveObj.setOrderId(order.getId());
saveObj.setUserId(order.getUserId());
// 标记订单状态
saveObj.setOrderNo(String.valueOf(order.getId()));
String type = ObjectUtil.equal(HardOrderStatusEnum.CANCEL.getType(), order.getOrderStatus()) ?
HardSaleTypeEnum.AFTER_SALE.getType() : HardSaleTypeEnum.IN_SALE.getType();
saveObj.setType(type);
baseMapper.insert(saveObj);
// 添加售后进度
HardAfterSaleLogEntity saveLogObj = HardAfterSaleLogEntity.builder()
.afterSaleId(saveObj.getId())
.userId(order.getUserId())
.operateType(HardAfterSaleOperateTypeEnum.MEMBER_CREATE.getType())
.beforeStatus(order.getOrderStatus())
.afterStatus(HardSaleStatusEnum.APPLY.getStatus())
.content(HardSaleStatusEnum.APPLY.getContent())
.build();
hardAfterSaleLogMapper.insert(saveLogObj);
// 更新交易订单项的售后状态
LambdaUpdateWrapper<HardOrderEntity> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(HardOrderEntity::getApplyCancelTime, null)
.set(HardOrderEntity::getOrderStatus, HardOrderStatusEnum.REFUND.getType())
.set(HardOrderEntity::getRefundStatus, HardRefundStatusEnum.NONE.getStatus())
.eq(HardOrderEntity::getId, order.getId());
hardOrderService.update(updateWrapper);
return saveObj;
}
private HardAfterSaleServiceImpl getSelf() {
return SpringUtil.getBean(getClass());
}
@@ -11,6 +11,7 @@ import com.bsd.pjcloud.admin.api.feign.RemoteDeptService;
import com.bsd.pjcloud.admin.api.feign.RemoteUserService;
import com.bsd.pjcloud.admin.api.utils.DataUtil;
import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.core.util.CollectionUtils;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.hard.api.constant.HardTypeEnum;
@@ -26,6 +27,7 @@ import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardParentCarEntity;
import com.bsd.pjcloud.hard.api.vo.order.HardCarVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo;
import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper;
import com.bsd.pjcloud.hard.service.HardCarService;
@@ -72,6 +74,7 @@ public class HardwareOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardO
private final HardManagerService hardManagerService;
private final HardCarService hardCarService;
private final HardParentCarServiceImpl hardParentCarServiceImpl;
private final RemoteMchService remoteMchService;
private final RemoteCodeUseService remoteCodeUseService;
@@ -80,7 +83,6 @@ public class HardwareOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardO
private final RemoteWalletSettingService walletSettingService;
private final RemoteUserService userService;
private final RemoteDeptService deptService;
private final HardParentCarServiceImpl hardParentCarServiceImpl;
@Override
public Page<HardOrderVo> pageJoin(Page page, HardOrderDto dto) {
@@ -110,6 +112,14 @@ public class HardwareOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardO
MchDataUtil.convertMchList(list.getRecords(), CollectionUtils.convertMap(mchList.getData(), MchManageVo::getId));
}
}
// 购物车
if (dto.getIsFindCarList()) {
for (HardOrderVo v : list.getRecords()) {
List<HardCarEntity> carList = hardCarService.getByParentCarId(v.getParentCarId());
List<HardCarVo> carVoList = BeanUtils.toBean(carList, HardCarVo.class);
v.setCarList(carVoList);
}
}
}
return list;
}
@@ -9,7 +9,7 @@ spring:
username: @nacos.username@
password: @nacos.password@
discovery:
server-addr: pjcloud-register:8848
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
config:
@@ -2,12 +2,15 @@ package com.bsd.pjcloud.wallet.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.bsd.pjcloud.common.core.util.TenantTable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* 支付设置
@@ -23,100 +26,100 @@ import java.time.LocalDateTime;
public class WalletSettingEntity extends Model<WalletSettingEntity> {
/**
* 编号
*/
/**
* 编号
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description="编号")
@Schema(description = "编号")
private Long id;
/**
* 每一餐的上限(分)
*/
@Schema(description="每一餐的上限(分)")
/**
* 每一餐的上限(分)
*/
@Schema(description = "每一餐的上限(分)")
private Integer payAmountMealLimit;
/**
* 每一餐的倍数
*/
@Schema(description="每一餐的倍数")
/**
* 每一餐的倍数
*/
@Schema(description = "每一餐的倍数")
private BigDecimal payAmountMealTimes;
/**
* 是否开启每一餐的额外缴费
*/
@Schema(description="是否开启每一餐的额外缴费")
/**
* 是否开启每一餐的额外缴费
*/
@Schema(description = "是否开启每一餐的额外缴费")
private String payAmountEnable;
/**
* 是否开启钱包二维码刷新
*/
@Schema(description="是否开启钱包二维码刷新")
/**
* 是否开启钱包二维码刷新
*/
@Schema(description = "是否开启钱包二维码刷新")
private String refreshQrCodeEnable;
/**
* 二维码刷新频率
*/
@Schema(description="二维码刷新频率")
/**
* 二维码刷新频率
*/
@Schema(description = "二维码刷新频率")
private Integer refreshQrCodeFre;
/**
* 是否开启离线订单的审批
*/
@Schema(description="是否开启离线订单的审批")
/**
* 是否开启离线订单的审批
*/
@Schema(description = "是否开启离线订单的审批")
private String offLineOrderApplyEnable;
/**
* 退款理由
*/
@Schema(description="退款理由")
/**
* 退款理由
*/
@Schema(description = "退款理由")
private String afterSaleRefundReasons;
/**
* 退货理由
*/
@Schema(description="退货理由")
/**
* 退货理由
*/
@Schema(description = "退货理由")
private String afterSaleReturnReasons;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description="创建人")
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description="创建时间")
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description="修改人")
/**
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "修改人")
private String updateBy;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description="修改时间")
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "修改时间")
private LocalDateTime updateTime;
/**
* 删除标记
*/
/**
* 删除标记
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description="删除标记")
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标记")
private String delFlag;
/**
* 租户ID
*/
@Schema(description="租户ID")
/**
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
}
@@ -1,30 +1,18 @@
package com.bsd.pjcloud.wallet.controller;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.wallet.api.dto.WalletSettingDto;
import com.bsd.pjcloud.wallet.api.entity.WalletSettingEntity;
import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo;
import com.bsd.pjcloud.wallet.service.WalletSettingService;
import org.springframework.security.access.prepost.PreAuthorize;
import com.bsd.pjcloud.common.excel.annotation.ResponseExcel;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
/**
* 支付设置
*
@@ -46,8 +34,14 @@ public class WalletSettingController {
public R<WalletSettingVo> get() {
return R.ok(walletSettingService.getSetting());
}
/* ************************************* start 远程调用 start ************************************* */
/* ************************************* end 远程调用 end ************************************* */
/* ************************************* start app start ************************************* */
@GetMapping("/app/get-setting")
public R<WalletSettingVo> appGet() {
return R.ok(walletSettingService.getSetting());
}
/* ************************************* end app end ************************************* */
@Operation(summary = "获取支付配置", description = "获取支付配置")
@GetMapping("")
@@ -18,6 +18,7 @@ import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
/**
* 支付设置