订单退款
parent
fc9c6e759a
commit
a6eb645d54
|
@ -18,6 +18,8 @@ public class ValidationUtils {
|
||||||
|
|
||||||
private static final Pattern PATTERN_MOBILE = Pattern.compile("^(?:(?:\\+|00)86)?1(?:(?:3[\\d])|(?:4[0,1,4-9])|(?:5[0-3,5-9])|(?:6[2,5-7])|(?:7[0-8])|(?:8[\\d])|(?:9[0-3,5-9]))\\d{8}$");
|
private static final Pattern PATTERN_MOBILE = Pattern.compile("^(?:(?:\\+|00)86)?1(?:(?:3[\\d])|(?:4[0,1,4-9])|(?:5[0-3,5-9])|(?:6[2,5-7])|(?:7[0-8])|(?:8[\\d])|(?:9[0-3,5-9]))\\d{8}$");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static final Pattern PATTERN_URL = Pattern.compile("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]");
|
private static final Pattern PATTERN_URL = Pattern.compile("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]");
|
||||||
|
|
||||||
private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*");
|
private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*");
|
||||||
|
|
|
@ -1,13 +1,23 @@
|
||||||
package cn.iocoder.yudao.framework.excel.core.util;
|
package cn.iocoder.yudao.framework.excel.core.util;
|
||||||
|
|
||||||
import com.alibaba.excel.EasyExcel;
|
import com.alibaba.excel.EasyExcel;
|
||||||
|
import com.alibaba.excel.enums.CellDataTypeEnum;
|
||||||
|
import com.alibaba.excel.metadata.Head;
|
||||||
|
import com.alibaba.excel.metadata.data.WriteCellData;
|
||||||
|
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
||||||
|
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
|
||||||
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
|
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Excel 工具类
|
* Excel 工具类
|
||||||
|
@ -32,7 +42,7 @@ public class ExcelUtils {
|
||||||
// 输出 Excel
|
// 输出 Excel
|
||||||
EasyExcel.write(response.getOutputStream(), head)
|
EasyExcel.write(response.getOutputStream(), head)
|
||||||
.autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
|
.autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
|
||||||
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
|
.registerWriteHandler(new AutoColumnWidthWriteHandler()) // 基于 column 长度,自动适配。最大 255 宽度
|
||||||
.sheet(sheetName).doWrite(data);
|
.sheet(sheetName).doWrite(data);
|
||||||
// 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
|
// 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
|
||||||
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
|
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
|
||||||
|
@ -44,5 +54,63 @@ public class ExcelUtils {
|
||||||
.autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
|
.autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
|
||||||
.doReadAllSync();
|
.doReadAllSync();
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 宽度自适应
|
||||||
|
*/
|
||||||
|
public static class AutoColumnWidthWriteHandler extends AbstractColumnWidthStyleStrategy {
|
||||||
|
|
||||||
|
private static final int MAX_COLUMN_WIDTH = 255;
|
||||||
|
|
||||||
|
// 因为在自动列宽的过程中,有些设置地方让列宽显得紧凑,所以做出了个判断
|
||||||
|
private static final int COLUMN_WIDTH = 30;
|
||||||
|
|
||||||
|
private final Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setColumnWidth(@NonNull WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, @NonNull Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
|
||||||
|
boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
|
||||||
|
if (needSetWidth) {
|
||||||
|
Map<Integer, Integer> maxColumnWidthMap = CACHE.computeIfAbsent(writeSheetHolder.getSheetNo(), k -> new HashMap<>());
|
||||||
|
|
||||||
|
Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
|
||||||
|
if (columnWidth >= 0) {
|
||||||
|
if (columnWidth > MAX_COLUMN_WIDTH) {
|
||||||
|
columnWidth = MAX_COLUMN_WIDTH;
|
||||||
|
} else {
|
||||||
|
if (columnWidth < COLUMN_WIDTH) {
|
||||||
|
columnWidth = columnWidth * 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());
|
||||||
|
if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
|
||||||
|
maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);
|
||||||
|
writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, @NonNull Boolean isHead) {
|
||||||
|
if (isHead) {
|
||||||
|
return cell.getStringCellValue().getBytes().length;
|
||||||
|
} else {
|
||||||
|
WriteCellData<?> cellData = cellDataList.get(0);
|
||||||
|
CellDataTypeEnum type = cellData.getType();
|
||||||
|
if (type == null) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
switch (type) {
|
||||||
|
case STRING:
|
||||||
|
return cellData.getStringValue().getBytes().length;
|
||||||
|
case BOOLEAN:
|
||||||
|
return cellData.getBooleanValue().toString().getBytes().length;
|
||||||
|
case NUMBER:
|
||||||
|
return cellData.getNumberValue().toString().getBytes().length;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,8 +83,8 @@ public class PhoneRecordController {
|
||||||
@Operation(summary = "获得充值档位记录分页")
|
@Operation(summary = "获得充值档位记录分页")
|
||||||
@PreAuthorize("@ss.hasPermission('shop:phone-record:query')")
|
@PreAuthorize("@ss.hasPermission('shop:phone-record:query')")
|
||||||
public CommonResult<PageResult<PhoneRecordRespVO>> getPhoneRecordPage(@Valid PhoneRecordPageReqVO pageVO) {
|
public CommonResult<PageResult<PhoneRecordRespVO>> getPhoneRecordPage(@Valid PhoneRecordPageReqVO pageVO) {
|
||||||
PageResult<PhoneRecordDO> pageResult = phoneRecordService.getPhoneRecordPage(pageVO);
|
PageResult<PhoneRecordRespVO> pageResult = phoneRecordService.getPhoneRecordPage(pageVO);
|
||||||
return success(PhoneRecordConvert.INSTANCE.convertPage(pageResult));
|
return success(pageResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
|
|
|
@ -118,7 +118,7 @@ public class RechargeOrderController {
|
||||||
List<RechargeOrderExcelVO> list = rechargeOrderService.findListExcel(exportReqVO);
|
List<RechargeOrderExcelVO> list = rechargeOrderService.findListExcel(exportReqVO);
|
||||||
ArrayList<Long> s = new ArrayList<>();
|
ArrayList<Long> s = new ArrayList<>();
|
||||||
list.forEach(x -> {
|
list.forEach(x -> {
|
||||||
s.add(x.getId());
|
s.add(Long.parseLong(x.getId()));
|
||||||
});
|
});
|
||||||
List<RechargeOrderInfoExcelVO> infoList = rechargeOrderInfoService.getRechargeOrderInfoListExcel(s);
|
List<RechargeOrderInfoExcelVO> infoList = rechargeOrderInfoService.getRechargeOrderInfoListExcel(s);
|
||||||
// 导出 Excel
|
// 导出 Excel
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package cn.iocoder.yudao.module.shop.controller.admin.recharge.method;
|
package cn.iocoder.yudao.module.shop.controller.admin.recharge.method;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderExcelVO;
|
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderExcelVO;
|
||||||
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderInfoExcelVO;
|
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderInfoExcelVO;
|
||||||
import com.alibaba.excel.EasyExcel;
|
import com.alibaba.excel.EasyExcel;
|
||||||
|
@ -32,7 +33,7 @@ public class Excel {
|
||||||
|
|
||||||
|
|
||||||
ExcelWriterBuilder writerBuilder = EasyExcel.write(response.getOutputStream())
|
ExcelWriterBuilder writerBuilder = EasyExcel.write(response.getOutputStream())
|
||||||
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy());
|
.registerWriteHandler(new ExcelUtils.AutoColumnWidthWriteHandler());
|
||||||
ExcelWriter excelWriter = writerBuilder.build();
|
ExcelWriter excelWriter = writerBuilder.build();
|
||||||
|
|
||||||
WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "订单列表").head(RechargeOrderExcelVO.class).build();
|
WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "订单列表").head(RechargeOrderExcelVO.class).build();
|
||||||
|
|
|
@ -37,7 +37,8 @@ public class PhoneRecordBaseVO {
|
||||||
@Schema(description = "充值档位", required = true, example = "25455")
|
@Schema(description = "充值档位", required = true, example = "25455")
|
||||||
@NotNull(message = "充值档位不能为空")
|
@NotNull(message = "充值档位不能为空")
|
||||||
private BigDecimal rechargeGearId;
|
private BigDecimal rechargeGearId;
|
||||||
|
@Schema(description = "充值档位", required = true, example = "25455")
|
||||||
|
private String rechargeGearName;
|
||||||
@Schema(description = "返费结束日期", required = true)
|
@Schema(description = "返费结束日期", required = true)
|
||||||
@NotNull(message = "返费结束日期不能为空")
|
@NotNull(message = "返费结束日期不能为空")
|
||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
@ -45,6 +46,6 @@ public class PhoneRecordBaseVO {
|
||||||
|
|
||||||
@Schema(description = "返费期数", required = true)
|
@Schema(description = "返费期数", required = true)
|
||||||
@NotNull(message = "返费期数不能为空")
|
@NotNull(message = "返费期数不能为空")
|
||||||
private String refundFeeNumber;
|
private Integer refundFeeNumber;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ public class PhoneRecordExcelVO {
|
||||||
private LocalDateTime refundFeeEndDate;
|
private LocalDateTime refundFeeEndDate;
|
||||||
|
|
||||||
@ExcelProperty("返费期数")
|
@ExcelProperty("返费期数")
|
||||||
private String refundFeeNumber;
|
private Integer refundFeeNumber;
|
||||||
|
|
||||||
@ExcelProperty("创建时间")
|
@ExcelProperty("创建时间")
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
|
@ -35,7 +35,7 @@ public class PhoneRecordExportReqVO {
|
||||||
private LocalDateTime[] refundFeeEndDate;
|
private LocalDateTime[] refundFeeEndDate;
|
||||||
|
|
||||||
@Schema(description = "返费期数")
|
@Schema(description = "返费期数")
|
||||||
private String refundFeeNumber;
|
private Integer refundFeeNumber;
|
||||||
|
|
||||||
@Schema(description = "创建时间")
|
@Schema(description = "创建时间")
|
||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
|
|
@ -37,7 +37,7 @@ public class PhoneRecordPageReqVO extends PageParam {
|
||||||
private LocalDateTime[] refundFeeEndDate;
|
private LocalDateTime[] refundFeeEndDate;
|
||||||
|
|
||||||
@Schema(description = "返费期数")
|
@Schema(description = "返费期数")
|
||||||
private String refundFeeNumber;
|
private Integer refundFeeNumber;
|
||||||
|
|
||||||
@Schema(description = "创建时间")
|
@Schema(description = "创建时间")
|
||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
package cn.iocoder.yudao.module.shop.controller.admin.recharge.vo;
|
package cn.iocoder.yudao.module.shop.controller.admin.recharge.vo;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
|
||||||
|
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
|
||||||
|
import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
|
||||||
|
import com.alibaba.excel.annotation.ExcelIgnore;
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
@ -15,8 +19,8 @@ import java.time.LocalDateTime;
|
||||||
public class RechargeOrderExcelVO {
|
public class RechargeOrderExcelVO {
|
||||||
|
|
||||||
|
|
||||||
@ExcelProperty("订单id")
|
@ExcelIgnore
|
||||||
private Long id;
|
private String id;
|
||||||
|
|
||||||
@ExcelProperty("订单编号")
|
@ExcelProperty("订单编号")
|
||||||
private String orderId;
|
private String orderId;
|
||||||
|
@ -59,7 +63,8 @@ public class RechargeOrderExcelVO {
|
||||||
@ExcelProperty("自提地址")
|
@ExcelProperty("自提地址")
|
||||||
private String SelfPickupAddr;
|
private String SelfPickupAddr;
|
||||||
|
|
||||||
@ExcelProperty("支付方式")
|
@ExcelProperty(value = "支付方式",converter = DictConvert.class)
|
||||||
|
@DictFormat(DictTypeConstants.PYT_TYPE)
|
||||||
private String payType;
|
private String payType;
|
||||||
|
|
||||||
@ExcelProperty("订单备注")
|
@ExcelProperty("订单备注")
|
||||||
|
@ -69,7 +74,7 @@ public class RechargeOrderExcelVO {
|
||||||
private BigDecimal totalPrice;
|
private BigDecimal totalPrice;
|
||||||
|
|
||||||
@ExcelProperty("运费")
|
@ExcelProperty("运费")
|
||||||
private BigDecimal shipPrice;
|
private BigDecimal shipPrice=new BigDecimal(0);
|
||||||
|
|
||||||
@ExcelProperty("会员账号")
|
@ExcelProperty("会员账号")
|
||||||
private String vipAccount;
|
private String vipAccount;
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package cn.iocoder.yudao.module.shop.controller.admin.recharge.vo;
|
package cn.iocoder.yudao.module.shop.controller.admin.recharge.vo;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
|
||||||
|
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
|
||||||
|
import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
@ -46,7 +49,8 @@ public class RechargeOrderInfoExcelVO {
|
||||||
@ExcelProperty("实付金额")
|
@ExcelProperty("实付金额")
|
||||||
private BigDecimal payPrice;
|
private BigDecimal payPrice;
|
||||||
|
|
||||||
@ExcelProperty("售后状态")
|
@ExcelProperty(value = "售后状态",converter = DictConvert.class)
|
||||||
|
@DictFormat(DictTypeConstants.PYT_STATUS)
|
||||||
private String afterStatus;
|
private String afterStatus;
|
||||||
|
|
||||||
@ExcelProperty("退款金额")
|
@ExcelProperty("退款金额")
|
||||||
|
@ -68,20 +72,4 @@ public class RechargeOrderInfoExcelVO {
|
||||||
private String mark;
|
private String mark;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ExcelProperty("赠送积分")
|
|
||||||
private Integer giveIntegral;
|
|
||||||
|
|
||||||
@ExcelProperty("是否单独分佣,0-否,1-是")
|
|
||||||
private Boolean isSub;
|
|
||||||
|
|
||||||
@ExcelProperty("会员价")
|
|
||||||
private BigDecimal vipPrice;
|
|
||||||
|
|
||||||
@ExcelProperty("商品类型:0-会员充值")
|
|
||||||
private Integer productType;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ public class RechargeOrderPageReqVO extends PageParam {
|
||||||
private BigDecimal payPrice;
|
private BigDecimal payPrice;
|
||||||
|
|
||||||
@Schema(description = "支付状态", example = "17413")
|
@Schema(description = "支付状态", example = "17413")
|
||||||
private Byte paid;
|
private Integer paid;
|
||||||
|
|
||||||
@Schema(description = "支付截止时间")
|
@Schema(description = "支付截止时间")
|
||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
@ -70,7 +70,7 @@ public class RechargeOrderPageReqVO extends PageParam {
|
||||||
private Boolean status;
|
private Boolean status;
|
||||||
|
|
||||||
@Schema(description = "0 未退款 1 申请中 2 已退款 3 退款中", example = "2")
|
@Schema(description = "0 未退款 1 申请中 2 已退款 3 退款中", example = "2")
|
||||||
private Byte refundStatus;
|
private Integer refundStatus;
|
||||||
|
|
||||||
@Schema(description = "退款图片")
|
@Schema(description = "退款图片")
|
||||||
private String refundReasonWapImg;
|
private String refundReasonWapImg;
|
||||||
|
@ -104,7 +104,7 @@ public class RechargeOrderPageReqVO extends PageParam {
|
||||||
private Byte isChannel;
|
private Byte isChannel;
|
||||||
|
|
||||||
@Schema(description = "消息提醒")
|
@Schema(description = "消息提醒")
|
||||||
private Byte isRemind;
|
private Integer isRemind;
|
||||||
|
|
||||||
@Schema(description = "后台是否删除")
|
@Schema(description = "后台是否删除")
|
||||||
private Boolean isSystemDel;
|
private Boolean isSystemDel;
|
||||||
|
|
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.shop.controller.app.member;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
|
import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
|
||||||
|
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
|
||||||
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeGearRespVO;
|
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeGearRespVO;
|
||||||
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderRespVO;
|
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderRespVO;
|
||||||
import cn.iocoder.yudao.module.shop.convert.recharge.RechargeOrderConvert;
|
import cn.iocoder.yudao.module.shop.convert.recharge.RechargeOrderConvert;
|
||||||
|
@ -42,6 +43,7 @@ public class MemberController {
|
||||||
@Operation(summary = "会员档次信息")
|
@Operation(summary = "会员档次信息")
|
||||||
@RequestMapping(value = "/memberGradeInfo", method = RequestMethod.GET)
|
@RequestMapping(value = "/memberGradeInfo", method = RequestMethod.GET)
|
||||||
@PreAuthenticated
|
@PreAuthenticated
|
||||||
|
@TenantIgnore
|
||||||
public CommonResult<List<RechargeGearRespVO>> memberGradeInfo() {
|
public CommonResult<List<RechargeGearRespVO>> memberGradeInfo() {
|
||||||
return CommonResult.success(rechargeGearService.getGradeInfo());
|
return CommonResult.success(rechargeGearService.getGradeInfo());
|
||||||
}
|
}
|
||||||
|
@ -50,12 +52,14 @@ public class MemberController {
|
||||||
@Operation(summary = "获取当前登录账号的充值记录")
|
@Operation(summary = "获取当前登录账号的充值记录")
|
||||||
@RequestMapping(value = "/memberOrderInfo", method = RequestMethod.GET)
|
@RequestMapping(value = "/memberOrderInfo", method = RequestMethod.GET)
|
||||||
@PreAuthenticated
|
@PreAuthenticated
|
||||||
|
@TenantIgnore
|
||||||
public CommonResult<List<RechargeOrderRespVO>> memberOrderInfo() {
|
public CommonResult<List<RechargeOrderRespVO>> memberOrderInfo() {
|
||||||
return CommonResult.success(rechargeOrderService.memberOrderInfo());
|
return CommonResult.success(rechargeOrderService.memberOrderInfo());
|
||||||
}
|
}
|
||||||
@Operation(summary = "会员头部信息")
|
@Operation(summary = "会员头部信息")
|
||||||
@RequestMapping(value = "/memberHeadInfo", method = RequestMethod.GET)
|
@RequestMapping(value = "/memberHeadInfo", method = RequestMethod.GET)
|
||||||
@PreAuthenticated
|
@PreAuthenticated
|
||||||
|
@TenantIgnore
|
||||||
public CommonResult<MemberHeadResponse> memberHeadInfo() {
|
public CommonResult<MemberHeadResponse> memberHeadInfo() {
|
||||||
return CommonResult.success(rechargeOrderService.memberHeadInfo());
|
return CommonResult.success(rechargeOrderService.memberHeadInfo());
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,6 @@ public class PhoneRecordDO extends BaseDO {
|
||||||
/**
|
/**
|
||||||
* 返费期数
|
* 返费期数
|
||||||
*/
|
*/
|
||||||
private String refundFeeNumber;
|
private Integer refundFeeNumber;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.PhoneRecordDO;
|
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.PhoneRecordDO;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.*;
|
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.*;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 充值档位记录 Mapper
|
* 充值档位记录 Mapper
|
||||||
|
@ -29,7 +31,7 @@ public interface PhoneRecordMapper extends BaseMapperX<PhoneRecordDO> {
|
||||||
.betweenIfPresent(PhoneRecordDO::getCreateTime, reqVO.getCreateTime())
|
.betweenIfPresent(PhoneRecordDO::getCreateTime, reqVO.getCreateTime())
|
||||||
.orderByDesc(PhoneRecordDO::getId));
|
.orderByDesc(PhoneRecordDO::getId));
|
||||||
}
|
}
|
||||||
|
IPage<PhoneRecordRespVO> findListPage(IPage<PhoneRecordRespVO> page, @Param("data") PhoneRecordPageReqVO data);
|
||||||
default List<PhoneRecordDO> selectList(PhoneRecordExportReqVO reqVO) {
|
default List<PhoneRecordDO> selectList(PhoneRecordExportReqVO reqVO) {
|
||||||
return selectList(new LambdaQueryWrapperX<PhoneRecordDO>()
|
return selectList(new LambdaQueryWrapperX<PhoneRecordDO>()
|
||||||
.eqIfPresent(PhoneRecordDO::getUserId, reqVO.getUserId())
|
.eqIfPresent(PhoneRecordDO::getUserId, reqVO.getUserId())
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package cn.iocoder.yudao.module.shop.service.order.impl;
|
package cn.iocoder.yudao.module.shop.service.order.impl;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.hutool.core.date.LocalDateTimeUtil;
|
||||||
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.PhoneUtil;
|
import cn.hutool.core.util.PhoneUtil;
|
||||||
|
@ -11,6 +13,7 @@ import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.DateLimitUtilVo;
|
import cn.iocoder.yudao.framework.common.pojo.DateLimitUtilVo;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
|
||||||
import cn.iocoder.yudao.framework.pay.properties.AliPayProperties;
|
import cn.iocoder.yudao.framework.pay.properties.AliPayProperties;
|
||||||
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
||||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
|
@ -79,6 +82,7 @@ import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
@ -1236,9 +1240,9 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
||||||
phoneRecordDO.setRefundFeeAmount(replace(info.getPrice()));
|
phoneRecordDO.setRefundFeeAmount(replace(info.getPrice()));
|
||||||
phoneRecordDO.setRechargeGearId(Long.valueOf(info.getRechargeGearId()));
|
phoneRecordDO.setRechargeGearId(Long.valueOf(info.getRechargeGearId()));
|
||||||
LocalDateTime localDateTime = LocalDateTime.now();
|
LocalDateTime localDateTime = LocalDateTime.now();
|
||||||
LocalDateTime newLocalDateTime = localDateTime.plusMonths(12);
|
LocalDateTime newLocalDateTime = LocalDateTimeUtil.offset(localDateTime,12, ChronoUnit.MONTHS);
|
||||||
phoneRecordDO.setRefundFeeEndDate(newLocalDateTime);
|
phoneRecordDO.setRefundFeeEndDate(newLocalDateTime);
|
||||||
phoneRecordDO.setRefundFeeNumber("12");
|
phoneRecordDO.setRefundFeeNumber(12);
|
||||||
recordDOS.add(phoneRecordDO);
|
recordDOS.add(phoneRecordDO);
|
||||||
});
|
});
|
||||||
phoneRecordMapper.insertBatch(recordDOS);
|
phoneRecordMapper.insertBatch(recordDOS);
|
||||||
|
|
|
@ -57,7 +57,7 @@ public interface PhoneRecordService {
|
||||||
* @param pageReqVO 分页查询
|
* @param pageReqVO 分页查询
|
||||||
* @return 充值档位记录分页
|
* @return 充值档位记录分页
|
||||||
*/
|
*/
|
||||||
PageResult<PhoneRecordDO> getPhoneRecordPage(PhoneRecordPageReqVO pageReqVO);
|
PageResult<PhoneRecordRespVO> getPhoneRecordPage(PhoneRecordPageReqVO pageReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得充值档位记录列表, 用于 Excel 导出
|
* 获得充值档位记录列表, 用于 Excel 导出
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package cn.iocoder.yudao.module.shop.service.recharge;
|
package cn.iocoder.yudao.module.shop.service.recharge;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
@ -70,8 +71,10 @@ public class PhoneRecordServiceImpl implements PhoneRecordService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<PhoneRecordDO> getPhoneRecordPage(PhoneRecordPageReqVO pageReqVO) {
|
public PageResult<PhoneRecordRespVO> getPhoneRecordPage(PhoneRecordPageReqVO pageReqVO) {
|
||||||
return phoneRecordMapper.selectPage(pageReqVO);
|
Page<PhoneRecordRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
|
||||||
|
phoneRecordMapper.findListPage(page,pageReqVO);
|
||||||
|
return new PageResult<>(page.getRecords(), page.getTotal());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -107,7 +107,9 @@ public class RechargeGearServiceImpl implements RechargeGearService {
|
||||||
List<RechargeGearDO> rechargeGearDOS = rechargeGearMapper.selectList(Wrappers.<RechargeGearDO>lambdaQuery()
|
List<RechargeGearDO> rechargeGearDOS = rechargeGearMapper.selectList(Wrappers.<RechargeGearDO>lambdaQuery()
|
||||||
.eq(RechargeGearDO::getDeleted, 0));
|
.eq(RechargeGearDO::getDeleted, 0));
|
||||||
List<RechargeGearRespVO> rechargeGearRespVOS = RechargeGearConvert.INSTANCE.convertList(rechargeGearDOS);
|
List<RechargeGearRespVO> rechargeGearRespVOS = RechargeGearConvert.INSTANCE.convertList(rechargeGearDOS);
|
||||||
RechargeOrderDO orderDO = orderMapper.selectOne(Wrappers.<RechargeOrderDO>lambdaQuery().eq(RechargeOrderDO::getUid, loginUser.getId()).last("LIMIT 1"));
|
RechargeOrderDO orderDO = orderMapper.selectOne(Wrappers.<RechargeOrderDO>lambdaQuery().eq(RechargeOrderDO::getUid, loginUser.getId())
|
||||||
|
.eq(RechargeOrderDO::getPaid,1)
|
||||||
|
.last("LIMIT 1"));
|
||||||
if (Objects.nonNull(orderDO)) {
|
if (Objects.nonNull(orderDO)) {
|
||||||
List<PhoneRecordDO> infoDOS = phoneRecordMapper.selectList(Wrappers.<PhoneRecordDO>lambdaQuery().eq(PhoneRecordDO::getRechargeOrderId, orderDO.getId()));
|
List<PhoneRecordDO> infoDOS = phoneRecordMapper.selectList(Wrappers.<PhoneRecordDO>lambdaQuery().eq(PhoneRecordDO::getRechargeOrderId, orderDO.getId()));
|
||||||
Map<Long, List<PhoneRecordDO>> collect = infoDOS.stream().collect(Collectors.groupingBy(PhoneRecordDO::getRechargeGearId));
|
Map<Long, List<PhoneRecordDO>> collect = infoDOS.stream().collect(Collectors.groupingBy(PhoneRecordDO::getRechargeGearId));
|
||||||
|
|
|
@ -56,7 +56,7 @@ public class AliPayStrategy implements IPayStrategy {
|
||||||
request.setBizContent(bizContent.toString());
|
request.setBizContent(bizContent.toString());
|
||||||
AlipayTradeWapPayResponse response = null;
|
AlipayTradeWapPayResponse response = null;
|
||||||
try {
|
try {
|
||||||
response = alipayClient.pageExecute(request);
|
response = alipayClient.pageExecute(request,"get");
|
||||||
orderResponse.setBody(response.getBody());
|
orderResponse.setBody(response.getBody());
|
||||||
} catch (AlipayApiException e) {
|
} catch (AlipayApiException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
|
@ -9,4 +9,28 @@
|
||||||
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
|
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<select id="findListPage" resultType="cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.PhoneRecordRespVO">
|
||||||
|
select a.`id` ,
|
||||||
|
a.`user_id` ,
|
||||||
|
a.`recharge_order_id` ,
|
||||||
|
a.`phone` ,
|
||||||
|
a.`refund_fee_amount` ,
|
||||||
|
a.`recharge_gear_id` ,
|
||||||
|
b.name as 'recharge_gear_name',
|
||||||
|
a.`refund_fee_end_date` ,
|
||||||
|
a.`refund_fee_number` ,
|
||||||
|
a.`deleted` ,
|
||||||
|
a.`creator` ,
|
||||||
|
a.`create_time` ,
|
||||||
|
a.`updater` ,
|
||||||
|
a. `update_time`
|
||||||
|
from cy_phone_record a
|
||||||
|
left join cy_recharge_gear b on a.recharge_gear_id=b.id
|
||||||
|
<where>
|
||||||
|
<if test="data.phone!=null and data.phone!=''">
|
||||||
|
a.phone like CONCAT('%',#{data.phone},'%')
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
|
@ -11,13 +11,13 @@
|
||||||
|
|
||||||
<select id="getRechargeOrderInfoListExcel" resultType="cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderInfoExcelVO">
|
<select id="getRechargeOrderInfoListExcel" resultType="cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderInfoExcelVO">
|
||||||
select
|
select
|
||||||
a.order_id as 'orderNo',
|
a.id as 'orderNo',
|
||||||
e.name as tenantName,
|
e.name as tenantName,
|
||||||
f.product_name as 'productName',
|
f.product_name as 'productName',
|
||||||
f.price,
|
f.price,
|
||||||
f.price as proTotalPrice,
|
f.price as proTotalPrice,
|
||||||
f.price as payPrice,
|
f.price as payPrice,
|
||||||
a.refund_status as afterStatus,
|
a.paid as afterStatus,
|
||||||
f.price as refundPrice,
|
f.price as refundPrice,
|
||||||
a.uid as 'vipAccount',
|
a.uid as 'vipAccount',
|
||||||
a.real_name as vipName
|
a.real_name as vipName
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
left join cy_recharge_order a on a.id = f.recharge_order_id
|
left join cy_recharge_order a on a.id = f.recharge_order_id
|
||||||
left join member_user b on a.promoter_id = b.id
|
left join member_user b on a.promoter_id = b.id
|
||||||
left join system_dept d on d.id = a.dept_id
|
left join system_dept d on d.id = a.dept_id
|
||||||
left join system_tenant e on a.promoter_id = b.id
|
left join system_tenant e on e.id = a.tenant_id
|
||||||
<where>
|
<where>
|
||||||
<if test="ids!=null and ids.size>0">
|
<if test="ids!=null and ids.size>0">
|
||||||
f.recharge_order_id in
|
f.recharge_order_id in
|
||||||
|
|
|
@ -30,35 +30,9 @@
|
||||||
d.parent_organization_name
|
d.parent_organization_name
|
||||||
from cy_recharge_order a
|
from cy_recharge_order a
|
||||||
left join member_user b on a.promoter_id = b.id
|
left join member_user b on a.promoter_id = b.id
|
||||||
left join member_promoter c on a.promoter_id=c.user_id
|
left join system_dept d on d.id = a.dept_id
|
||||||
left join system_dept d on d.id = c.dept_id
|
<include refid="baseWhere">
|
||||||
<where>
|
</include>
|
||||||
and a.paid=1
|
|
||||||
<if test="data.orderId !=null and data.orderId!=''">
|
|
||||||
and a.order_id like CONCAT('%',#{data.orderId},'%')
|
|
||||||
</if>
|
|
||||||
<if test="data.tenantId !=null and data.tenantId!=1">
|
|
||||||
and a.tenant_id =#{data.tenantId}
|
|
||||||
</if>
|
|
||||||
<if test="data.paySerialNumber !=null and data.paySerialNumber!=''">
|
|
||||||
and a.pay_serial_number like CONCAT('%',#{data.paySerialNumber},'%')
|
|
||||||
</if>
|
|
||||||
<if test="data.nickname !=null and data.nickname!=''">
|
|
||||||
and b.nickname like CONCAT('%',#{data.nickname},'%')
|
|
||||||
</if>
|
|
||||||
<if test="data.realName !=null and data.realName!=''">
|
|
||||||
and a.real_name like CONCAT('%',#{data.realName},'%')
|
|
||||||
</if>
|
|
||||||
<if test="data.userPhone !=null and data.userPhone!=''">
|
|
||||||
and a.user_phone like CONCAT('%',#{data.userPhone},'%')
|
|
||||||
</if>
|
|
||||||
<if test="data.payTime !=null ">
|
|
||||||
and a.pay_time >=#{data.payTime[0]}
|
|
||||||
</if>
|
|
||||||
<if test="data.payTime !=null ">
|
|
||||||
and a.pay_time <=#{data.payTime[1]}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
</select>
|
</select>
|
||||||
<select id="findListPage" resultType="cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderRespVO">
|
<select id="findListPage" resultType="cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderRespVO">
|
||||||
select
|
select
|
||||||
|
@ -78,8 +52,7 @@
|
||||||
d.parent_organization_name
|
d.parent_organization_name
|
||||||
from cy_recharge_order a
|
from cy_recharge_order a
|
||||||
left join member_user b on a.promoter_id = b.id
|
left join member_user b on a.promoter_id = b.id
|
||||||
left join member_promoter c on a.promoter_id=c.user_id
|
left join system_dept d on d.id = a.dept_id
|
||||||
left join system_dept d on d.id = c.dept_id
|
|
||||||
<include refid="baseWhere">
|
<include refid="baseWhere">
|
||||||
</include>
|
</include>
|
||||||
</select>
|
</select>
|
||||||
|
@ -88,6 +61,7 @@
|
||||||
a.id,
|
a.id,
|
||||||
a.order_id,
|
a.order_id,
|
||||||
a.pay_serial_number,
|
a.pay_serial_number,
|
||||||
|
a.tenant_id,
|
||||||
e.name as tenantName,
|
e.name as tenantName,
|
||||||
a.pay_time,
|
a.pay_time,
|
||||||
a.pay_time as payCompleteTime,
|
a.pay_time as payCompleteTime,
|
||||||
|
@ -100,21 +74,23 @@
|
||||||
a.uid,
|
a.uid,
|
||||||
a.real_name as vipName,
|
a.real_name as vipName,
|
||||||
a.out_trade_no,
|
a.out_trade_no,
|
||||||
b.nickname as promoter,
|
if(b.nickname=null,d.parent_organization_name,CONCAT(d.parent_organization_name,'-',b.nickname)) as promoter,
|
||||||
d.parent_organization_name as 'depName'
|
d.parent_organization_name
|
||||||
from cy_recharge_order a
|
from cy_recharge_order a
|
||||||
left join member_user b on a.promoter_id = b.id
|
left join member_user b on a.promoter_id = b.id
|
||||||
left join system_dept d on d.id = a.dept_id
|
left join system_dept d on d.id = a.dept_id
|
||||||
left join system_tenant e on a.promoter_id = b.id
|
left join system_tenant e on e.id = a.tenant_id
|
||||||
<include refid="baseWhere">
|
<include refid="baseWhere">
|
||||||
</include>
|
</include>
|
||||||
</select>
|
</select>
|
||||||
<sql id="baseWhere">
|
<sql id="baseWhere">
|
||||||
<where>
|
<where>
|
||||||
and a.paid=1
|
|
||||||
<if test="data.orderId !=null and data.orderId!=''">
|
<if test="data.orderId !=null and data.orderId!=''">
|
||||||
and a.order_id like CONCAT('%',#{data.orderId},'%')
|
and a.order_id like CONCAT('%',#{data.orderId},'%')
|
||||||
</if>
|
</if>
|
||||||
|
<if test="data.paid !=null and data.paid!=''">
|
||||||
|
and a.paid =#{data.paid}
|
||||||
|
</if>
|
||||||
<if test="data.tenantId !=null and data.tenantId!=1">
|
<if test="data.tenantId !=null and data.tenantId!=1">
|
||||||
and a.tenant_id =#{data.tenantId}
|
and a.tenant_id =#{data.tenantId}
|
||||||
</if>
|
</if>
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package cn.iocoder.yudao.module.member.controller.app.auth.vo;
|
package cn.iocoder.yudao.module.member.controller.app.auth.vo;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
import cn.iocoder.yudao.framework.common.validation.Mobile;
|
import cn.iocoder.yudao.framework.common.validation.Mobile;
|
||||||
import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
|
import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
|
||||||
|
@ -28,7 +29,7 @@ public class AppAuthSmsLoginReqVO {
|
||||||
|
|
||||||
@Schema(description = "手机号", required = true, example = "15601691300")
|
@Schema(description = "手机号", required = true, example = "15601691300")
|
||||||
@NotEmpty(message = "手机号不能为空")
|
@NotEmpty(message = "手机号不能为空")
|
||||||
@Mobile
|
@Pattern(regexp = "^[1][3,4,5,7,8][0,1,2,4,5,6,7,8,9][0-9]{8}$",message = "手机号不正确")
|
||||||
private String mobile;
|
private String mobile;
|
||||||
/**
|
/**
|
||||||
* 推广员id
|
* 推广员id
|
||||||
|
|
|
@ -25,5 +25,8 @@ public interface DictTypeConstants {
|
||||||
String SMS_TEMPLATE_TYPE = "system_sms_template_type"; // 短信模板类型
|
String SMS_TEMPLATE_TYPE = "system_sms_template_type"; // 短信模板类型
|
||||||
String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态
|
String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态
|
||||||
String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态
|
String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态
|
||||||
|
String PYT_TYPE = "pay_type"; // 支付类型
|
||||||
|
|
||||||
|
String PYT_STATUS = "pay_status"; // 支付状态
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -209,8 +209,8 @@ ali:
|
||||||
merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCAhydIKD244uxHaCAE8N4KA0kfK2UkhXayUwarvc09s/JHC7WkrtwgmeHx+JyFA/QQA1WHQREJ8jyS9HrgasmmA+BaE0vGwbu/c0R4Cde5dLeITZb4w4X1RlH+xjtF34pKLH3oVi29q9jUTRii41eCBeztL/XcbJDsxAnCNnuxcak0gk4cl8j9aoMBP/opIc5sTDSqYFSSTDSMPGh90M6KowFtCHyVZxEszcIRX9cRIuf9KtfGvBzljJMjNGshIMuaHVCFpy72E0s50HmMxC4Kodhp6HEdLV1GUBZy87PYiKTqp9WVn0CndzcfmmdUUXVUvqWPKzRN3YSxExJ0Z5KFAgMBAAECggEABovbulciXaphMnnhN581D/l+3fGN40BQ/WAxNMokDAKAUpIMHGkzmQ19bp+lCTlcUvx4fL0ZqxIFd86v+4I05xnHcY8OCv+PGn86e4q0zCNfvbeF+wGqbwW342whVLvABWsitpS9G64HCzkqChHeQScgHCyXLzTwZL7PaG7x+eWnQ3WyA5KlCpUQWOz6OBPD7flkaflVRbDDZqmhcpEwwSXC9vSQb5+E0BZ118+5nJA65Wi/EPtqCzWX4k6ioiQcN5OeJrScZ4fnQm4h4j+TRLeKqkAKCZFpAZcB7RERxA/4Mzz9mEzHOBzSbrUU+miJ3oSkd4S4ldrOZU4EVkI1AQKBgQDe5t+Qij0hOPQaMpiM2hiQnMAI3TzHRbrYf6JUlMqdzad9oasY2ap+iit60TD9OLwjRGzjy7S9WL2bUgmmU4/sOjR0NMl8z3iUTYun6EubNoMUiu9UhQXBThxBCZv/H2agJ4Uswq2lBjUuGyp383lj9qSkScngGknYgrUd/pUa5QKBgQCTnNzCsIU/1N3fhzpvh1RmUwz8JalcmPNxQqrxE53Je+hVQ4BoeVMCov8U62TjBrxmHFEDVwXqAlRUUOWsWu4ac7V/VvFlwQoqPjkjNteOW6aO+BMDAlb2FVg5GzFy/MvLw4EUtU/Sx8EmWZpyaIzjRV4IUHx4WzJoORKEUIH/IQKBgQCh+9F37p3h6Murxh0KLuwvG1qKlow2nDveXVKQeNiNuQgAyl3WX0gBUVOrmx4oxvQiBPXEzSJ5f2W62/FbR9qNZvb7g+jwpK0RyRC2Yp+fGgxD/3tRRqIaCjOKJ/uPeThRJqcnEgqypEI9UUyZgvwyYuje4yirjS8hAkuwknO06QKBgHH4tnbX5jovuBPDjHnaSm8rBqaUyZxGOAimCehTVgvgULWshbOkoVQy17KmQWIMrGBG0sI6acWRgN0NDRgzqQ3hcyxby8zd7GRLYMBwsqQm3YYbwkobf1tHhbOp7Fc1GoE8dSixCW3cb6SVoGtfkBBWWdEfm8st1tCj6EkjBAwhAoGAShd1PY/QOEJ6Cj9IDXvD25DAh0dKs54PRxENetbIxPgYpH7db6n/smmbwM69U4TXZyFfqme1Bc0JwM2J7D6gs4OV88AhXJvfj091eJQhYC5e80Eo8dySserwLp8/ka6FV/EFUplg/DD4JR/jbVzO2fbOPCLm6I+sZqG3K7mg6IM=
|
merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCAhydIKD244uxHaCAE8N4KA0kfK2UkhXayUwarvc09s/JHC7WkrtwgmeHx+JyFA/QQA1WHQREJ8jyS9HrgasmmA+BaE0vGwbu/c0R4Cde5dLeITZb4w4X1RlH+xjtF34pKLH3oVi29q9jUTRii41eCBeztL/XcbJDsxAnCNnuxcak0gk4cl8j9aoMBP/opIc5sTDSqYFSSTDSMPGh90M6KowFtCHyVZxEszcIRX9cRIuf9KtfGvBzljJMjNGshIMuaHVCFpy72E0s50HmMxC4Kodhp6HEdLV1GUBZy87PYiKTqp9WVn0CndzcfmmdUUXVUvqWPKzRN3YSxExJ0Z5KFAgMBAAECggEABovbulciXaphMnnhN581D/l+3fGN40BQ/WAxNMokDAKAUpIMHGkzmQ19bp+lCTlcUvx4fL0ZqxIFd86v+4I05xnHcY8OCv+PGn86e4q0zCNfvbeF+wGqbwW342whVLvABWsitpS9G64HCzkqChHeQScgHCyXLzTwZL7PaG7x+eWnQ3WyA5KlCpUQWOz6OBPD7flkaflVRbDDZqmhcpEwwSXC9vSQb5+E0BZ118+5nJA65Wi/EPtqCzWX4k6ioiQcN5OeJrScZ4fnQm4h4j+TRLeKqkAKCZFpAZcB7RERxA/4Mzz9mEzHOBzSbrUU+miJ3oSkd4S4ldrOZU4EVkI1AQKBgQDe5t+Qij0hOPQaMpiM2hiQnMAI3TzHRbrYf6JUlMqdzad9oasY2ap+iit60TD9OLwjRGzjy7S9WL2bUgmmU4/sOjR0NMl8z3iUTYun6EubNoMUiu9UhQXBThxBCZv/H2agJ4Uswq2lBjUuGyp383lj9qSkScngGknYgrUd/pUa5QKBgQCTnNzCsIU/1N3fhzpvh1RmUwz8JalcmPNxQqrxE53Je+hVQ4BoeVMCov8U62TjBrxmHFEDVwXqAlRUUOWsWu4ac7V/VvFlwQoqPjkjNteOW6aO+BMDAlb2FVg5GzFy/MvLw4EUtU/Sx8EmWZpyaIzjRV4IUHx4WzJoORKEUIH/IQKBgQCh+9F37p3h6Murxh0KLuwvG1qKlow2nDveXVKQeNiNuQgAyl3WX0gBUVOrmx4oxvQiBPXEzSJ5f2W62/FbR9qNZvb7g+jwpK0RyRC2Yp+fGgxD/3tRRqIaCjOKJ/uPeThRJqcnEgqypEI9UUyZgvwyYuje4yirjS8hAkuwknO06QKBgHH4tnbX5jovuBPDjHnaSm8rBqaUyZxGOAimCehTVgvgULWshbOkoVQy17KmQWIMrGBG0sI6acWRgN0NDRgzqQ3hcyxby8zd7GRLYMBwsqQm3YYbwkobf1tHhbOp7Fc1GoE8dSixCW3cb6SVoGtfkBBWWdEfm8st1tCj6EkjBAwhAoGAShd1PY/QOEJ6Cj9IDXvD25DAh0dKs54PRxENetbIxPgYpH7db6n/smmbwM69U4TXZyFfqme1Bc0JwM2J7D6gs4OV88AhXJvfj091eJQhYC5e80Eo8dySserwLp8/ka6FV/EFUplg/DD4JR/jbVzO2fbOPCLm6I+sZqG3K7mg6IM=
|
||||||
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4AmKmcg8NImIDHlY1dz/DgBlIB1EVXv5gI2S17/Ddt7kDEdY2Uq0TV5NmVxf1RQ6EXQCDpBm83IOkduMeGsnD3zad6Vpit6hdjfvMJ4au9pAaoe4nYAy0CoMVTKDIR7XunSJZqfOZTihLXD8GbqMFTMPRyuh/JNCHoeDfDhca2nD6hyVOLE7XqZK8gVq9WgUM8uVkXDHJJfPHFmQaU8jJt3pyuItsVi1id8vJvHdng/rFy0USPwSq9kVv9DaIxI2197UBvjtyt4iTTYE5esOiJeulUggwmpWoss7Cx2fbN0pLVors+DybJGZjEW3GdwL+R6FStvQNAVcIf2Ty/NgKwIDAQAB
|
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4AmKmcg8NImIDHlY1dz/DgBlIB1EVXv5gI2S17/Ddt7kDEdY2Uq0TV5NmVxf1RQ6EXQCDpBm83IOkduMeGsnD3zad6Vpit6hdjfvMJ4au9pAaoe4nYAy0CoMVTKDIR7XunSJZqfOZTihLXD8GbqMFTMPRyuh/JNCHoeDfDhca2nD6hyVOLE7XqZK8gVq9WgUM8uVkXDHJJfPHFmQaU8jJt3pyuItsVi1id8vJvHdng/rFy0USPwSq9kVv9DaIxI2197UBvjtyt4iTTYE5esOiJeulUggwmpWoss7Cx2fbN0pLVors+DybJGZjEW3GdwL+R6FStvQNAVcIf2Ty/NgKwIDAQAB
|
||||||
gatewayUrl: https://openapi.alipay.com/gateway.do
|
gatewayUrl: https://openapi.alipay.com/gateway.do
|
||||||
notify-url: http://yuxy.perrymake.com/admin-api/notify/ali/pay_notify
|
notify-url: http://api.cyywl.top/admin-api/notify/ali/pay_notify
|
||||||
refund-notify: http://yuxy.perrymake.com/admin-api/notify/ali/refund_notify
|
refund-notify: http://api.cyywl.top/admin-api/notify/ali/refund_notify
|
||||||
# 芋道配置项,设置当前项目所有自定义的配置
|
# 芋道配置项,设置当前项目所有自定义的配置
|
||||||
yudao:
|
yudao:
|
||||||
captcha:
|
captcha:
|
||||||
|
|
|
@ -0,0 +1,234 @@
|
||||||
|
server:
|
||||||
|
port: 48080
|
||||||
|
servlet:
|
||||||
|
context-path: /
|
||||||
|
|
||||||
|
--- #################### 数据库相关配置 ####################
|
||||||
|
|
||||||
|
spring:
|
||||||
|
# 数据源配置项
|
||||||
|
autoconfigure:
|
||||||
|
exclude:
|
||||||
|
- com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
|
||||||
|
- org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置
|
||||||
|
datasource:
|
||||||
|
druid: # Druid 【监控】相关的全局配置
|
||||||
|
web-stat-filter:
|
||||||
|
enabled: true
|
||||||
|
stat-view-servlet:
|
||||||
|
enabled: true
|
||||||
|
allow: # 设置白名单,不填则允许所有访问
|
||||||
|
url-pattern: /druid/*
|
||||||
|
login-username: # 控制台管理用户名和密码
|
||||||
|
login-password:
|
||||||
|
filter:
|
||||||
|
stat:
|
||||||
|
enabled: true
|
||||||
|
log-slow-sql: true # 慢 SQL 记录
|
||||||
|
slow-sql-millis: 100
|
||||||
|
merge-sql: true
|
||||||
|
wall:
|
||||||
|
config:
|
||||||
|
multi-statement-allow: true
|
||||||
|
dynamic: # 多数据源配置
|
||||||
|
druid: # Druid 【连接池】相关的全局配置
|
||||||
|
initial-size: 5 # 初始连接数
|
||||||
|
min-idle: 10 # 最小连接池数量
|
||||||
|
max-active: 20 # 最大连接池数量
|
||||||
|
max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
|
||||||
|
time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
|
||||||
|
min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
|
||||||
|
max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
|
||||||
|
validation-query: SELECT 1 # 配置检测连接是否有效
|
||||||
|
test-while-idle: true
|
||||||
|
test-on-borrow: false
|
||||||
|
test-on-return: false
|
||||||
|
primary: master
|
||||||
|
datasource:
|
||||||
|
master:
|
||||||
|
name: cyywl
|
||||||
|
url: jdbc:mysql://117.33.142.185:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true
|
||||||
|
driver-class-name: com.mysql.jdbc.Driver
|
||||||
|
username: root
|
||||||
|
password: axzsd110
|
||||||
|
# slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
|
# name: ruoyi-vue-pro
|
||||||
|
# url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true
|
||||||
|
# driver-class-name: com.mysql.jdbc.Driver
|
||||||
|
# username: root
|
||||||
|
# password: 3WLiVUBEwTbvAfsh
|
||||||
|
|
||||||
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
|
redis:
|
||||||
|
host: 117.33.142.185 # 地址
|
||||||
|
port: 6369 # 端口
|
||||||
|
database: 6 # 数据库索引
|
||||||
|
password: 20221122@dev # 密码,建议生产环境开启
|
||||||
|
|
||||||
|
--- #################### 定时任务相关配置 ####################
|
||||||
|
|
||||||
|
# Quartz 配置项,对应 QuartzProperties 配置类
|
||||||
|
spring:
|
||||||
|
quartz:
|
||||||
|
auto-startup: true # 测试环境,需要开启 Job
|
||||||
|
scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName
|
||||||
|
job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
|
||||||
|
wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
|
||||||
|
properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档
|
||||||
|
org:
|
||||||
|
quartz:
|
||||||
|
# Scheduler 相关配置
|
||||||
|
scheduler:
|
||||||
|
instanceName: schedulerName
|
||||||
|
instanceId: AUTO # 自动生成 instance ID
|
||||||
|
# JobStore 相关配置
|
||||||
|
jobStore:
|
||||||
|
# JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162
|
||||||
|
class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
|
||||||
|
isClustered: true # 是集群模式
|
||||||
|
clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒
|
||||||
|
misfireThreshold: 60000 # misfire 阀值,单位:毫秒。
|
||||||
|
# 线程池相关配置
|
||||||
|
threadPool:
|
||||||
|
threadCount: 25 # 线程池大小。默认为 10 。
|
||||||
|
threadPriority: 5 # 线程优先级
|
||||||
|
class: org.quartz.simpl.SimpleThreadPool # 线程池类型
|
||||||
|
jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置
|
||||||
|
initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。
|
||||||
|
|
||||||
|
--- #################### 服务保障相关配置 ####################
|
||||||
|
|
||||||
|
# Lock4j 配置项
|
||||||
|
lock4j:
|
||||||
|
acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
|
||||||
|
expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
|
||||||
|
|
||||||
|
# Resilience4j 配置项
|
||||||
|
resilience4j:
|
||||||
|
ratelimiter:
|
||||||
|
instances:
|
||||||
|
backendA:
|
||||||
|
limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50
|
||||||
|
limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500
|
||||||
|
timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s
|
||||||
|
register-health-indicator: true # 是否注册到健康监测
|
||||||
|
|
||||||
|
--- #################### 监控相关配置 ####################
|
||||||
|
|
||||||
|
# Actuator 监控端点的配置项
|
||||||
|
management:
|
||||||
|
endpoints:
|
||||||
|
web:
|
||||||
|
base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
|
||||||
|
exposure:
|
||||||
|
include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
|
||||||
|
|
||||||
|
# Spring Boot Admin 配置项
|
||||||
|
spring:
|
||||||
|
boot:
|
||||||
|
admin:
|
||||||
|
# Spring Boot Admin Client 客户端的相关配置
|
||||||
|
client:
|
||||||
|
url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址
|
||||||
|
instance:
|
||||||
|
service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
|
||||||
|
# Spring Boot Admin Server 服务端的相关配置
|
||||||
|
context-path: /admin # 配置 Spring
|
||||||
|
|
||||||
|
# 日志文件配置
|
||||||
|
logging:
|
||||||
|
file:
|
||||||
|
name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
|
||||||
|
|
||||||
|
--- #################### 微信公众号相关配置 ####################
|
||||||
|
wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
|
||||||
|
mp:
|
||||||
|
# 公众号配置(必填)
|
||||||
|
app-id: wx041349c6f39b268b
|
||||||
|
secret: 5abee519483bc9f8cb37ce280e814bd0
|
||||||
|
# 存储配置,解决 AccessToken 的跨节点的共享
|
||||||
|
config-storage:
|
||||||
|
type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
|
||||||
|
key-prefix: wx # Redis Key 的前缀 TODO 芋艿:解决下 Redis key 管理的配置
|
||||||
|
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
|
||||||
|
miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
|
||||||
|
appid: wx63c280fe3248a3e7
|
||||||
|
secret: 6f270509224a7ae1296bbf1c8cb97aed
|
||||||
|
config-storage:
|
||||||
|
type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
|
||||||
|
key-prefix: wa # Redis Key 的前缀 TODO 芋艿:解决下 Redis key 管理的配置
|
||||||
|
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
|
||||||
|
pay:
|
||||||
|
one:
|
||||||
|
enabled: true
|
||||||
|
app-id: wxb1826c88da21d81e
|
||||||
|
mch-id: 1641993417
|
||||||
|
mch-key: qdn2I7Cmx4JeiKOt2CDjiu6UHgLTsOsM
|
||||||
|
apiv3-key: cyywl666666cyywl888888cyywl66666
|
||||||
|
private-cert-path: classpath:/1/apiclient_cert.pem
|
||||||
|
private-key-path: classpath:/1/apiclient_key.pem
|
||||||
|
key-path: classpath:/1/apiclient_cert.p12
|
||||||
|
cert-serial-no: 58FDB503F92B6C0E258C9940BB726C2BF6022E56
|
||||||
|
notify-url: http://api.cyywl.top/app-api/pay/wxpay/pay_notify
|
||||||
|
refund-notify-url: http://api.cyywl.top/app-api/pay/wxpay/refund_notify
|
||||||
|
two:
|
||||||
|
enabled: true
|
||||||
|
app-id: wxb1826c88da21d81e
|
||||||
|
mch-id: 1642042589
|
||||||
|
mch-key: qdn2I7Cmx4JeiKOt2CDjiu6UHgLTsOsM
|
||||||
|
apiv3-key: cyywl666666cyywl888888cyywl66666
|
||||||
|
private-cert-path: classpath:/2/apiclient_cert.pem
|
||||||
|
private-key-path: classpath:/2/apiclient_key.pem
|
||||||
|
key-path: classpath:/2/apiclient_cert.p12
|
||||||
|
cert-serial-no: 47F04D51F958FFEF56A6DFC25BDE83CF89353E19
|
||||||
|
notify-url: http://api.cyywl.top/app-api/pay/wxpay/pay_notify
|
||||||
|
refund-notify-url: http://api.cyywl.top/app-api/pay/wxpay/refund_notify
|
||||||
|
|
||||||
|
|
||||||
|
--- #################### 芋道相关配置 ####################
|
||||||
|
ali:
|
||||||
|
pay:
|
||||||
|
one:
|
||||||
|
appId: 2021003196623046
|
||||||
|
merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCAhydIKD244uxHaCAE8N4KA0kfK2UkhXayUwarvc09s/JHC7WkrtwgmeHx+JyFA/QQA1WHQREJ8jyS9HrgasmmA+BaE0vGwbu/c0R4Cde5dLeITZb4w4X1RlH+xjtF34pKLH3oVi29q9jUTRii41eCBeztL/XcbJDsxAnCNnuxcak0gk4cl8j9aoMBP/opIc5sTDSqYFSSTDSMPGh90M6KowFtCHyVZxEszcIRX9cRIuf9KtfGvBzljJMjNGshIMuaHVCFpy72E0s50HmMxC4Kodhp6HEdLV1GUBZy87PYiKTqp9WVn0CndzcfmmdUUXVUvqWPKzRN3YSxExJ0Z5KFAgMBAAECggEABovbulciXaphMnnhN581D/l+3fGN40BQ/WAxNMokDAKAUpIMHGkzmQ19bp+lCTlcUvx4fL0ZqxIFd86v+4I05xnHcY8OCv+PGn86e4q0zCNfvbeF+wGqbwW342whVLvABWsitpS9G64HCzkqChHeQScgHCyXLzTwZL7PaG7x+eWnQ3WyA5KlCpUQWOz6OBPD7flkaflVRbDDZqmhcpEwwSXC9vSQb5+E0BZ118+5nJA65Wi/EPtqCzWX4k6ioiQcN5OeJrScZ4fnQm4h4j+TRLeKqkAKCZFpAZcB7RERxA/4Mzz9mEzHOBzSbrUU+miJ3oSkd4S4ldrOZU4EVkI1AQKBgQDe5t+Qij0hOPQaMpiM2hiQnMAI3TzHRbrYf6JUlMqdzad9oasY2ap+iit60TD9OLwjRGzjy7S9WL2bUgmmU4/sOjR0NMl8z3iUTYun6EubNoMUiu9UhQXBThxBCZv/H2agJ4Uswq2lBjUuGyp383lj9qSkScngGknYgrUd/pUa5QKBgQCTnNzCsIU/1N3fhzpvh1RmUwz8JalcmPNxQqrxE53Je+hVQ4BoeVMCov8U62TjBrxmHFEDVwXqAlRUUOWsWu4ac7V/VvFlwQoqPjkjNteOW6aO+BMDAlb2FVg5GzFy/MvLw4EUtU/Sx8EmWZpyaIzjRV4IUHx4WzJoORKEUIH/IQKBgQCh+9F37p3h6Murxh0KLuwvG1qKlow2nDveXVKQeNiNuQgAyl3WX0gBUVOrmx4oxvQiBPXEzSJ5f2W62/FbR9qNZvb7g+jwpK0RyRC2Yp+fGgxD/3tRRqIaCjOKJ/uPeThRJqcnEgqypEI9UUyZgvwyYuje4yirjS8hAkuwknO06QKBgHH4tnbX5jovuBPDjHnaSm8rBqaUyZxGOAimCehTVgvgULWshbOkoVQy17KmQWIMrGBG0sI6acWRgN0NDRgzqQ3hcyxby8zd7GRLYMBwsqQm3YYbwkobf1tHhbOp7Fc1GoE8dSixCW3cb6SVoGtfkBBWWdEfm8st1tCj6EkjBAwhAoGAShd1PY/QOEJ6Cj9IDXvD25DAh0dKs54PRxENetbIxPgYpH7db6n/smmbwM69U4TXZyFfqme1Bc0JwM2J7D6gs4OV88AhXJvfj091eJQhYC5e80Eo8dySserwLp8/ka6FV/EFUplg/DD4JR/jbVzO2fbOPCLm6I+sZqG3K7mg6IM=
|
||||||
|
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4AmKmcg8NImIDHlY1dz/DgBlIB1EVXv5gI2S17/Ddt7kDEdY2Uq0TV5NmVxf1RQ6EXQCDpBm83IOkduMeGsnD3zad6Vpit6hdjfvMJ4au9pAaoe4nYAy0CoMVTKDIR7XunSJZqfOZTihLXD8GbqMFTMPRyuh/JNCHoeDfDhca2nD6hyVOLE7XqZK8gVq9WgUM8uVkXDHJJfPHFmQaU8jJt3pyuItsVi1id8vJvHdng/rFy0USPwSq9kVv9DaIxI2197UBvjtyt4iTTYE5esOiJeulUggwmpWoss7Cx2fbN0pLVors+DybJGZjEW3GdwL+R6FStvQNAVcIf2Ty/NgKwIDAQAB
|
||||||
|
gatewayUrl: https://openapi.alipay.com/gateway.do
|
||||||
|
notify-url: http://api.cyywl.top/admin-api/notify/ali/pay_notify
|
||||||
|
refund-notify: http://api.cyywl.top/admin-api/notify/ali/refund_notify
|
||||||
|
# 芋道配置项,设置当前项目所有自定义的配置
|
||||||
|
yudao:
|
||||||
|
xss:
|
||||||
|
enable: false
|
||||||
|
exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
|
||||||
|
- ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
|
||||||
|
- ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
|
||||||
|
pay:
|
||||||
|
callback-url: http://yunai.natapp1.cc/admin-api/pay/notify/callback
|
||||||
|
return-url: http://yunai.natapp1.cc/admin-api/pay/notify/return
|
||||||
|
demo: false # 开启演示模式
|
||||||
|
|
||||||
|
justauth:
|
||||||
|
enabled: true
|
||||||
|
type:
|
||||||
|
DINGTALK: # 钉钉
|
||||||
|
client-id: dingvrnreaje3yqvzhxg
|
||||||
|
client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
|
||||||
|
ignore-check-redirect-uri: true
|
||||||
|
WECHAT_ENTERPRISE: # 企业微信
|
||||||
|
client-id: wwd411c69a39ad2e54
|
||||||
|
client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
|
||||||
|
agent-id: 1000004
|
||||||
|
ignore-check-redirect-uri: true
|
||||||
|
cache:
|
||||||
|
type: REDIS
|
||||||
|
prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
|
||||||
|
timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
|
||||||
|
wx:
|
||||||
|
mp:
|
||||||
|
useRedis: false
|
||||||
|
defaultContent: \u60A8\u597D\uFF0C\u6709\u4EC0\u4E48\u95EE\u9898\uFF1F
|
||||||
|
redisConfig:
|
||||||
|
host: 117.33.142.185 # 地址
|
||||||
|
port: 6369 # 端口
|
||||||
|
database: 16 # 数据库索引
|
||||||
|
password: 20221122@dev # 密码,建议生产环境开启
|
|
@ -86,7 +86,8 @@ export const DICT_TYPE = {
|
||||||
PROMOTION_CONDITION_TYPE: 'promotion_condition_type', // 营销的条件类型枚举
|
PROMOTION_CONDITION_TYPE: 'promotion_condition_type', // 营销的条件类型枚举
|
||||||
|
|
||||||
|
|
||||||
PAY_TYPE:'pay_type'
|
PAY_TYPE:'pay_type',
|
||||||
|
PAY_STATUS:'pay_status'
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -3,32 +3,11 @@
|
||||||
|
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="用户id" prop="userId">
|
|
||||||
<el-input v-model="queryParams.userId" placeholder="请输入用户id" clearable @keyup.enter.native="handleQuery"/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="充值订单id" prop="rechargeOrderId">
|
|
||||||
<el-input v-model="queryParams.rechargeOrderId" placeholder="请输入充值订单id" clearable @keyup.enter.native="handleQuery"/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="充值号码" prop="phone">
|
<el-form-item label="充值号码" prop="phone">
|
||||||
<el-input v-model="queryParams.phone" placeholder="请输入充值号码" clearable @keyup.enter.native="handleQuery"/>
|
<el-input v-model="queryParams.phone" placeholder="请输入充值号码" clearable @keyup.enter.native="handleQuery"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="返费金额" prop="refundFeeAmount">
|
|
||||||
<el-input v-model="queryParams.refundFeeAmount" placeholder="请输入返费金额" clearable @keyup.enter.native="handleQuery"/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="充值档位" prop="rechargeGearId">
|
|
||||||
<el-input v-model="queryParams.rechargeGearId" placeholder="请输入充值档位" clearable @keyup.enter.native="handleQuery"/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="返费结束日期" prop="refundFeeEndDate">
|
|
||||||
<el-date-picker v-model="queryParams.refundFeeEndDate" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
|
|
||||||
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="返费期数" prop="refundFeeNumber">
|
|
||||||
<el-input v-model="queryParams.refundFeeNumber" placeholder="请输入返费期数" clearable @keyup.enter.native="handleQuery"/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="创建时间" prop="createTime">
|
|
||||||
<el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
|
|
||||||
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
|
||||||
<el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
|
<el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
|
||||||
|
@ -41,6 +20,10 @@
|
||||||
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
|
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
|
||||||
v-hasPermi="['shop:phone-record:create']">新增</el-button>
|
v-hasPermi="['shop:phone-record:create']">新增</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
<el-col :span="1.5">
|
||||||
|
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
|
||||||
|
v-hasPermi="['shop:phone-record:export']">导入</el-button>
|
||||||
|
</el-col>
|
||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
|
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
|
||||||
v-hasPermi="['shop:phone-record:export']">导出</el-button>
|
v-hasPermi="['shop:phone-record:export']">导出</el-button>
|
||||||
|
@ -50,12 +33,9 @@
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="主键" align="center" prop="id" />
|
|
||||||
<el-table-column label="用户id" align="center" prop="userId" />
|
|
||||||
<el-table-column label="充值订单id" align="center" prop="rechargeOrderId" />
|
|
||||||
<el-table-column label="充值号码" align="center" prop="phone" />
|
<el-table-column label="充值号码" align="center" prop="phone" />
|
||||||
<el-table-column label="返费金额" align="center" prop="refundFeeAmount" />
|
<el-table-column label="返费金额" align="center" prop="refundFeeAmount" />
|
||||||
<el-table-column label="充值档位" align="center" prop="rechargeGearId" />
|
<el-table-column label="充值档位" align="center" prop="rechargeGearName" />
|
||||||
<el-table-column label="返费结束日期" align="center" prop="refundFeeEndDate" width="180">
|
<el-table-column label="返费结束日期" align="center" prop="refundFeeEndDate" width="180">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<span>{{ parseTime(scope.row.refundFeeEndDate) }}</span>
|
<span>{{ parseTime(scope.row.refundFeeEndDate) }}</span>
|
||||||
|
@ -67,14 +47,6 @@
|
||||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
|
||||||
<template v-slot="scope">
|
|
||||||
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
|
|
||||||
v-hasPermi="['shop:phone-record:update']">修改</el-button>
|
|
||||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
|
|
||||||
v-hasPermi="['shop:phone-record:delete']">删除</el-button>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
</el-table>
|
||||||
<!-- 分页组件 -->
|
<!-- 分页组件 -->
|
||||||
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
|
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
|
||||||
|
|
|
@ -22,6 +22,11 @@
|
||||||
<el-form-item label="充值号码" prop="userPhone">
|
<el-form-item label="充值号码" prop="userPhone">
|
||||||
<el-input v-model="queryParams.userPhone" placeholder="请输入充值号码" clearable @keyup.enter.native="handleQuery"/>
|
<el-input v-model="queryParams.userPhone" placeholder="请输入充值号码" clearable @keyup.enter.native="handleQuery"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="支付状态" prop="userPhone">
|
||||||
|
<el-select v-model="queryParams.paid" placeholder="请选择支付状态" clearable style="width: 240px">
|
||||||
|
<el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
|
||||||
<el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
|
<el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
|
||||||
|
@ -52,7 +57,8 @@
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="推广员" align="center" prop="parentOrganizationName" >
|
<el-table-column label="推广员" align="center" prop="parentOrganizationName" >
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<span>{{ scope.row.parentOrganizationName }}-{{ scope.row.nickname }}</span>
|
<span>{{ scope.row.parentOrganizationName }}</span>
|
||||||
|
<span v-if="scope.row.nickname!=='' && scope.row.nickname!==null">-{{ scope.row.nickname }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="会员名称" align="center" prop="realName" />
|
<el-table-column label="会员名称" align="center" prop="realName" />
|
||||||
|
@ -66,9 +72,9 @@
|
||||||
<dict-tag :type="DICT_TYPE.PAY_TYPE" :value="scope.row.payType"/>
|
<dict-tag :type="DICT_TYPE.PAY_TYPE" :value="scope.row.payType"/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="支付状态" align="center">
|
<el-table-column label="支付状态" align="center" prop="paid">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<span>已支付</span>
|
<dict-tag :type="DICT_TYPE.PAY_STATUS" :value="scope.row.paid"/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="退款状态" align="center">
|
<el-table-column label="退款状态" align="center">
|
||||||
|
@ -88,7 +94,7 @@
|
||||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleRefund(scope.row, 2)"
|
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleRefund(scope.row, 2)"
|
||||||
v-hasPermi="['shop:recharge-order:delete']">拒绝退款</el-button>
|
v-hasPermi="['shop:recharge-order:delete']">拒绝退款</el-button>
|
||||||
</template>
|
</template>
|
||||||
<el-button v-if="scope.row.refundStatus !== 2 || scope.row.refundStatus !== 3" size="mini" type="text" icon="el-icon-edit" @click="handleRefund(scope.row, 3)"
|
<el-button v-if="scope.row.refundStatus !== 2 && scope.row.refundStatus !== 3 && scope.row.paid==1" size="mini" type="text" icon="el-icon-edit" @click="handleRefund(scope.row, 3)"
|
||||||
v-hasPermi="['shop:recharge-order:update']">发起退款</el-button>
|
v-hasPermi="['shop:recharge-order:update']">发起退款</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
@ -111,7 +117,8 @@ import {
|
||||||
exportRechargeOrderExcel,
|
exportRechargeOrderExcel,
|
||||||
refundRechargeOrder
|
refundRechargeOrder
|
||||||
} from '@/api/shop/rechargeOrder';
|
} from '@/api/shop/rechargeOrder';
|
||||||
import {DICT_TYPE} from "@/utils/dict";
|
import {DICT_TYPE, getDictDatas} from "@/utils/dict";
|
||||||
|
import ElementForm from "@/components/bpmnProcessDesigner/package/penal/form/ElementForm.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "RechargeOrder",
|
name: "RechargeOrder",
|
||||||
|
@ -121,6 +128,7 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
|
ElementForm
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -177,6 +185,7 @@ export default {
|
||||||
outTradeNo: null,
|
outTradeNo: null,
|
||||||
paySerialNumber: null,
|
paySerialNumber: null,
|
||||||
},
|
},
|
||||||
|
statusDictDatas: getDictDatas(DICT_TYPE.PAY_STATUS),
|
||||||
// 表单参数
|
// 表单参数
|
||||||
form: {},
|
form: {},
|
||||||
// 表单校验
|
// 表单校验
|
||||||
|
|
Loading…
Reference in New Issue