|
|
@@ -135,18 +135,24 @@ public class StoreServiceFeeRuleServiceImpl implements StoreServiceFeeRuleServic
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public R<Integer> createRule(StoreServiceFeeRuleSaveDto dto) {
|
|
|
+ public R<List<Integer>> createRule(StoreServiceFeeRuleSaveDto dto) {
|
|
|
log.info("StoreServiceFeeRuleServiceImpl.createRule?dto={}", dto);
|
|
|
String checkMsg = validateAndCheckConflict(dto, null);
|
|
|
if (checkMsg != null) {
|
|
|
return R.fail(checkMsg);
|
|
|
}
|
|
|
Integer userId = getCurrentUserId();
|
|
|
- StoreServiceFeeRule rule = new StoreServiceFeeRule();
|
|
|
- fillRuleFromDto(rule, dto, userId, false);
|
|
|
- ruleMapper.insert(rule);
|
|
|
- saveChildren(rule.getId(), dto, userId);
|
|
|
- return R.data(rule.getId());
|
|
|
+ // 以桌为主体,选择了几个桌就生成几条主表记录
|
|
|
+ List<Integer> createdIds = new ArrayList<>();
|
|
|
+ for (Integer tableId : dto.getTableIds()) {
|
|
|
+ StoreServiceFeeRule rule = new StoreServiceFeeRule();
|
|
|
+ fillRuleFromDto(rule, dto, userId, false);
|
|
|
+ ruleMapper.insert(rule);
|
|
|
+ // 为该条主表记录仅绑定当前桌台,并写入时段
|
|
|
+ saveChildrenForSingleTable(rule.getId(), dto, tableId, userId);
|
|
|
+ createdIds.add(rule.getId());
|
|
|
+ }
|
|
|
+ return R.data(createdIds);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -334,21 +340,60 @@ public class StoreServiceFeeRuleServiceImpl implements StoreServiceFeeRuleServic
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void saveChildrenForSingleTable(Integer ruleId, StoreServiceFeeRuleSaveDto dto, Integer tableId, Integer userId) {
|
|
|
+ StoreServiceFeeRuleTable row = new StoreServiceFeeRuleTable();
|
|
|
+ row.setRuleId(ruleId);
|
|
|
+ row.setStoreId(dto.getStoreId());
|
|
|
+ row.setTableId(tableId);
|
|
|
+ row.setCreatedUserId(userId);
|
|
|
+ row.setUpdatedUserId(userId);
|
|
|
+ ruleTableMapper.insert(row);
|
|
|
+
|
|
|
+ for (StoreServiceFeeRuleSlotDto slotDto : dto.getSlots()) {
|
|
|
+ StoreServiceFeeRuleSlot slot = new StoreServiceFeeRuleSlot();
|
|
|
+ slot.setRuleId(ruleId);
|
|
|
+ slot.setWeekdayMask(slotDto.getWeekdayMask());
|
|
|
+ slot.setStartTime(LocalTime.parse(slotDto.getStartTime(), TIME_FORMATTER));
|
|
|
+ slot.setEndTime(LocalTime.parse(slotDto.getEndTime(), TIME_FORMATTER));
|
|
|
+ slot.setCreatedUserId(userId);
|
|
|
+ slot.setUpdatedUserId(userId);
|
|
|
+ ruleSlotMapper.insert(slot);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private String validateAndCheckConflict(StoreServiceFeeRuleSaveDto dto, Integer excludeRuleId) {
|
|
|
String basicMsg = validateBasic(dto);
|
|
|
if (basicMsg != null) {
|
|
|
return basicMsg;
|
|
|
}
|
|
|
|
|
|
- // 名称校验(同店不可重复)
|
|
|
- LambdaQueryWrapper<StoreServiceFeeRule> nameWrapper = new LambdaQueryWrapper<>();
|
|
|
- nameWrapper.eq(StoreServiceFeeRule::getStoreId, dto.getStoreId())
|
|
|
- .eq(StoreServiceFeeRule::getFeeName, dto.getFeeName().trim());
|
|
|
- if (excludeRuleId != null) {
|
|
|
- nameWrapper.ne(StoreServiceFeeRule::getId, excludeRuleId);
|
|
|
- }
|
|
|
- if (ruleMapper.selectCount(nameWrapper) > 0) {
|
|
|
- return "服务费名称已存在";
|
|
|
+ // 名称校验(同桌台下不可重复;编辑时忽略本条)
|
|
|
+ List<Integer> tableIdsForNameCheck = dto.getTableIds() == null ? Collections.emptyList()
|
|
|
+ : dto.getTableIds().stream().distinct().collect(Collectors.toList());
|
|
|
+ if (!tableIdsForNameCheck.isEmpty()) {
|
|
|
+ List<StoreServiceFeeRuleTable> sameTableRelations = ruleTableMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<StoreServiceFeeRuleTable>()
|
|
|
+ .eq(StoreServiceFeeRuleTable::getStoreId, dto.getStoreId())
|
|
|
+ .in(StoreServiceFeeRuleTable::getTableId, tableIdsForNameCheck));
|
|
|
+ if (!sameTableRelations.isEmpty()) {
|
|
|
+ List<Integer> sameTableRuleIds = sameTableRelations.stream()
|
|
|
+ .map(StoreServiceFeeRuleTable::getRuleId)
|
|
|
+ .distinct()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (excludeRuleId != null) {
|
|
|
+ sameTableRuleIds = sameTableRuleIds.stream()
|
|
|
+ .filter(id -> !id.equals(excludeRuleId))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ if (!sameTableRuleIds.isEmpty()) {
|
|
|
+ LambdaQueryWrapper<StoreServiceFeeRule> sameTableNameWrapper = new LambdaQueryWrapper<>();
|
|
|
+ sameTableNameWrapper.in(StoreServiceFeeRule::getId, sameTableRuleIds)
|
|
|
+ .eq(StoreServiceFeeRule::getFeeName, dto.getFeeName().trim());
|
|
|
+ if (ruleMapper.selectCount(sameTableNameWrapper) > 0) {
|
|
|
+ return "同桌台下服务费名称已存在";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 状态为关闭时,仅做名称校验即可(不参与冲突检查)
|