Browse Source

1、订单退款问题修复

master
Aug 3 days ago
parent
commit
ec5453f1b6
13 changed files with 152 additions and 81 deletions
  1. +3
    -2
      admin-hanhai-vue/.env.development
  2. +3
    -2
      admin-hanhai-vue/.env.production
  3. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/controller/MassageOrderController.java
  4. +9
    -4
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/entity/MassageOrder.java
  5. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/mapper/MassageOrderMapper.java
  6. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/service/IMassageOrderService.java
  7. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/service/impl/MassageOrderServiceImpl.java
  8. +7
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/vue/MassageOrderList.vue
  9. +5
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/vue/modules/MassageOrderForm.vue
  10. +13
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/vue3/MassageOrder.data.ts
  11. +1
    -0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiService/impl/OrderServiceImpl.java
  12. +103
    -64
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiService/impl/WxMiniappPayServiceImpl.java
  13. +4
    -4
      jeecg-boot-module-system/src/main/resources/application-dev.yml

+ 3
- 2
admin-hanhai-vue/.env.development View File

@ -1,6 +1,7 @@
NODE_ENV=development
VUE_APP_API_BASE_URL=https://www.yurangongfang.com/massage-admin/
//VUE_APP_API_BASE_URL=http://localhost:8000/massage-admin/
//VUE_APP_API_BASE_URL=https://wwwh5.yurangongfang.com/massage-admin/
//VUE_APP_API_BASE_URL=https://www.yurangongfang.com/massage-admin/
VUE_APP_API_BASE_URL=http://localhost:8000/massage-admin/
VUE_APP_CAS_BASE_URL=http://cas.example.org:8443/cas
VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview


+ 3
- 2
admin-hanhai-vue/.env.production View File

@ -1,5 +1,6 @@
NODE_ENV=production
VUE_APP_API_BASE_URL=https://www.yurangongfang.com/massage-admin/
//VUE_APP_API_BASE_URL=http://localhost:8000/massage-admin/
//VUE_APP_API_BASE_URL=https://wwwh5.yurangongfang.com/massage-admin/
//VUE_APP_API_BASE_URL=https://www.yurangongfang.com/massage-admin/
VUE_APP_API_BASE_URL=http://localhost:8000/massage-admin/
VUE_APP_CAS_BASE_URL=http://localhost:8888/cas
VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview

+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/controller/MassageOrderController.java View File

@ -39,7 +39,7 @@ import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 订单信息表
* @Author: jeecg-boot
* @Date: 2025-05-20
* @Date: 2025-07-30
* @Version: V1.0
*/
@Api(tags="订单信息表")


+ 9
- 4
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/entity/MassageOrder.java View File

@ -22,7 +22,7 @@ import lombok.experimental.Accessors;
/**
* @Description: 订单信息表
* @Author: jeecg-boot
* @Date: 2025-05-20
* @Date: 2025-07-30
* @Version: V1.0
*/
@Data
@ -66,6 +66,11 @@ public class MassageOrder implements Serializable {
@Excel(name = "优惠金额", width = 15)
@ApiModelProperty(value = "优惠金额")
private java.math.BigDecimal discountAmount;
/**付款方式*/
@Excel(name = "付款方式", width = 15, dicCode = "pay_type")
@Dict(dicCode = "pay_type")
@ApiModelProperty(value = "付款方式")
private java.lang.String payType;
/**付款时间*/
@Excel(name = "付款时间", width = 15)
@ApiModelProperty(value = "付款时间")
@ -103,7 +108,7 @@ public class MassageOrder implements Serializable {
@ApiModelProperty(value = "是否已退款")
private java.lang.String isRefound;
//项目信息
@TableField(exist = false)
MassageItem massageItem;
//项目信息
@TableField(exist = false)
MassageItem massageItem;
}

+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/mapper/MassageOrderMapper.java View File

@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 订单信息表
* @Author: jeecg-boot
* @Date: 2025-05-20
* @Date: 2025-07-30
* @Version: V1.0
*/
public interface MassageOrderMapper extends BaseMapper<MassageOrder> {


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/service/IMassageOrderService.java View File

@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 订单信息表
* @Author: jeecg-boot
* @Date: 2025-05-20
* @Date: 2025-07-30
* @Version: V1.0
*/
public interface IMassageOrderService extends IService<MassageOrder> {


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/service/impl/MassageOrderServiceImpl.java View File

@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 订单信息表
* @Author: jeecg-boot
* @Date: 2025-05-20
* @Date: 2025-07-30
* @Version: V1.0
*/
@Service


+ 7
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/vue/MassageOrderList.vue View File

@ -142,6 +142,11 @@
align:"center",
dataIndex: 'discountAmount'
},
{
title:'付款方式',
align:"center",
dataIndex: 'payType_dictText'
},
{
title:'付款时间',
align:"center",
@ -220,6 +225,7 @@
fieldList.push({type:'datetime',value:'validTime',text:'有效时间'})
fieldList.push({type:'BigDecimal',value:'amount',text:'实付款',dictCode:''})
fieldList.push({type:'BigDecimal',value:'discountAmount',text:'优惠金额',dictCode:''})
fieldList.push({type:'string',value:'payType',text:'付款方式',dictCode:'pay_type'})
fieldList.push({type:'datetime',value:'payTime',text:'付款时间'})
fieldList.push({type:'datetime',value:'useTime',text:'核销时间'})
fieldList.push({type:'string',value:'shopId',text:'核销门店id',dictCode:"massage_shop,shop,id"})
@ -227,7 +233,7 @@
fieldList.push({type:'string',value:'itemId',text:'关联项目id',dictCode:"massage_item,title,id"})
fieldList.push({type:'string',value:'userId',text:'关联用户id',dictCode:"han_hai_member,nick_name,id"})
fieldList.push({type:'string',value:'isDel',text:'是否删除',dictCode:'is_del'})
fieldList.push({type:'string',value:'isRefound',text:'是否已退款',dictCode:''})
fieldList.push({type:'string',value:'isRefound',text:'是否已退款',dictCode:'is_refound'})
this.superFieldList = fieldList
}
}


+ 5
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/vue/modules/MassageOrderForm.vue View File

@ -23,6 +23,11 @@
<a-input-number v-model="model.discountAmount" placeholder="请输入优惠金额" style="width: 100%" />
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="付款方式" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="payType">
<j-dict-select-tag type="list" v-model="model.payType" dictCode="pay_type" placeholder="请选择付款方式" />
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="付款时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="payTime">
<j-date placeholder="请选择付款时间" v-model="model.payTime" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />


+ 13
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/massageOrder/vue3/MassageOrder.data.ts View File

@ -24,6 +24,11 @@ export const columns: BasicColumn[] = [
align:"center",
dataIndex: 'discountAmount'
},
{
title: '付款方式',
align:"center",
dataIndex: 'payType_dictText'
},
{
title: '付款时间',
align:"center",
@ -93,6 +98,14 @@ export const formSchema: FormSchema[] = [
field: 'discountAmount',
component: 'InputNumber',
},
{
label: '付款方式',
field: 'payType',
component: 'JDictSelectTag',
componentProps:{
dictCode:"pay_type"
},
},
{
label: '付款时间',
field: 'payTime',


+ 1
- 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiService/impl/OrderServiceImpl.java View File

@ -157,6 +157,7 @@ public class OrderServiceImpl implements OrderService {
//订单信息
String payNo = IdWorker.getIdStr();//生成订单号
massageOrder.setId(payNo);
massageOrder.setPayType(payType);//支付方式0-微信支付 1-余额支付
massageOrder.setUserId(hanHaiMember.getId());
//查询服务信息


+ 103
- 64
jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiService/impl/WxMiniappPayServiceImpl.java View File

@ -143,7 +143,7 @@ public class WxMiniappPayServiceImpl implements WxMiniappPayService {
//权限验证
//HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token);//小程序权限验证
HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiAccount(token); //公众号权限验证;
//HanHaiMember hanHaiMember = hanHaiMemberService.getById("1919297392365035521");
//HanHaiMember hanHaiMember = hanHaiMemberService.getById("1935289020980486145");
// 初始化服务
RefundService service = new RefundService.Builder().config(config).build();
@ -166,74 +166,113 @@ public class WxMiniappPayServiceImpl implements WxMiniappPayService {
if(null != check){
return Response.error("该订单已经退款过:"+orderId);
}
//添加退款记录
MassageRefoundLog massageRefoundLog = new MassageRefoundLog();
massageRefoundLog.setStatus("0");//退款状态
massageRefoundLog.setOrderId(orderId);//退款订单号
massageRefoundLog.setRefoundAmount(payOrder.getAmount());//退款金额
massageRefoundLog.setUserId(hanHaiMember.getId());//退款用户
massageRefoundLogService.save(massageRefoundLog);
switch (payOrder.getPayType()){
//微信支付退款
case "0":
//添加退款记录
MassageRefoundLog massageRefoundLog = new MassageRefoundLog();
massageRefoundLog.setStatus("0");//退款状态
massageRefoundLog.setOrderId(orderId);//退款订单号
massageRefoundLog.setRefoundAmount(payOrder.getAmount());//退款金额
massageRefoundLog.setUserId(hanHaiMember.getId());//退款用户
massageRefoundLogService.save(massageRefoundLog);
// if (payOrder.getAmount().compareTo(req.getRefundAmount()) < 0) {
// return Response.error("退款金额不能大于支付金额");
// }
CreateRequest request = new CreateRequest();
// 调用request.setXxx(val)设置所需参数具体参数可见Request定义
request.setOutTradeNo(orderId);
request.setOutRefundNo("REFUND_" + orderId);
AmountReq amount = new AmountReq();
// 订单总金额单位为分只能为整数详见支付金额
amount.setTotal(decimalToLong(payOrder.getAmount()));
// 退款金额单位为分只能为整数不能超过支付总额
amount.setRefund(decimalToLong(payOrder.getAmount()));
amount.setCurrency("CNY");
request.setAmount(amount);
request.setNotifyUrl(refundNotifyUrl);
// 调用接口
Refund refund = null;
try {
refund = service.create(request);
} catch (HttpException e) {
log.error("退款申请失败,发送HTTP请求失败:", e);
return Response.error("退款失败");
} catch (MalformedMessageException e) {
log.error("退款申请失败,解析微信支付应答或回调报文异常,返回信息:", e);
return Response.error("退款失败");
} catch (ValidationException e) {
log.error("退款申请失败,验证签名失败,返回信息:", e);
return Response.error("验证签名失败");
} catch (ServiceException e) {
log.error("退款申请失败,发送HTTP请求成功,返回异常,返回码:{},返回信息:", e.getErrorCode(), e);
return Response.error("退款失败:" + e.getErrorMessage());
} catch (Exception e) {
log.error("退款申请失败,异常:", e);
return Response.error("退款失败");
}
if (Status.SUCCESS.equals(refund.getStatus())) {
log.info("退款成功!-订单号:{}", payOrder.getId());
//修改退款记录订单状态
MassageRefoundLog refoundLog = massageRefoundLogService.lambdaQuery()
.eq(MassageRefoundLog::getOrderId, payOrder.getId())
.one();
refoundLog.setRefoundTime(CommonUtils.getCurrentTime());
refoundLog.setStatus("1");
massageRefoundLogService.updateById(refoundLog);
return Response.success("退款成功");
} else if (Status.CLOSED.equals(refund.getStatus())) {
log.info("退款关闭!-订单号:{}", payOrder.getId());
return Response.error("退款关闭");
} else if (Status.PROCESSING.equals(refund.getStatus())) {
log.info("退款处理中!-订单号:{}", payOrder.getId());
return Response.error("退款处理中");
} else if (Status.ABNORMAL.equals(refund.getStatus())) {
log.info("退款异常!-订单号:{}", payOrder.getId());
return Response.error("退款异常");
CreateRequest request = new CreateRequest();
// 调用request.setXxx(val)设置所需参数具体参数可见Request定义
request.setOutTradeNo(orderId);
request.setOutRefundNo("REFUND_" + orderId);
AmountReq amount = new AmountReq();
// 订单总金额单位为分只能为整数详见支付金额
amount.setTotal(decimalToLong(payOrder.getAmount()));
// 退款金额单位为分只能为整数不能超过支付总额
amount.setRefund(decimalToLong(payOrder.getAmount()));
amount.setCurrency("CNY");
request.setAmount(amount);
request.setNotifyUrl(refundNotifyUrl);
// 调用接口
Refund refund = null;
try {
refund = service.create(request);
} catch (HttpException e) {
log.error("退款申请失败,发送HTTP请求失败:", e);
return Response.error("退款失败");
} catch (MalformedMessageException e) {
log.error("退款申请失败,解析微信支付应答或回调报文异常,返回信息:", e);
return Response.error("退款失败");
} catch (ValidationException e) {
log.error("退款申请失败,验证签名失败,返回信息:", e);
return Response.error("验证签名失败");
} catch (ServiceException e) {
log.error("退款申请失败,发送HTTP请求成功,返回异常,返回码:{},返回信息:", e.getErrorCode(), e);
return Response.error("退款失败:" + e.getErrorMessage());
} catch (Exception e) {
log.error("退款申请失败,异常:", e);
return Response.error("退款失败");
}
if (Status.SUCCESS.equals(refund.getStatus())) {
log.info("退款成功!-订单号:{}", payOrder.getId());
//修改退款记录订单状态
MassageRefoundLog refoundLog = massageRefoundLogService.lambdaQuery()
.eq(MassageRefoundLog::getOrderId, payOrder.getId())
.one();
refoundLog.setRefoundTime(CommonUtils.getCurrentTime());
refoundLog.setStatus("1");
massageRefoundLogService.updateById(refoundLog);
return Response.success("退款成功");
} else if (Status.CLOSED.equals(refund.getStatus())) {
log.info("退款关闭!-订单号:{}", payOrder.getId());
return Response.error("退款关闭");
} else if (Status.PROCESSING.equals(refund.getStatus())) {
log.info("退款处理中!-订单号:{}", payOrder.getId());
return Response.error("退款处理中");
} else if (Status.ABNORMAL.equals(refund.getStatus())) {
log.info("退款异常!-订单号:{}", payOrder.getId());
return Response.error("退款异常");
}
return Response.error("退款失败");
case "1":
//余额支付退款
//修改用户余额
BigDecimal refoundMoney = payOrder.getAmount();//退款金额
BigDecimal newBalance = hanHaiMember.getPrice().add(refoundMoney);
hanHaiMember.setPrice(newBalance);
hanHaiMemberService.updateById(hanHaiMember);
//修改订单退款状态
MassageOrder order = massageOrderService
.lambdaQuery()
.eq(MassageOrder::getId, payOrder.getId())
.eq(MassageOrder::getIsRefound, "0")
.one();
if(null != order){
order.setStatus("3");
order.setIsRefound("1");
massageOrderService.updateById(order);
}
//添加退款记录
MassageRefoundLog refoundLog = new MassageRefoundLog();
refoundLog.setStatus("1");//退款状态
refoundLog.setOrderId(orderId);//退款订单号
refoundLog.setRefoundAmount(payOrder.getAmount());//退款金额
refoundLog.setUserId(hanHaiMember.getId());//退款用户
refoundLog.setRefoundTime(CommonUtils.getCurrentTime());
massageRefoundLogService.save(refoundLog);
return Response.success("退款到余额成功");
default:
//余额支付退款
return Response.error("支付方式错误,退款失败");
}
return Response.error("退款失败");
}
/**


+ 4
- 4
jeecg-boot-module-system/src/main/resources/application-dev.yml View File

@ -339,10 +339,10 @@ wx:
# appid: wx77ba4c7131677a74 # 微信小程序appid
# secret: fb915d623f92d455f2e70934f75fb96c # 微信小程序密钥
merchantId: 1712378227 # 商户号
privateKeyPath: jeecg-boot-module-system/src/main/resources/apiclient_key.pem #本地私钥路径
publicKeyPath: jeecg-boot-module-system/src/main/resources/pub_key.pem #本地公钥路径
# privateKeyPath: /root/massage/cerFile/apiclient_key.pem #线上私钥路径
# publicKeyPath: /root/massage/cerFile/pub_key.pem #线上公钥路径
# privateKeyPath: jeecg-boot-module-system/src/main/resources/apiclient_key.pem #本地私钥路径
# publicKeyPath: jeecg-boot-module-system/src/main/resources/pub_key.pem #本地公钥路径
privateKeyPath: /root/massage/cerFile/apiclient_key.pem #线上私钥路径
publicKeyPath: /root/massage/cerFile/pub_key.pem #线上公钥路径
publicKeyId: PUB_KEY_ID_0117123782272025033100396400002931 #公钥
merchantSerialNumber: 33E9FE8076531A7C7AD401DC34E053DBD7C28E22 # 商户API证书序列号
apiV3Key: 0fdb77429ffdf206c151af76a663041c # 商户APIV3密钥


Loading…
Cancel
Save