抽奖代码
parent
237cde5ae0
commit
0918b9ca88
@ -0,0 +1,113 @@
|
||||
package cn.iocoder.yudao.module.trade.controller.admin.verifylog;
|
||||
|
||||
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
|
||||
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
|
||||
import cn.iocoder.yudao.module.trade.convert.verifylog.VerifyLogConvert;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
|
||||
import javax.validation.constraints.*;
|
||||
import javax.validation.*;
|
||||
import javax.servlet.http.*;
|
||||
import java.util.*;
|
||||
import java.io.IOException;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
|
||||
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
|
||||
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||
|
||||
import cn.iocoder.yudao.module.trade.controller.admin.verifylog.vo.*;
|
||||
import cn.iocoder.yudao.module.trade.dal.dataobject.verifylog.VerifyLogDO;
|
||||
import cn.iocoder.yudao.module.trade.service.verifylog.VerifyLogService;
|
||||
|
||||
@Tag(name = "管理后台 - 门店核销记录")
|
||||
@RestController
|
||||
@RequestMapping("/trade/verify-log")
|
||||
@Validated
|
||||
public class VerifyLogController {
|
||||
|
||||
@Resource
|
||||
private VerifyLogService verifyLogService;
|
||||
|
||||
@Resource
|
||||
private MemberUserApi memberUserApi;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建门店核销记录")
|
||||
@PreAuthorize("@ss.hasPermission('trade:verify-log:create')")
|
||||
public CommonResult<Long> createVerifyLog(@Valid @RequestBody VerifyLogSaveReqVO createReqVO) {
|
||||
return success(verifyLogService.createVerifyLog(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "更新门店核销记录")
|
||||
@PreAuthorize("@ss.hasPermission('trade:verify-log:update')")
|
||||
public CommonResult<Boolean> updateVerifyLog(@Valid @RequestBody VerifyLogSaveReqVO updateReqVO) {
|
||||
verifyLogService.updateVerifyLog(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除门店核销记录")
|
||||
@Parameter(name = "id", description = "编号", required = true)
|
||||
@PreAuthorize("@ss.hasPermission('trade:verify-log:delete')")
|
||||
public CommonResult<Boolean> deleteVerifyLog(@RequestParam("id") Long id) {
|
||||
verifyLogService.deleteVerifyLog(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@Operation(summary = "获得门店核销记录")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('trade:verify-log:query')")
|
||||
public CommonResult<VerifyLogRespVO> getVerifyLog(@RequestParam("id") Long id) {
|
||||
VerifyLogDO verifyLog = verifyLogService.getVerifyLog(id);
|
||||
return success(BeanUtils.toBean(verifyLog, VerifyLogRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得门店核销记录分页")
|
||||
@PreAuthorize("@ss.hasPermission('trade:verify-log:query')")
|
||||
public CommonResult<PageResult<VerifyLogRespVO>> getVerifyLogPage(@Valid VerifyLogPageReqVO pageReqVO) {
|
||||
PageResult<VerifyLogRespVO> pageResult = verifyLogService.getVerifyLogPage(pageReqVO);
|
||||
List<MemberUserRespDTO> users = memberUserApi.getUserList(
|
||||
convertSet(pageResult.getList(), VerifyLogRespVO::getMebId));
|
||||
return success(VerifyLogConvert.INSTANCE.convertPage(pageResult, users));
|
||||
// return success(BeanUtils.toBean(pageResult, VerifyLogRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出门店核销记录 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('trade:verify-log:export')")
|
||||
@ApiAccessLog(operateType = EXPORT)
|
||||
public void exportVerifyLogExcel(@Valid VerifyLogPageReqVO pageReqVO,
|
||||
HttpServletResponse response) throws IOException {
|
||||
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||
List<VerifyLogRespVO> list = verifyLogService.getVerifyLogPage(pageReqVO).getList();
|
||||
// 导出 Excel
|
||||
ExcelUtils.write(response, "门店核销记录.xls", "数据", VerifyLogRespVO.class,
|
||||
BeanUtils.toBean(list, VerifyLogRespVO.class));
|
||||
}
|
||||
|
||||
@PutMapping("/updateAlready")
|
||||
@Operation(summary = "结算核销统计")
|
||||
@PreAuthorize("@ss.hasPermission('member:distribution-statistics:update')")
|
||||
public CommonResult<Boolean> updateAlready(@Valid @RequestBody VerifyLogSaveReqVO updateReqVO) {
|
||||
verifyLogService.updateAlready(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
package cn.iocoder.yudao.module.trade.controller.admin.verifylog.vo;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
@Schema(description = "管理后台 - 门店核销记录分页 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class VerifyLogPageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "会员id", example = "11234")
|
||||
private Long mebId;
|
||||
|
||||
@Schema(description = "订单id", example = "20689")
|
||||
private Long orderId;
|
||||
|
||||
@Schema(description = "核销编码")
|
||||
private String pickUpVerifyCode;
|
||||
|
||||
@Schema(description = "核销时间")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] verifyTime;
|
||||
|
||||
@Schema(description = "兑换状态", example = "1")
|
||||
private String status;
|
||||
|
||||
@Schema(description = "备注", example = "你猜")
|
||||
private String remark;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] createTime;
|
||||
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package cn.iocoder.yudao.module.trade.controller.admin.verifylog.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import com.alibaba.excel.annotation.*;
|
||||
|
||||
@Schema(description = "管理后台 - 门店核销记录 Response VO")
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class VerifyLogRespVO {
|
||||
|
||||
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24309")
|
||||
@ExcelProperty("订单编号")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "会员id", example = "11234")
|
||||
@ExcelProperty("会员id")
|
||||
private Long mebId;
|
||||
|
||||
@Schema(description = "订单id", example = "20689")
|
||||
@ExcelProperty("订单id")
|
||||
private Long orderId;
|
||||
|
||||
@Schema(description = "核销编码")
|
||||
@ExcelProperty("核销编码")
|
||||
private String pickUpVerifyCode;
|
||||
|
||||
@Schema(description = "核销时间")
|
||||
@ExcelProperty("核销时间")
|
||||
private LocalDateTime verifyTime;
|
||||
|
||||
@Schema(description = "兑换状态", example = "1")
|
||||
@ExcelProperty("兑换状态")
|
||||
private String status;
|
||||
|
||||
@Schema(description = "备注", example = "你猜")
|
||||
@ExcelProperty("备注")
|
||||
private String remark;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "用户昵称", example = "2")
|
||||
@ExcelProperty("用户昵称")
|
||||
private String nickname;
|
||||
|
||||
@Schema(description = "手机号", example = "2")
|
||||
@ExcelProperty("手机号")
|
||||
private String phone;
|
||||
|
||||
@Schema(description = "已结算", example = "2")
|
||||
@ExcelProperty("已结算")
|
||||
private Integer haveAlready;
|
||||
|
||||
@Schema(description = "未结算", example = "2")
|
||||
@ExcelProperty("未结算")
|
||||
private Integer unAlready;
|
||||
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package cn.iocoder.yudao.module.trade.controller.admin.verifylog.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import javax.validation.constraints.*;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Schema(description = "管理后台 - 门店核销记录新增/修改 Request VO")
|
||||
@Data
|
||||
public class VerifyLogSaveReqVO {
|
||||
|
||||
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24309")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "会员id", example = "11234")
|
||||
private Long mebId;
|
||||
|
||||
@Schema(description = "订单id", example = "20689")
|
||||
private Long orderId;
|
||||
|
||||
@Schema(description = "核销编码")
|
||||
private String pickUpVerifyCode;
|
||||
|
||||
@Schema(description = "核销时间")
|
||||
private LocalDateTime verifyTime;
|
||||
|
||||
@Schema(description = "兑换状态", example = "1")
|
||||
private String status;
|
||||
|
||||
@Schema(description = "备注", example = "你猜")
|
||||
private String remark;
|
||||
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package cn.iocoder.yudao.module.trade.convert.verifylog;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
|
||||
import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
|
||||
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
|
||||
import cn.iocoder.yudao.module.trade.controller.admin.verifylog.vo.VerifyLogRespVO;
|
||||
import cn.iocoder.yudao.module.trade.dal.dataobject.verifylog.VerifyLogDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||
|
||||
@Mapper
|
||||
public interface VerifyLogConvert {
|
||||
VerifyLogConvert INSTANCE = Mappers.getMapper(VerifyLogConvert.class);
|
||||
|
||||
default PageResult<VerifyLogRespVO> convertPage(PageResult<VerifyLogRespVO> pageResult, List<MemberUserRespDTO> users) {
|
||||
PageResult<VerifyLogRespVO> voPageResult = convertPage(pageResult);
|
||||
// user 拼接
|
||||
Map<Long, MemberUserRespDTO> userMap = convertMap(users, MemberUserRespDTO::getId);
|
||||
voPageResult.getList().forEach(record -> {
|
||||
MapUtils.findAndThen(userMap, record.getMebId(),
|
||||
memberUserRespDTO -> record.setNickname(memberUserRespDTO.getNickname()).setPhone(memberUserRespDTO.getMobile()));
|
||||
});
|
||||
return voPageResult;
|
||||
}
|
||||
PageResult<VerifyLogRespVO> convertPage(PageResult<VerifyLogRespVO> page);
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package cn.iocoder.yudao.module.trade.dal.dataobject.verifylog;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalDateTime;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
|
||||
/**
|
||||
* 门店核销记录 DO
|
||||
*
|
||||
* @author 郑大钒水
|
||||
*/
|
||||
@TableName("trade_verify_log")
|
||||
@KeySequence("trade_verify_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class VerifyLogDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 订单编号
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
/**
|
||||
* 会员id
|
||||
*/
|
||||
private Long mebId;
|
||||
/**
|
||||
* 订单id
|
||||
*/
|
||||
private Long orderId;
|
||||
/**
|
||||
* 核销编码
|
||||
*/
|
||||
private String pickUpVerifyCode;
|
||||
/**
|
||||
* 核销时间
|
||||
*/
|
||||
private LocalDateTime verifyTime;
|
||||
/**
|
||||
* 兑换状态
|
||||
*/
|
||||
private String status;
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
package cn.iocoder.yudao.module.trade.dal.mysql.verifylog;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
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.trade.dal.dataobject.verifylog.VerifyLogDO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import cn.iocoder.yudao.module.trade.controller.admin.verifylog.vo.*;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
/**
|
||||
* 门店核销记录 Mapper
|
||||
*
|
||||
* @author 郑大钒水
|
||||
*/
|
||||
@Mapper
|
||||
public interface VerifyLogMapper extends BaseMapperX<VerifyLogDO> {
|
||||
|
||||
default PageResult<VerifyLogDO> selectPage(VerifyLogPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<VerifyLogDO>()
|
||||
.eqIfPresent(VerifyLogDO::getMebId, reqVO.getMebId())
|
||||
.eqIfPresent(VerifyLogDO::getOrderId, reqVO.getOrderId())
|
||||
.eqIfPresent(VerifyLogDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode())
|
||||
.betweenIfPresent(VerifyLogDO::getVerifyTime, reqVO.getVerifyTime())
|
||||
.eqIfPresent(VerifyLogDO::getStatus, reqVO.getStatus())
|
||||
.eqIfPresent(VerifyLogDO::getRemark, reqVO.getRemark())
|
||||
.betweenIfPresent(VerifyLogDO::getCreateTime, reqVO.getCreateTime())
|
||||
.orderByDesc(VerifyLogDO::getId));
|
||||
}
|
||||
|
||||
@Select({"<script>",
|
||||
"SELECT\n" +
|
||||
"\tl.meb_id,\n" +
|
||||
"\tsum( CASE WHEN l.STATUS = 1 THEN 1 ELSE 0 END ) AS 'have_already',\n" +
|
||||
"\tsum( CASE WHEN l.STATUS = 0 THEN 1 ELSE 0 END ) AS 'un_already' \n" +
|
||||
"FROM\n" +
|
||||
"\ttrade_verify_log l",
|
||||
"where l.deleted = FALSE ",
|
||||
// "<if test='status !=null and status!=\"\" '>" ,
|
||||
// " and l.status = #{status}" ,
|
||||
// "</if> ",
|
||||
"GROUP BY\n" +
|
||||
"\tl.meb_id\n" +
|
||||
"order BY\n" +
|
||||
"\tl.meb_id\n" +
|
||||
"</script>"})
|
||||
IPage<VerifyLogRespVO> selectPage1(IPage<?> page, @Param("reqVO") VerifyLogPageReqVO reqVO);
|
||||
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
package cn.iocoder.yudao.module.trade.service.verifylog;
|
||||
|
||||
import java.util.*;
|
||||
import javax.validation.*;
|
||||
import cn.iocoder.yudao.module.trade.controller.admin.verifylog.vo.*;
|
||||
import cn.iocoder.yudao.module.trade.dal.dataobject.verifylog.VerifyLogDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
|
||||
/**
|
||||
* 门店核销记录 Service 接口
|
||||
*
|
||||
* @author 郑大钒水
|
||||
*/
|
||||
public interface VerifyLogService {
|
||||
|
||||
/**
|
||||
* 创建门店核销记录
|
||||
*
|
||||
* @param createReqVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
Long createVerifyLog(@Valid VerifyLogSaveReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新门店核销记录
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateVerifyLog(@Valid VerifyLogSaveReqVO updateReqVO);
|
||||
|
||||
/**
|
||||
* 删除门店核销记录
|
||||
*
|
||||
* @param id 编号
|
||||
*/
|
||||
void deleteVerifyLog(Long id);
|
||||
|
||||
/**
|
||||
* 获得门店核销记录
|
||||
*
|
||||
* @param id 编号
|
||||
* @return 门店核销记录
|
||||
*/
|
||||
VerifyLogDO getVerifyLog(Long id);
|
||||
|
||||
/**
|
||||
* 获得门店核销记录分页
|
||||
*
|
||||
* @param pageReqVO 分页查询
|
||||
* @return 门店核销记录分页
|
||||
*/
|
||||
PageResult<VerifyLogRespVO> getVerifyLogPage(VerifyLogPageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 更新核销统计
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateAlready(@Valid VerifyLogSaveReqVO updateReqVO);
|
||||
|
||||
}
|
@ -0,0 +1,84 @@
|
||||
package cn.iocoder.yudao.module.trade.service.verifylog;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.springframework.stereotype.Service;
|
||||
import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.*;
|
||||
import cn.iocoder.yudao.module.trade.controller.admin.verifylog.vo.*;
|
||||
import cn.iocoder.yudao.module.trade.dal.dataobject.verifylog.VerifyLogDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
|
||||
import cn.iocoder.yudao.module.trade.dal.mysql.verifylog.VerifyLogMapper;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
|
||||
|
||||
/**
|
||||
* 门店核销记录 Service 实现类
|
||||
*
|
||||
* @author 郑大钒水
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class VerifyLogServiceImpl implements VerifyLogService {
|
||||
|
||||
@Resource
|
||||
private VerifyLogMapper verifyLogMapper;
|
||||
|
||||
@Override
|
||||
public Long createVerifyLog(VerifyLogSaveReqVO createReqVO) {
|
||||
// 插入
|
||||
VerifyLogDO verifyLog = BeanUtils.toBean(createReqVO, VerifyLogDO.class);
|
||||
verifyLogMapper.insert(verifyLog);
|
||||
// 返回
|
||||
return verifyLog.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateVerifyLog(VerifyLogSaveReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
validateVerifyLogExists(updateReqVO.getId());
|
||||
// 更新
|
||||
VerifyLogDO updateObj = BeanUtils.toBean(updateReqVO, VerifyLogDO.class);
|
||||
verifyLogMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteVerifyLog(Long id) {
|
||||
// 校验存在
|
||||
validateVerifyLogExists(id);
|
||||
// 删除
|
||||
verifyLogMapper.deleteById(id);
|
||||
}
|
||||
|
||||
private void validateVerifyLogExists(Long id) {
|
||||
if (verifyLogMapper.selectById(id) == null) {
|
||||
throw exception(VERIFY_LOG_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public VerifyLogDO getVerifyLog(Long id) {
|
||||
return verifyLogMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<VerifyLogRespVO> getVerifyLogPage(VerifyLogPageReqVO pageReqVO) {
|
||||
IPage<VerifyLogRespVO> pageResult = verifyLogMapper.selectPage1(MyBatisUtils.buildPage(pageReqVO),pageReqVO);
|
||||
return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAlready(VerifyLogSaveReqVO updateReqVO) {
|
||||
// 结算
|
||||
verifyLogMapper.update(new UpdateWrapper<VerifyLogDO>().lambda().set(VerifyLogDO::getStatus,1).eq(VerifyLogDO::getMebId,updateReqVO.getMebId()));
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
package cn.iocoder.yudao.module.pay.api.wallet.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class PayWalletRespDTO {
|
||||
|
||||
private Long id;
|
||||
|
||||
private LocalDateTime createTime;
|
||||
|
||||
private String nickname;
|
||||
private String avatar;
|
||||
@NotNull(message = "用户编号不能为空")
|
||||
private Long userId;
|
||||
|
||||
@NotNull(message = "用户类型不能为空")
|
||||
private Integer userType;
|
||||
|
||||
@NotNull(message = "余额,单位分不能为空")
|
||||
private Integer balance;
|
||||
|
||||
@NotNull(message = "累计支出,单位分不能为空")
|
||||
private Integer totalExpense;
|
||||
|
||||
@NotNull(message = "累计充值,单位分不能为空")
|
||||
private Integer totalRecharge;
|
||||
|
||||
@NotNull(message = "冻结金额,单位分不能为空")
|
||||
private Integer freezePrice;
|
||||
}
|
@ -0,0 +1,82 @@
|
||||
package cn.iocoder.yudao.module.pay.api.wallet;
|
||||
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.member.api.distributionconfig.vo.DistributionConfigRespDTO;
|
||||
import cn.iocoder.yudao.module.pay.api.wallet.dto.PayWalletDTO;
|
||||
import cn.iocoder.yudao.module.pay.api.wallet.dto.PayWalletTransactionDTO;
|
||||
import cn.iocoder.yudao.module.pay.controller.admin.wallet.vo.wallet.PayWalletPageReqVO;
|
||||
import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderExtensionDO;
|
||||
import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO;
|
||||
import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletDO;
|
||||
import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletTransactionDO;
|
||||
import cn.iocoder.yudao.module.pay.dal.mysql.wallet.PayWalletMapper;
|
||||
import cn.iocoder.yudao.module.pay.enums.wallet.PayWalletBizTypeEnum;
|
||||
import cn.iocoder.yudao.module.pay.service.order.PayOrderService;
|
||||
import cn.iocoder.yudao.module.pay.service.refund.PayRefundService;
|
||||
import cn.iocoder.yudao.module.pay.service.wallet.PayWalletService;
|
||||
import cn.iocoder.yudao.module.pay.service.wallet.PayWalletTransactionService;
|
||||
import cn.iocoder.yudao.module.pay.service.wallet.bo.WalletTransactionCreateReqBO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*;
|
||||
import static cn.iocoder.yudao.module.pay.enums.wallet.PayWalletBizTypeEnum.PAYMENT;
|
||||
import static cn.iocoder.yudao.module.pay.enums.wallet.PayWalletBizTypeEnum.PAYMENT_REFUND;
|
||||
|
||||
/**
|
||||
* 钱包 Service 实现类
|
||||
*
|
||||
* @author jason
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class PayWalletApiImpl implements PayWalletApi {
|
||||
|
||||
|
||||
@Resource
|
||||
@Lazy // 延迟加载,避免循环依赖
|
||||
private PayWalletService payWalletService;
|
||||
|
||||
@Override
|
||||
public PayWalletDTO getOrCreateWallet(Long userId, Integer userType) {
|
||||
return BeanUtils.toBean(payWalletService.getOrCreateWallet(userId,userType), PayWalletDTO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PayWalletDTO getWallet(Long walletId) {
|
||||
return BeanUtils.toBean(payWalletService.getWallet(walletId), PayWalletDTO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PayWalletTransactionDTO reduceWalletBalance(Long walletId, Long bizId, PayWalletBizTypeEnum bizType, Integer price) {
|
||||
return BeanUtils.toBean(payWalletService.reduceWalletBalance(walletId,bizId,bizType,price), PayWalletTransactionDTO.class);
|
||||
}
|
||||
@Override
|
||||
public PayWalletTransactionDTO reduceWalletBalance1(Long userId, Long bizId, PayWalletBizTypeEnum bizType, Integer price) {
|
||||
return BeanUtils.toBean(payWalletService.reduceWalletBalance1(userId,bizId,bizType,price), PayWalletTransactionDTO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PayWalletTransactionDTO addWalletBalance(Long walletId, String bizId, PayWalletBizTypeEnum bizType, Integer price) {
|
||||
return BeanUtils.toBean(payWalletService.addWalletBalance(walletId,bizId,bizType,price), PayWalletTransactionDTO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void freezePrice(Long id, Integer price) {
|
||||
payWalletService.freezePrice(id,price);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unfreezePrice(Long id, Integer price) {
|
||||
payWalletService.unfreezePrice(id,price);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
import request from '@/config/axios'
|
||||
|
||||
// 门店核销记录 VO
|
||||
export interface VerifyLogVO {
|
||||
id: number // 订单编号
|
||||
mebId: number // 会员id
|
||||
orderId: number // 订单id
|
||||
pickUpVerifyCode: string // 核销编码
|
||||
verifyTime: Date // 核销时间
|
||||
status: string // 兑换状态
|
||||
remark: string // 备注
|
||||
}
|
||||
|
||||
// 门店核销记录 API
|
||||
export const VerifyLogApi = {
|
||||
// 查询门店核销记录分页
|
||||
getVerifyLogPage: async (params: any) => {
|
||||
return await request.get({ url: `/trade/verify-log/page`, params })
|
||||
},
|
||||
|
||||
// 查询门店核销记录详情
|
||||
getVerifyLog: async (id: number) => {
|
||||
return await request.get({ url: `/trade/verify-log/get?id=` + id })
|
||||
},
|
||||
|
||||
// 新增门店核销记录
|
||||
createVerifyLog: async (data: VerifyLogVO) => {
|
||||
return await request.post({ url: `/trade/verify-log/create`, data })
|
||||
},
|
||||
|
||||
// 修改门店核销记录
|
||||
updateVerifyLog: async (data: VerifyLogVO) => {
|
||||
return await request.put({ url: `/trade/verify-log/update`, data })
|
||||
},
|
||||
|
||||
// 删除门店核销记录
|
||||
deleteVerifyLog: async (id: number) => {
|
||||
return await request.delete({ url: `/trade/verify-log/delete?id=` + id })
|
||||
},
|
||||
|
||||
// 导出门店核销记录 Excel
|
||||
exportVerifyLog: async (params) => {
|
||||
return await request.download({ url: `/trade/verify-log/export-excel`, params })
|
||||
},
|
||||
// 结算核销统计
|
||||
updateAlready: async (data: VerifyLogVO) => {
|
||||
return await request.put({ url: `/trade/verify-log/updateAlready`, data })
|
||||
},
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
<template>
|
||||
<div class="flex flex-col gap-2 bg-[var(--el-bg-color-overlay)] p-6">
|
||||
<div class="flex items-center justify-between text-gray-500">
|
||||
<span>{{ title }}</span>
|
||||
<el-tag>{{ tag }}</el-tag>
|
||||
</div>
|
||||
<div class="flex flex-row items-baseline justify-between">
|
||||
<CountTo :prefix="prefix" :end-val="value" :decimals="decimals" class="text-3xl" />
|
||||
<span :class="toNumber(percent) > 0 ? 'text-red-500' : 'text-green-500'">
|
||||
{{ Math.abs(toNumber(percent)) }}%
|
||||
<Icon :icon="toNumber(percent) > 0 ? 'ep:caret-top' : 'ep:caret-bottom'" class="!text-sm" />
|
||||
</span>
|
||||
</div>
|
||||
<el-divider class="mb-1! mt-2!" />
|
||||
<div class="flex flex-row items-center justify-between text-sm">
|
||||
<span class="text-gray-500">昨日数据</span>
|
||||
<span>{{ prefix || '' }}{{ reference }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { propTypes } from '@/utils/propTypes'
|
||||
import { toNumber } from 'lodash-es'
|
||||
import { calculateRelativeRate } from '@/utils'
|
||||
|
||||
/** 交易对照卡片 */
|
||||
defineOptions({ name: 'ComparisonCard' })
|
||||
|
||||
const props = defineProps({
|
||||
title: propTypes.string.def('').isRequired,
|
||||
tag: propTypes.string.def(''),
|
||||
prefix: propTypes.string.def(''),
|
||||
value: propTypes.number.def(0).isRequired,
|
||||
reference: propTypes.number.def(0).isRequired,
|
||||
decimals: propTypes.number.def(0)
|
||||
})
|
||||
|
||||
// 计算环比
|
||||
const percent = computed(() =>
|
||||
calculateRelativeRate(props.value as number, props.reference as number)
|
||||
)
|
||||
</script>
|
@ -0,0 +1,91 @@
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<CardTitle title="用户统计" />
|
||||
</template>
|
||||
<!-- 折线图 -->
|
||||
<Echart :height="300" :options="lineChartOptions" />
|
||||
</el-card>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import dayjs from 'dayjs'
|
||||
import { EChartsOption } from 'echarts'
|
||||
import * as MemberStatisticsApi from '@/api/mall/statistics/member'
|
||||
import { formatDate } from '@/utils/formatTime'
|
||||
import { CardTitle } from '@/components/Card'
|
||||
|
||||
/** 会员用户统计卡片 */
|
||||
defineOptions({ name: 'MemberStatisticsCard' })
|
||||
|
||||
const loading = ref(true) // 加载中
|
||||
/** 折线图配置 */
|
||||
const lineChartOptions = reactive<EChartsOption>({
|
||||
dataset: {
|
||||
dimensions: ['date', 'count'],
|
||||
source: []
|
||||
},
|
||||
grid: {
|
||||
left: 20,
|
||||
right: 20,
|
||||
bottom: 20,
|
||||
top: 80,
|
||||
containLabel: true
|
||||
},
|
||||
legend: {
|
||||
top: 50
|
||||
},
|
||||
series: [{ name: '注册量', type: 'line', smooth: true, areaStyle: {} }],
|
||||
toolbox: {
|
||||
feature: {
|
||||
// 数据区域缩放
|
||||
dataZoom: {
|
||||
yAxisIndex: false // Y轴不缩放
|
||||
},
|
||||
brush: {
|
||||
type: ['lineX', 'clear'] // 区域缩放按钮、还原按钮
|
||||
},
|
||||
saveAsImage: { show: true, name: '会员统计' } // 保存为图片
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
type: 'cross'
|
||||
},
|
||||
padding: [5, 10]
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
formatter: (date: string) => formatDate(date, 'MM-DD')
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
axisTick: {
|
||||
show: false
|
||||
}
|
||||
}
|
||||
}) as EChartsOption
|
||||
|
||||
const getMemberRegisterCountList = async () => {
|
||||
loading.value = true
|
||||
// 查询最近一月数据
|
||||
const beginTime = dayjs().subtract(30, 'd').startOf('d')
|
||||
const endTime = dayjs().endOf('d')
|
||||
const list = await MemberStatisticsApi.getMemberRegisterCountList(beginTime, endTime)
|
||||
// 更新 Echarts 数据
|
||||
if (lineChartOptions.dataset && lineChartOptions.dataset['source']) {
|
||||
lineChartOptions.dataset['source'] = list
|
||||
}
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
/** 初始化 **/
|
||||
onMounted(() => {
|
||||
getMemberRegisterCountList()
|
||||
})
|
||||
</script>
|
@ -0,0 +1,82 @@
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<CardTitle title="快捷入口" />
|
||||
</template>
|
||||
<div class="flex flex-row flex-wrap gap-8 p-4">
|
||||
<div
|
||||
v-for="menu in menuList"
|
||||
:key="menu.name"
|
||||
class="h-20 w-20% flex flex-col cursor-pointer items-center justify-center gap-2"
|
||||
@click="handleMenuClick(menu.routerName)"
|
||||
>
|
||||
<div
|
||||
:class="menu.bgColor"
|
||||
class="h-48px w-48px flex items-center justify-center rounded text-white"
|
||||
>
|
||||
<Icon :icon="menu.icon" class="text-7.5!" />
|
||||
</div>
|
||||
<span>{{ menu.name }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
/** 快捷入口卡片 */
|
||||
import { CardTitle } from '@/components/Card'
|
||||
|
||||
defineOptions({ name: 'ShortcutCard' })
|
||||
|
||||
const router = useRouter() // 路由
|
||||
|
||||
/** 菜单列表 */
|
||||
const menuList = [
|
||||
{ name: '用户管理', icon: 'ep:user-filled', bgColor: 'bg-red-400', routerName: 'MemberUser' },
|
||||
{
|
||||
name: '商品管理',
|
||||
icon: 'fluent-mdl2:product',
|
||||
bgColor: 'bg-orange-400',
|
||||
routerName: 'ProductSpu'
|
||||
},
|
||||
{ name: '订单管理', icon: 'ep:list', bgColor: 'bg-yellow-500', routerName: 'TradeOrder' },
|
||||
{
|
||||
name: '售后管理',
|
||||
icon: 'ri:refund-2-line',
|
||||
bgColor: 'bg-green-600',
|
||||
routerName: 'TradeAfterSale'
|
||||
},
|
||||
{
|
||||
name: '分销管理',
|
||||
icon: 'fa-solid:project-diagram',
|
||||
bgColor: 'bg-cyan-500',
|
||||
routerName: 'TradeBrokerageUser'
|
||||
},
|
||||
{
|
||||
name: '优惠券',
|
||||
icon: 'ep:ticket',
|
||||
bgColor: 'bg-blue-500',
|
||||
routerName: 'PromotionCoupon'
|
||||
},
|
||||
{
|
||||
name: '拼团活动',
|
||||
icon: 'fa:group',
|
||||
bgColor: 'bg-purple-500',
|
||||
routerName: 'PromotionBargainActivity'
|
||||
},
|
||||
{
|
||||
name: '佣金提现',
|
||||
icon: 'vaadin:money-withdraw',
|
||||
bgColor: 'bg-rose-500',
|
||||
routerName: 'TradeBrokerageWithdraw'
|
||||
}
|
||||
]
|
||||
|
||||
/**
|
||||
* 跳转到菜单对应页面
|
||||
*
|
||||
* @param routerName 路由页面组件的名称
|
||||
*/
|
||||
const handleMenuClick = (routerName: string) => {
|
||||
router.push({ name: routerName })
|
||||
}
|
||||
</script>
|
Loading…
Reference in New Issue