订单评价和投诉

This commit is contained in:
admin
2024-05-08 23:45:51 +08:00
parent 61e777c41e
commit aa68b33ca5
17 changed files with 568 additions and 46 deletions

View File

@@ -1,11 +1,14 @@
package com.starry.admin.modules.custom.module.entity; package com.starry.admin.modules.custom.module.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.starry.admin.common.conf.StringTypeHandler;
import com.starry.common.domain.BaseEntity; import com.starry.common.domain.BaseEntity;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* 顾客留言对象 play_custom_leave_msg * 顾客留言对象 play_custom_leave_msg
@@ -15,7 +18,7 @@ import java.util.Date;
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@TableName("play_custom_leave_msg") @TableName(value = "play_custom_leave_msg", autoResultMap = true)
public class PlayCustomLeaveMsgEntity extends BaseEntity<PlayCustomLeaveMsgEntity> { public class PlayCustomLeaveMsgEntity extends BaseEntity<PlayCustomLeaveMsgEntity> {
@@ -42,7 +45,8 @@ public class PlayCustomLeaveMsgEntity extends BaseEntity<PlayCustomLeaveMsgEntit
/** /**
* 图片 * 图片
*/ */
private String images; @TableField(typeHandler = StringTypeHandler.class)
private List<String> images;
/** /**
* 留言时间 * 留言时间

View File

@@ -22,6 +22,15 @@ public interface IPlayCustomLeaveMsgService extends IService<PlayCustomLeaveMsgE
PlayCustomLeaveMsgEntity selectPlayCustomLeaveMsgById(String id); PlayCustomLeaveMsgEntity selectPlayCustomLeaveMsgById(String id);
/**
* 查询当前用户不允许留言的原因
*
* @param customId 顾客ID
* @return 没有权限原因
*/
String queryNoMessagesAllowedReason(String customId);
/** /**
* 分页查询顾客留言列表 * 分页查询顾客留言列表
* *

View File

@@ -7,15 +7,20 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.starry.admin.common.conf.ThreadLocalRequestDetail;
import com.starry.admin.common.exception.CustomException;
import com.starry.admin.modules.custom.mapper.PlayCustomLeaveMsgMapper; import com.starry.admin.modules.custom.mapper.PlayCustomLeaveMsgMapper;
import com.starry.admin.modules.custom.module.entity.PlayCustomLeaveMsgEntity; import com.starry.admin.modules.custom.module.entity.PlayCustomLeaveMsgEntity;
import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity;
import com.starry.admin.modules.custom.module.vo.PlayCustomLeaveMsgQueryVo; import com.starry.admin.modules.custom.module.vo.PlayCustomLeaveMsgQueryVo;
import com.starry.admin.modules.custom.module.vo.PlayCustomLeaveMsgReturnVo; import com.starry.admin.modules.custom.module.vo.PlayCustomLeaveMsgReturnVo;
import com.starry.admin.modules.custom.service.IPlayCustomLeaveMsgService; import com.starry.admin.modules.custom.service.IPlayCustomLeaveMsgService;
import com.starry.common.utils.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Arrays; import java.util.Arrays;
/** /**
@@ -61,7 +66,31 @@ public class PlayCustomLeaveMsgServiceImpl extends ServiceImpl<PlayCustomLeaveMs
@Override @Override
public IPage<PlayCustomLeaveMsgEntity> selectPlayCustomLeaveMsgByPage(PlayCustomLeaveMsgEntity playCustomLeaveMsg) { public IPage<PlayCustomLeaveMsgEntity> selectPlayCustomLeaveMsgByPage(PlayCustomLeaveMsgEntity playCustomLeaveMsg) {
Page<PlayCustomLeaveMsgEntity> page = new Page<>(1, 10); Page<PlayCustomLeaveMsgEntity> page = new Page<>(1, 10);
return this.baseMapper.selectPage(page, new LambdaQueryWrapper<PlayCustomLeaveMsgEntity>()); return this.baseMapper.selectPage(page, new LambdaQueryWrapper<>());
}
/**
* 查询当前用户不允许留言的原因
* 1、一个人在同一天只能留言一次
*
* @param customId 顾客ID
* @return 当前用户不允许留言的原因
*/
@Override
public String queryNoMessagesAllowedReason(String customId) {
// 1、一个人在同一天只能留言一次
LocalDateTime now = LocalDateTime.now();
LocalDateTime start = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
LocalDateTime end = LocalDateTime.of(now.toLocalDate(), LocalTime.MAX);
LambdaQueryWrapper<PlayCustomLeaveMsgEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(PlayCustomLeaveMsgEntity::getCustomId, customId);
lambdaQueryWrapper.between(PlayCustomLeaveMsgEntity::getMsgTime, start, end);
if (this.baseMapper.selectOne(lambdaQueryWrapper) != null) {
return "一天只能留言一次";
}
// 2、
// 3、
return "";
} }
/** /**
@@ -72,6 +101,10 @@ public class PlayCustomLeaveMsgServiceImpl extends ServiceImpl<PlayCustomLeaveMs
*/ */
@Override @Override
public boolean create(PlayCustomLeaveMsgEntity playCustomLeaveMsg) { public boolean create(PlayCustomLeaveMsgEntity playCustomLeaveMsg) {
String noMessagesAllowedReason = this.queryNoMessagesAllowedReason(ThreadLocalRequestDetail.getCustomUserInfo().getId());
if (StringUtils.isNotEmpty(noMessagesAllowedReason)) {
throw new CustomException(noMessagesAllowedReason);
}
if (StrUtil.isBlankIfStr(playCustomLeaveMsg.getId())) { if (StrUtil.isBlankIfStr(playCustomLeaveMsg.getId())) {
playCustomLeaveMsg.setId(IdUtil.fastSimpleUUID()); playCustomLeaveMsg.setId(IdUtil.fastSimpleUUID());
} }

View File

@@ -1,7 +1,7 @@
package com.starry.admin.modules.order.module.constant; package com.starry.admin.modules.order.module.constant;
/** /**
* @author 杭州世平信息科技有限公司-xuhq * @author admin
* @since 2024/5/8 15:41 * @since 2024/5/8 15:41
**/ **/
public class OrderConstant { public class OrderConstant {

View File

@@ -1,11 +1,14 @@
package com.starry.admin.modules.order.module.entity; package com.starry.admin.modules.order.module.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.starry.admin.common.conf.StringTypeHandler;
import com.starry.common.domain.BaseEntity; import com.starry.common.domain.BaseEntity;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* 订单投诉信息对象 play_order_complaint_info * 订单投诉信息对象 play_order_complaint_info
@@ -15,7 +18,7 @@ import java.util.Date;
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@TableName("play_order_complaint_info") @TableName(value = "play_order_complaint_info", autoResultMap = true)
public class PlayOrderComplaintInfoEntity extends BaseEntity<PlayOrderComplaintInfoEntity> { public class PlayOrderComplaintInfoEntity extends BaseEntity<PlayOrderComplaintInfoEntity> {
@@ -62,7 +65,8 @@ public class PlayOrderComplaintInfoEntity extends BaseEntity<PlayOrderComplaintI
/** /**
* 图片列表 * 图片列表
*/ */
private String images; @TableField(typeHandler = StringTypeHandler.class)
private List<String> images;
/** /**
* 数据是否隐藏0:未隐藏1:隐藏) * 数据是否隐藏0:未隐藏1:隐藏)

View File

@@ -0,0 +1,135 @@
package com.starry.admin.modules.order.module.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
/**
* 订单查询返回对象
*
* @author admin
* @since 2024-03-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class PlayOrderDetailsReturnVo {
private String id;
/**
* 用户ID
*/
private String customId;
/**
* 用户昵称
*/
private String customNickname;
/**
* 用户头像
*/
private String customAvatar;
/**
* 店员ID
*/
private String clerkId;
/**
* 店员昵称
*/
private String clerkNickname;
/**
* 店员头像
*/
private String clerkAvatar;
/**
* 下单时间
*/
private Date purchaserTime;
/**
* 订单金额
*/
private BigDecimal orderMoney;
/**
* 订单最终金额
*/
private BigDecimal finalAmount;
/**
* 商品ID
*/
private String commodityId;
/**
* 商品类型[0:礼物1服务]
*/
private String commodityType;
/**
* 商品类型[0:礼物1服务]
*/
private String commodityName;
/**
* 商品单价
*/
private BigDecimal commodityPrice;
/**
* 服务市场
*
* @since 2024/5/8 16:44
**/
private String serviceDuration;
/**
* 商品数量
*/
private int commodityNumber;
/**
* 订单状态【0:1:2:3:4】
* 0已下单待接单
* 1已接单待开始
* 2已开始服务中
* 3已完成
* 4已取消
*/
private String orderStatus;
/**
* 下单类型0指定单1随机单。2打赏单
*/
private String placeType;
/**
* 微信号码
*/
private String weiChatCode;
/**
* 支付方式0余额支付,1:微信支付,2:支付宝支付
*/
private String payMethod;
/**
* 订单备注
*/
private String remark;
}

View File

@@ -3,10 +3,7 @@ package com.starry.admin.modules.order.service;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity; import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity;
import com.starry.admin.modules.order.module.vo.PlayOrderInfoQueryVo; import com.starry.admin.modules.order.module.vo.*;
import com.starry.admin.modules.order.module.vo.PlayOrderInfoReturnVo;
import com.starry.admin.modules.order.module.vo.PlayOrderRewardQueryVo;
import com.starry.admin.modules.order.module.vo.PlayOrderRewardReturnVo;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -84,6 +81,14 @@ public interface IPlayOrderInfoService extends IService<PlayOrderInfoEntity> {
*/ */
IPage<PlayOrderRewardReturnVo> selectRewardOrderInfoByPage(PlayOrderRewardQueryVo vo); IPage<PlayOrderRewardReturnVo> selectRewardOrderInfoByPage(PlayOrderRewardQueryVo vo);
/**
* 根据订单ID查询订单信息
*
* @param orderId 订单ID
* @return 订单信息
*/
PlayOrderDetailsReturnVo selectById(String orderId);
/** /**
* 查询订单 * 查询订单
* *
@@ -137,7 +142,7 @@ public interface IPlayOrderInfoService extends IService<PlayOrderInfoEntity> {
* 顾客取消订单 * 顾客取消订单
* *
* @param orderId 订单ID * @param orderId 订单ID
* @author 杭州世平信息科技有限公司-xuhq * @author admin
* @since 2024/5/8 16:56 * @since 2024/5/8 16:56
**/ **/
void customCancellationOrder(String orderId); void customCancellationOrder(String orderId);

View File

@@ -7,12 +7,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.starry.admin.common.exception.CustomException;
import com.starry.admin.modules.clerk.module.entity.PlayClerkUserInfoEntity; import com.starry.admin.modules.clerk.module.entity.PlayClerkUserInfoEntity;
import com.starry.admin.modules.commodity.module.entity.PlayClerkServiceEntity;
import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity;
import com.starry.admin.modules.order.mapper.PlayOrderComplaintInfoMapper; import com.starry.admin.modules.order.mapper.PlayOrderComplaintInfoMapper;
import com.starry.admin.modules.order.module.entity.PlayOrderComplaintInfoEntity; import com.starry.admin.modules.order.module.entity.PlayOrderComplaintInfoEntity;
import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity;
import com.starry.admin.modules.order.module.vo.PlayOrderComplaintQueryVo; import com.starry.admin.modules.order.module.vo.PlayOrderComplaintQueryVo;
import com.starry.admin.modules.order.module.vo.PlayOrderComplaintReturnVo; import com.starry.admin.modules.order.module.vo.PlayOrderComplaintReturnVo;
import com.starry.admin.modules.order.service.IPlayOrderComplaintInfoService; import com.starry.admin.modules.order.service.IPlayOrderComplaintInfoService;
@@ -80,12 +79,31 @@ public class PlayOrderComplaintInfoServiceImpl extends ServiceImpl<PlayOrderComp
*/ */
@Override @Override
public boolean create(PlayOrderComplaintInfoEntity playOrderComplaintInfo) { public boolean create(PlayOrderComplaintInfoEntity playOrderComplaintInfo) {
if (allowComplaint(playOrderComplaintInfo.getCustomId(), playOrderComplaintInfo.getOrderId())) {
throw new CustomException("一个订单只能投诉一次");
}
if (StrUtil.isBlankIfStr(playOrderComplaintInfo.getId())) { if (StrUtil.isBlankIfStr(playOrderComplaintInfo.getId())) {
playOrderComplaintInfo.setId(IdUtil.fastSimpleUUID()); playOrderComplaintInfo.setId(IdUtil.fastSimpleUUID());
} }
return save(playOrderComplaintInfo); return save(playOrderComplaintInfo);
} }
/**
* 当前订单是否已投诉
*
* @param customerId 顾客ID
* @param orderId 订单ID
* @return true:订单已评价false:订单未评价
*/
public boolean allowComplaint(String customerId, String orderId) {
LambdaQueryWrapper<PlayOrderComplaintInfoEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(PlayOrderComplaintInfoEntity::getCustomId, customerId);
lambdaQueryWrapper.eq(PlayOrderComplaintInfoEntity::getOrderId, orderId);
return this.baseMapper.selectOne(lambdaQueryWrapper) != null;
}
/** /**
* 修改订单投诉信息 * 修改订单投诉信息
* *

View File

@@ -7,10 +7,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.starry.admin.common.exception.CustomException;
import com.starry.admin.modules.clerk.module.entity.PlayClerkUserInfoEntity; import com.starry.admin.modules.clerk.module.entity.PlayClerkUserInfoEntity;
import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity;
import com.starry.admin.modules.order.mapper.PlayOrderEvaluateInfoMapper; import com.starry.admin.modules.order.mapper.PlayOrderEvaluateInfoMapper;
import com.starry.admin.modules.order.module.entity.PlayOrderComplaintInfoEntity;
import com.starry.admin.modules.order.module.entity.PlayOrderEvaluateInfoEntity; import com.starry.admin.modules.order.module.entity.PlayOrderEvaluateInfoEntity;
import com.starry.admin.modules.order.module.vo.PlayOrderEvaluateQueryVo; import com.starry.admin.modules.order.module.vo.PlayOrderEvaluateQueryVo;
import com.starry.admin.modules.order.module.vo.PlayOrderEvaluateReturnVo; import com.starry.admin.modules.order.module.vo.PlayOrderEvaluateReturnVo;
@@ -39,6 +39,10 @@ public class PlayOrderEvaluateInfoServiceImpl extends ServiceImpl<PlayOrderEvalu
*/ */
@Override @Override
public PlayOrderEvaluateInfoEntity selectPlayOrderEvaluateInfoById(String id) { public PlayOrderEvaluateInfoEntity selectPlayOrderEvaluateInfoById(String id) {
PlayOrderEvaluateInfoEntity entity = this.baseMapper.selectById(id);
if (entity == null) {
throw new CustomException("评价信息不存在");
}
return this.baseMapper.selectById(id); return this.baseMapper.selectById(id);
} }
@@ -73,17 +77,36 @@ public class PlayOrderEvaluateInfoServiceImpl extends ServiceImpl<PlayOrderEvalu
/** /**
* 新增订单评价信息 * 新增订单评价信息
* *
*
* @param playOrderEvaluateInfo 订单评价信息 * @param playOrderEvaluateInfo 订单评价信息
* @return 结果 * @return 结果
*/ */
@Override @Override
public boolean create(PlayOrderEvaluateInfoEntity playOrderEvaluateInfo) { public boolean create(PlayOrderEvaluateInfoEntity playOrderEvaluateInfo) {
if (allowComplaint(playOrderEvaluateInfo.getCustomId(), playOrderEvaluateInfo.getOrderId())) {
throw new CustomException("一个订单只能评价一次");
}
if (StrUtil.isBlankIfStr(playOrderEvaluateInfo.getId())) { if (StrUtil.isBlankIfStr(playOrderEvaluateInfo.getId())) {
playOrderEvaluateInfo.setId(IdUtil.fastSimpleUUID()); playOrderEvaluateInfo.setId(IdUtil.fastSimpleUUID());
} }
return save(playOrderEvaluateInfo); return save(playOrderEvaluateInfo);
} }
/**
* 当前订单是否已评价
*
* @param customerId 顾客ID
* @param orderId 订单ID
* @return true:订单已评价false:订单未评价
*/
public boolean allowComplaint(String customerId, String orderId) {
LambdaQueryWrapper<PlayOrderEvaluateInfoEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(PlayOrderEvaluateInfoEntity::getCustomId, customerId);
lambdaQueryWrapper.eq(PlayOrderEvaluateInfoEntity::getOrderId, orderId);
return this.baseMapper.selectOne(lambdaQueryWrapper) != null;
}
/** /**
* 修改订单评价信息 * 修改订单评价信息
* *

View File

@@ -14,10 +14,7 @@ import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity;
import com.starry.admin.modules.order.mapper.PlayOrderInfoMapper; import com.starry.admin.modules.order.mapper.PlayOrderInfoMapper;
import com.starry.admin.modules.order.module.constant.OrderConstant; import com.starry.admin.modules.order.module.constant.OrderConstant;
import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity; import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity;
import com.starry.admin.modules.order.module.vo.PlayOrderInfoQueryVo; import com.starry.admin.modules.order.module.vo.*;
import com.starry.admin.modules.order.module.vo.PlayOrderInfoReturnVo;
import com.starry.admin.modules.order.module.vo.PlayOrderRewardQueryVo;
import com.starry.admin.modules.order.module.vo.PlayOrderRewardReturnVo;
import com.starry.admin.modules.order.service.IPlayOrderInfoService; import com.starry.admin.modules.order.service.IPlayOrderInfoService;
import com.starry.common.utils.StringUtils; import com.starry.common.utils.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -152,6 +149,7 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
} }
/** /**
* 查询订单 * 查询订单
* *
@@ -167,6 +165,24 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
return entity; return entity;
} }
@Override
public PlayOrderDetailsReturnVo selectById(String orderId) {
MPJLambdaWrapper<PlayOrderInfoEntity> lambdaQueryWrapper = new MPJLambdaWrapper<PlayOrderInfoEntity>()
// 查询主表全部字段
.selectAll(PlayOrderInfoEntity.class)
// 查询顾客表
.selectAs(PlayCustomUserInfoEntity::getId, "customUserId").selectAs(PlayCustomUserInfoEntity::getAvatar, "customAvatar").selectAs(PlayCustomUserInfoEntity::getNickname, "customUserNickname")
// 查询陪聊表
.selectAs(PlayClerkUserInfoEntity::getId, "clerkUserId").selectAs(PlayClerkUserInfoEntity::getAvatar, "clerkUserAvatar").selectAs(PlayClerkUserInfoEntity::getNickname, "clerkUserNickname")
// 子表
.leftJoin(PlayCustomUserInfoEntity.class, PlayCustomUserInfoEntity::getId, PlayOrderInfoEntity::getPurchaserBy).leftJoin(PlayClerkUserInfoEntity.class, PlayClerkUserInfoEntity::getId, PlayOrderInfoEntity::getAcceptBy);
lambdaQueryWrapper.eq(PlayOrderInfoEntity::getPlaceType, "2");
lambdaQueryWrapper.orderByDesc(PlayOrderInfoEntity::getPurchaserTime);
return this.baseMapper.selectJoinOne(PlayOrderDetailsReturnVo.class, lambdaQueryWrapper);
}
/** /**
* 分页查询订单信息 * 分页查询订单信息
* *
@@ -185,7 +201,6 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
.selectAs(PlayClerkUserInfoEntity::getId, "clerkUserId").selectAs(PlayClerkUserInfoEntity::getAvatar, "clerkUserAvatar").selectAs(PlayClerkUserInfoEntity::getNickname, "clerkUserNickname") .selectAs(PlayClerkUserInfoEntity::getId, "clerkUserId").selectAs(PlayClerkUserInfoEntity::getAvatar, "clerkUserAvatar").selectAs(PlayClerkUserInfoEntity::getNickname, "clerkUserNickname")
// 商品表 // 商品表
.selectAs(PlayClerkCommodityEntity::getId, "commodityId").selectAs(PlayClerkCommodityEntity::getCommodityName, "commodityName").selectAs(PlayClerkCommodityEntity::getServiceDuration, "serviceDuration") .selectAs(PlayClerkCommodityEntity::getId, "commodityId").selectAs(PlayClerkCommodityEntity::getCommodityName, "commodityName").selectAs(PlayClerkCommodityEntity::getServiceDuration, "serviceDuration")
// 子表-顾客表 // 子表-顾客表
.leftJoin(PlayCustomUserInfoEntity.class, PlayCustomUserInfoEntity::getId, PlayOrderInfoEntity::getPurchaserBy) .leftJoin(PlayCustomUserInfoEntity.class, PlayCustomUserInfoEntity::getId, PlayOrderInfoEntity::getPurchaserBy)
// 子表-店员表 // 子表-店员表

View File

@@ -1,6 +1,7 @@
package com.starry.admin.modules.weichat.controller; package com.starry.admin.modules.weichat.controller;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.starry.admin.common.aspect.CustomUserLogin; import com.starry.admin.common.aspect.CustomUserLogin;
import com.starry.admin.common.conf.ThreadLocalRequestDetail; import com.starry.admin.common.conf.ThreadLocalRequestDetail;
@@ -11,14 +12,21 @@ import com.starry.admin.modules.clerk.module.entity.PlayClerkUserInfoEntity;
import com.starry.admin.modules.clerk.module.entity.PlayClerkUserListResultVo; import com.starry.admin.modules.clerk.module.entity.PlayClerkUserListResultVo;
import com.starry.admin.modules.clerk.service.IPlayClerkCommodityService; import com.starry.admin.modules.clerk.service.IPlayClerkCommodityService;
import com.starry.admin.modules.clerk.service.IPlayClerkUserInfoService; import com.starry.admin.modules.clerk.service.IPlayClerkUserInfoService;
import com.starry.admin.modules.custom.module.entity.PlayCustomLeaveMsgEntity;
import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity;
import com.starry.admin.modules.custom.service.IPlayCustomLeaveMsgService;
import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService;
import com.starry.admin.modules.follow.service.IPlayCustomFollowInfoService; import com.starry.admin.modules.follow.service.IPlayCustomFollowInfoService;
import com.starry.admin.modules.gift.module.entity.PlayGiftInfoEntity; import com.starry.admin.modules.gift.module.entity.PlayGiftInfoEntity;
import com.starry.admin.modules.gift.service.IPlayGiftInfoService; import com.starry.admin.modules.gift.service.IPlayGiftInfoService;
import com.starry.admin.modules.order.module.entity.PlayOrderComplaintInfoEntity;
import com.starry.admin.modules.order.module.entity.PlayOrderEvaluateInfoEntity;
import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity; import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity;
import com.starry.admin.modules.order.module.vo.PlayOrderDetailsReturnVo;
import com.starry.admin.modules.order.module.vo.PlayOrderInfoQueryVo; import com.starry.admin.modules.order.module.vo.PlayOrderInfoQueryVo;
import com.starry.admin.modules.order.module.vo.PlayOrderInfoReturnVo; import com.starry.admin.modules.order.module.vo.PlayOrderInfoReturnVo;
import com.starry.admin.modules.order.service.IPlayOrderComplaintInfoService;
import com.starry.admin.modules.order.service.IPlayOrderEvaluateInfoService;
import com.starry.admin.modules.order.service.IPlayOrderInfoService; import com.starry.admin.modules.order.service.IPlayOrderInfoService;
import com.starry.admin.modules.weichat.entity.*; import com.starry.admin.modules.weichat.entity.*;
import com.starry.admin.modules.weichat.service.WxCustomUserService; import com.starry.admin.modules.weichat.service.WxCustomUserService;
@@ -32,6 +40,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
/** /**
* @author admin * @author admin
@@ -66,7 +75,16 @@ public class WxCustomController {
private WxCustomUserService customUserService; private WxCustomUserService customUserService;
@Resource @Resource
private IPlayOrderInfoService orderInfoService; private IPlayOrderInfoService playOrderInfoService;
@Resource
private IPlayCustomLeaveMsgService playCustomLeaveMsgService;
@Resource
private IPlayOrderComplaintInfoService playOrderComplaintInfoService;
@Resource
private IPlayOrderEvaluateInfoService playOrderEvaluateInfoService;
/** /**
* 根据店员ID查询店员详细信息 * 根据店员ID查询店员详细信息
@@ -115,7 +133,7 @@ public class WxCustomController {
throw new CustomException("余额不足"); throw new CustomException("余额不足");
} }
// 记录订单信息 // 记录订单信息
orderInfoService.createRewardOrder(new BigDecimal(vo.getMoney()), new BigDecimal(vo.getMoney()), userId); playOrderInfoService.createRewardOrder(new BigDecimal(vo.getMoney()), new BigDecimal(vo.getMoney()), userId);
// 顾客减少余额 // 顾客减少余额
customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance().subtract(new BigDecimal(vo.getMoney()))); customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance().subtract(new BigDecimal(vo.getMoney())));
playBalanceDetailsInfoService.create("0", customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().subtract(new BigDecimal(vo.getMoney())), "打赏", new BigDecimal(vo.getMoney()).multiply(new BigDecimal("-1"))); playBalanceDetailsInfoService.create("0", customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().subtract(new BigDecimal(vo.getMoney())), "打赏", new BigDecimal(vo.getMoney()).multiply(new BigDecimal("-1")));
@@ -141,7 +159,7 @@ public class WxCustomController {
throw new CustomException("账号余额不足"); throw new CustomException("账号余额不足");
} }
// 记录订单信息 // 记录订单信息
orderInfoService.createGiftOrder(vo.getGiftId(), giftInfo.getPrice(), vo.getGiftQuantity(), money, money, userId); playOrderInfoService.createGiftOrder(vo.getGiftId(), giftInfo.getPrice(), vo.getGiftQuantity(), money, money, userId);
// 顾客减少余额 // 顾客减少余额
customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance().subtract(money)); customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance().subtract(money));
playBalanceDetailsInfoService.create("0", customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().subtract(money), "赠送礼物", money.multiply(new BigDecimal("-1"))); playBalanceDetailsInfoService.create("0", customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().subtract(money), "赠送礼物", money.multiply(new BigDecimal("-1")));
@@ -157,7 +175,7 @@ public class WxCustomController {
* *
* @param vo 指定订单查询对象 * @param vo 指定订单查询对象
* @return com.starry.common.result.R * @return com.starry.common.result.R
* @author 杭州世平信息科技有限公司-xuhq * @author admin
* @since 2024/5/8 16:31 * @since 2024/5/8 16:31
**/ **/
@CustomUserLogin @CustomUserLogin
@@ -174,7 +192,7 @@ public class WxCustomController {
throw new CustomException("余额不足"); throw new CustomException("余额不足");
} }
// 记录订单信息 // 记录订单信息
orderInfoService.createOrdinaryOrder("2", "0", clerkCommodity.getCommodityId(), clerkCommodity.getCommodityPrice(), vo.getCommodityQuantity(), money, money, customId); playOrderInfoService.createOrdinaryOrder("2", "0", clerkCommodity.getCommodityId(), clerkCommodity.getCommodityPrice(), vo.getCommodityQuantity(), money, money, customId);
// 顾客减少余额 // 顾客减少余额
customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance().subtract(money)); customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance().subtract(money));
playBalanceDetailsInfoService.create("0", customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().subtract(money), "打赏", money.multiply(new BigDecimal("-1"))); playBalanceDetailsInfoService.create("0", customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().subtract(money), "打赏", money.multiply(new BigDecimal("-1")));
@@ -197,7 +215,7 @@ public class WxCustomController {
* *
* @param vo 订单列表分页查询对象 * @param vo 订单列表分页查询对象
* @return com.starry.common.result.R * @return com.starry.common.result.R
* @author 杭州世平信息科技有限公司-xuhq * @author admin
* @since 2024/5/8 15:57 * @since 2024/5/8 15:57
**/ **/
@CustomUserLogin @CustomUserLogin
@@ -205,7 +223,7 @@ public class WxCustomController {
public R queryOrderByPage(@Validated @RequestBody PlayOrderInfoQueryVo vo) { public R queryOrderByPage(@Validated @RequestBody PlayOrderInfoQueryVo vo) {
vo.setPurchaserBy(ThreadLocalRequestDetail.getCustomUserInfo().getId()); vo.setPurchaserBy(ThreadLocalRequestDetail.getCustomUserInfo().getId());
vo.setOrderType("2"); vo.setOrderType("2");
IPage<PlayOrderInfoReturnVo> iPage = orderInfoService.selectOrderInfoPage(vo); IPage<PlayOrderInfoReturnVo> iPage = playOrderInfoService.selectOrderInfoPage(vo);
return R.ok(iPage); return R.ok(iPage);
} }
@@ -214,13 +232,13 @@ public class WxCustomController {
* *
* @param id 订单ID * @param id 订单ID
* @return com.starry.common.result.R * @return com.starry.common.result.R
* @author 杭州世平信息科技有限公司-xuhq * @author admin
* @since 2024/5/8 15:57 * @since 2024/5/8 15:57
**/ **/
@CustomUserLogin @CustomUserLogin
@GetMapping("/order/queryById") @GetMapping("/order/queryById")
public R queryById(@RequestParam("id") String id) { public R queryById(@RequestParam("id") String id) {
PlayOrderInfoEntity orderInfo = orderInfoService.selectOrderInfoById(id); PlayOrderDetailsReturnVo orderInfo = playOrderInfoService.selectById(id);
return R.ok(orderInfo); return R.ok(orderInfo);
} }
@@ -229,22 +247,119 @@ public class WxCustomController {
* *
* @param id 订单ID * @param id 订单ID
* @return com.starry.common.result.R * @return com.starry.common.result.R
* @author 杭州世平信息科技有限公司-xuhq * @author admin
* @since 2024/5/8 15:57 * @since 2024/5/8 15:57
**/ **/
@CustomUserLogin @CustomUserLogin
@GetMapping("/order/cancellation") @GetMapping("/order/cancellation")
public R cancellationOrder(@RequestParam("id") String id) { public R cancellationOrder(@RequestParam("id") String id) {
orderInfoService.customCancellationOrder(id); playOrderInfoService.customCancellationOrder(id);
return R.ok("取消成功"); return R.ok("取消成功");
} }
/**
* 新增订单评价信息
*
* @param vo 订单评价信息实体
* @return com.starry.common.result.R
* @author admin
* @since 2024/5/8 15:57
**/
@CustomUserLogin
@PostMapping("/order/evaluate/add")
public R addOrderEvaluate(@Validated @RequestBody PlayOrderEvaluateAddVo vo) {
vo.setCustomId(ThreadLocalRequestDetail.getCustomUserInfo().getId());
PlayOrderInfoEntity orderInfo = playOrderInfoService.selectOrderInfoById(vo.getOrderId());
if (!orderInfo.getPurchaserBy().equals(vo.getCustomId())) {
throw new CustomException("只有下单人才能评价");
}
PlayOrderEvaluateInfoEntity entity = ConvertUtil.entityToVo(vo, PlayOrderEvaluateInfoEntity.class);
playOrderEvaluateInfoService.create(entity);
return R.ok("评价成功");
}
/**
* 新增订单投诉信息
*
* @param vo 订单评价信息实体
* @return com.starry.common.result.R
* @author admin
* @since 2024/5/8 15:57
**/
@CustomUserLogin
@PostMapping("/order/complaint/add")
public R addOrderComplaint(@Validated @RequestBody PlayOrderComplaintAddVo vo) {
vo.setCustomId(ThreadLocalRequestDetail.getCustomUserInfo().getId());
PlayOrderInfoEntity orderInfo = playOrderInfoService.selectOrderInfoById(vo.getOrderId());
if (!orderInfo.getPurchaserBy().equals(vo.getCustomId())) {
throw new CustomException("只有下单人才能投诉");
}
PlayOrderComplaintInfoEntity entity = ConvertUtil.entityToVo(vo, PlayOrderComplaintInfoEntity.class);
playOrderComplaintInfoService.create(entity);
return R.ok("新增成功");
}
/**
* 顾客新增留言
*
* @param vo 顾客新增留言对象
* @return com.starry.common.result.R
* @author admin
* @since 2024/5/8 15:57
**/
@CustomUserLogin
@PostMapping("/leave/add")
public R cancellationOrder(@Validated @RequestBody PlayCustomLeaveAddVo vo) {
vo.setCustomId(ThreadLocalRequestDetail.getCustomUserInfo().getId());
PlayCustomLeaveMsgEntity entity = ConvertUtil.entityToVo(vo, PlayCustomLeaveMsgEntity.class);
entity.setMsgTime(new Date());
playCustomLeaveMsgService.create(entity);
return R.ok("取消成功");
}
/**
* 查询当前顾客是否允许留言
*
* @return com.starry.common.result.R
* @author admin
* @since 2024/5/8 15:57
**/
@CustomUserLogin
@GetMapping("/leave/queryPermission")
public R queryLeavePermission() {
// 不允许留言的原因,如果原因为空,说明允许留言
String noMessagesAllowedReason = playCustomLeaveMsgService.queryNoMessagesAllowedReason(ThreadLocalRequestDetail.getCustomUserInfo().getId());
if (StringUtils.isEmpty(noMessagesAllowedReason)) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("permission", true);
jsonObject.put("msg", "");
return R.ok(jsonObject);
} else {
JSONObject jsonObject = new JSONObject();
jsonObject.put("permission", false);
jsonObject.put("msg", noMessagesAllowedReason);
return R.ok(jsonObject);
}
}
/** /**
* 顾客修改对陪玩的关注状态 * 顾客修改对陪玩的关注状态
* *
* @param vo 陪玩的关注状态对象 * @param vo 陪玩的关注状态对象
* @return com.starry.common.result.R * @return com.starry.common.result.R
* @author 杭州世平信息科技有限公司-xuhq * @author admin
* @since 2024/5/8 15:57 * @since 2024/5/8 15:57
**/ **/
@CustomUserLogin @CustomUserLogin

View File

@@ -54,7 +54,7 @@ public class WxPlayController {
/** /**
* 微信支付-微信回调地址https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7&index=8 * 微信支付-微信回调地址https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7&index=8
* *
* @author 杭州世平信息科技有限公司-xuhq * @author admin
* @since 2024/5/8 11:25 * @since 2024/5/8 11:25
**/ **/
@GetMapping("/jsCallback") @GetMapping("/jsCallback")
@@ -74,15 +74,15 @@ public class WxPlayController {
log.error("*********未查询到对应的支付记录,订单号:{}", outTradeNo); log.error("*********未查询到对应的支付记录,订单号:{}", outTradeNo);
return; return;
} }
// TODO如果支付状态不是待支付 // // TODO如果支付状态不是待支付
if (!orderInfoEntity.getOrderStatus().equals(RepairStatusEnum.NOT_PAY.name())) { // if (!orderInfoEntity.getOrderStatus().equals(RepairStatusEnum.NOT_PAY.name())) {
log.error("*********支付记录状态异常,支付记录:{}", JSONObject.toJSONString(repair)); // log.error("*********支付记录状态异常,支付记录:{}", JSONObject.toJSONString(repair));
return; // return;
} // }
Date nowDate = new Date(); // Date nowDate = new Date();
repair.setPaySuccessTime(nowDate); // repair.setPaySuccessTime(nowDate);
repair.setPayStatus(RepairStatusEnum.PAID.name()); // repair.setPayStatus(RepairStatusEnum.PAID.name());
repair.setStatus(RepairStatusEnum.REPAIRING.name()); // repair.setStatus(RepairStatusEnum.REPAIRING.name());
orderInfoService.updateById(orderInfoEntity); orderInfoService.updateById(orderInfoEntity);
log.info("*********支付处理完成"); log.info("*********支付处理完成");
@@ -134,8 +134,8 @@ public class WxPlayController {
PlayCustomUserInfoEntity customUserInfo = customUserInfoService.selectById(ThreadLocalRequestDetail.getCustomUserInfo().getId()); PlayCustomUserInfoEntity customUserInfo = customUserInfoService.selectById(ThreadLocalRequestDetail.getCustomUserInfo().getId());
// 租户信息 // 租户信息
SysTenantEntity entity = tenantService.selectSysTenantByTenantId(tenantId); SysTenantEntity entity = tenantService.selectSysTenantByTenantId(tenantId);
// 订单总金额,单位为分开发阶段固定设置为支付1分钱 // 订单总金额,单位为分
long totalFee = 1; long totalFee = getTotalFee(money);
// 创建订单信息 // 创建订单信息
String orderId = IdUtil.fastSimpleUUID(); String orderId = IdUtil.fastSimpleUUID();
orderInfoService.createRechargeOrder(orderId, new BigDecimal(totalFee * 1.0 / 100), new BigDecimal(totalFee * 1.0 / 100), customUserInfo.getId()); orderInfoService.createRechargeOrder(orderId, new BigDecimal(totalFee * 1.0 / 100), new BigDecimal(totalFee * 1.0 / 100), customUserInfo.getId());
@@ -184,7 +184,7 @@ public class WxPlayController {
public long getTotalFee(String money) { public long getTotalFee(String money) {
long totalFee; long totalFee;
try { try {
totalFee = (long) Float.parseFloat(money) * 100; totalFee = (long) (Float.parseFloat(money) * 100);
} catch (Exception e) { } catch (Exception e) {
throw new CustomException("请求参数错误,money类型异常"); throw new CustomException("请求参数错误,money类型异常");
} }

View File

@@ -0,0 +1,44 @@
package com.starry.admin.modules.weichat.entity;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
/**
* 顾客新增留言对象
*
* @author admin
* @since 2024/5/8 下午10:03
**/
@Data
public class PlayCustomLeaveAddVo {
/**
* 顾客ID
*/
private String customId;
/**
* 留言内容
*/
@NotBlank(message = "留言内容不能为空")
@Length(max = 255, message = "留言内容不能超过255个字符")
private String content;
/**
* 图片
*/
@NotNull(message = "images不能为空")
@Size(max = 3, message = "照片不能超过3张")
private List<String> images;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,52 @@
package com.starry.admin.modules.weichat.entity;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import java.util.Date;
import java.util.List;
/**
* 订单投诉新增VO
*
* @author admin
* @since 2024/5/8 下午10:49
**/
@Data
public class PlayOrderComplaintAddVo {
/**
* 订单ID
*/
@NotBlank(message = "订单ID不能为空")
private String orderId;
/**
* 顾客ID
*/
private String customId;
/**
* 投诉人微信号码
*/
@NotBlank(message = "微信号码不能为空")
private String wxChatCode;
/**
* 投诉内容
*/
@NotBlank(message = "投诉内容不能为空")
@Length(max = 255, message = "投诉内容最多255个字符")
private String complaintCon;
/**
* 投诉时间
*/
private Date complaintTime = new Date();
/**
* 图片列表
*/
private List<String> images;
}

View File

@@ -0,0 +1,60 @@
package com.starry.admin.modules.weichat.entity;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;
import java.util.Date;
/**
* 订单评价新增VO
*
* @author admin
* @since 2024/5/8 下午10:49
**/
@Data
public class PlayOrderEvaluateAddVo {
/**
* 订单ID
*/
@NotBlank(message = "订单ID不能为空")
private String orderId;
/**
* 顾客ID
*/
private String customId;
/**
* 匿名评价(0:匿名1:非匿名)
*/
@NotBlank(message = "是否匿名不能为空")
@Pattern(regexp = "[01]", message = "匿名评价只能位0或1")
private String anonymous;
/**
* 评价类型(0:好评1差评)
*/
private String evaluateType = "0";
/**
* 评价等级【1-5星最低1星最高5星】
*/
@NotNull(message = "评价等级不能为空")
@Min(value = 1, message = "评价等级最低位1星")
@Max(value = 5, message = "评价等级最高5星")
private int evaluateLevel;
/**
* 评价内容
*/
@NotNull(message = "评价内容不能为空")
@Length(max = 255, message = "评价内容最多255个字符")
private String evaluateCon;
/**
* 评价时间
*/
private Date evaluateTime = new Date();
}

View File

@@ -5,7 +5,7 @@ import lombok.Data;
/** /**
* 微信预支付接口返回信息 * 微信预支付接口返回信息
* *
* @author 杭州世平信息科技有限公司-xuhq * @author admin
* @since 2024/5/8 10:43 * @since 2024/5/8 10:43
**/ **/
@Data @Data

View File

@@ -17,6 +17,9 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
/**
* @author admin
*/
@Slf4j @Slf4j
@Service @Service
public class WxCustomMpService { public class WxCustomMpService {
@@ -53,7 +56,9 @@ public class WxCustomMpService {
if (entity == null) { if (entity == null) {
throw new CustomException("系统错误,租户ID不能为空"); throw new CustomException("系统错误,租户ID不能为空");
} }
if (StringUtils.isEmpty(entity.getMchId())) throw new CustomException("商户号不能为空,请联系平台方进行配置"); if (StringUtils.isEmpty(entity.getMchId())) {
throw new CustomException("商户号不能为空,请联系平台方进行配置");
}
WxPayConfig payConfig = new WxPayConfig(); WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(StringUtils.trimToNull(entity.getAppId())); payConfig.setAppId(StringUtils.trimToNull(entity.getAppId()));
payConfig.setMchId(StringUtils.trimToNull(entity.getMchId())); payConfig.setMchId(StringUtils.trimToNull(entity.getMchId()));