package com.oying.modules.pc.store.service.impl;
|
|
import cn.hutool.core.util.ObjUtil;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.oying.exception.BadRequestException;
|
import com.oying.exception.EntityNotFoundException;
|
import com.oying.modules.pc.store.converter.StoreAssembler;
|
import com.oying.modules.pc.store.domain.Store;
|
import com.oying.modules.pc.store.domain.StoreUser;
|
import com.oying.modules.pc.store.domain.dto.StoreCreateRequest;
|
import com.oying.modules.pc.store.domain.dto.StoreQueryCriteria;
|
import com.oying.modules.pc.store.domain.dto.StoreUpdateRequest;
|
import com.oying.modules.pc.store.mapper.StoreMapper;
|
import com.oying.modules.pc.store.mapper.StoreUserMapper;
|
import com.oying.modules.pc.store.service.StoreService;
|
import com.oying.utils.PageResult;
|
import com.oying.utils.PageUtil;
|
import com.oying.utils.SecurityUtils;
|
import com.oying.utils.StringUtils;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.time.LocalTime;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.Optional;
|
import java.util.Set;
|
|
/**
|
* 店铺Service业务层处理
|
*
|
* @author lzp
|
* @date 2025-04-22
|
*/
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements StoreService {
|
|
private final StoreMapper storeMapper;
|
private final StoreUserMapper storeUserMapper;
|
|
@Override
|
public PageResult<Store> queryByPage(StoreQueryCriteria criteria) {
|
Page<Store> page = new Page<>(criteria.getPage(), criteria.getSize());
|
return PageUtil.toPage(storeMapper.selectStoreList(criteria, page));
|
}
|
|
@Override
|
public List<Store> queryAll(StoreQueryCriteria criteria) {
|
return storeMapper.selectStoreList(criteria);
|
}
|
|
@Override
|
public List<Long> queryStoreIds(StoreQueryCriteria criteria) {
|
return storeMapper.queryStoreIds(criteria);
|
}
|
|
@Override
|
public Store getMerchantStore(Long merchantId) {
|
return storeMapper.selectStoreByMerchantId(merchantId);
|
}
|
|
@Override
|
public List<Store> getStoresByIds(Set<Long> ids) {
|
return storeMapper.queryByIds(ids);
|
}
|
|
@Override
|
public List<Store> getUserStores(Long userId) {
|
return storeMapper.queryUserStores(userId);
|
}
|
|
@Override
|
public Store getOrThrow(Long storeId, Long version) {
|
Objects.requireNonNull(storeId, String.format("方法 '%s' 调用失败:参数 'storeId'(店铺ID)不能为 null", "findOrThrow"));
|
LambdaQueryWrapper<Store> wrapper = new LambdaQueryWrapper<>();
|
wrapper.eq(Store::getStoreId, storeId);
|
if (ObjUtil.isNotEmpty(version)) {
|
wrapper.eq(Store::getVersion, version);
|
}
|
Store existingStore = storeMapper.selectOne(wrapper);
|
if (ObjUtil.isEmpty(existingStore)) {
|
throw new EntityNotFoundException(Store.class, "storeId", storeId.toString());
|
}
|
return existingStore;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void create(Store resources) {
|
storeMapper.insert(resources);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public Store create(StoreCreateRequest request) {
|
// 检查店铺名称是否存在
|
if (this.existsStoreName(request.getStoreName())) {
|
throw new BadRequestException("店铺名称已存在");
|
}
|
// 创建店铺
|
Store store = StoreAssembler.to(request);
|
storeMapper.insert(store);
|
return store;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public boolean update(Store resources, boolean isDirectUpdate) {
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(resources.getStoreId(), resources.getVersion());
|
if (isDirectUpdate) {
|
return this.update(resources, wrapper);
|
} else {
|
Store existingStore = this.getById(resources.getStoreId());
|
existingStore.copy(resources);
|
return this.update(existingStore, wrapper);
|
}
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public boolean update(StoreUpdateRequest request) {
|
Store existingStore = this.getOrThrow(request.getStoreId(), request.getVersion());
|
existingStore.copy(StoreAssembler.to(request));
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(existingStore.getStoreId(), existingStore.getVersion());
|
return this.update(existingStore, wrapper);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public boolean updateLogo(Long storeId, Long logoImageId, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getLogoImageId, logoImageId);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean updateName(Long storeId, String storeName, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getStoreName, storeName);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean updateDescription(Long storeId, String description, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getDescription, description);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean updateContactPhone(Long storeId, String contactPhone, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getContactPhone, contactPhone);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean updateAddress(Long storeId, String address, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getAddress, address);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean updateLocation(Long storeId, Double longitude, Double latitude, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getLongitude, longitude)
|
.set(Store::getLatitude, latitude);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean updateRadius(Long storeId, Integer radius, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getRadius, radius);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean updatePlatformCategory(Long storeId, Long platformCategory, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getPlatformCategoryId, platformCategory);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean updateBusinessHours(Long storeId, LocalTime openTime, LocalTime endTime, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getOpenTime, openTime)
|
.set(Store::getCloseTime, endTime);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean updateDeliveryMinimum(Long storeId, BigDecimal deliveryMinimum, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getDeliveryMinimum, deliveryMinimum);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean updateDeliveryFee(Long storeId, BigDecimal deliveryFee, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getDeliveryFee, deliveryFee);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean updateStatus(Long storeId, Integer status, Long version) {
|
Store existingStore = this.getOrThrow(storeId, version);
|
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
|
.set(Store::getStatus, status);
|
return update(wrapper);
|
}
|
|
@Override
|
public boolean existsStoreName(String storeName) {
|
if (StringUtils.isEmpty(storeName)) {
|
return true;
|
}
|
LambdaQueryWrapper<Store> wrapper = new LambdaQueryWrapper<Store>()
|
.eq(Store::getStoreName, storeName);
|
return storeMapper.selectCount(wrapper) > 0;
|
}
|
|
@Override
|
public boolean bindUser(Long storeId) {
|
StoreUser storeUser = new StoreUser();
|
storeUser.setStoreId(storeId);
|
storeUser.setUserId(SecurityUtils.getCurrentUserId());
|
storeUser.setRoleType("");
|
storeUser.setPermissions("");
|
storeUserMapper.insert(storeUser);
|
return true;
|
}
|
|
@Override
|
public boolean existsByIdAndMerchantId(Long storeId, Long merchantId) {
|
if (storeId == null || merchantId == null) {
|
return false;
|
}
|
Store store = getById(storeId);
|
return Optional.ofNullable(store).map(i -> merchantId.equals(i.getMerchantId())).orElse(false);
|
}
|
|
private LambdaUpdateWrapper<Store> createLambdaUpdateWrapper(Long storeId, Long version) {
|
Objects.requireNonNull(storeId, String.format("方法 '%s' 调用失败:参数 'storeId'(店铺ID)不能为 null", "createLambdaUpdateWrapper"));
|
LambdaUpdateWrapper<Store> updateWrapper = new LambdaUpdateWrapper<>();
|
updateWrapper.eq(Store::getStoreId, storeId);
|
if (ObjUtil.isNotEmpty(version)) {
|
updateWrapper.eq(Store::getVersion, version);
|
updateWrapper.set(Store::getVersion, version + 1);
|
}
|
return updateWrapper;
|
}
|
}
|