From a7501803a3ca43310e57a5dd912e5047919c2e43 Mon Sep 17 00:00:00 2001
From: 彭雪彬 <1724387007@qq.com>
Date: Tue, 15 Jul 2025 15:26:55 +0800
Subject: [PATCH] Merge branch 'xin' into pxb

---
 oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreServiceImpl.java |  184 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 150 insertions(+), 34 deletions(-)

diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreServiceImpl.java
index 445170a..253d66c 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreServiceImpl.java
@@ -1,24 +1,36 @@
 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.time.ZonedDateTime;
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 /**
  * 店铺Service业务层处理
@@ -32,6 +44,7 @@
 public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements StoreService {
 
     private final StoreMapper storeMapper;
+    private final StoreUserMapper storeUserMapper;
 
     @Override
     public PageResult<Store> queryByPage(StoreQueryCriteria criteria) {
@@ -45,101 +58,199 @@
     }
 
     @Override
+    public List<Long> queryStoreIds(StoreQueryCriteria criteria) {
+        return storeMapper.queryStoreIds(criteria);
+    }
+
+    @Override
     public Store getMerchantStore(Long merchantId) {
         return storeMapper.selectStoreByMerchantId(merchantId);
     }
 
     @Override
-    public boolean create(Store store) {
-        // store.setStoreId(StoreIdGenerator.getId());
-        store.setCreateBy(SecurityUtils.getCurrentUserId());
-        store.setCreateTime(ZonedDateTime.now());
-        return save(store);
+    public List<Store> getStoresByIds(Set<Long> ids) {
+        return storeMapper.queryByIds(ids);
     }
 
     @Override
-    public boolean updateLogo(Long storeId, String logo) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId).set(Store::getLogoImageId, logo);
+    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) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId)
+    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) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId)
+    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) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId)
+    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) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId)
+    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) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId)
+    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) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId)
+    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) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId)
+    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) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId)
+    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) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId)
+    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) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId)
+    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) {
-        LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId)
+    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
@@ -151,9 +262,14 @@
         return Optional.ofNullable(store).map(i -> merchantId.equals(i.getMerchantId())).orElse(false);
     }
 
-    private LambdaUpdateWrapper<Store> createLambdaUpdateWrapper(Long storeId) {
-        return new LambdaUpdateWrapper<Store>()
-                .eq(Store::getStoreId, storeId)
-                .set(Store::getUpdateBy, SecurityUtils.getCurrentUserId());
+    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;
     }
 }

--
Gitblit v1.9.3