订单退款

pull/2/head
perry 2023-05-22 12:55:07 +08:00
parent fc9c6e759a
commit a6eb645d54
30 changed files with 425 additions and 125 deletions

View File

@ -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_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$]*");

View File

@ -1,13 +1,23 @@
package cn.iocoder.yudao.framework.excel.core.util;
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 lombok.NonNull;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Excel
@ -32,7 +42,7 @@ public class ExcelUtils {
// 输出 Excel
EasyExcel.write(response.getOutputStream(), head)
.autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
.registerWriteHandler(new AutoColumnWidthWriteHandler()) // 基于 column 长度,自动适配。最大 255 宽度
.sheet(sheetName).doWrite(data);
// 设置 header 和 contentType。写在最后的原因是避免报错时响应 contentType 已经被修改了
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
@ -44,5 +54,63 @@ public class ExcelUtils {
.autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
.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;
}
}
}
}
}
}

View File

@ -83,8 +83,8 @@ public class PhoneRecordController {
@Operation(summary = "获得充值档位记录分页")
@PreAuthorize("@ss.hasPermission('shop:phone-record:query')")
public CommonResult<PageResult<PhoneRecordRespVO>> getPhoneRecordPage(@Valid PhoneRecordPageReqVO pageVO) {
PageResult<PhoneRecordDO> pageResult = phoneRecordService.getPhoneRecordPage(pageVO);
return success(PhoneRecordConvert.INSTANCE.convertPage(pageResult));
PageResult<PhoneRecordRespVO> pageResult = phoneRecordService.getPhoneRecordPage(pageVO);
return success(pageResult);
}
@GetMapping("/export-excel")

View File

@ -118,7 +118,7 @@ public class RechargeOrderController {
List<RechargeOrderExcelVO> list = rechargeOrderService.findListExcel(exportReqVO);
ArrayList<Long> s = new ArrayList<>();
list.forEach(x -> {
s.add(x.getId());
s.add(Long.parseLong(x.getId()));
});
List<RechargeOrderInfoExcelVO> infoList = rechargeOrderInfoService.getRechargeOrderInfoListExcel(s);
// 导出 Excel

View File

@ -1,5 +1,6 @@
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.RechargeOrderInfoExcelVO;
import com.alibaba.excel.EasyExcel;
@ -32,7 +33,7 @@ public class Excel {
ExcelWriterBuilder writerBuilder = EasyExcel.write(response.getOutputStream())
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy());
.registerWriteHandler(new ExcelUtils.AutoColumnWidthWriteHandler());
ExcelWriter excelWriter = writerBuilder.build();
WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "订单列表").head(RechargeOrderExcelVO.class).build();

View File

@ -37,7 +37,8 @@ public class PhoneRecordBaseVO {
@Schema(description = "充值档位", required = true, example = "25455")
@NotNull(message = "充值档位不能为空")
private BigDecimal rechargeGearId;
@Schema(description = "充值档位", required = true, example = "25455")
private String rechargeGearName;
@Schema(description = "返费结束日期", required = true)
@NotNull(message = "返费结束日期不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ -45,6 +46,6 @@ public class PhoneRecordBaseVO {
@Schema(description = "返费期数", required = true)
@NotNull(message = "返费期数不能为空")
private String refundFeeNumber;
private Integer refundFeeNumber;
}

View File

@ -41,7 +41,7 @@ public class PhoneRecordExcelVO {
private LocalDateTime refundFeeEndDate;
@ExcelProperty("返费期数")
private String refundFeeNumber;
private Integer refundFeeNumber;
@ExcelProperty("创建时间")
private LocalDateTime createTime;

View File

@ -35,7 +35,7 @@ public class PhoneRecordExportReqVO {
private LocalDateTime[] refundFeeEndDate;
@Schema(description = "返费期数")
private String refundFeeNumber;
private Integer refundFeeNumber;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

View File

@ -37,7 +37,7 @@ public class PhoneRecordPageReqVO extends PageParam {
private LocalDateTime[] refundFeeEndDate;
@Schema(description = "返费期数")
private String refundFeeNumber;
private Integer refundFeeNumber;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

View File

@ -1,5 +1,9 @@
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 lombok.Data;
@ -15,8 +19,8 @@ import java.time.LocalDateTime;
public class RechargeOrderExcelVO {
@ExcelProperty("订单id")
private Long id;
@ExcelIgnore
private String id;
@ExcelProperty("订单编号")
private String orderId;
@ -59,7 +63,8 @@ public class RechargeOrderExcelVO {
@ExcelProperty("自提地址")
private String SelfPickupAddr;
@ExcelProperty("支付方式")
@ExcelProperty(value = "支付方式",converter = DictConvert.class)
@DictFormat(DictTypeConstants.PYT_TYPE)
private String payType;
@ExcelProperty("订单备注")
@ -69,7 +74,7 @@ public class RechargeOrderExcelVO {
private BigDecimal totalPrice;
@ExcelProperty("运费")
private BigDecimal shipPrice;
private BigDecimal shipPrice=new BigDecimal(0);
@ExcelProperty("会员账号")
private String vipAccount;

View File

@ -1,5 +1,8 @@
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 lombok.*;
import java.util.*;
@ -46,7 +49,8 @@ public class RechargeOrderInfoExcelVO {
@ExcelProperty("实付金额")
private BigDecimal payPrice;
@ExcelProperty("售后状态")
@ExcelProperty(value = "售后状态",converter = DictConvert.class)
@DictFormat(DictTypeConstants.PYT_STATUS)
private String afterStatus;
@ExcelProperty("退款金额")
@ -68,20 +72,4 @@ public class RechargeOrderInfoExcelVO {
private String mark;
@ExcelProperty("赠送积分")
private Integer giveIntegral;
@ExcelProperty("是否单独分佣,0-否1-是")
private Boolean isSub;
@ExcelProperty("会员价")
private BigDecimal vipPrice;
@ExcelProperty("商品类型:0-会员充值")
private Integer productType;
}

View File

@ -49,7 +49,7 @@ public class RechargeOrderPageReqVO extends PageParam {
private BigDecimal payPrice;
@Schema(description = "支付状态", example = "17413")
private Byte paid;
private Integer paid;
@Schema(description = "支付截止时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ -70,7 +70,7 @@ public class RechargeOrderPageReqVO extends PageParam {
private Boolean status;
@Schema(description = "0 未退款 1 申请中 2 已退款 3 退款中", example = "2")
private Byte refundStatus;
private Integer refundStatus;
@Schema(description = "退款图片")
private String refundReasonWapImg;
@ -104,7 +104,7 @@ public class RechargeOrderPageReqVO extends PageParam {
private Byte isChannel;
@Schema(description = "消息提醒")
private Byte isRemind;
private Integer isRemind;
@Schema(description = "后台是否删除")
private Boolean isSystemDel;

View File

@ -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.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.RechargeOrderRespVO;
import cn.iocoder.yudao.module.shop.convert.recharge.RechargeOrderConvert;
@ -42,6 +43,7 @@ public class MemberController {
@Operation(summary = "会员档次信息")
@RequestMapping(value = "/memberGradeInfo", method = RequestMethod.GET)
@PreAuthenticated
@TenantIgnore
public CommonResult<List<RechargeGearRespVO>> memberGradeInfo() {
return CommonResult.success(rechargeGearService.getGradeInfo());
}
@ -50,12 +52,14 @@ public class MemberController {
@Operation(summary = "获取当前登录账号的充值记录")
@RequestMapping(value = "/memberOrderInfo", method = RequestMethod.GET)
@PreAuthenticated
@TenantIgnore
public CommonResult<List<RechargeOrderRespVO>> memberOrderInfo() {
return CommonResult.success(rechargeOrderService.memberOrderInfo());
}
@Operation(summary = "会员头部信息")
@RequestMapping(value = "/memberHeadInfo", method = RequestMethod.GET)
@PreAuthenticated
@TenantIgnore
public CommonResult<MemberHeadResponse> memberHeadInfo() {
return CommonResult.success(rechargeOrderService.memberHeadInfo());
}

View File

@ -57,6 +57,6 @@ public class PhoneRecordDO extends BaseDO {
/**
*
*/
private String refundFeeNumber;
private Integer refundFeeNumber;
}

View File

@ -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.mapper.BaseMapperX;
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.PhoneRecordDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.*;
import org.apache.ibatis.annotations.Param;
/**
* Mapper
@ -29,7 +31,7 @@ public interface PhoneRecordMapper extends BaseMapperX<PhoneRecordDO> {
.betweenIfPresent(PhoneRecordDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PhoneRecordDO::getId));
}
IPage<PhoneRecordRespVO> findListPage(IPage<PhoneRecordRespVO> page, @Param("data") PhoneRecordPageReqVO data);
default List<PhoneRecordDO> selectList(PhoneRecordExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<PhoneRecordDO>()
.eqIfPresent(PhoneRecordDO::getUserId, reqVO.getUserId())

View File

@ -1,6 +1,8 @@
package cn.iocoder.yudao.module.shop.service.order.impl;
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.ObjectUtil;
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.PageParam;
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.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
@ -79,6 +82,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -1236,9 +1240,9 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
phoneRecordDO.setRefundFeeAmount(replace(info.getPrice()));
phoneRecordDO.setRechargeGearId(Long.valueOf(info.getRechargeGearId()));
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime newLocalDateTime = localDateTime.plusMonths(12);
LocalDateTime newLocalDateTime = LocalDateTimeUtil.offset(localDateTime,12, ChronoUnit.MONTHS);
phoneRecordDO.setRefundFeeEndDate(newLocalDateTime);
phoneRecordDO.setRefundFeeNumber("12");
phoneRecordDO.setRefundFeeNumber(12);
recordDOS.add(phoneRecordDO);
});
phoneRecordMapper.insertBatch(recordDOS);

View File

@ -57,7 +57,7 @@ public interface PhoneRecordService {
* @param pageReqVO
* @return
*/
PageResult<PhoneRecordDO> getPhoneRecordPage(PhoneRecordPageReqVO pageReqVO);
PageResult<PhoneRecordRespVO> getPhoneRecordPage(PhoneRecordPageReqVO pageReqVO);
/**
* , Excel

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.shop.service.recharge;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -70,8 +71,10 @@ public class PhoneRecordServiceImpl implements PhoneRecordService {
}
@Override
public PageResult<PhoneRecordDO> getPhoneRecordPage(PhoneRecordPageReqVO pageReqVO) {
return phoneRecordMapper.selectPage(pageReqVO);
public PageResult<PhoneRecordRespVO> getPhoneRecordPage(PhoneRecordPageReqVO pageReqVO) {
Page<PhoneRecordRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
phoneRecordMapper.findListPage(page,pageReqVO);
return new PageResult<>(page.getRecords(), page.getTotal());
}
@Override

View File

@ -107,7 +107,9 @@ public class RechargeGearServiceImpl implements RechargeGearService {
List<RechargeGearDO> rechargeGearDOS = rechargeGearMapper.selectList(Wrappers.<RechargeGearDO>lambdaQuery()
.eq(RechargeGearDO::getDeleted, 0));
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)) {
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));

View File

@ -56,7 +56,7 @@ public class AliPayStrategy implements IPayStrategy {
request.setBizContent(bizContent.toString());
AlipayTradeWapPayResponse response = null;
try {
response = alipayClient.pageExecute(request);
response = alipayClient.pageExecute(request,"get");
orderResponse.setBody(response.getBody());
} catch (AlipayApiException e) {
e.printStackTrace();

View File

@ -9,4 +9,28 @@
文档可见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>

View File

@ -11,13 +11,13 @@
<select id="getRechargeOrderInfoListExcel" resultType="cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderInfoExcelVO">
select
a.order_id as 'orderNo',
a.id as 'orderNo',
e.name as tenantName,
f.product_name as 'productName',
f.price,
f.price as proTotalPrice,
f.price as payPrice,
a.refund_status as afterStatus,
a.paid as afterStatus,
f.price as refundPrice,
a.uid as 'vipAccount',
a.real_name as vipName
@ -25,7 +25,7 @@
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 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>
<if test="ids!=null and ids.size>0">
f.recharge_order_id in

View File

@ -30,35 +30,9 @@
d.parent_organization_name
from cy_recharge_order a
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 = c.dept_id
<where>
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 &gt;=#{data.payTime[0]}
</if>
<if test="data.payTime !=null ">
and a.pay_time &lt;=#{data.payTime[1]}
</if>
</where>
left join system_dept d on d.id = a.dept_id
<include refid="baseWhere">
</include>
</select>
<select id="findListPage" resultType="cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderRespVO">
select
@ -78,8 +52,7 @@
d.parent_organization_name
from cy_recharge_order a
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 = c.dept_id
left join system_dept d on d.id = a.dept_id
<include refid="baseWhere">
</include>
</select>
@ -88,6 +61,7 @@
a.id,
a.order_id,
a.pay_serial_number,
a.tenant_id,
e.name as tenantName,
a.pay_time,
a.pay_time as payCompleteTime,
@ -100,21 +74,23 @@
a.uid,
a.real_name as vipName,
a.out_trade_no,
b.nickname as promoter,
d.parent_organization_name as 'depName'
if(b.nickname=null,d.parent_organization_name,CONCAT(d.parent_organization_name,'-',b.nickname)) as promoter,
d.parent_organization_name
from cy_recharge_order a
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_tenant e on a.promoter_id = b.id
left join system_tenant e on e.id = a.tenant_id
<include refid="baseWhere">
</include>
</select>
<sql id="baseWhere">
<where>
and a.paid=1
<if test="data.orderId !=null and data.orderId!=''">
and a.order_id like CONCAT('%',#{data.orderId},'%')
</if>
<if test="data.paid !=null and data.paid!=''">
and a.paid =#{data.paid}
</if>
<if test="data.tenantId !=null and data.tenantId!=1">
and a.tenant_id =#{data.tenantId}
</if>

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.member.controller.app.auth.vo;
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.Mobile;
import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
@ -28,7 +29,7 @@ public class AppAuthSmsLoginReqVO {
@Schema(description = "手机号", required = true, example = "15601691300")
@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;
/**
* 广id

View File

@ -25,5 +25,8 @@ public interface DictTypeConstants {
String SMS_TEMPLATE_TYPE = "system_sms_template_type"; // 短信模板类型
String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态
String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态
String PYT_TYPE = "pay_type"; // 支付类型
String PYT_STATUS = "pay_status"; // 支付状态
}

View File

@ -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=
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4AmKmcg8NImIDHlY1dz/DgBlIB1EVXv5gI2S17/Ddt7kDEdY2Uq0TV5NmVxf1RQ6EXQCDpBm83IOkduMeGsnD3zad6Vpit6hdjfvMJ4au9pAaoe4nYAy0CoMVTKDIR7XunSJZqfOZTihLXD8GbqMFTMPRyuh/JNCHoeDfDhca2nD6hyVOLE7XqZK8gVq9WgUM8uVkXDHJJfPHFmQaU8jJt3pyuItsVi1id8vJvHdng/rFy0USPwSq9kVv9DaIxI2197UBvjtyt4iTTYE5esOiJeulUggwmpWoss7Cx2fbN0pLVors+DybJGZjEW3GdwL+R6FStvQNAVcIf2Ty/NgKwIDAQAB
gatewayUrl: https://openapi.alipay.com/gateway.do
notify-url: http://yuxy.perrymake.com/admin-api/notify/ali/pay_notify
refund-notify: http://yuxy.perrymake.com/admin-api/notify/ali/refund_notify
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:
captcha:

View File

@ -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 # 密码,建议生产环境开启

View File

@ -86,7 +86,8 @@ export const DICT_TYPE = {
PROMOTION_CONDITION_TYPE: 'promotion_condition_type', // 营销的条件类型枚举
PAY_TYPE:'pay_type'
PAY_TYPE:'pay_type',
PAY_STATUS:'pay_status'
}
/**

View File

@ -3,32 +3,11 @@
<!-- 搜索工作栏 -->
<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-input v-model="queryParams.phone" placeholder="请输入充值号码" clearable @keyup.enter.native="handleQuery"/>
</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-button type="primary" icon="el-icon-search" @click="handleQuery"></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"
v-hasPermi="['shop:phone-record:create']">新增</el-button>
</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-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
v-hasPermi="['shop:phone-record:export']">导出</el-button>
@ -50,12 +33,9 @@
<!-- 列表 -->
<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="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">
<template v-slot="scope">
<span>{{ parseTime(scope.row.refundFeeEndDate) }}</span>
@ -67,14 +47,6 @@
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</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>
<!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"

View File

@ -22,6 +22,11 @@
<el-form-item label="充值号码" prop="userPhone">
<el-input v-model="queryParams.userPhone" placeholder="请输入充值号码" clearable @keyup.enter.native="handleQuery"/>
</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-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
@ -52,7 +57,8 @@
</el-table-column>
<el-table-column label="推广员" align="center" prop="parentOrganizationName" >
<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>
</el-table-column>
<el-table-column label="会员名称" align="center" prop="realName" />
@ -66,9 +72,9 @@
<dict-tag :type="DICT_TYPE.PAY_TYPE" :value="scope.row.payType"/>
</template>
</el-table-column>
<el-table-column label="支付状态" align="center">
<el-table-column label="支付状态" align="center" prop="paid">
<template v-slot="scope">
<span>已支付</span>
<dict-tag :type="DICT_TYPE.PAY_STATUS" :value="scope.row.paid"/>
</template>
</el-table-column>
<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)"
v-hasPermi="['shop:recharge-order:delete']">拒绝退款</el-button>
</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>
</template>
</el-table-column>
@ -111,7 +117,8 @@ import {
exportRechargeOrderExcel,
refundRechargeOrder
} 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 {
name: "RechargeOrder",
@ -121,6 +128,7 @@ export default {
}
},
components: {
ElementForm
},
data() {
return {
@ -177,6 +185,7 @@ export default {
outTradeNo: null,
paySerialNumber: null,
},
statusDictDatas: getDictDatas(DICT_TYPE.PAY_STATUS),
//
form: {},
//