后台-客服页面调整和客服转接功能(前端刷新功能未实现) #78

Merged
root merged 5 commits from cxw into master 2024-10-25 13:59:20 +08:00
44 changed files with 1603 additions and 124 deletions
Showing only changes of commit ade1a54439 - Show all commits

View File

@ -0,0 +1,21 @@
import request from '@/config/axios'
// 付费会员配置 VO
export interface PaidMemberConfigVO {
id: number // 编号
openPaidMember: boolean // 开启付费会员
paidMemberPrice: boolean // 商品付费会员价
}
// 付费会员配置 API
export const PaidMemberConfigApi = {
// 查询付费会员配置详情
getPaidMemberConfig: async () => {
return await request.get({ url: `/member/paid-member-config/get` })
},
// 保存付费会员配置
savePaidMemberConfig: async (data: PaidMemberConfigVO) => {
return await request.put({ url: `/member/paid-member-config/save`, data })
}
}

View File

@ -55,5 +55,10 @@ export const LitemallReservationApi = {
// 导出预约订单 Excel
exportLitemallReservation: async (params) => {
return await request.download({ url: `/subscribe/litemall-reservation/export-excel`, params })
}
},
// 删除预约订单
checkLitemallReservation: async (id: number,check: number) => {
return await request.get({ url: `/subscribe/litemall-reservation/check?id=` + id + `&check=` + check })
},
}

View File

@ -127,6 +127,8 @@ export enum DICT_TYPE {
//预约:项目
SUBSCRIBE_PROJECT_STATUS = 'subscribe_project_status',
SUBSCRIBE_RESERVATION_STATUS = 'subscribe_reservation_status',
//预约:配置
SUBSCRIBE_CONFIGURATION_STATUS = 'subscribe_configuration_status',

View File

@ -0,0 +1,114 @@
<template>
<doc-alert title="会员手册(功能开启)" url="https://doc.iocoder.cn/member/build/" />
<ContentWrap>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="120px"
v-loading="formLoading"
>
<!-- <el-form-item label="hideId" v-show="false">-->
<!-- <el-input v-model="formData.id" />-->
<!-- </el-form-item>-->
<el-tabs>
<el-tab-pane label="付费会员配置">
<el-form-item label="开启付费会员" prop="openPaidMember">
<el-radio v-model="formData.openPaidMember" :label="true">开启</el-radio>
<el-radio v-model="formData.openPaidMember" :label="false">关闭</el-radio>
<el-text class="w-full" size="small" type="info">
付费会员开关
</el-text>
</el-form-item>
<el-form-item v-if="formData.openPaidMember === true" label="商品付费会员价" prop="paidMemberPrice">
<el-radio v-model="formData.paidMemberPrice" :label="true">开启</el-radio>
<el-radio v-model="formData.paidMemberPrice" :label="false">关闭</el-radio>
<el-text class="w-full" size="small" type="info">
商品付费会员价是否展示
</el-text>
</el-form-item>
</el-tab-pane>
</el-tabs>
<el-form-item>
<el-button type="primary" @click="onSubmit">提交</el-button>
</el-form-item>
</el-form>
</ContentWrap>
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as PadiMemberTypeVoApi from '@/api/member/memberconfig'
import PaidMemberConfigForm from './PaidMemberConfigForm.vue'
import * as ConfigApi from "@/api/member/config";
/** 付费会员配置 列表 */
defineOptions({ name: 'PaidMemberConfig' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const formLoading = ref(false) // 12
const formData = ref({
id: undefined,
openPaidMember: true,
paidMemberPrice: true
})
const formRules = reactive({})
const formRef = ref() // Ref
const onSubmit = async () => {
//
if (!formRef) return
const valid = await formRef.value.validate()
if (!valid) return
//
formLoading.value = true
try {
const data = formData.value as unknown as PadiMemberTypeVoApi.PaidMemberConfigVO
await PadiMemberTypeVoApi.PaidMemberConfigApi.savePaidMemberConfig(data)
message.success(t('common.updateSuccess'))
dialogVisible.value = false
} finally {
formLoading.value = false
}
}
/** 查询付费会员配置 */
const getPaidMemberConfig = async () =>{
try {
const data = await PadiMemberTypeVoApi.PaidMemberConfigApi.getPaidMemberConfig()
if(data == null){
return
}
formData.value = data
}finally {
}
}
// 使 watch openPaidMember
watch(
() => formData.value.openPaidMember,
(newVal) => {
if (!newVal) {
formData.value.paidMemberPrice = false; // openPaidMember false paidMemberPriceStatus
}
// newVal true v-if
},
{ immediate: true } //
);
/** 初始化 **/
onMounted(() => {
getPaidMemberConfig()
})
</script>

View File

@ -9,19 +9,19 @@
label-width="68px"
>
<el-form-item label="会员类型" prop="payMemberType">
<el-input
v-model="queryParams.payMemberType"
placeholder="请输入用户会员类型"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
<!-- <el-select v-model ="queryParams.payMemberType" placeholder="请选择会员类型">-->
<!-- <el-option v-for ="item in cardlist"-->
<!-- :key="item.id"-->
<!-- :label="item.name"-->
<!-- :value="item.name"></el-option>-->
<!-- </el-select>-->
<!-- <el-input-->
<!-- v-model="queryParams.payMemberType"-->
<!-- placeholder="请输入用户会员类型"-->
<!-- clearable-->
<!-- @keyup.enter="handleQuery"-->
<!-- class="!w-240px"-->
<!-- />-->
<el-select v-model ="queryParams.payMemberType" placeholder="请选择会员类型" @keyup.enter="handleQuery" class="!w-240px">
<el-option v-for ="item in cardlist"
:key="item.id"
:label="item.name"
:value="item.name"/>
</el-select>
</el-form-item>
<el-form-item label="支付方式" prop="payType">
<!-- <el-input-->
@ -108,7 +108,7 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { PaidMemberUserApi, PaidMemberUserVO } from '@/api/member/memberuser'
import * as CardApi from '@/api/member/type'
import * as CardVoApid from '@/api/member/type'
import PaidMemberUserForm from './PaidMemberUserForm.vue'
/** 付费会员 列表 */
@ -217,10 +217,10 @@ const handleExport = async () => {
}
}
const cardlist = ref<CardApi.cardVO[]>([])//
const cardlist = ref<CardVoApid.cardVO[]>([])//
/** 初始化 **/
onMounted(async () => {
await getList()
cardlist.value = (await CardApi.getcardlist()) as CardApi.cardVO[]
cardlist.value = (await CardVoApid.cardApi.getcardlist()) as CardVoApid.cardVO[]
})
</script>

View File

@ -33,10 +33,11 @@
/>
</el-select>
</el-form-item>
<el-form-item label="可预约日期" prop="timeInterval">
<el-form-item label="可预约日期" prop="timeInterval" >
<el-date-picker
v-model="formData.timeInterval"
type="daterange"
value-format="YYYY-MM-DD"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
@ -106,8 +107,8 @@ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
console.log('11111111111',formData.value.timeInterval)
formData.value.timeInterval = JSON.stringify(formData.value.timeInterval);
console.log('11111111111',JSON.stringify(formData.value.timeInterval))
formData.value.timeInterval = JSON.stringify(formData.value.timeInterval);
//
await formRef.value.validate()
//

View File

@ -148,25 +148,26 @@
width="180px"
/> -->
<!-- <el-table-column label="预约时间段" align="center" prop="hsstr" /> -->
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="预约状态" align="center" prop="reStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.RE_STATUS" :value="scope.row.reStatus" />
</template>
</el-table-column>
<!-- <el-table-column label="审核状态" align="center" prop="status">
<!-- <el-table-column label="审核状态" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.STATUS" :value="scope.row.status" />
<dict-tag :type="DICT_TYPE.SUBSCRIBE_RESERVATION_STATUS" :value="scope.row.status" />
</template>
</el-table-column> -->
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" fixed="right" width="110">
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" /> -->
<el-table-column label="审核" align="center" fixed="right" width="110">
<template #default="scope">
<!-- <el-button
link
@ -176,14 +177,43 @@
>
编辑
</el-button> -->
<el-button
<el-button
v-if="scope.row.reStatus == 2"
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['subscribe:litemall-reservation:delete']"
type="success"
@click="handleTonguo(scope.row.id)"
>
删除
通过
</el-button>
<el-button
v-if="scope.row.reStatus == 2"
link
type="danger"
@click="handleJujue(scope.row.id)"
>
拒绝
</el-button>
<el-button
v-if="scope.row.reStatus == 1"
disabled
type="success"
>
已通过
</el-button>
<el-button
v-if="scope.row.reStatus == 0"
disabled
type="danger"
>
已拒绝
</el-button>
</template>
</el-table-column>
</el-table>
@ -233,6 +263,7 @@ const queryParams = reactive({
technicianName: undefined,
technicianId: undefined,
reStatus: undefined,
status: undefined,
remark: undefined,
createTime: []
})
@ -269,14 +300,28 @@ const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
/** 审核通过按钮操作 */
const handleTonguo = async (id: number) => {
const check = 1;
try {
//
await message.delConfirm()
//
await LitemallReservationApi.deleteLitemallReservation(id)
message.success(t('common.delSuccess'))
await LitemallReservationApi.checkLitemallReservation(id,check)
message.success(t('审核成功'))
//
await getList()
} catch {}
}
/** 审核拒绝按钮操作 */
const handleJujue = async (id: number) => {
const check = 0;
try {
await LitemallReservationApi.checkLitemallReservation(id,check)
message.success(t('审核成功'))
//
await getList()
} catch {}

View File

@ -69,10 +69,10 @@
<el-table-column label="归属项目" align="center" prop="brandName" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
<el-table-column label="操作" align="center" fixed="right" width="200">
<el-table-column label="操作" align="center" fixed="right" width="220">
<template #default="scope">
<el-button @click="openday(scope.row.projectId,scope.row.id)">
配置
<el-button type="info" @click="openday(scope.row.projectId,scope.row.id)">
时间段配置
</el-button>
<el-button link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['subscribe:litemall-technician:update']">

View File

@ -76,8 +76,10 @@ public class AppTradeOrderController {
@Operation(summary = "更新订单为已支付") // pay-module 支付服务进行回调可见 PayNotifyJob
@PermitAll
public CommonResult<Boolean> updateOrderPaid(@RequestBody PayOrderNotifyReqDTO notifyReqDTO) {
System.out.println("进入回调notify:"+ notifyReqDTO);
tradeOrderUpdateService.updateOrderPaid(Long.valueOf(notifyReqDTO.getMerchantOrderId()),
notifyReqDTO.getPayOrderId());
System.out.println("订单更新完成");
return success(true);
}

View File

@ -0,0 +1,156 @@
package cn.iocoder.yudao.module.trade.dal.dataobject.member;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
import cn.iocoder.yudao.framework.ip.core.Area;
import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
import cn.iocoder.yudao.module.system.enums.common.SexEnum;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import java.time.LocalDateTime;
import java.util.List;
/**
* 会员用户 DO
*
* uk_mobile 索引基于 {@link #mobile} 字段
*
* @author 芋道源码
*/
@TableName(value = "member_user", autoResultMap = true)
@KeySequence("member_user_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TradeMemberUserDO extends TenantBaseDO {
// ========== 账号信息 ==========
/**
* 用户ID
*/
@TableId
private Long id;
/**
* 手机
*/
private String mobile;
/**
* 加密后的密码
*
* 因为目前使用 {@link BCryptPasswordEncoder} 加密器所以无需自己处理 salt
*/
private String password;
/**
* 帐号状态
*
* 枚举 {@link CommonStatusEnum}
*/
private Integer status;
/**
* 注册 IP
*/
private String registerIp;
/**
* 注册终端
* 枚举 {@link TerminalEnum}
*/
private Integer registerTerminal;
/**
* 最后登录IP
*/
private String loginIp;
/**
* 最后登录时间
*/
private LocalDateTime loginDate;
// ========== 基础信息 ==========
/**
* 用户昵称
*/
private String nickname;
/**
* 用户头像
*/
private String avatar;
/**
* 真实名字
*/
private String name;
/**
* 性别
*
* 枚举 {@link SexEnum}
*/
private Integer sex;
/**
* 出生日期
*/
private LocalDateTime birthday;
/**
* 所在地
*
* 关联 {@link Area#getId()} 字段
*/
private Integer areaId;
/**
* 用户备注
*/
private String mark;
// ========== 其它信息 ==========
/**
* 积分
*/
private Integer point;
// TODO 疯狂增加一个 totalPoint个人信息接口要返回
/**
* 会员标签列表以逗号分隔
*/
@TableField(typeHandler = LongListTypeHandler.class)
private List<Long> tagIds;
/**
* 会员级别编号
*
* 关联 {@link MemberLevelDO#getId()} 字段
*/
private Long levelId;
/**
* 会员经验
*/
private Integer experience;
/**
* 用户分组编号
*
* 关联 {@link MemberGroupDO#getId()} 字段
*/
private Long groupId;
/**
* 是否绑过卡,是否开通过会员(0未开通,1试用,2有效期,3永久)
*/
private Integer activate;
/**
* 会员权益id
*/
private Long noticeInterestId;
/**
* 角色id0普通用户 1工作人员
*/
private Integer roleId;
}

View File

@ -0,0 +1,157 @@
package cn.iocoder.yudao.module.trade.dal.dataobject.member;
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.time.LocalDateTime;
/**
* 会员 DO
*
* @author 管理员
*/
@TableName("paid_member_user")
@KeySequence("paid_member_user_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TradePaidMemberUserDO extends TenantBaseDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 用户编号
*/
private Long uid;
/**
* 手机号
*/
private String mobile;
/**
* 密码
*/
private String password;
/**
* 状态
*/
private Integer status;
/**
* 注册 IP
*/
private String registerIp;
/**
* 注册终端
*/
private Integer registerTerminal;
/**
* 最后登录IP
*/
private String loginIp;
/**
* 最后登录时间
*/
private LocalDateTime loginDate;
/**
* 用户昵称
*/
private String nickname;
/**
* 头像
*/
private String avatar;
/**
* 真实名字
*/
private String name;
/**
* 性别
*/
private Integer sex;
/**
* 出生日期
*/
private LocalDateTime birthday;
/**
* 所在地
*/
private Integer areaId;
/**
* 用户备注
*/
private String mark;
/**
* 积分
*/
private Integer point;
/**
* 用户标签编号列表,以逗号分隔
*/
private String tagIds;
/**
* 等级编号
*/
private Long levelId;
/**
* 经验
*/
private Integer experience;
/**
* 用户分组编号
*/
private Long groupId;
/**
* 是否支付,0:未支付1:已支付
* */
private Boolean paid;
/*
* 支付时间
* */
private LocalDateTime payTime;
/**
* 到期时间
*/
private LocalDateTime cardExpirationTime;
/**
* 支付金额单位为分
*/
private Integer price;
/**
* 期限天数
*/
private String deadlineDay ;
/**
* 支付方式
*/
private String payType;
/**
* 支付渠道
*/
private String payChannel;
/**
* 订单号
*/
private String orderNo;
/**
* 支付订单编号
*
* 关联 {@link PayOrderDO#getId()}
*/
private Long payOrderId;
/**
* 会员类型
*/
private String payMemberType;
}

View File

@ -0,0 +1,72 @@
package cn.iocoder.yudao.module.trade.dal.mysql.member;
import cn.hutool.core.lang.Assert;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.trade.dal.dataobject.member.TradeMemberUserDO;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 会员 User Mapper
*
* @author 芋道源码
*/
@Mapper
public interface TradeMemberUserMapper extends BaseMapperX<TradeMemberUserDO> {
default TradeMemberUserDO selectByMobile(String mobile) {
return selectOne(TradeMemberUserDO::getMobile, mobile);
}
default List<TradeMemberUserDO> selectListByNicknameLike(String nickname) {
return selectList(new LambdaQueryWrapperX<TradeMemberUserDO>()
.likeIfPresent(TradeMemberUserDO::getNickname, nickname));
}
default Long selectCountByGroupId(Long groupId) {
return selectCount(TradeMemberUserDO::getGroupId, groupId);
}
default Long selectCountByLevelId(Long levelId) {
return selectCount(TradeMemberUserDO::getLevelId, levelId);
}
default Long selectCountByTagId(Long tagId) {
return selectCount(new LambdaQueryWrapperX<TradeMemberUserDO>()
.apply("FIND_IN_SET({0}, tag_ids)", tagId));
}
/**
* 更新用户积分增加
*
* @param id 用户编号
* @param incrCount 增加积分正数
*/
default void updatePointIncr(Long id, Integer incrCount) {
Assert.isTrue(incrCount > 0);
LambdaUpdateWrapper<TradeMemberUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<TradeMemberUserDO>()
.setSql(" point = point + " + incrCount)
.eq(TradeMemberUserDO::getId, id);
update(null, lambdaUpdateWrapper);
}
/**
* 更新用户积分减少
*
* @param id 用户编号
* @param incrCount 增加积分负数
* @return 更新行数
*/
default int updatePointDecr(Long id, Integer incrCount) {
Assert.isTrue(incrCount < 0);
LambdaUpdateWrapper<TradeMemberUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<TradeMemberUserDO>()
.setSql(" point = point + " + incrCount) // 负数所以使用 +
.eq(TradeMemberUserDO::getId, id);
return update(null, lambdaUpdateWrapper);
}
}

View File

@ -0,0 +1,14 @@
package cn.iocoder.yudao.module.trade.dal.mysql.member;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.trade.dal.dataobject.member.TradePaidMemberUserDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 会员 Mapper
*
* @author 管理员
*/
@Mapper
public interface TradePaidMemberUserMapper extends BaseMapperX<TradePaidMemberUserDO> {
}

View File

@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.trade.service.member;
import cn.iocoder.yudao.module.trade.dal.dataobject.member.TradeMemberUserDO;
/**
* 会员用户 Service 接口
*
* @author 芋道源码
*/
public interface TradeMemberUserService {
/**
* 通过用户 ID 查询用户
*
* @param id 用户ID
* @return 用户对象信息
*/
TradeMemberUserDO getUser(Long id);
void updateUserDo(TradeMemberUserDO user);
void updateActivate(String cardName);
}

View File

@ -0,0 +1,107 @@
package cn.iocoder.yudao.module.trade.service.member;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.trade.dal.dataobject.member.TradeMemberUserDO;
import cn.iocoder.yudao.module.trade.dal.mysql.member.TradeMemberUserMapper;
import com.google.common.annotations.VisibleForTesting;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.validation.Valid;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*;
/**
* 会员 User Service 实现类
*
* @author 芋道源码
*/
@Service
@Valid
@Slf4j
public class TradeMemberUserServiceImpl implements TradeMemberUserService {
@Resource
private TradeMemberUserMapper tradeMemberUserMapper;
@Override
public TradeMemberUserDO getUser(Long id) {
return tradeMemberUserMapper.selectById(id);
}
private TradeMemberUserDO validateUserExists(String mobile) {
TradeMemberUserDO user = tradeMemberUserMapper.selectByMobile(mobile);
if (user == null) {
throw exception(USER_MOBILE_NOT_EXISTS);
}
return user;
}
@VisibleForTesting
TradeMemberUserDO validateUserExists(Long id) {
if (id == null) {
return null;
}
TradeMemberUserDO user = tradeMemberUserMapper.selectById(id);
if (user == null) {
throw exception(USER_NOT_EXISTS);
}
return user;
}
@VisibleForTesting
void validateMobileUnique(Long id, String mobile) {
if (StrUtil.isBlank(mobile)) {
return;
}
TradeMemberUserDO user = tradeMemberUserMapper.selectByMobile(mobile);
if (user == null) {
return;
}
// 如果 id 为空说明不用比较是否为相同 id 的用户
if (id == null) {
throw exception(USER_MOBILE_USED, mobile);
}
if (!user.getId().equals(id)) {
throw exception(USER_MOBILE_USED, mobile);
}
}
@Override
public void updateUserDo(TradeMemberUserDO tradeMemberUserDO) {
// 校验存在
validateUserExists(tradeMemberUserDO.getId());
// 校验手机唯一
validateMobileUnique(tradeMemberUserDO.getId(), tradeMemberUserDO.getMobile());
// 更新
if(tradeMemberUserDO.getLevelId() != null && tradeMemberUserDO.getLevelId() == 5){
tradeMemberUserDO.setLevelId(Long.parseLong("1"));
}
tradeMemberUserMapper.updateById(tradeMemberUserDO);
}
@Override
public void updateActivate(String cardName) {
TradeMemberUserDO tradeMemberUserDO = getUser(getLoginUserId());
//设置个人信息的会员状态0未开通1试用2有效期3永久
if(cardName.equals("永久")){
tradeMemberUserDO.setActivate(3);
}else {
tradeMemberUserDO.setActivate(2);
}
tradeMemberUserMapper.updateById(tradeMemberUserDO);
}
}

View File

@ -0,0 +1,37 @@
package cn.iocoder.yudao.module.trade.service.member;
import cn.iocoder.yudao.module.trade.dal.dataobject.member.TradePaidMemberUserDO;
import javax.validation.Valid;
import java.time.LocalDateTime;
/**
* 会员 Service 接口
*
* @author 管理员
*/
public interface TradePaidMemberUserService {
LocalDateTime getDeadLineDay(String cardName);
TradePaidMemberUserDO getPaidMemberUserByOrderNo(String orderNO);
/**
* 判断当前支付方式
* */
String currentPayType(String payChannel);
/**
* 更新会员
*
* @param updateReqVO 更新信息
*/
void update(@Valid TradePaidMemberUserDO updateReqVO);
TradePaidMemberUserDO getByPayOrderId(Long payOrderId);
}

View File

@ -0,0 +1,97 @@
package cn.iocoder.yudao.module.trade.service.member;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.trade.dal.dataobject.member.TradePaidMemberUserDO;
import cn.iocoder.yudao.module.trade.dal.mysql.member.TradePaidMemberUserMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.PAID_MEMBER_ORDER_NOT_EXISTS;
/**
* 会员 Service 实现类
*
* @author 管理员
*/
@Service
@Validated
public class TradeTradePaidMemberUserServiceImpl implements TradePaidMemberUserService {
@Resource
private TradePaidMemberUserMapper tradePaidMemberUserMapper;
private void validateMemberUserExists(Long id) {
if (tradePaidMemberUserMapper.selectById(id) == null) {
throw exception(PAID_MEMBER_ORDER_NOT_EXISTS);
}
}
//获取会员类型对应的过期时间
@Override
public LocalDateTime getDeadLineDay(String cardName) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime deadlineDay;
//判断是否具有过期时间该操作为续费
if (cardName.equals("试用")){
deadlineDay = now.plus(1, ChronoUnit.DAYS);
} else if (cardName.equals("月卡")) {
deadlineDay = now.plus(1,ChronoUnit.MONTHS);
} else if (cardName.equals("季卡")) {
deadlineDay = now.plus(3,ChronoUnit.MONTHS);
} else if (cardName.equals("年卡")) {
deadlineDay = now.plus(1,ChronoUnit.YEARS);
} else {
//永久设置为一个非常远的的日期
deadlineDay = LocalDateTime.of(9999,12,31,23,59,59);
}
return deadlineDay;
}
@Override
public TradePaidMemberUserDO getPaidMemberUserByOrderNo(String orderNO) {
TradePaidMemberUserDO tradePaidMemberUserDO = tradePaidMemberUserMapper.selectOne(TradePaidMemberUserDO::getOrderNo,orderNO);
return tradePaidMemberUserDO;
}
@Override
public String currentPayType(String payChannel) {
String payType = null;
if (payChannel.equals("wallet")){
payType = "余额";
} else if(payChannel.startsWith("wx")){
payType = "微信";
} else if (payChannel.startsWith("alipay")) {
payType = "支付宝";
} else {
payType = "模拟支付";
}
return payType;
}
@Override
public void update(TradePaidMemberUserDO updateReqVO) {
// 校验存在
validateMemberUserExists(updateReqVO.getId());
tradePaidMemberUserMapper.updateById(updateReqVO);
}
@Override
public TradePaidMemberUserDO getByPayOrderId(Long payOrderId) {
TradePaidMemberUserDO tradePaidMemberUserDO = tradePaidMemberUserMapper.selectOne(
new LambdaQueryWrapperX<TradePaidMemberUserDO>().eqIfPresent(TradePaidMemberUserDO::getPayOrderId,payOrderId));
if (tradePaidMemberUserDO == null) {
throw exception(PAID_MEMBER_ORDER_NOT_EXISTS);
}
return tradePaidMemberUserDO;
}
}

View File

@ -22,7 +22,6 @@ import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi;
import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.pointorder.PointOrderDO;
import cn.iocoder.yudao.module.promotion.dal.mysql.pointorder.PointOrderMapper;
import cn.iocoder.yudao.module.system.api.social.SocialUserApi;
@ -38,6 +37,8 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.item.AppTradeOrderI
import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
import cn.iocoder.yudao.module.trade.dal.dataobject.cart.CartDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.member.TradeMemberUserDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.member.TradePaidMemberUserDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
@ -50,6 +51,8 @@ import cn.iocoder.yudao.module.trade.framework.order.core.annotations.TradeOrder
import cn.iocoder.yudao.module.trade.framework.order.core.utils.TradeOrderLogUtils;
import cn.iocoder.yudao.module.trade.service.cart.CartService;
import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService;
import cn.iocoder.yudao.module.trade.service.member.TradeMemberUserService;
import cn.iocoder.yudao.module.trade.service.member.TradePaidMemberUserService;
import cn.iocoder.yudao.module.trade.service.message.TradeMessageService;
import cn.iocoder.yudao.module.trade.service.message.bo.TradeOrderMessageWhenDeliveryOrderReqBO;
import cn.iocoder.yudao.module.trade.service.order.handler.TradeOrderHandler;
@ -75,6 +78,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.minusTime;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getTerminal;
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
@ -128,6 +132,12 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
@Resource
private ProductSpuApi productSpuApi;
@Resource
private TradeMemberUserService tradeMemberUserService;
@Resource
private TradePaidMemberUserService tradePaidMemberUserService;
// =================== Order ===================
@ -320,11 +330,35 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
@Transactional(rollbackFor = Exception.class)
@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_PAY)
public void updateOrderPaid(Long id, Long payOrderId) {
System.out.println("进入校验");
// 1. 校验并获得交易订单可支付
KeyValue<TradeOrderDO, PayOrderRespDTO> orderResult = validateOrderPayable(id, payOrderId);
System.out.println("校验成功");
TradeOrderDO order = orderResult.getKey();
PayOrderRespDTO payOrder = orderResult.getValue();
System.out.println("交易订单成功id"+id+"和payOrderId"+payOrderId);
//会员用户信息支付状态修改
TradeMemberUserDO tradeMemberUserDO = tradeMemberUserService.getUser(getLoginUserId());
TradePaidMemberUserDO tradePaidMemberUserDO = tradePaidMemberUserService.getByPayOrderId(payOrderId);
if(tradePaidMemberUserDO != null && tradeMemberUserDO != null){
System.out.println("进入会员支付修改操作paid"+tradePaidMemberUserDO+"和member"+tradeMemberUserDO);
tradePaidMemberUserDO.setPayTime(LocalDateTime.now());
tradePaidMemberUserDO.setPaid(true);
//过期时间
LocalDateTime cardExpirationTime = tradePaidMemberUserService.getDeadLineDay(tradePaidMemberUserDO.getPayMemberType());
tradePaidMemberUserDO.setCardExpirationTime(cardExpirationTime);
tradePaidMemberUserDO.setPayChannel(payOrder.getChannelCode());
//支付方式
String payType = tradePaidMemberUserService.currentPayType(payOrder.getChannelCode());
tradePaidMemberUserDO.setPayType(payType);
//更新会员订单
tradePaidMemberUserService.update(tradePaidMemberUserDO);
System.out.println("成功更新会员订单paid"+tradePaidMemberUserDO);
//更新用户会员状态
tradeMemberUserService.updateActivate(tradePaidMemberUserDO.getPayMemberType());
System.out.println("成功更新用户的会员状态member"+tradeMemberUserDO);
}
System.out.println("会员修改操作结束!!!");
// 2. 更新 TradeOrderDO 状态为已支付等待发货
int updateCount = tradeOrderMapper.updateByIdAndStatus(id, order.getStatus(),
new TradeOrderDO().setStatus(TradeOrderStatusEnum.UNDELIVERED.getStatus()).setPayStatus(true)

View File

@ -69,8 +69,9 @@ public interface ErrorCodeConstants {
ErrorCode MEMBER_USER_NOT_EXISTS = new ErrorCode(1_004_021_000, "会员不存在");
ErrorCode PAID_MEMBER_ORDER_NOT_EXISTS = new ErrorCode(1_004_022_000, "付费会员订单不存在");
ErrorCode PAID_MEMBER_USER_ORDER_NO_NOT_EXISTS = new ErrorCode(1_004_023_000, "生成会员订单号失败,请重新提交");
ErrorCode PAID_MEMBER_USER_NOT_OPEN = new ErrorCode(1_004_021_000, "会员未开通");
ErrorCode PAID_MEMBER_USER_PASSED = new ErrorCode(1_004_021_000, "会员已过期");
ErrorCode PAID_MEMBER_USER_NOT_OPEN = new ErrorCode(1_004_024_000, "会员未开通");
ErrorCode PAID_MEMBER_USER_PASSED = new ErrorCode(1_004_025_000, "会员已过期");
ErrorCode PAID_MEMBER_CONFIG_NOT_EXISTS = new ErrorCode(1_004_026_000, "付费会员配置不存在");
}

View File

@ -0,0 +1,59 @@
package cn.iocoder.yudao.module.member.controller.admin.memberconfig;
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 cn.iocoder.yudao.module.member.controller.admin.memberconfig.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.memberconfig.PaidMemberConfigDO;
import cn.iocoder.yudao.module.member.service.memberconfig.PaidMemberConfigService;
@Tag(name = "管理后台 - 付费会员配置")
@RestController
@RequestMapping("/member/paid-member-config")
@Validated
public class PaidMemberConfigController {
@Resource
private PaidMemberConfigService paidMemberConfigService;
@PutMapping("/save")
@Operation(summary = "保存付费会员配置")
@PreAuthorize("@ss.hasPermission('member:paid-member-config:save')")
public CommonResult<Boolean> updatePaidMemberConfig(@Valid @RequestBody PaidMemberConfigSaveReqVO saveReqVO) {
paidMemberConfigService.saveConfig(saveReqVO);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得付费会员配置")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('member:paid-member-config:query')")
public CommonResult<PaidMemberConfigRespVO> getPaidMemberConfig() {
PaidMemberConfigDO paidMemberConfig = paidMemberConfigService.getConfig();
return success(BeanUtils.toBean(paidMemberConfig, PaidMemberConfigRespVO.class));
}
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.member.controller.admin.memberconfig.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 PaidMemberConfigPageReqVO extends PageParam {
@Schema(description = "开启付费会员")
private Boolean openPaidMember;
@Schema(description = "商品付费会员价", example = "20313")
private Boolean paidMemberPrice;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.member.controller.admin.memberconfig.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 PaidMemberConfigRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "9256")
@ExcelProperty("编号")
private Long id;
@Schema(description = "开启付费会员", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("开启付费会员")
private Boolean openPaidMember;
@Schema(description = "商品付费会员价", requiredMode = Schema.RequiredMode.REQUIRED, example = "20313")
@ExcelProperty("商品付费会员价")
private Boolean paidMemberPrice;
@Schema(description = "创建时间")
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.member.controller.admin.memberconfig.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 付费会员配置新增/修改 Request VO")
@Data
public class PaidMemberConfigSaveReqVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "9256")
private Long id;
@Schema(description = "开启付费会员", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "开启付费会员不能为空")
private Boolean openPaidMember;
@Schema(description = "商品付费会员价", requiredMode = Schema.RequiredMode.REQUIRED, example = "20313")
private Boolean paidMemberPrice;
}

View File

@ -4,6 +4,9 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "用户 APP - 用户个人信息 Response VO")
@Data
@ -45,6 +48,7 @@ public class AppMemberUserInfoRespVO {
private String cardName;
@Schema(description = "会员名称", requiredMode = Schema.RequiredMode.REQUIRED)
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private String cardExpirationTime;
@Schema(description = "用户 App - 会员等级")

View File

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.member.convert.memberconfig;
import cn.iocoder.yudao.module.member.controller.admin.memberconfig.vo.PaidMemberConfigSaveReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.memberconfig.PaidMemberConfigDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 付费会员配置 Convert
*
*/
@Mapper
public interface PaidMemberConfigConvert {
PaidMemberConfigConvert INSTANCE = Mappers.getMapper(PaidMemberConfigConvert.class);
PaidMemberConfigDO convert(PaidMemberConfigSaveReqVO bean);
}

View File

@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.member.dal.dataobject.memberconfig;
import lombok.*;
import java.util.*;
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("paid_member_config")
@KeySequence("paid_member_config_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PaidMemberConfigDO extends BaseDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 开启付费会员
*/
private Boolean openPaidMember;
/**
* 商品付费会员价
*/
private Boolean paidMemberPrice;
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.member.dal.mysql.memberconfig;
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.member.dal.dataobject.memberconfig.PaidMemberConfigDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.member.controller.admin.memberconfig.vo.*;
/**
* 付费会员配置 Mapper
*
* @author 管理员
*/
@Mapper
public interface PaidMemberConfigMapper extends BaseMapperX<PaidMemberConfigDO> {
default PageResult<PaidMemberConfigDO> selectPage(PaidMemberConfigPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<PaidMemberConfigDO>()
.eqIfPresent(PaidMemberConfigDO::getOpenPaidMember, reqVO.getOpenPaidMember())
.eqIfPresent(PaidMemberConfigDO::getPaidMemberPrice, reqVO.getPaidMemberPrice())
.betweenIfPresent(PaidMemberConfigDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PaidMemberConfigDO::getId));
}
}

View File

@ -0,0 +1,63 @@
package cn.iocoder.yudao.module.member.service.memberconfig;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.member.controller.admin.memberconfig.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.memberconfig.PaidMemberConfigDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* 付费会员配置 Service 接口
*
* @author 管理员
*/
public interface PaidMemberConfigService {
/**
* 创建付费会员配置
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createPaidMemberConfig(@Valid PaidMemberConfigSaveReqVO createReqVO);
/**
* 更新付费会员配置
*
* @param updateReqVO 更新信息
*/
void updatePaidMemberConfig(@Valid PaidMemberConfigSaveReqVO updateReqVO);
/**
* 删除付费会员配置
*
* @param id 编号
*/
void deletePaidMemberConfig(Long id);
/**
* 获得付费会员配置
*
* @param id 编号
* @return 付费会员配置
*/
PaidMemberConfigDO getPaidMemberConfig(Long id);
/**
* 获得付费会员配置分页
*
* @param pageReqVO 分页查询
* @return 付费会员配置分页
*/
PageResult<PaidMemberConfigDO> getPaidMemberConfigPage(PaidMemberConfigPageReqVO pageReqVO);
/**
* 获得付费会员配置
*
* @return 会员配置
*/
PaidMemberConfigDO getConfig();
void saveConfig(PaidMemberConfigSaveReqVO saveReqVO);
}

View File

@ -0,0 +1,94 @@
package cn.iocoder.yudao.module.member.service.memberconfig;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.member.convert.memberconfig.PaidMemberConfigConvert;
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.member.controller.admin.memberconfig.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.memberconfig.PaidMemberConfigDO;
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.member.dal.mysql.memberconfig.PaidMemberConfigMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*;
/**
* 付费会员配置 Service 实现类
*
* @author 管理员
*/
@Service
@Validated
public class PaidMemberConfigServiceImpl implements PaidMemberConfigService {
@Resource
private PaidMemberConfigMapper paidMemberConfigMapper;
@Override
public Long createPaidMemberConfig(PaidMemberConfigSaveReqVO createReqVO) {
// 插入
PaidMemberConfigDO paidMemberConfig = BeanUtils.toBean(createReqVO, PaidMemberConfigDO.class);
paidMemberConfigMapper.insert(paidMemberConfig);
// 返回
return paidMemberConfig.getId();
}
@Override
public void updatePaidMemberConfig(PaidMemberConfigSaveReqVO updateReqVO) {
// 校验存在
validatePaidMemberConfigExists(updateReqVO.getId());
// 更新
PaidMemberConfigDO updateObj = BeanUtils.toBean(updateReqVO, PaidMemberConfigDO.class);
paidMemberConfigMapper.updateById(updateObj);
}
@Override
public void deletePaidMemberConfig(Long id) {
// 校验存在
validatePaidMemberConfigExists(id);
// 删除
paidMemberConfigMapper.deleteById(id);
}
private void validatePaidMemberConfigExists(Long id) {
if (paidMemberConfigMapper.selectById(id) == null) {
throw exception(PAID_MEMBER_CONFIG_NOT_EXISTS);
}
}
@Override
public PaidMemberConfigDO getPaidMemberConfig(Long id) {
return paidMemberConfigMapper.selectById(id);
}
@Override
public PageResult<PaidMemberConfigDO> getPaidMemberConfigPage(PaidMemberConfigPageReqVO pageReqVO) {
return paidMemberConfigMapper.selectPage(pageReqVO);
}
@Override
public PaidMemberConfigDO getConfig() {
List<PaidMemberConfigDO> list = paidMemberConfigMapper.selectList();
return CollectionUtils.getFirst(list);
}
@Override
public void saveConfig(PaidMemberConfigSaveReqVO saveReqVO) {
//存在则更新
PaidMemberConfigDO paidMemberConfigDO = getConfig();
if(paidMemberConfigDO != null){
paidMemberConfigMapper.updateById(PaidMemberConfigConvert.INSTANCE.convert(saveReqVO).setId(paidMemberConfigDO.getId()));
return;
}
//不存在则进行插入
paidMemberConfigMapper.insert(PaidMemberConfigConvert.INSTANCE.convert(saveReqVO));
}
}

View File

@ -189,4 +189,6 @@ public interface MemberUserService {
void updateUserDo(MemberUserDO user);
void updateActivate(String cardName);
}

View File

@ -38,6 +38,7 @@ import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*;
/**
@ -322,10 +323,22 @@ public class MemberUserServiceImpl implements MemberUserService {
validateMobileUnique(memberUserDO.getId(), memberUserDO.getMobile());
// 更新
if(memberUserDO.getLevelId() == 5){
if(memberUserDO.getLevelId() != null && memberUserDO.getLevelId() == 5){
memberUserDO.setLevelId(Long.parseLong("1"));
}
memberUserMapper.updateById(memberUserDO);
}
@Override
public void updateActivate(String cardName) {
MemberUserDO memberUserDO = getUser(getLoginUserId());
//设置个人信息的会员状态0未开通1试用2有效期3永久
if(cardName.equals("永久")){
memberUserDO.setActivate(3);
}else {
memberUserDO.setActivate(2);
}
memberUserMapper.updateById(memberUserDO);
}
}

View File

@ -61,6 +61,11 @@ public interface PaidMemberUserService {
PaidMemberUserDO getPaidMemberUserByOrderNo(String orderNO);
/**
* 判断当前支付方式
* */
String currentPayType(String payChannel);
/**
* 更新会员
*
@ -79,4 +84,6 @@ public interface PaidMemberUserService {
*/
PageResult<PaidMemberUserDO> getMemberUserPage(PaidMemberUserPageReqVO pageReqVO);
PaidMemberUserDO getByPayOrderId(Long payOrderId);
}

View File

@ -146,6 +146,21 @@ public class PaidMemberUserServiceImpl implements PaidMemberUserService {
return paidMemberUserDO;
}
@Override
public String currentPayType(String payChannel) {
String payType = null;
if (payChannel.equals("wallet")){
payType = "余额";
} else if(payChannel.startsWith("wx")){
payType = "微信";
} else if (payChannel.startsWith("alipay")) {
payType = "支付宝";
} else {
payType = "模拟支付";
}
return payType;
}
@Override
public void update(PaidMemberUserDO updateReqVO) {
// 校验存在
@ -170,4 +185,14 @@ public class PaidMemberUserServiceImpl implements PaidMemberUserService {
return paidMemberUserMapper.selectPage(pageReqVO);
}
@Override
public PaidMemberUserDO getByPayOrderId(Long payOrderId) {
PaidMemberUserDO paidMemberUserDO = paidMemberUserMapper.selectOne(
new LambdaQueryWrapperX<PaidMemberUserDO>().eqIfPresent(PaidMemberUserDO::getPayOrderId,payOrderId));
if(paidMemberUserDO == null){
throw exception(PAID_MEMBER_ORDER_NOT_EXISTS);
}
return paidMemberUserDO;
}
}

View File

@ -24,6 +24,8 @@
<version>${revision}</version>
</dependency>
<!-- 业务组件 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>

View File

@ -175,25 +175,12 @@ public class AppPaidMembeController {
LocalDateTime cardExpirationTime = paidMemberUserService.getDeadLineDay(notifyReqDTO.getCardName());
paidMemberUserDO.setCardExpirationTime(cardExpirationTime);
paidMemberUserDO.setPayChannel(notifyReqDTO.getPayChannel());
if (notifyReqDTO.getPayChannel().equals("wallet")){
paidMemberUserDO.setPayType("余额");
} else if(notifyReqDTO.getPayChannel().startsWith("wx")){
paidMemberUserDO.setPayType("微信");
} else if (notifyReqDTO.getPayChannel().startsWith("alipay")) {
paidMemberUserDO.setPayType("支付宝");
} else {
paidMemberUserDO.setPayType("模拟支付");
}
String payType = paidMemberUserService.currentPayType(notifyReqDTO.getPayChannel());
paidMemberUserDO.setPayType(payType);
//更新会员订单
paidMemberUserService.update(paidMemberUserDO);
//设置个人信息的会员状态0未开通1试用2有效期3永久
if(notifyReqDTO.getCardName().equals("永久")){
memberUserDO.setActivate(3);
}else {
memberUserDO.setActivate(2);
}
//更新用户会员状态
memberUserService.updateUserDo(memberUserDO);
memberUserService.updateActivate(paidMemberUserDO.getPayMemberType());
// return success(PayMemberOrderConvert.INSTANCE.convert(paidMemberUserDO.getId(),payOrderId
// ,paidMemberUserDO.getCardExpirationTime(),memberUserDO.getActivate()));
return success(true);

View File

@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.pay.dal.mysql.order;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderExportReqVO;
import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderPageReqVO;
import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO;
@ -59,4 +60,9 @@ public interface PayOrderMapper extends BaseMapperX<PayOrderDO> {
.lt(PayOrderDO::getExpireTime, expireTime));
}
default PayOrderDO selectByAppIdAndMerchantOrderIdAndSubject(Long appId, String merchantOrderId, String subject){
return selectOne(PayOrderDO::getAppId, appId,
PayOrderDO::getMerchantOrderId, merchantOrderId,
PayOrderDO::getSubject,subject);
}
}

View File

@ -121,10 +121,14 @@ public class PayOrderServiceImpl implements PayOrderService {
public Long createOrder(PayOrderCreateReqDTO reqDTO) {
// 校验 App
PayAppDO app = appService.validPayApp(reqDTO.getAppId());
// 查询对应的支付交易单是否已经存在如果是则直接返回
PayOrderDO order = orderMapper.selectByAppIdAndMerchantOrderId(
reqDTO.getAppId(), reqDTO.getMerchantOrderId());
if(reqDTO.getSubject() != null && reqDTO.getSubject().equals("会员支付购卡")){
/// 查询对应的会员购卡是否已经存在如果是则直接返回(付费会员订单)
order = orderMapper.selectByAppIdAndMerchantOrderIdAndSubject(reqDTO.getAppId(),reqDTO.getMerchantOrderId()
,reqDTO.getSubject());
}
if (order != null) {
log.warn("[createOrder][appId({}) merchantOrderId({}) 已经存在对应的支付单({})]", order.getAppId(),
order.getMerchantOrderId(), toJsonString(order)); // 理论来说不会出现这个情况
@ -150,17 +154,6 @@ public class PayOrderServiceImpl implements PayOrderService {
// 1.32 校验支付渠道是否有效
PayChannelDO channel = validateChannelCanSubmit(order.getAppId(), reqVO.getChannelCode());
PayClient client = channelService.getPayClient(channel.getId());
// 如果订单扩展里面已经存在该订单号的订单扩展正在等待则关闭已有的订单扩展然后再创建解决先点击微信支付然后再使用余额支付会产生两个扩展订单的bug
LambdaQueryWrapperX<PayOrderExtensionDO> wrapperX = new LambdaQueryWrapperX<>();
wrapperX.eq(PayOrderExtensionDO::getOrderId, order.getId()).eq(PayOrderExtensionDO::getStatus, PayOrderStatusEnum.WAITING.getStatus());
List<PayOrderExtensionDO> existOrderExtensionList = orderExtensionMapper.selectList(wrapperX);
if (existOrderExtensionList != null){
// 考虑到这种重复的扩展订单一般就一个最大值取决与支付方式个数所以不使用批处理插入
for (PayOrderExtensionDO payOrderExtensionDO : existOrderExtensionList) {
payOrderExtensionDO.setStatus(PayOrderStatusEnum.CLOSED.getStatus());
orderExtensionMapper.updateById(payOrderExtensionDO);
}
}
// 2. 插入 PayOrderExtensionDO
String no = noRedisDAO.generate(payProperties.getOrderNoPrefix());
PayOrderExtensionDO orderExtension = PayOrderConvert.INSTANCE.convert(reqVO, userIp)
@ -273,12 +266,7 @@ public class PayOrderServiceImpl implements PayOrderService {
PayChannelDO channel = channelService.validPayChannel(channelId);
// 更新支付订单为已支付
TenantUtils.execute(channel.getTenantId(), () -> getSelf().notifyOrder(channel, notify));
// 获取订单扩展
PayOrderExtensionDO payOrderExtensionDO = orderExtensionMapper.selectByNo(notify.getOutTradeNo());
// 判断订单是否更新为已支付
if (Objects.equals(PayOrderStatusEnum.SUCCESS.getStatus(), orderMapper.selectById(payOrderExtensionDO.getOrderId()).getStatus())){
// 充值判断
PayWalletRechargeDO walletRechargeDO = walletRechargeMapper.selectOne("pay_order_id", payOrderExtensionDO.getOrderId());
if (walletRechargeDO != null){
walletRechargeDO.setPayStatus(true);
@ -287,7 +275,6 @@ public class PayOrderServiceImpl implements PayOrderService {
payWalletService.addWalletBalance(walletRechargeDO.getWalletId(),walletRechargeDO.getPayOrderId().toString(),RECHARGE,walletRechargeDO.getTotalPrice());
}
}
}
/**
* 通知并更新订单的支付结果

View File

@ -105,8 +105,8 @@ public class ConfigurationController {
//添加预约套餐时间段配置
@PostMapping("/addUpdConfiguration")
public CommonResult<Long> addConfiguration(@RequestBody ConfigurationDO pageReqVO) {
Long aLong = configurationService.addUpdConfiguration(pageReqVO);
public CommonResult<Integer> addConfiguration(@RequestBody ConfigurationDO pageReqVO) {
Integer aLong = configurationService.addUpdConfiguration(pageReqVO);
return success(aLong);
}

View File

@ -94,4 +94,11 @@ public class LitemallReservationController {
BeanUtils.toBean(list, LitemallReservationRespVO.class));
}
@GetMapping("/check")
public CommonResult<Boolean> checkLitemallReservation(@RequestParam("id") Long id,@RequestParam("check") Long check) {
Boolean aBoolean = litemallReservationService.checkLitemallReservation(id, check);
return success(aBoolean);
}
}

View File

@ -57,7 +57,7 @@ public interface ConfigurationService {
List<ServiceTimeVO> getConfiguration(Integer id);
Long addUpdConfiguration(ConfigurationDO pageReqVO);
Integer addUpdConfiguration(ConfigurationDO pageReqVO);
List<ConfigurationDO> getConfigurationList(Integer projectdayId, Integer technicianId);

View File

@ -13,6 +13,8 @@ import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@ -101,36 +103,87 @@ public class ConfigurationServiceImpl implements ConfigurationService {
serviceTimeVOList.add(serviceTimeVO);
}
return serviceTimeVOList;
}
@Transactional
@Override
public Long addUpdConfiguration(ConfigurationDO pageReqVO) {
public Integer addUpdConfiguration(ConfigurationDO pageReqVO) {
//添加成功后时间段添加到预约时间段配置中
if(pageReqVO.getServiceTimes() != null && pageReqVO.getServiceTimes() != ""){
//把StringJSON格式serviceTime转成对象
List<ServiceTimeVO> serviceTimeVOS = JSON.parseObject(pageReqVO.getServiceTimes(), new TypeReference<List<ServiceTimeVO>>() {});
/**
* 删除时间段
*/
//获取预约天的时间段
List<ServiceTimeVO> serviceTimeVOList = new ArrayList<>();
for (int i = 0; i < serviceTimeVOS.size(); i++) {
if (serviceTimeVOS.get(i).getId() != null){
serviceTimeVOList.add(serviceTimeVOS.get(i));
}
}
List<ServiceTimeVO> configurationByProjectdayId = getConfigurationByProjectdayId(pageReqVO.getProjectdayId());
for (int i = 0; i < configurationByProjectdayId.size(); i++) {
ServiceTimeVO serviceTimeVO1 = configurationByProjectdayId.get(i);
int check = 0;
for (int j = 0; j < serviceTimeVOList.size(); j++) {
ServiceTimeVO serviceTimeVO = serviceTimeVOS.get(j);
if (!serviceTimeVO1.getId().equals(serviceTimeVO.getId())){
check++;
}
if (check == serviceTimeVOList.size()){
configurationMapper.deleteById(serviceTimeVO1.getId());
}
}
}
for (int j = 0; j < serviceTimeVOS.size(); j++) {
ServiceTimeVO serviceTimeVO = serviceTimeVOS.get(j);
String serviceTime = serviceTimeVO.getStart() + " - " + serviceTimeVO.getEnd();
ConfigurationDO configurationDO = new ConfigurationDO();
configurationDO.setTechnicianId(pageReqVO.getTechnicianId());
configurationDO.setProjectdayId(pageReqVO.getProjectdayId());
configurationDO.setTimeQuantum(serviceTime);
configurationDO.setAvailableNumber(Integer.parseInt(serviceTimeVO.getSubscribeNum()));
configurationDO.setResidueNumber(Integer.parseInt(serviceTimeVO.getSubscribeNum()));
configurationDO.setStatus(1);
configurationMapper.insert(configurationDO);
}
//判断时间段是否存在
/**
* 添加修改时间段
*/
if (serviceTimeVO.getId() == null){ //不存在添加进时间段
ConfigurationDO configurationDO = new ConfigurationDO();
configurationDO.setTechnicianId(pageReqVO.getTechnicianId());
configurationDO.setProjectdayId(pageReqVO.getProjectdayId());
configurationDO.setTimeQuantum(serviceTime);
configurationDO.setAvailableNumber(Integer.parseInt(serviceTimeVO.getSubscribeNum()));
configurationDO.setResidueNumber(Integer.parseInt(serviceTimeVO.getSubscribeNum()));
configurationDO.setStatus(1);
int insert = configurationMapper.insert(configurationDO);
if (insert == 0){
return insert;
}
}else {
ConfigurationDO configurationDO = new ConfigurationDO();
configurationDO.setId(serviceTimeVO.getId());
configurationDO.setTechnicianId(pageReqVO.getTechnicianId());
configurationDO.setProjectdayId(pageReqVO.getProjectdayId());
configurationDO.setTimeQuantum(serviceTime);
configurationDO.setAvailableNumber(Integer.parseInt(serviceTimeVO.getSubscribeNum()));
int i = configurationMapper.updateById(configurationDO);
if (i == 0){
return i;
}
}
}
}
return null;
return 1;
}
@Override
@ -142,4 +195,21 @@ public class ConfigurationServiceImpl implements ConfigurationService {
return configurationDOS;
}
public List<ServiceTimeVO> getConfigurationByProjectdayId(Long id) {
List<ConfigurationDO> configurationDOS = configurationMapper.selectList("projectday_id", id);
List<ServiceTimeVO> serviceTimeVOList = new ArrayList<>();
for (int i = 0; i < configurationDOS.size(); i++) {
ConfigurationDO configurationDO = configurationDOS.get(i);
ServiceTimeVO serviceTimeVO = new ServiceTimeVO();
String[] split = configurationDO.getTimeQuantum().split(" - ");
serviceTimeVO.setId(configurationDO.getId());
serviceTimeVO.setStart(split[0]);
serviceTimeVO.setEnd(split[1]);
serviceTimeVO.setSubscribeNum(String.valueOf(configurationDO.getAvailableNumber()));
serviceTimeVOList.add(serviceTimeVO);
}
return serviceTimeVOList;
}
}

View File

@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.srbscribe.dal.mysql.projectday.ProjectdayMapper;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import org.springframework.stereotype.Service;
@ -66,37 +67,21 @@ public class ProjectServiceImpl implements ProjectService {
// 将字符串转换为数组
String[] timeIntervalArray = gson.fromJson(project.getTimeInterval(), arrayType);
String[] startDate = timeIntervalArray[0].split("T");
String[] endDate = timeIntervalArray[1].split("T");
// 定义日期格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 定义起始日期和结束日期
LocalDate startDates = LocalDate.parse(startDate[0], formatter);
LocalDate endDates = LocalDate.parse(endDate[0], formatter);
// 获取日期范围内的所有日期
List<LocalDate> dateList = getDatesBetween(startDates, endDates);
// 创建一个 StringBuilder 来存储所有日期的字符串
StringBuilder dateStringBuilder = new StringBuilder();
// 拼接所有日期字符串
for (LocalDate date : dateList) {
dateStringBuilder.append(date.format(formatter)).append(","); // 连接日期和逗号
}
// 删除最后一个逗号和空格
if (dateStringBuilder.length() > 0) {
dateStringBuilder.setLength(dateStringBuilder.length() - 1); // 移除最后的逗号和空格
}
// 输出所有日期作为单个字符串
String finalDateString = dateStringBuilder.toString();
//根据两个日期获取中间所有日期 "2024-10-01,.......,2024-10-31"
String finalDateString = dateString(timeIntervalArray[0], timeIntervalArray[1]);
String[] split = finalDateString.split(",");
List<ProjectdayDO> projectdayDOS = new ArrayList<>();
for (int i = 0; i < split.length; i++) {
ProjectdayDO projectdayDO = new ProjectdayDO();
projectdayDO.setProjectId(project.getId());
projectdayDO.setDays(split[i]);
//获取星期
LocalDate localDate = LocalDate.parse(split[i]);
String dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINESE);
projectdayDO.setWeek(dayOfWeek);
projectdayDOS.add(projectdayDO);
}
projectdayMapper.insertBatch(projectdayDOS);
@ -110,8 +95,93 @@ public class ProjectServiceImpl implements ProjectService {
return project.getId();
}
//根据两个日期获取中间所有日期 "2024-10-01,.......,2024-10-31"
public String dateString(String startDay,String endDay){
// 定义日期格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 定义起始日期和结束日期
LocalDate startDates = LocalDate.parse(startDay, formatter);
LocalDate endDates = LocalDate.parse(endDay, formatter);
// 获取日期范围内的所有日期
List<LocalDate> dateList = getDatesBetween(startDates, endDates);
// 创建一个 StringBuilder 来存储所有日期的字符串
StringBuilder dateStringBuilder = new StringBuilder();
// 拼接所有日期字符串
for (LocalDate date : dateList) {
dateStringBuilder.append(date.format(formatter)).append(","); // 连接日期和逗号
}
// 删除最后一个逗号和空格
if (dateStringBuilder.length() > 0) {
dateStringBuilder.setLength(dateStringBuilder.length() - 1); // 移除最后的逗号和空格
}
// 输出所有日期作为单个字符串
String finalDateString = dateStringBuilder.toString();
return finalDateString;
}
@Override
public void updateProject(ProjectSaveReqVO updateReqVO) {
// 创建 Gson 对象
Gson gson = new Gson();
// 定义数组的类型
Type arrayType = new TypeToken<String[]>() {}.getType();
// 将字符串转换为数组
String[] timeIntervalArray = gson.fromJson(updateReqVO.getTimeInterval(), arrayType);
//根据两个日期获取中间所有日期 "2024-10-01,.......,2024-10-31"
String finalDateString = dateString(timeIntervalArray[0], timeIntervalArray[1]);
String[] split = finalDateString.split(",");
List<String> dateList = new ArrayList<>();
for (int i = 0; i < split.length; i++) {
dateList.add(split[i]);
}
//更新前的时间
List<ProjectdayDO> projectdayDOS = projectdayMapper.selectList("project_id", updateReqVO.getId());
List<ProjectdayDO> projectdayList = new ArrayList<>();
for (int i = 0; i < dateList.size(); i++) {
int chick = 0;
for (int j = 0; j < projectdayDOS.size(); j++) {
ProjectdayDO projectdayDO = projectdayDOS.get(j);
if (!dateList.get(i).equals(projectdayDO.getDays())){
chick ++;
}
if (chick == projectdayDOS.size()){ //没有相同预约天添加
ProjectdayDO projectdayDO1 = new ProjectdayDO();
projectdayDO1.setProjectId(updateReqVO.getId());
projectdayDO1.setDays(split[i]);
//获取星期
LocalDate localDate = LocalDate.parse(split[i]);
String dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINESE);
projectdayDO1.setWeek(dayOfWeek);
projectdayList.add(projectdayDO1);
}
if (dateList.get(i).equals(projectdayDO.getDays())){
projectdayDOS.remove(projectdayDO); //删除相等的
}
}
}
projectdayMapper.insertBatch(projectdayList);
//删除原来多余的预约天
if (!projectdayDOS.isEmpty()){
projectdayMapper.deleteByIds(projectdayDOS);
}
// 校验存在
validateProjectExists(updateReqVO.getId());
// 更新

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.srbscribe.controller.admin.reservation.vo.LitemallReservationPageReqVO;
import cn.iocoder.yudao.module.srbscribe.controller.admin.reservation.vo.LitemallReservationSaveReqVO;
import cn.iocoder.yudao.module.srbscribe.dal.dataobject.reservation.LitemallReservationDO;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.*;
import java.util.List;
@ -71,4 +72,8 @@ public interface LitemallReservationService {
List<LitemallReservationDO> reservationInfo(Long userId);
Boolean checkLitemallReservation( Long id, Long check);
}

View File

@ -22,6 +22,8 @@ import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@ -158,14 +160,14 @@ public class LitemallReservationServiceImpl implements LitemallReservationServic
}
@Transactional
@Override
public int addReservation(LitemallReservationDO litemallReservationDO) {
ConfigurationDO configurationDO = configurationMapper.selectOne("id", litemallReservationDO.getConfigurationId());
if (configurationDO.getResidueNumber() > 0){ //剩余预约人数大于0可预约
litemallReservationDO.setReStatus(1);
litemallReservationDO.setReStatus(2);
litemallReservationMapper.insert(litemallReservationDO);
int a = configurationDO.getResidueNumber() - 1;
if (a == 0){
@ -191,6 +193,9 @@ public class LitemallReservationServiceImpl implements LitemallReservationServic
if (litemallReservationDO.getReStatus() == 0){
litemallReservationDO.setStat("预约失败");
}
if (litemallReservationDO.getReStatus() == 2){
litemallReservationDO.setStat("待审核");
}
//门店信息
@ -222,4 +227,20 @@ public class LitemallReservationServiceImpl implements LitemallReservationServic
return litemallReservationDOList;
}
@Override
public Boolean checkLitemallReservation(Long id, Long check) {
LitemallReservationDO litemallReservationDO = litemallReservationMapper.selectOne("id", id);
if (check == 0){ //拒绝
litemallReservationDO.setReStatus(0);
}
if (check == 1){
litemallReservationDO.setReStatus(1);
}
litemallReservationMapper.updateById(litemallReservationDO);
return true;
}
}