feat:订餐人灵活控制

This commit is contained in:
dzc committed 2026-07-22 19:15:54 +08:00
1 parent e2d28b5d53
commit cce873b1c6
4 files changed
+36 -8

No files matched your search

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.admin.api.dto.UserInfo;
import com.bsd.pjcloud.admin.api.constant.user.UserRelationTypeEnum;
import com.bsd.pjcloud.admin.api.entity.SysDept;
import com.bsd.pjcloud.admin.api.entity.SysUser;
import com.bsd.pjcloud.admin.api.feign.RemoteDeptService;
@@ -107,6 +108,7 @@ import com.bsd.pjcloud.wallet.api.dto.act.ActComCancelDto;
import com.bsd.pjcloud.wallet.api.entity.WalletCodeUseEntity;
import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity;
import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity;
import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity;
import com.bsd.pjcloud.wallet.api.feign.*;
import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil;
import com.bsd.pjcloud.wallet.api.vo.MchManageVo;
@@ -939,6 +941,7 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
if (!Objects.equals(merchant.getTypes(), MerchantTypeEnum.CANTEEN.getType())) {
throw new RuntimeException("购物车商户不是食堂商户");
}
validateMerchantReserveDinerPermissions(payerUserId, dinerUserIds, merchant);
WalletManageEntity wallet = Optional.ofNullable(remoteWalletService.getWallet(payerUserId, WalletTypeEnum.EAT)).map(R::getData).orElseThrow(() -> new RuntimeException("用户钱包不存在"));
if (!Objects.equals(wallet.getUserId(), payerUserId)) {
throw new RuntimeException("钱包不属于当前付款人");
@@ -1051,6 +1054,20 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
return new ArrayList<>(distinctIds);
}
/**
* 商户未配置监护关系时只能为付款人本人订餐,服务端必须再次校验以防绕过 App 限制。
*/
private void validateMerchantReserveDinerPermissions(Long payerUserId, List<Long> dinerUserIds, MchManageVo merchant) {
boolean containsProxyDiner = dinerUserIds.stream().anyMatch(id -> !Objects.equals(id, payerUserId));
if (!containsProxyDiner) {
return;
}
MchManageEntity.TableReservationConf conf = merchant.getTableReservationConf();
if (conf == null || ObjectUtil.isEmpty(conf.getUserRelationTypeIdList()) || !conf.getUserRelationTypeIdList().contains(UserRelationTypeEnum.GUARDIAN_WARD.getRelationCode())) {
throw new RuntimeException("当前商户未开启监护关系代订餐");
}
}
/**
* 多人复制购物车前先拒绝缺少商品、数量或金额的异常明细,避免在库存汇总阶段出现半途失败。
*/
@@ -242,9 +242,9 @@ public class MchManageEntity extends Model<MchManageEntity> {
private Boolean singleProductOnlyInCart = false;
/**
* 为什么的`用户关系类型`代订餐(一般是监护人为被监护人代订餐)
* 允许代订餐的用户关系编码,对应 sys_user_relation_type 字典和 UserRelationTypeEnum。
*/
private List<Long> userRelationTypeIdList;
private List<String> userRelationTypeIdList;
}
@Data
@@ -76,4 +76,4 @@ public interface MchManageService extends IService<MchManageEntity> {
* 判断用户是否能查看到所有食堂
*/
boolean getIsConsumeUser(Long id);
}
}
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.admin.api.dto.UserInfo;
import com.bsd.pjcloud.admin.api.constant.user.UserRelationTypeEnum;
import com.bsd.pjcloud.admin.api.entity.SysDept;
import com.bsd.pjcloud.admin.api.feign.RemoteDeptService;
import com.bsd.pjcloud.admin.api.feign.RemoteFileService;
@@ -66,6 +67,7 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
@@ -189,13 +191,22 @@ public class MchManageServiceImpl extends ServiceImpl<MchManageMapper, MchManage
String reserveMode = conf.getReserveMode();
if (reserveMode == null || reserveMode.trim().isEmpty()) {
conf.setReserveMode("TIME_WINDOW");
return;
} else {
reserveMode = reserveMode.trim();
if (!"TIME_WINDOW".equals(reserveMode) && !"WEEKLY_CYCLE".equals(reserveMode)) {
throw new RuntimeException("预约时间模式无效");
}
conf.setReserveMode(reserveMode);
}
reserveMode = reserveMode.trim();
if (!"TIME_WINDOW".equals(reserveMode) && !"WEEKLY_CYCLE".equals(reserveMode)) {
throw new RuntimeException("预约时间模式无效");
// 配置保存枚举业务编码;历史数据库ID和无效值在再次保存时自动移除。
if (ObjectUtil.isNotEmpty(conf.getUserRelationTypeIdList())) {
conf.setUserRelationTypeIdList(conf.getUserRelationTypeIdList().stream()
.filter(Objects::nonNull)
.map(String::trim)
.filter(code -> UserRelationTypeEnum.valueOfByType(code) != null)
.distinct()
.toList());
}
conf.setReserveMode(reserveMode);
}
@CacheEvict(