Răsfoiți Sursa

Merge remote-tracking branch 'origin/sit' into sit

# Conflicts:
#	alien-store/src/main/java/shop/alien/store/service/impl/StoreOperationalActivityServiceImpl.java
fcw 2 luni în urmă
părinte
comite
d62444e1c3

+ 4 - 0
alien-entity/src/main/java/shop/alien/mapper/CommonCommentMapper.java

@@ -1,5 +1,6 @@
 package shop.alien.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
@@ -67,5 +68,8 @@ public interface CommonCommentMapper extends BaseMapper<CommonComment> {
     @Update("UPDATE common_comment SET delete_flag = 1, updated_time = NOW() " +
             "WHERE source_type = #{sourceType} AND source_id = #{sourceId} AND delete_flag = 0")
     int logicDeleteBySourceId(@Param("sourceType") Integer sourceType, @Param("sourceId") Integer sourceId);
+
+    @Select("select * from common_comment ${ew.customSqlSegment}")
+    CommonComment selectAll(@Param(Constants.WRAPPER) LambdaQueryWrapper<CommonComment> and);
 }
 

+ 4 - 0
alien-entity/src/main/java/shop/alien/mapper/LifeUserDynamicsMapper.java

@@ -1,5 +1,6 @@
 package shop.alien.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
@@ -93,4 +94,7 @@ public interface LifeUserDynamicsMapper extends BaseMapper<LifeUserDynamics> {
     List<LifeUserDynamicsVo> getDynamicsDetail(@Param("id") Integer id);
 
     List<LifeUserDynamicsVo> getStoreDynamicslist(@Param("userId") String userId, @Param("phoneId") String phoneId);
+
+    @Select("select * from life_user_dynamics ${ew.customSqlSegment}")
+    LifeUserDynamics selectAll(@Param(Constants.WRAPPER) LambdaQueryWrapper<LifeUserDynamics> and);
 }

+ 43 - 3
alien-store/src/main/java/shop/alien/store/controller/StoreCuisineController.java

@@ -23,7 +23,9 @@ import shop.alien.store.service.StoreInfoService;
 import shop.alien.store.service.StorePriceService;
 import shop.alien.store.util.ai.AiGetPriceUtil;
 
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -146,7 +148,9 @@ public class StoreCuisineController {
             @ApiImplicitParam(name = "storeId", value = "商户id", dataType = "Integer", paramType = "query"),
             @ApiImplicitParam(name = "name", value = "菜名", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "status", value = "状态:0-待审核 1-审核通过 2-审核拒绝", dataType = "Integer", paramType = "query"),
-            @ApiImplicitParam(name = "type", value = "类型:1-美食 2-通用", dataType = "Integer", paramType = "query")
+            @ApiImplicitParam(name = "type", value = "类型:1-美食 2-通用", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "startCreatedTime", value = "创建时间开始(yyyy-MM-dd HH:mm:ss)", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "endCreatedTime", value = "创建时间结束(yyyy-MM-dd HH:mm:ss)", dataType = "String", paramType = "query", required = false)
     })
     @GetMapping("/getPage")
     public R<List<PriceListVo>> getPage(
@@ -156,11 +160,33 @@ public class StoreCuisineController {
             @RequestParam(required = false) String name,
             @RequestParam(required = false) Integer status,
             @RequestParam(required = true) Integer type,
-            @RequestParam(required = false) Integer origin)
+            @RequestParam(required = false) Integer origin,
+            @RequestParam(required = false) String startCreatedTime,
+            @RequestParam(required = false) String endCreatedTime)
     {
-        log.info("StoreCuisineController.getPage?pageNum={},pageSize={},storeId={},name={},status={},type={}", pageNum, pageSize, storeId, name, status, type);
+        log.info("StoreCuisineController.getPage?pageNum={},pageSize={},storeId={},name={},status={},type={},startCreatedTime={},endCreatedTime={}", pageNum, pageSize, storeId, name, status, type, startCreatedTime, endCreatedTime);
         List<PriceListVo> priceListVo = new ArrayList<>();
 
+        // 解析时间参数
+        Date startTime = null;
+        Date endTime = null;
+        if (startCreatedTime != null && !startCreatedTime.isEmpty()) {
+            try {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                startTime = sdf.parse(startCreatedTime);
+            } catch (Exception e) {
+                log.warn("解析开始时间失败: {}", startCreatedTime, e);
+            }
+        }
+        if (endCreatedTime != null && !endCreatedTime.isEmpty()) {
+            try {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                endTime = sdf.parse(endCreatedTime);
+            } catch (Exception e) {
+                log.warn("解析结束时间失败: {}", endCreatedTime, e);
+            }
+        }
+
         if(type == 1){
             Page<StoreCuisine> page = new Page<>(pageNum, pageSize);
             LambdaQueryWrapper<StoreCuisine> queryWrapper = new LambdaQueryWrapper<>();
@@ -177,6 +203,13 @@ public class StoreCuisineController {
             if (status != null) {
                 queryWrapper.eq(StoreCuisine::getStatus, status);
             }
+            // 创建时间范围查询
+            if (startTime != null) {
+                queryWrapper.ge(StoreCuisine::getCreatedTime, startTime);
+            }
+            if (endTime != null) {
+                queryWrapper.le(StoreCuisine::getCreatedTime, endTime);
+            }
             queryWrapper.orderByDesc(StoreCuisine::getCreatedTime);
             IPage<StoreCuisine> result = storeCuisineService.page(page, queryWrapper);
             List<StoreCuisine> cuisineList = result.getRecords();
@@ -206,6 +239,13 @@ public class StoreCuisineController {
             }
             // 默认只查询已上架的菜品/套餐(shelf_status = 1)
             queryWrapper.eq(StorePrice::getShelfStatus, 1);
+            // 创建时间范围查询
+            if (startTime != null) {
+                queryWrapper.ge(StorePrice::getCreatedTime, startTime);
+            }
+            if (endTime != null) {
+                queryWrapper.le(StorePrice::getCreatedTime, endTime);
+            }
             queryWrapper.orderByDesc(StorePrice::getCreatedTime);
             IPage<StorePrice> result = storePriceService.page(page, queryWrapper);
             List<StorePrice> storePrices = result.getRecords();

+ 38 - 4
alien-store/src/main/java/shop/alien/store/controller/StorePriceController.java

@@ -20,6 +20,8 @@ import shop.alien.util.encryption.JasyptEncryptorUtil;
 import shop.alien.util.encryption.StandardAesUtil;
 import shop.alien.util.encryption.properties.EncryptProperties;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -199,7 +201,9 @@ public class StorePriceController {
             @ApiImplicitParam(name = "storeId", value = "商户id", dataType = "Integer", paramType = "query"),
             @ApiImplicitParam(name = "name", value = "名字", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "status", value = "状态:0-待审核 1-审核通过 2-审核拒绝", dataType = "Integer", paramType = "query"),
-            @ApiImplicitParam(name = "shelfStatus", value = "上下架状态:1-上架,2-下架", dataType = "Integer", paramType = "query")
+            @ApiImplicitParam(name = "shelfStatus", value = "上下架状态:1-上架,2-下架", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "startCreatedTime", value = "创建时间开始(yyyy-MM-dd HH:mm:ss)", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "endCreatedTime", value = "创建时间结束(yyyy-MM-dd HH:mm:ss)", dataType = "String", paramType = "query", required = false)
     })
     @GetMapping("/getPage")
     public R<IPage<StorePrice>> getPage(
@@ -209,9 +213,32 @@ public class StorePriceController {
             @RequestParam(required = false) String name,
             @RequestParam(required = false) Integer status,
             @RequestParam(required = false) Integer shelfStatus,
-            @RequestParam(required = false) Integer origin) {
-        log.info("StorePriceController.getPage?pageNum={},pageSize={},storeId={},name={},status={},shelfStatus={}",
-                pageNum, pageSize, storeId, name, status, shelfStatus);
+            @RequestParam(required = false) Integer origin,
+            @RequestParam(required = false) String startCreatedTime,
+            @RequestParam(required = false) String endCreatedTime) {
+        log.info("StorePriceController.getPage?pageNum={},pageSize={},storeId={},name={},status={},shelfStatus={},startCreatedTime={},endCreatedTime={}",
+                pageNum, pageSize, storeId, name, status, shelfStatus, startCreatedTime, endCreatedTime);
+        
+        // 解析时间参数
+        Date startTime = null;
+        Date endTime = null;
+        if (startCreatedTime != null && !startCreatedTime.isEmpty()) {
+            try {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                startTime = sdf.parse(startCreatedTime);
+            } catch (Exception e) {
+                log.warn("解析开始时间失败: {}", startCreatedTime, e);
+            }
+        }
+        if (endCreatedTime != null && !endCreatedTime.isEmpty()) {
+            try {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                endTime = sdf.parse(endCreatedTime);
+            } catch (Exception e) {
+                log.warn("解析结束时间失败: {}", endCreatedTime, e);
+            }
+        }
+        
         Page<StorePrice> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<StorePrice> queryWrapper = new LambdaQueryWrapper<>();
         if(null==origin){
@@ -229,6 +256,13 @@ public class StorePriceController {
         if (shelfStatus != null) {
             queryWrapper.eq(StorePrice::getShelfStatus, shelfStatus);
         }
+        // 创建时间范围查询
+        if (startTime != null) {
+            queryWrapper.ge(StorePrice::getCreatedTime, startTime);
+        }
+        if (endTime != null) {
+            queryWrapper.le(StorePrice::getCreatedTime, endTime);
+        }
         queryWrapper.orderByDesc(StorePrice::getCreatedTime);
         IPage<StorePrice> result = storePriceService.page(page, queryWrapper);
         return R.data(result);

+ 7 - 5
alien-store/src/main/java/shop/alien/store/controller/StoreRenovationRequirementController.java

@@ -86,7 +86,8 @@ public class StoreRenovationRequirementController {
             @ApiImplicitParam(name = "sortType", value = "排序类型(1:最新发布, 2:价格最高, 3:面积最大)", dataType = "Integer", paramType = "query"),
             @ApiImplicitParam(name = "requirementTitle", value = "需求标题(模糊查询)", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "startTime", value = "开始时间(格式:yyyy-MM-dd,查询创建时间范围)", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "endTime", value = "结束时间(格式:yyyy-MM-dd,查询创建时间范围)", dataType = "String", paramType = "query")
+            @ApiImplicitParam(name = "endTime", value = "结束时间(格式:yyyy-MM-dd,查询创建时间范围)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "hasCommunicated", value = "是否已沟通(true:已沟通, false:未沟通)", dataType = "Boolean", paramType = "query")
     })
     @GetMapping("/getPage")
     public R<IPage<StoreRenovationRequirementDto>> getPage(
@@ -100,13 +101,14 @@ public class StoreRenovationRequirementController {
             @RequestParam(required = false, defaultValue = "1") Integer sortType,
             @RequestParam(required = false) String requirementTitle,
             @RequestParam(required = false) String startTime,
-            @RequestParam(required = false) String endTime) {
-        log.info("StoreRenovationRequirementController.getPage?page={}, size={}, storeId={}, city={}, renovationType={}, status={}, auditStatus={}, sortType={}, requirementTitle={}, startTime={}, endTime={}",
-                page, size, storeId, city, renovationType, status, auditStatus, sortType, requirementTitle, startTime, endTime);
+            @RequestParam(required = false) String endTime,
+            @RequestParam(required = false) Boolean hasCommunicated) {
+        log.info("StoreRenovationRequirementController.getPage?page={}, size={}, storeId={}, city={}, renovationType={}, status={}, auditStatus={}, sortType={}, requirementTitle={}, startTime={}, endTime={}, hasCommunicated={}",
+                page, size, storeId, city, renovationType, status, auditStatus, sortType, requirementTitle, startTime, endTime, hasCommunicated);
         try {
             Page<StoreRenovationRequirementDto> pageParam = new Page<>(page, size);
             IPage<StoreRenovationRequirementDto> result = requirementService.getRequirementPage(
-                    pageParam, storeId, city, renovationType, status, auditStatus, sortType, requirementTitle, startTime, endTime);
+                    pageParam, storeId, city, renovationType, status, auditStatus, sortType, requirementTitle, startTime, endTime, hasCommunicated);
             return R.data(result);
         } catch (Exception e) {
             log.error("分页查询装修需求失败: {}", e.getMessage(), e);

+ 3 - 1
alien-store/src/main/java/shop/alien/store/service/StoreRenovationRequirementService.java

@@ -45,6 +45,7 @@ public interface StoreRenovationRequirementService extends IService<StoreRenovat
      * @param requirementTitle 需求标题(可选,模糊查询)
      * @param startTime 开始时间(可选,格式:yyyy-MM-dd,查询创建时间范围)
      * @param endTime 结束时间(可选,格式:yyyy-MM-dd,查询创建时间范围)
+     * @param hasCommunicated 是否已沟通(可选,true:已沟通, false:未沟通)
      * @return 分页结果
      */
     IPage<StoreRenovationRequirementDto> getRequirementPage(Page<StoreRenovationRequirementDto> page,
@@ -56,7 +57,8 @@ public interface StoreRenovationRequirementService extends IService<StoreRenovat
                                                              Integer sortType,
                                                              String requirementTitle,
                                                              String startTime,
-                                                             String endTime);
+                                                             String endTime,
+                                                             Boolean hasCommunicated);
 
     /**
      * 更新浏览数

+ 12 - 4
alien-store/src/main/java/shop/alien/store/service/impl/LifeUserViolationServiceImpl.java

@@ -774,7 +774,10 @@ public class LifeUserViolationServiceImpl extends ServiceImpl<LifeUserViolationM
         List<String> videoFileType = Arrays.asList("mp4", "avi", "mov", "wmv", "flv", "mkv");
 
         if ("2".equals(item.getReportContextType())) {
-            LifeUserDynamics dynamicsInfo = lifeUserDynamicsMapper.selectById(item.getDynamicsId());
+            LifeUserDynamics dynamicsInfo = lifeUserDynamicsMapper.selectAll(new LambdaQueryWrapper<LifeUserDynamics>()
+                    .eq(LifeUserDynamics::getId, item.getDynamicsId())
+                    .and(d -> d.eq(LifeUserDynamics::getDeleteFlag, 1)
+                            .or(c-> c.eq(LifeUserDynamics::getDeleteFlag, 0))));
             item.setDynamicsInfo(dynamicsInfo);
             // 将逗号分隔的图片路径拆分成 List<String>
             if (dynamicsInfo != null && StringUtils.isNotEmpty(dynamicsInfo.getImagePath())) {
@@ -788,13 +791,18 @@ public class LifeUserViolationServiceImpl extends ServiceImpl<LifeUserViolationM
 
         if ("3".equals(item.getReportContextType())) {
             // TODO: 处理评论类型
-            CommonComment commonComment = commonCommentMapper.selectById(item.getBusinessId());
+            CommonComment commonComment = commonCommentMapper.selectAll(new LambdaQueryWrapper<CommonComment>()
+                    .eq(CommonComment::getId, item.getBusinessId()));
+
+
             item.setCommonCommentInfo(commonComment);
 
 //            StoreComment commentInfo = storeCommentMapper.selectById(item.getBusinessId());
 //            item.setCommentInfo(commentInfo);
-
-            LifeUserDynamics dynamicsInfo = lifeUserDynamicsMapper.selectById(commonComment.getSourceId());
+            LifeUserDynamics dynamicsInfo = lifeUserDynamicsMapper.selectAll(new LambdaQueryWrapper<LifeUserDynamics>()
+                    .eq(LifeUserDynamics::getId, commonComment.getSourceId())
+                    .and(d -> d.eq(LifeUserDynamics::getDeleteFlag, 1)
+                            .or(c-> c.eq(LifeUserDynamics::getDeleteFlag, 0))));
             item.setDynamicsInfo(dynamicsInfo);
             // 将逗号分隔的图片路径拆分成 List<String>
             if (dynamicsInfo != null && StringUtils.isNotEmpty(dynamicsInfo.getImagePath())) {

+ 3 - 2
alien-store/src/main/java/shop/alien/store/service/impl/StoreOperationalActivityAchievementServiceImpl.java

@@ -22,6 +22,7 @@ import shop.alien.mapper.storePlantform.StoreOperationalActivityAchievementMappe
 import shop.alien.mapper.storePlantform.StoreOperationalActivityMapper;
 import shop.alien.store.dto.StoreOperationalActivityAchievementDto;
 import shop.alien.store.service.StoreOperationalActivityAchievementService;
+import shop.alien.util.common.DateUtils;
 
 /**
  * 运营活动成果服务实现
@@ -56,8 +57,8 @@ public class StoreOperationalActivityAchievementServiceImpl implements StoreOper
         if (activity == null) {
             throw new IllegalArgumentException("活动不存在");
         }
-        Date now = new Date();
-        if (activity.getStartTime() != null && now.before(activity.getStartTime())) {
+        Date nowDay = DateUtils.toDateOnly(new Date());
+        if (activity.getStartTime() != null && nowDay.before(DateUtils.toDateOnly(activity.getStartTime()))) {
             throw new IllegalArgumentException("活动未开始,不允许新增成果");
         }
 

+ 20 - 19
alien-store/src/main/java/shop/alien/store/service/impl/StoreOperationalActivityServiceImpl.java

@@ -30,6 +30,7 @@ import shop.alien.store.config.BaseRedisService;
 import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.dto.StoreOperationalActivitySignupDto;
 import shop.alien.store.service.StoreOperationalActivityService;
+import shop.alien.util.common.DateUtils;
 import shop.alien.util.common.Constants;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 
@@ -258,7 +259,7 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
             Integer approvedCount = signupMapper.countSignupByActivityId(dto.getActivityId());
             Integer limitPeople = activity.getActivityLimitPeople();
             if (limitPeople != null && limitPeople > 0 && approvedCount != null && approvedCount >= limitPeople) {
-                throw new IllegalArgumentException("报名人数已满");
+                throw new IllegalArgumentException("当前报名人数已满");
             }
 
             StoreOperationalActivitySignup signup = new StoreOperationalActivitySignup();
@@ -272,7 +273,7 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
             signup.setDeleteFlag(0);
             signup.setCreatedUserId(dto.getUserId());
             boolean result = signupMapper.insert(signup) > 0;
-            
+
             // 报名成功后给商家发送通知
             if (result) {
                 try {
@@ -281,7 +282,7 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
                     log.error("发送活动报名通知失败,signupId={}, error={}", signup.getId(), e.getMessage(), e);
                 }
             }
-            
+
             return result;
         } finally {
             baseRedisService.unlock(lockKey, lockVal);
@@ -293,11 +294,11 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
         if (status == null || (status != 2 && status != 5)) {
             throw new IllegalArgumentException("活动状态不允许报名");
         }
-        Date now = new Date();
-        if (activity.getSignupStartTime() != null && now.before(activity.getSignupStartTime())) {
+        Date nowDay = DateUtils.toDateOnly(new Date());
+        if (activity.getSignupStartTime() != null && nowDay.before(DateUtils.toDateOnly(activity.getSignupStartTime()))) {
             throw new IllegalArgumentException("未到报名时间");
         }
-        if (activity.getSignupEndTime() != null && now.after(activity.getSignupEndTime())) {
+        if (activity.getSignupEndTime() != null && nowDay.after(DateUtils.toDateOnly(activity.getSignupEndTime()))) {
             throw new IllegalArgumentException("报名已结束");
         }
 //        if (activity.getStartTime() != null && status == 5 && now.before(activity.getStartTime())) {
@@ -398,13 +399,13 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
         if (activity == null) {
             return false;
         }
-        Date now = new Date();
-        Date start = activity.getSignupStartTime();
-        Date end = activity.getSignupEndTime();
-        if (start != null && now.before(start)) {
+        Date nowDay = DateUtils.toDateOnly(new Date());
+        Date start = DateUtils.toDateOnly(activity.getSignupStartTime());
+        Date end = DateUtils.toDateOnly(activity.getSignupEndTime());
+        if (start != null && nowDay.before(start)) {
             return false;
         }
-        if (end != null && now.after(end)) {
+        if (end != null && nowDay.after(end)) {
             return false;
         }
         return true;
@@ -414,11 +415,11 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
         if (activity == null) {
             return null;
         }
-        Date now = new Date();
+        Date nowDay = DateUtils.toDateOnly(new Date());
         if (activity.getStatus() != null && activity.getStatus() == 7) {
             return 0;
         }
-        if (activity.getEndTime() != null && now.after(activity.getEndTime())) {
+        if (activity.getEndTime() != null && nowDay.after(DateUtils.toDateOnly(activity.getEndTime()))) {
             return 0;
         }
         Integer status = activity.getStatus();
@@ -426,10 +427,10 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
             return 1;
         }
         if (signupStatus != null && signupStatus == 2
-                && activity.getStartTime() != null && now.before(activity.getStartTime())) {
+                && activity.getStartTime() != null && nowDay.before(DateUtils.toDateOnly(activity.getStartTime()))) {
             return 2;
         }
-        if (activity.getSignupEndTime() != null && now.after(activity.getSignupEndTime())) {
+        if (activity.getSignupEndTime() != null && nowDay.after(DateUtils.toDateOnly(activity.getSignupEndTime()))) {
             if (status != null && status == 5 && signupStatus != null && signupStatus == 2) {
                 return 3;
             }
@@ -443,7 +444,7 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
                 return 4;
             }
             if (signupStatus == 1) {
-                if (activity.getSignupEndTime() != null && now.before(activity.getSignupEndTime())) {
+                if (activity.getSignupEndTime() != null && nowDay.before(DateUtils.toDateOnly(activity.getSignupEndTime()))) {
                     return 5;
                 }
                 return 1;
@@ -489,14 +490,14 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
         if (item == null) {
             return null;
         }
-        Date now = new Date();
+        Date nowDay = DateUtils.toDateOnly(new Date());
         Integer activityStatus = item.getActivityStatus();
         boolean hasAchievement = item.getHasAchievement() != null && item.getHasAchievement() == 1;
         Integer auditStatus = item.getSignupAuditStatus();
         Date startTime = item.getStartTime();
         Date endTime = item.getEndTime();
         boolean ended = (activityStatus != null && (activityStatus == 7 || activityStatus == 6))
-                || (endTime != null && now.after(endTime));
+                || (endTime != null && nowDay.after(DateUtils.toDateOnly(endTime)));
         if (ended) {
             return hasAchievement ? 2 : 1;
         }
@@ -512,7 +513,7 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
             }
         }
         if (auditStatus != null && auditStatus == 0
-                && startTime != null && now.before(startTime)) {
+                && startTime != null && nowDay.before(DateUtils.toDateOnly(startTime))) {
             return 7;
         }
         return null;

+ 53 - 13
alien-store/src/main/java/shop/alien/store/service/impl/StoreRenovationRequirementServiceImpl.java

@@ -452,9 +452,10 @@ public class StoreRenovationRequirementServiceImpl extends ServiceImpl<StoreReno
                                                                      Integer sortType,
                                                                      String requirementTitle,
                                                                      String startTime,
-                                                                     String endTime) {
-        log.info("StoreRenovationRequirementServiceImpl.getRequirementPage?storeId={}, city={}, renovationType={}, status={}, auditStatus={}, sortType={}, requirementTitle={}, startTime={}, endTime={}",
-                storeId, city, renovationType, status, auditStatus, sortType, requirementTitle, startTime, endTime);
+                                                                     String endTime,
+                                                                     Boolean hasCommunicated) {
+        log.info("StoreRenovationRequirementServiceImpl.getRequirementPage?storeId={}, city={}, renovationType={}, status={}, auditStatus={}, sortType={}, requirementTitle={}, startTime={}, endTime={}, hasCommunicated={}",
+                storeId, city, renovationType, status, auditStatus, sortType, requirementTitle, startTime, endTime, hasCommunicated);
 
         LambdaQueryWrapper<StoreRenovationRequirement> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(StoreRenovationRequirement::getDeleteFlag, 0);
@@ -520,10 +521,22 @@ public class StoreRenovationRequirementServiceImpl extends ServiceImpl<StoreReno
             wrapper.orderByDesc(StoreRenovationRequirement::getCreatedTime);
         }
 
-        IPage<StoreRenovationRequirement> requirementPage = this.page(new Page<>(page.getCurrent(), page.getSize()), wrapper);
-
-        // 转换为DTO
-        IPage<StoreRenovationRequirementDto> dtoPage = requirementPage.convert(requirement -> {
+        // 如果传入了 hasCommunicated 参数,需要先查询所有数据(不分页),计算沟通状态后再过滤和分页
+        IPage<StoreRenovationRequirement> requirementPage;
+        List<StoreRenovationRequirement> requirementList;
+        if (hasCommunicated != null) {
+            // 查询所有符合条件的数据(不分页)
+            requirementList = this.list(wrapper);
+            requirementPage = new Page<>(page.getCurrent(), page.getSize());
+            requirementPage.setTotal(requirementList.size());
+            requirementPage.setRecords(new ArrayList<>());
+        } else {
+            // 正常分页查询
+            requirementPage = this.page(new Page<>(page.getCurrent(), page.getSize()), wrapper);
+            requirementList = requirementPage.getRecords();
+        }
+        
+        List<StoreRenovationRequirementDto> dtoList = requirementList.stream().map(requirement -> {
             StoreRenovationRequirementDto dto = new StoreRenovationRequirementDto();
             BeanUtils.copyProperties(requirement, dto);
 
@@ -536,7 +549,12 @@ public class StoreRenovationRequirementServiceImpl extends ServiceImpl<StoreReno
             }
 
             return dto;
-        });
+        }).collect(Collectors.toList());
+        
+        // 创建分页对象
+        IPage<StoreRenovationRequirementDto> dtoPage = new Page<>(page.getCurrent(), page.getSize());
+        dtoPage.setRecords(dtoList);
+        dtoPage.setTotal(hasCommunicated != null ? dtoList.size() : requirementPage.getTotal());
 
         // 批量查询商铺信息并填充到DTO
         if (dtoPage.getRecords() != null && !dtoPage.getRecords().isEmpty()) {
@@ -600,9 +618,9 @@ public class StoreRenovationRequirementServiceImpl extends ServiceImpl<StoreReno
 
                         // 检查是否已查询过该商铺的沟通状态
                         String communicationKey = currentUserPhoneId + "_" + publishingShopPhoneId;
-                        Boolean hasCommunicated = communicationStatusMap.get(communicationKey);
+                        Boolean communicated = communicationStatusMap.get(communicationKey);
 
-                        if (hasCommunicated == null) {
+                        if (communicated == null) {
                             // 判断互相都发送过消息才算沟通过
                             // 检查 currentUserPhoneId 是否给 publishingShopPhoneId 发送过消息
                             LambdaQueryWrapper<LifeMessage> messageWrapper1 = new LambdaQueryWrapper<>();
@@ -621,11 +639,11 @@ public class StoreRenovationRequirementServiceImpl extends ServiceImpl<StoreReno
                             boolean hasSentMessage2 = messageCount2 != null && messageCount2 > 0;
 
                             // 只有双方都发送过消息才算沟通过
-                            hasCommunicated = hasSentMessage1 && hasSentMessage2;
-                            communicationStatusMap.put(communicationKey, hasCommunicated);
+                            communicated = hasSentMessage1 && hasSentMessage2;
+                            communicationStatusMap.put(communicationKey, communicated);
                         }
 
-                        dto.setHasCommunicated(hasCommunicated);
+                        dto.setHasCommunicated(communicated);
                     } else {
                         dto.setHasCommunicated(false);
                     }
@@ -636,6 +654,28 @@ public class StoreRenovationRequirementServiceImpl extends ServiceImpl<StoreReno
             }
         }
 
+        // 如果传入了 hasCommunicated 参数,根据沟通状态进行过滤
+        if (hasCommunicated != null) {
+            List<StoreRenovationRequirementDto> filteredList = dtoPage.getRecords().stream()
+                    .filter(dto -> hasCommunicated.equals(dto.getHasCommunicated()))
+                    .collect(Collectors.toList());
+            
+            // 更新总数
+            dtoPage.setTotal(filteredList.size());
+            
+            // 手动分页
+            int current = (int) page.getCurrent();
+            int size = (int) page.getSize();
+            int start = (current - 1) * size;
+            int end = Math.min(start + size, filteredList.size());
+            
+            if (start < filteredList.size()) {
+                dtoPage.setRecords(filteredList.subList(start, end));
+            } else {
+                dtoPage.setRecords(new ArrayList<>());
+            }
+        }
+
         return dtoPage;
     }
 

+ 19 - 0
alien-util/src/main/java/shop/alien/util/common/DateUtils.java

@@ -76,6 +76,25 @@ public class DateUtils {
     }
 
     /**
+     * 将日期截断为仅保留年月日(时分秒置为 00:00:00),用于按“天”比较,不比较时分秒。
+     *
+     * @param date 日期,可为 null
+     * @return 当天 00:00:00 的 Date,若入参为 null 则返回 null
+     */
+    public static Date toDateOnly(Date date) {
+        if (date == null) {
+            return null;
+        }
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.set(Calendar.HOUR_OF_DAY, 0);
+        c.set(Calendar.MINUTE, 0);
+        c.set(Calendar.SECOND, 0);
+        c.set(Calendar.MILLISECOND, 0);
+        return c.getTime();
+    }
+
+    /**
      * 日期比较
      *
      * @param dateOne 日期1