Browse Source

Merge remote-tracking branch 'origin/master'

wxd 3 weeks ago
parent
commit
fc4a063dc4
41 changed files with 1266 additions and 249 deletions
  1. 3 1
      alien-entity/src/main/java/shop/alien/entity/store/LifeCollect.java
  2. 77 0
      alien-entity/src/main/java/shop/alien/entity/store/LifeCoupon.java
  3. 145 0
      alien-entity/src/main/java/shop/alien/entity/store/StoreHotelGroupRoomInfo.java
  4. 8 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/LifeCouponVo.java
  5. 3 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/LifeTuanGouParamVo.java
  6. 4 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/StoreGroupPackageVO.java
  7. 10 4
      alien-entity/src/main/java/shop/alien/mapper/LifeMessageMapper.java
  8. 5 0
      alien-entity/src/main/java/shop/alien/mapper/PlatformStoreCouponMapper.java
  9. 11 0
      alien-entity/src/main/java/shop/alien/mapper/StoreClockInMapper.java
  10. 16 0
      alien-entity/src/main/java/shop/alien/mapper/StoreHotelGroupRoomInfoMapper.java
  11. 32 15
      alien-second/src/main/java/shop/alien/second/controller/SecondTradeRecordController.java
  12. 11 20
      alien-second/src/main/java/shop/alien/second/service/SecondTradeRecordService.java
  13. 66 22
      alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java
  14. 127 11
      alien-store/src/main/java/shop/alien/store/controller/LifeCollectController.java
  15. 7 4
      alien-store/src/main/java/shop/alien/store/controller/LifeCouponController.java
  16. 49 3
      alien-store/src/main/java/shop/alien/store/controller/LifeGroupPackageController.java
  17. 21 11
      alien-store/src/main/java/shop/alien/store/controller/LifeMessageController.java
  18. 9 9
      alien-store/src/main/java/shop/alien/store/controller/LifeNoticeController.java
  19. 11 9
      alien-store/src/main/java/shop/alien/store/controller/PlatformStoreCouponController.java
  20. 12 0
      alien-store/src/main/java/shop/alien/store/controller/StoreGroupPackageController.java
  21. 5 5
      alien-store/src/main/java/shop/alien/store/controller/UserStoreController.java
  22. 1 1
      alien-store/src/main/java/shop/alien/store/service/LifeCouponService.java
  23. 7 1
      alien-store/src/main/java/shop/alien/store/service/LifeGroupPackageService.java
  24. 5 1
      alien-store/src/main/java/shop/alien/store/service/LifeMessageService.java
  25. 3 1
      alien-store/src/main/java/shop/alien/store/service/LifeNoticeService.java
  26. 1 1
      alien-store/src/main/java/shop/alien/store/service/LifeStoreService.java
  27. 60 9
      alien-store/src/main/java/shop/alien/store/service/LifeUserStoreService.java
  28. 3 5
      alien-store/src/main/java/shop/alien/store/service/PlatformStoreCouponService.java
  29. 4 1
      alien-store/src/main/java/shop/alien/store/service/StoreClockInService.java
  30. 9 0
      alien-store/src/main/java/shop/alien/store/service/StoreGroupPackageService.java
  31. 14 13
      alien-store/src/main/java/shop/alien/store/service/impl/LifeCouponServiceImpl.java
  32. 8 0
      alien-store/src/main/java/shop/alien/store/service/impl/LifeDiscountCouponServiceImpl.java
  33. 0 2
      alien-store/src/main/java/shop/alien/store/service/impl/LifeDiscountCouponStoreFriendServiceImpl.java
  34. 226 4
      alien-store/src/main/java/shop/alien/store/service/impl/LifeGroupPackageServiceImpl.java
  35. 123 48
      alien-store/src/main/java/shop/alien/store/service/impl/LifeMessageServiceImpl.java
  36. 15 14
      alien-store/src/main/java/shop/alien/store/service/impl/LifeNoticeServiceImpl.java
  37. 34 28
      alien-store/src/main/java/shop/alien/store/service/impl/PlatformStoreCouponServiceImpl.java
  38. 12 1
      alien-store/src/main/java/shop/alien/store/service/impl/StoreClockInServiceImpl.java
  39. 66 0
      alien-store/src/main/java/shop/alien/store/service/impl/StoreGroupPackageServiceImpl.java
  40. 5 5
      alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java
  41. 38 0
      alien-store/src/main/java/shop/alien/store/util/GroupConstant.java

+ 3 - 1
alien-entity/src/main/java/shop/alien/entity/store/LifeCollect.java

@@ -23,7 +23,9 @@ public class LifeCollect {
 
     private String userId;
 
-    private String goodsId;
+    @ApiModelProperty(value = "团购id")
+    @TableField("coupon_id")
+    private String couponId;
 
     private String businessId;
 

+ 77 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeCoupon.java

@@ -535,4 +535,81 @@ public class LifeCoupon {
     @ApiModelProperty(value = "有效期时间段")
     @TableField("validity_period")
     private String validityPeriod;
+
+    @ApiModelProperty(value = "是否可与其它优惠券叠加使用 0:否,1:是")
+    @TableField("stacking_type")
+    private String stackingType;
+
+    @ApiModelProperty(value = "全场通用 0:否,1:是")
+    @TableField("general_type")
+    private String generalType;
+
+    @ApiModelProperty(value = "单次可用数量")
+    @TableField("single_can_use")
+    private String singleCanUse;
+
+    @ApiModelProperty(value = "适用标识:1:适用范围,2:不适用范围")
+    @TableField("apply_type")
+    private String applyType;
+
+    @ApiModelProperty(value = "适用描述")
+    @TableField("apply_desc")
+    private String applyDesc;
+
+    @ApiModelProperty(value = "有效期类型,1:指定天数,2:指定时间段")
+    @TableField("expiration_type")
+    private String expirationType;
+
+    @ApiModelProperty(value = "不可用类型,1:全部日期,2:限制日期,3:自定义")
+    @TableField("unused_type")
+    private String unusedType;
+
+    // 房屋类型
+    @ApiModelProperty(value = "房屋类型")
+    @TableField("house_type")
+    private String houseType;
+
+    @ApiModelProperty(value = "房屋卧室")
+    @TableField("house_type_b")
+    private String houseTypeB;
+
+    @ApiModelProperty(value = "房屋客厅")
+    @TableField("house_type_l")
+    private String houseTypeL;
+
+    @ApiModelProperty(value = "房屋厨房")
+    @TableField("house_type_k")
+    private String houseTypeK;
+
+    @ApiModelProperty(value = "房屋卫生间")
+    @TableField("house_type_t")
+    private String houseTypeT;
+
+    @ApiModelProperty(value = "销售时间str")
+    @TableField("sale_time_str")
+    private String saleTimeStr;
+
+    @ApiModelProperty(value = "结束销售时间str")
+    @TableField("sale_time_end")
+    private String saleTimeEnd;
+
+    @ApiModelProperty(value = "标签日期不可用")
+    @TableField("unavai_lable_date")
+    private String unavaiLableDate;
+
+    @ApiModelProperty(value = "房间类型str")
+    @TableField("room_type_str")
+    private String roomTypeStr;
+
+    @ApiModelProperty(value = "时间范围")
+    @TableField("time_range")
+    private String timeRange;
+
+    @ApiModelProperty(value = "取消政策str")
+    @TableField("cancellation_policy_str")
+    private String cancellationPolicyStr;
+
+    @ApiModelProperty(value = "优惠卷有效期str")
+    @TableField("validity_periodyh_str")
+    private String validityPeriodyhStr;
 }

+ 145 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreHotelGroupRoomInfo.java

@@ -0,0 +1,145 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 酒店团购子表
+ * </p>
+ *
+ * @author qxy
+ * @since 2025-07-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="StoreHotelGroupRoomInfo对象", description="酒店团购子表")
+public class StoreHotelGroupRoomInfo extends Model<StoreHotelGroupRoomInfo> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private String id;
+
+    @ApiModelProperty(value = "团购id")
+    @TableField("group_id")
+    private String groupId;
+
+    @ApiModelProperty(value = "面积")
+    @TableField("area")
+    private Double area;
+
+    @ApiModelProperty(value = "床尺寸code")
+    @TableField("bed_size_code")
+    private String bedSizeCode;
+
+    @ApiModelProperty(value = "床尺寸")
+    @TableField("bed_size")
+    private String bedSize;
+
+    @ApiModelProperty(value = "床数量")
+    @TableField("bed_num")
+    private Integer bedNum;
+
+    @ApiModelProperty(value = "窗:0:否,1:是")
+    @TableField("window_flag")
+    private Integer windowFlag;
+
+    @ApiModelProperty(value = "独立卫生间: 0:否,1:是")
+    @TableField("bathroom_flag")
+    private Integer bathroomFlag;
+
+    @ApiModelProperty(value = "wifi: 0:否,1:是")
+    @TableField("wifi_flag")
+    private Integer wifiFlag;
+
+    @ApiModelProperty(value = "早餐: 0:否,1:是")
+    @TableField("breakfast_flag")
+    private Integer breakfastFlag;
+
+    @ApiModelProperty(value = "起始楼层")
+    @TableField("floor_str")
+    private String floorStr;
+
+    @ApiModelProperty(value = "最低楼层")
+    @TableField("floor_end")
+    private String floorEnd;
+
+    @ApiModelProperty(value = "居住人数")
+    @TableField("residence_num")
+    private Integer residenceNum;
+
+    @ApiModelProperty(value = "吸烟:0:否,1:是")
+    @TableField("smoking_flag")
+    private Integer smokingFlag;
+
+    @ApiModelProperty(value = "删除状态")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    private Date createdTime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField(value = "created_user_id", fill = FieldFill.INSERT)
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "类别")
+    @TableField("category")
+    private String category;
+
+    @ApiModelProperty(value = "服务名称")
+    @TableField("service_name")
+    private String serviceName;
+
+    @ApiModelProperty(value = "数量")
+    @TableField("num")
+    private Integer num;
+
+    @ApiModelProperty(value = "分组名")
+    @TableField("group_name")
+    private String groupName;
+
+    @ApiModelProperty(value = "时长")
+    @TableField("duration")
+    private String duration;
+
+    @ApiModelProperty(value = "sonOrder")
+    @TableField("son_order")
+    private Integer sonOrder;
+
+    @ApiModelProperty(value = "fatherOrder")
+    @TableField("father_order")
+    private Integer fatherOrder;
+
+    @ApiModelProperty(value = "早餐说明")
+    @TableField("break_fast_str")
+    private String breakFastStr;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 8 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/LifeCouponVo.java

@@ -10,6 +10,8 @@ import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import shop.alien.entity.store.LifeCoupon;
 import shop.alien.entity.store.StoreGroupInfo;
+import shop.alien.entity.store.StoreHotelGroupRoomInfo;
+
 
 import java.util.Date;
 import java.util.List;
@@ -571,5 +573,11 @@ public class LifeCouponVo extends LifeCoupon {
     @ApiModelProperty(value = "团购子表")
     private List<StoreGroupInfo> storeGroupInfos;
 
+    @ApiModelProperty(value = "酒店团购子表")
+    private List<StoreHotelGroupRoomInfo> storeHotelGroupRoomInfos;
+
+    @ApiModelProperty(value = "是否收藏")
+    private String isCollect;
+
     private Integer count;
 }

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/LifeTuanGouParamVo.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 import lombok.Data;
 import shop.alien.entity.store.LifeCoupon;
 import shop.alien.entity.store.LifeGroupPackage;
+import shop.alien.entity.store.StoreHotelGroupRoomInfo;
 
 import java.util.List;
 
@@ -17,4 +18,6 @@ public class LifeTuanGouParamVo {
     LifeCoupon tuangou;
 
     List<LifeGroupPackage> tuangouPackageList;
+
+    List<StoreHotelGroupRoomInfo> tuangouHotelRoomList;
 }

+ 4 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreGroupPackageVO.java

@@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import shop.alien.entity.store.LifeCoupon;
 import shop.alien.entity.store.StoreGroupInfo;
+import shop.alien.entity.store.StoreHotelGroupRoomInfo;
 
 import java.util.List;
 
@@ -22,4 +23,7 @@ public class StoreGroupPackageVO {
     @ApiModelProperty(value = "子表信息")
     private List<StoreGroupInfo> storeGroupInfos;
 
+    @ApiModelProperty(value = "酒店团购子表信息")
+    private List<StoreHotelGroupRoomInfo> storeHotelGroupRoomInfos;
+
 }

+ 10 - 4
alien-entity/src/main/java/shop/alien/mapper/LifeMessageMapper.java

@@ -38,13 +38,19 @@ public interface LifeMessageMapper extends BaseMapper<LifeMessage> {
             "        where delete_flag = 0 and (sender_id = #{phoneId} or receiver_id = #{phoneId}) " +
             "               and (instr(delete_phone_id, #{phoneId}) is null or instr(delete_phone_id, #{phoneId}) = 0)" +
             "    ) " +
-            "    select *, row_number() over (partition by phoneId order by created_time desc ) num " +
+            "    select *, row_number() over (partition by phoneId order by created_time desc ) num, " +
+            "           substring_index(phoneId, '_', 1) flag, substring_index(phoneId, '_', -1) phone " +
             "    from message " +
             ") " +
-            "select id, type, phoneId, content, created_time createdTime, is_read " +
-            "from message_num " +
+            "select message.id, message.type, message.phoneId, message.content, message.created_time createdTime, message.is_read, " +
+            "       if (message.flag = 'user', user.user_name, suser.name) userName, " +
+            "       if (message.flag = 'user', user.user_image, img.img_url) userImage " +
+            "from message_num message " +
+            "left join life_user user on message.flag = 'user' and message.phone = user.user_phone and user.delete_flag = 0 " +
+            "left join store_user suser on message.flag = 'store' and message.phone = suser.phone and suser.delete_flag = 0 " +
+            "left join store_img img on img.store_id = suser.store_id and img.img_type = '10' and img.delete_flag = 0 " +
             "${ew.customSqlSegment}")
-    IPage<LifeMessageVo> getLifeMessagePageByPhoneId(IPage<LifeMessageVo> iPage, @Param("phoneId") String phoneId, @Param(Constants.WRAPPER) QueryWrapper<LifeFansVo> dynamicsWrapper);
+    List<LifeMessageVo> getLifeMessagePageByPhoneId(@Param("phoneId") String phoneId, @Param(Constants.WRAPPER) QueryWrapper<LifeFansVo> dynamicsWrapper);
 
     @Update("update life_message set delete_phone_id = (if(delete_phone_id is null, #{receiverId}, concat(delete_phone_id, ',', #{receiverId}))) ,delete_flag = '1'" +
             "where (receiver_id = #{senderId} and sender_id = #{receiverId}) or (sender_id = #{senderId} and receiver_id = #{receiverId}) ")

+ 5 - 0
alien-entity/src/main/java/shop/alien/mapper/PlatformStoreCouponMapper.java

@@ -28,4 +28,9 @@ public interface PlatformStoreCouponMapper extends BaseMapper<LifeCoupon> {
             "${ew.customSqlSegment}")
     List<LifeCouponVo> getCouponList(@Param(Constants.WRAPPER) QueryWrapper<LifeCouponVo> wrapper);
 
+    @Select("select lc.*,si.store_name,si.store_tel phone\n" +
+            "from life_coupon lc \n" +
+            "left join store_info si on si.id = lc.store_id \n" +
+            "where lc.id = ${id}")
+    LifeCouponVo getCouponById(Integer id);
 }

+ 11 - 0
alien-entity/src/main/java/shop/alien/mapper/StoreClockInMapper.java

@@ -9,6 +9,9 @@ import org.apache.ibatis.annotations.Select;
 import shop.alien.entity.store.StoreClockIn;
 import shop.alien.entity.store.vo.StoreClockInVo;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * <p>
  * 店铺打卡 Mapper 接口
@@ -38,4 +41,12 @@ public interface StoreClockInMapper extends BaseMapper<StoreClockIn> {
             "left join store_dictionary dict on dict.type_name = 'storeType' and store.store_type = dict.dict_id and dict.delete_flag = 0 " +
             "${ew.customSqlSegment} ")
     IPage<StoreClockInVo> getStoreClockInList(IPage<StoreClockIn> page, @Param(Constants.WRAPPER) QueryWrapper<StoreClockIn> queryWrapper);
+
+    /**
+     * 获取门店打卡次数
+     *
+     * @return list
+     */
+    @Select("SELECT store_id as storeId, count(store_id) as count FROM `store_clock_in` where delete_flag = 0 GROUP BY store_id ")
+    List<Map<Integer, Integer>> getStoreClockInCount();
 }

+ 16 - 0
alien-entity/src/main/java/shop/alien/mapper/StoreHotelGroupRoomInfoMapper.java

@@ -0,0 +1,16 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.store.StoreHotelGroupRoomInfo;
+
+/**
+ * <p>
+ * 八大类团(酒店)房间表 Mapper 接口
+ * </p>
+ *
+ * @author ssk
+ * @since 2025-05-22
+ */
+public interface StoreHotelGroupRoomInfoMapper extends BaseMapper<StoreHotelGroupRoomInfo> {
+
+}

+ 32 - 15
alien-second/src/main/java/shop/alien/second/controller/SecondTradeRecordController.java

@@ -10,6 +10,8 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.second.SecondTradeRecord;
 import shop.alien.second.service.SecondTradeRecordService;
 
+import java.util.List;
+
 /**
  * <p>
  * 二手交易记录表 前端控制器
@@ -31,27 +33,42 @@ public class SecondTradeRecordController {
 
     @ApiOperation("获取交易信息")
     @ApiOperationSupport(order = 1)
-    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主键id", dataType = "Integer", paramType = "query", required = true)})
+    @ApiImplicitParams({@ApiImplicitParam(name = "sideId", value = "对方的id", dataType = "Integer", paramType = "query", required = true)})
     @GetMapping("/getTradeRecord")
-    public R<SecondTradeRecord> getTradeRecord(@Param("id") Long id) {
-        log.error("SecondTradeRecordController.getTradeRecord?id={}", id);
-        return R.data(secondTradeRecordService.getTradeRecord(id));
+    public R<List<SecondTradeRecord>> getTradeRecord(@RequestParam int sideId) {
+        log.info("SecondTradeRecordController.getTradeRecord?sideId={}", sideId);
+        return R.data(secondTradeRecordService.getTradeRecord(sideId));
     }
 
-    @ApiOperation("保存或更新交易记录")
+    @ApiOperation("创建交易")
     @ApiOperationSupport(order = 2)
-    @PostMapping("/saveOrUpdate")
-    public R<Boolean> saveOrUpdate(@RequestBody SecondTradeRecord entity) {
-        log.error("SecondTradeRecordController.getTradeRecord?entity={}", entity.toString());
-        return R.data(secondTradeRecordService.saveOrUpdate(entity));
+    @PostMapping("/createTrade")
+    public R<Boolean> createTrade(@RequestBody SecondTradeRecord entity) {
+        log.info("SecondTradeRecordController.createTrade?entity={}", entity.toString());
+        if (secondTradeRecordService.createTrade(entity)) return R.success("创建成功");
+        return R.fail("创建失败");
     }
 
-    @ApiOperation("删除交易信息")
+    @ApiOperation("交易签到")
     @ApiOperationSupport(order = 3)
-    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主键id", dataType = "Integer", paramType = "query", required = true)})
-    @DeleteMapping("/deleteTradeRecord")
-    public R<Boolean> deleteTradeRecord(@Param("id") Long id) {
-        log.error("SecondTradeRecordController.deleteTradeRecord?id={}", id);
-        return R.data(secondTradeRecordService.removeById(id));
+    @ApiImplicitParams({@ApiImplicitParam(name = "tradeId", value = "交易id", dataType = "Integer", paramType = "query", required = true)})
+    @GetMapping("/tradeSignin")
+    public R<Boolean> tradeSignin(@RequestParam int tradeId) {
+        log.info("SecondTradeRecordController.tradeSignin?tradeId={}", tradeId);
+        if (secondTradeRecordService.tradeSignin(tradeId)) return R.success("签到成功");
+        return R.fail("签到失败");
+    }
+
+    @ApiOperation("交易确认")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tradeId", value = "交易id", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "type", value = "0-失败  1-成功", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "evaluate", value = "评价", dataType = "String", paramType = "query")})
+    @GetMapping("/tradeConfirm")
+    public R<Boolean> tradeConfirm(@RequestParam int tradeId, @RequestParam int type, @RequestParam String evaluate) {
+        log.info("SecondTradeRecordController.tradeConfirm?tradeId={}, type={}, evaluate={}", tradeId, type, evaluate);
+        if (secondTradeRecordService.tradeConfirm(tradeId, type, evaluate)) return R.success("交易确认成功");
+        return R.fail("交易确认失败");
     }
 }

+ 11 - 20
alien-second/src/main/java/shop/alien/second/service/SecondTradeRecordService.java

@@ -2,8 +2,11 @@ package shop.alien.second.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import io.swagger.models.auth.In;
 import shop.alien.entity.second.SecondTradeRecord;
 
+import java.util.List;
+
 /**
  * <p>
  * 二手交易记录表 服务类
@@ -13,24 +16,12 @@ import shop.alien.entity.second.SecondTradeRecord;
  * @since 2025-07-07
  */
 public interface SecondTradeRecordService extends IService<SecondTradeRecord> {
-    /**
-     * 根据ID获取交易记录
-     * @param id 交易记录ID
-     * @return 交易记录对象
-     */
-    SecondTradeRecord getTradeRecord(Long id);
-
-    /**
-     * 保存或更新交易记录
-     * @param entity 交易记录对象
-     * @return 操作结果
-     */
-    boolean saveOrUpdate(SecondTradeRecord entity);
-
-    /**
-     * 根据ID删除交易记录
-     * @param id 交易记录ID
-     * @return 删除结果
-     */
-    boolean removeById(Long id);
+    List<SecondTradeRecord> getTradeRecord(int sideId);
+
+    boolean createTrade(SecondTradeRecord entity);
+
+    boolean tradeSignin(int tradeId);
+
+    boolean tradeConfirm(int tradeId, int type, String evaluate);
+
 }

+ 66 - 22
alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java

@@ -1,5 +1,6 @@
 package shop.alien.second.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -9,6 +10,10 @@ import shop.alien.entity.second.SecondTradeRecord;
 import shop.alien.mapper.second.SecondGoodsMapper;
 import shop.alien.mapper.second.SecondTradeRecordMapper;
 import shop.alien.second.service.SecondTradeRecordService;
+import shop.alien.util.common.JwtUtil;
+
+import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -27,42 +32,81 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
     private final SecondGoodsMapper secondGoodsMapper;
 
     @Override
-    public SecondTradeRecord getTradeRecord(Long id) {
-        return super.getById(id);
+    public List<SecondTradeRecord> getTradeRecord(int sideId) {
+        try {
+            int userId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId");
+            QueryWrapper<SecondTradeRecord> wrapper = new QueryWrapper<>();
+            wrapper.apply("(buyer_id = '" + sideId + "' and seller_id = '" + userId + "') || (buyer_id = '" + userId + "' and seller_id = '" + sideId + "')");
+            wrapper.orderByDesc("created_time");
+            return secondTradeRecordMapper.selectList(wrapper);
+        } catch (Exception e) {
+            log.error("SecondTradeRecordServiceImpl.getTradeRecord===", e.fillInStackTrace());
+            return null;
+        }
     }
 
     /**
-     * 保存或更新交易记录
+     * 创建交易
      * @param entity 交易记录对象
      * @return 操作结果
      */
     @Override
-    public boolean saveOrUpdate(SecondTradeRecord entity) {
+    public boolean createTrade(SecondTradeRecord entity) {
         try {
-            if (null == entity.getId()) {
-                super.saveOrUpdate(entity);
-                SecondGoods goods = new SecondGoods();
-                goods.setId(entity.getGoodsId());
-                goods.setTradeId(entity.getId());
-                secondGoodsMapper.updateById(goods);
-            } else {
-                super.saveOrUpdate(entity);
-            }
+            secondTradeRecordMapper.insert(entity);
+            SecondGoods goods = new SecondGoods();
+            goods.setId(entity.getGoodsId());
+            goods.setTradeId(entity.getId());
+            secondGoodsMapper.updateById(goods);
             return true;
         } catch (Exception e) {
-            log.error("SecondTradeRecordServiceImpl.saveOrUpdate?error={}", e.getMessage());
+            log.error("SecondTradeRecordServiceImpl.createTrade===", e.fillInStackTrace());
         }
-
         return false;
     }
 
-    /**
-     * 根据ID删除交易记录
-     * @param id 交易记录ID
-     * @return 删除结果
-     */
     @Override
-    public boolean removeById(Long id) {
-        return super.removeById(id);
+    public boolean tradeSignin(int tradeId) {
+        try {
+            int userId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId");
+            SecondTradeRecord tradeRecord = secondTradeRecordMapper.selectById(tradeId);
+            SecondTradeRecord record = new SecondTradeRecord();
+            record.setId(tradeId);
+            if (userId == tradeRecord.getBuyerId()) {
+                record.setBuyerSignin(1);
+            } else if (userId == tradeRecord.getSellerId()) {
+                record.setSellerSignin(1);
+            } else {
+                return false;
+            }
+            secondTradeRecordMapper.updateById(record);
+        } catch (Exception e) {
+            log.error("SecondTradeRecordServiceImpl.tradeSignin===", e.fillInStackTrace());
+        }
+        return true;
+    }
+
+    @Override
+    public boolean tradeConfirm(int tradeId, int type, String evaluate) {
+        try {
+            int userId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId");
+            SecondTradeRecord tradeRecord = secondTradeRecordMapper.selectById(tradeId);
+            SecondTradeRecord record = new SecondTradeRecord();
+            record.setId(tradeId);
+            if (userId == tradeRecord.getBuyerId()) {
+                record.setBuyerTransactionStatus(type);
+                record.setBuyerEvaluate(evaluate);
+            } else if (userId == tradeRecord.getSellerId()) {
+                record.setSellerTransactionStatus(type);
+                record.setSellerEvaluate(evaluate);
+                record.setTradeStatus(type);
+            } else {
+                return false;
+            }
+            secondTradeRecordMapper.updateById(record);
+        } catch (Exception e) {
+            log.error("SecondTradeRecordServiceImpl.tradeConfirm===", e.fillInStackTrace());
+        }
+        return true;
     }
 }

+ 127 - 11
alien-store/src/main/java/shop/alien/store/controller/LifeCollectController.java

@@ -13,17 +13,16 @@ import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.second.SecondGoods;
 import shop.alien.entity.store.LifeCollect;
+import shop.alien.entity.store.LifeCoupon;
+import shop.alien.entity.store.StoreImg;
 import shop.alien.entity.store.vo.StoreInfoVo;
+import shop.alien.mapper.*;
 import shop.alien.mapper.second.SecondGoodsMapper;
 import shop.alien.store.config.GaoDeMapUtil;
-import shop.alien.mapper.LifeCollectMapper;
-import shop.alien.mapper.StoreInfoMapper;
 import shop.alien.util.common.ListToPage;
 
 import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -45,33 +44,92 @@ public class LifeCollectController {
 
     private final GaoDeMapUtil gaoDeMapUtil;
 
+    private final LifeCouponMapper lifeCouponMapper;
+
+    private final StoreEvaluationMapper storeEvaluationMapper;
+
+    private final LifeUserOrderMapper lifeUserOrderMapper;
+
+    private final StoreImgMapper storeImgMapper;
+
     @ApiOperation("收藏列表")
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "分页页数", dataType = "String", paramType = "query", required = true),
             @ApiImplicitParam(name = "size", value = "分页条数", dataType = "String", paramType = "query", required = true),
             @ApiImplicitParam(name = "userId", value = "用户id", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "jingdu", value = "jingdu", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "weidu", value = "weidu", dataType = "String", paramType = "query")})
+            @ApiImplicitParam(name = "weidu", value = "weidu", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "businessSection", value = "经营板块", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "keyword", value = "关键词", dataType = "String", paramType = "query")
+    })
     @GetMapping("selectCollectList")
     public R<IPage<StoreInfoVo>> selectCollectList(@RequestParam(defaultValue = "1") int page,
                                                    @RequestParam(defaultValue = "10") int size,
                                                    @RequestParam String userId,
                                                    @RequestParam String jingdu,
-                                                   @RequestParam String weidu) {
-        log.info("LifeCollectController.selectCollectList?userId={},page={},size={},jingdu={},weidu={}", userId, page, size, jingdu, weidu);
+                                                   @RequestParam String weidu,
+                                                   @RequestParam String businessSection,
+                                                   @RequestParam String keyword
+    ) {
+        log.info("LifeCollectController.selectCollectList?userId={},page={},size={},jingdu={},weidu={},businessSection={},keyword={}", userId, page, size, jingdu, weidu,businessSection,keyword);
         LambdaUpdateWrapper<LifeCollect> wrapper = new LambdaUpdateWrapper<>();
         wrapper.eq(LifeCollect::getUserId, userId);
-        wrapper.eq(LifeCollect::getDeleteFlag, 0).orderByDesc(LifeCollect::getCreatedTime);
+        wrapper.eq(LifeCollect::getDeleteFlag, 0).isNotNull(LifeCollect::getStoreId).orderByDesc(LifeCollect::getCreatedTime);
         List<LifeCollect> lifeCollectList = lifeCollectMapper.selectList(wrapper);
         List<StoreInfoVo> storeVoList = new ArrayList<>();
+
         if (!CollectionUtils.isEmpty(lifeCollectList)) {
-            List<String> ids = lifeCollectList.stream().map(LifeCollect::getStoreId).collect(Collectors.toList());
+            // 获取收藏的店铺id
+            List<String> ids = lifeCollectList.stream().filter(x->null != x.getStoreId()).map(LifeCollect::getStoreId).collect(Collectors.toList());
             QueryWrapper<StoreInfoVo> queryWrapper = new QueryWrapper<>();
             queryWrapper.in("a.id", ids).eq("a.delete_flag", 0);
+            // 查询店铺团购信息
+            LambdaUpdateWrapper<LifeCoupon> quanWrapper = new LambdaUpdateWrapper<>();
+            quanWrapper.in(LifeCoupon::getStoreId, ids)
+                    .eq(LifeCoupon::getStatus, 1)
+                    .orderByDesc(LifeCoupon::getCreatedTime);
+            List<LifeCoupon> quanList = lifeCouponMapper.selectList(quanWrapper);
+            // 八大类分类
+            if (!StringUtils.isEmpty(businessSection)) {
+                queryWrapper.eq("a.business_section", businessSection);
+            }
+            // 关键词查询
+            if (!StringUtils.isEmpty(keyword)) {
+                queryWrapper.like("a.store_name", keyword);
+            }
+            // 计算店铺平均分 和 人均花销
+            Map<Object, List<Map<String, Object>>> avgScoreMap = storeEvaluationMapper.allStoreAvgScore().stream().collect(Collectors.groupingBy(o -> o.get("store_id")));
+            Map<Object, List<Map<String, Object>>> avgPriceMap =  lifeUserOrderMapper.allStoreAvgPrice().stream().collect(Collectors.groupingBy(o -> o.get("store_id")));
             List<StoreInfoVo> storeInfoVoList = storeInfoMapper.getStoreInfoVoList(queryWrapper);
             lifeCollectList.forEach(a -> {
                 storeInfoVoList.forEach(b -> {
                     if (a.getStoreId().equals(b.getId().toString())) {
+                        // 团购券设置
+                        List<Map<String, Object>> quanMapList = new ArrayList<>();
+                        if (!quanList.isEmpty()) {
+                            for (LifeCoupon quan : quanList) {
+                                if (b.getId().toString().equals(quan.getStoreId())) {
+                                    Map<String, Object> quanMap = new HashMap<>();
+                                    quanMap.put("quanType", quan.getType());
+                                    quanMap.put("name", quan.getName());
+                                    quanMap.put("price", quan.getPrice());
+                                    // 折扣价
+                                    quanMap.put("offprice", quan.getOffprice());
+                                    quanMap.put("quanId", quan.getId());
+                                    quanMapList.add(quanMap);
+                                }
+                            }
+                        }
+                        b.setQuanList(quanMapList);
+                        // 得分,人均
+                        b.setAvgScore("0");
+                        b.setAvgPrice("0");
+                        if (avgScoreMap.containsKey(String.valueOf(b.getId()))) {
+                            b.setAvgScore(String.valueOf(avgScoreMap.get(String.valueOf(b.getId())).get(0).get("avg_score")));
+                        }
+                        if (avgPriceMap.containsKey(String.valueOf(b.getId()))) {
+                            b.setAvgPrice(String.valueOf(avgPriceMap.get(String.valueOf(b.getId())).get(0).get("avg_price")));
+                        }
                         if ((jingdu != null && !jingdu.isEmpty()) && (weidu != null && !weidu.isEmpty())) {
                             String[] split = b.getStorePosition().split(",");
                             double storeDistance;
@@ -91,6 +149,58 @@ public class LifeCollectController {
         return R.data(ListToPage.setPage(storeVoList, page, size));
     }
 
+    @ApiOperation("团购收藏列表")
+    @ApiOperationSupport(order = 1)
+    @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "分页页数", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "size", value = "分页条数", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户id", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "businessSection", value = "经营板块", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "keyword", value = "关键词", dataType = "String", paramType = "query")
+    })
+    @GetMapping("selectCouponCollectList")
+    public R<IPage<LifeCoupon>> selectCouponCollectList(@RequestParam(defaultValue = "1") int page,
+                                                        @RequestParam(defaultValue = "10") int size,
+                                                        @RequestParam String userId,
+                                                        @RequestParam String businessSection,
+                                                        @RequestParam String keyword){
+        log.info("LifeCollectController.selectCouponCollectList?userId={},page={},size={},businessSection={},keyword={}", userId, page, size,businessSection,keyword);
+        LambdaUpdateWrapper<LifeCollect> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(LifeCollect::getUserId, userId);
+        wrapper.eq(LifeCollect::getDeleteFlag, 0).isNotNull(LifeCollect::getCouponId).orderByDesc(LifeCollect::getCreatedTime);
+        List<LifeCollect> lifeCollectList = lifeCollectMapper.selectList(wrapper);
+        List<LifeCoupon> lifeCoupons = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(lifeCollectList)) {
+            // 获取收藏的优惠券id
+            List<String> ids = lifeCollectList.stream().map(LifeCollect::getCouponId).collect(Collectors.toList());
+            QueryWrapper<LifeCoupon> queryWrapper = new QueryWrapper<>();
+            queryWrapper.in("id", ids).eq("delete_flag", 0).orderByDesc("created_time");
+            // 八大类分类
+            if (!StringUtils.isEmpty(businessSection)) {
+                queryWrapper.eq("store_type", businessSection);
+            }
+            // 关键词查询
+            if (!StringUtils.isEmpty(keyword)) {
+                queryWrapper.like("name", keyword);
+            }
+            lifeCoupons = lifeCouponMapper.selectList(queryWrapper);
+            // 设置团购券图片
+            List<String> imagesId = lifeCoupons.stream().map(LifeCoupon::getImagePath).collect(Collectors.toList());
+            if ( !CollectionUtils.isEmpty(imagesId) ){
+                QueryWrapper<StoreImg> imgQueryWrapper = new QueryWrapper<>();
+                imgQueryWrapper.in("id", imagesId);
+                List<StoreImg> storeImgs = storeImgMapper.selectList(imgQueryWrapper);
+                Map<String, List<StoreImg>> collect = storeImgs.stream().collect(Collectors.groupingBy(x -> String.valueOf(x.getId())));
+                lifeCoupons.forEach(coupon -> {
+                    String imgId = coupon.getImagePath().split(",")[0];
+                    if ( collect.containsKey(imgId) ){
+                        coupon.setImagePath(collect.get(imgId).get(0).getImgUrl());
+                    }
+                });
+            }
+        }
+        return R.data(ListToPage.setPage(lifeCoupons, page, size));
+    }
+
     @ApiOperation("添加收藏")
     @ApiOperationSupport(order = 2)
     @PostMapping("addCollect")
@@ -120,10 +230,16 @@ public class LifeCollectController {
             @RequestParam(value = "userId", required = false) String userId,
             @RequestParam(value = "storeId", required = false) String storeId,
             @RequestParam(value = "businessId", required = false) String businessId,
-            @RequestParam(value = "businessType", required = false) String businessType) {
+            @RequestParam(value = "businessType", required = false) String businessType,
+            @RequestParam(value = "couponId", required = false) String couponId) {
         log.info("LifeCollectController.cancelCollect?userId={},storeId={}", userId, storeId);
         LambdaUpdateWrapper<LifeCollect> wrapper = new LambdaUpdateWrapper<>();
         wrapper.eq(LifeCollect::getUserId, userId);
+        if(!StringUtils.isEmpty(storeId)) {
+            wrapper.eq(LifeCollect::getStoreId, storeId);
+        } else if (!StringUtils.isEmpty(couponId)){
+            wrapper.eq(LifeCollect::getCouponId, couponId);
+        }
         if (StringUtil.isBlank(businessType) && businessType.equals(1)) {
             wrapper.eq(LifeCollect::getBusinessId, businessId);
             wrapper.eq(LifeCollect::getBusinessType, businessType);

+ 7 - 4
alien-store/src/main/java/shop/alien/store/controller/LifeCouponController.java

@@ -41,14 +41,17 @@ public class LifeCouponController {
     @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页数", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "size", value = "页容", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "status", value = "状态", dataType = "Integer", paramType = "query", required = true)})
+            @ApiImplicitParam(name = "status", value = "状态", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "name", value = "名称", dataType = "Integer", paramType = "query", required = false)
+    })
     @GetMapping("/getCouponList")
     private R<IPage<LifeCoupon>> getCouponList(@RequestParam(value = "page", defaultValue = "1") int page,
                                                @RequestParam(value = "size", defaultValue = "10") int size,
                                                @RequestParam("storeId") String storeId,
-                                               @RequestParam("status") String status) {
-        log.info("LifeCouponController.getCouponList?page={},size={},storeId={},status={}", page, size, storeId, status);
-        return R.data(lifeCouponService.getCouponList(page, size, storeId, status));
+                                               @RequestParam("status") String status,
+                                               @RequestParam(value = "name",required = false) String name) {
+        log.info("LifeCouponController.getCouponList?page={},size={},storeId={},status={},name={}", page, size, storeId, status, name);
+        return R.data(lifeCouponService.getCouponList(page, size, storeId, status, name));
     }
 
     @ApiOperation("暂停恢复优惠券")

+ 49 - 3
alien-store/src/main/java/shop/alien/store/controller/LifeGroupPackageController.java

@@ -13,10 +13,12 @@ import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LifeCoupon;
 import shop.alien.entity.store.StoreGroupInfo;
+import shop.alien.entity.store.StoreHotelGroupRoomInfo;
 import shop.alien.entity.store.vo.LifeCouponVo;
 import shop.alien.entity.store.vo.LifeTuanGouParamVo;
 import shop.alien.mapper.LifeCouponMapper;
 import shop.alien.mapper.StoreGroupInfoMapper;
+import shop.alien.mapper.StoreHotelGroupRoomInfoMapper;
 import shop.alien.store.service.LifeCouponService;
 import shop.alien.store.service.LifeGroupPackageService;
 import shop.alien.util.common.ListToPage;
@@ -45,6 +47,8 @@ public class LifeGroupPackageController {
 
     private final StoreGroupInfoMapper storeGroupInfoMapper;
 
+    private final StoreHotelGroupRoomInfoMapper storeHotelGroupRoomInfoMapper;
+
     @ApiOperation("新建团购")
     @PostMapping("/addOrUpdateGroupPackage")
     public R<Boolean> addOrUpdateGroupPackage(@RequestBody LifeTuanGouParamVo lifeTuanGouParamVo) {
@@ -78,6 +82,20 @@ public class LifeGroupPackageController {
         return R.fail("失败");
     }
 
+    @ApiOperation("删除酒店团购")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "酒店团购主键id", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/deleteHotelGroupPackage")
+    public R<Boolean> deleteHotelGroupPackage(@RequestParam("id") Integer id) {
+        log.info("LifeGroupPackageController.deleteHotelGroupPackage?id={}", id);
+        if (lifeCouponService.removeById(id)) {
+            storeHotelGroupRoomInfoMapper.delete(new LambdaQueryWrapper<StoreHotelGroupRoomInfo>().eq(StoreHotelGroupRoomInfo::getGroupId, id));
+            return R.success("成功");
+        }
+        return R.fail("失败");
+    }
+
     /**
      * @param storeId
      * @param status  状态:-1.待审核  -2.已驳回  0.待使用(已通过), 1.已核销, 2.已过期, 3.待退款, 4.已退款
@@ -104,6 +122,27 @@ public class LifeGroupPackageController {
         return R.data(lifeGroupPackageService.getGroupPackageList(page, size, storeId, status, couponCode, name));
     }
 
+    @ApiOperation("酒店团购列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "页容", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "status", value = "状态", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "couponCode", value = "券id", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "name", value = "券名称", dataType = "String", paramType = "query")
+    })
+    @GetMapping("/getHotelGroupPackageList")
+    private R<IPage<LifeCouponVo>> getHotelGroupPackageList(
+            @RequestParam(defaultValue = "1") Integer page,
+            @RequestParam(defaultValue = "10") Integer size,
+            @RequestParam("storeId") String storeId,
+            @RequestParam("status") String status,
+            @RequestParam("couponCode") String couponCode,
+            @RequestParam("name") String name) {
+        log.info("LifeGroupPackageController.getHotelGroupPackageList?pageNum={},pageSize={},storeId={},status={}", storeId, status, page, size);
+        return R.data(lifeGroupPackageService.getHotelGroupPackageList(page, size, storeId, status, couponCode, name));
+    }
+
     @ApiOperation("暂停团购")
     @GetMapping("/updateGroupPackageStatus")
     public R<Boolean> updateGroupPackageStatus(@RequestParam("id") String id, @RequestParam("status") Integer status) {
@@ -116,9 +155,16 @@ public class LifeGroupPackageController {
 
     @ApiOperation("团购详情")
     @GetMapping("/getGroupPackageDetail")
-    private R<Map<String, Object>> getGroupPackageDetail(@RequestParam("id") String id) {
-        log.info("LifeGroupPackageController.getGroupPackageDetail?id={}", id);
-        return R.data(lifeGroupPackageService.getGroupPackageDetail(id));
+    private R<Map<String, Object>> getGroupPackageDetail(@RequestParam("id") String id, @RequestParam("userId") String userId) {
+        log.info("LifeGroupPackageController.getGroupPackageDetail?id={}&userId={}", id, userId);
+        return R.data(lifeGroupPackageService.getGroupPackageDetail(id,userId));
+    }
+
+    @ApiOperation("酒店团购详情")
+    @GetMapping("/getGroupHotelPackageDetail")
+    private R<Map<String, Object>> getGroupHotelPackageDetail(@RequestParam("id") String id, @RequestParam("userId") String userId) {
+        log.info("LifeGroupPackageController.getGroupHotelPackageDetail?id={}&userId={}", id, userId);
+        return R.data(lifeGroupPackageService.getGroupHotelPackageDetail(id,userId));
     }
 
     @ApiOperation("猜你喜欢")

+ 21 - 11
alien-store/src/main/java/shop/alien/store/controller/LifeMessageController.java

@@ -34,18 +34,28 @@ public class LifeMessageController {
     @ApiOperation("消息列表")
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "page", value = "分页页数", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "size", value = "分页条数", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "friendType", value = "好友类型 1-好友 2-好友以外", dataType = "Integer", paramType = "query")})
+            @ApiImplicitParam(name = "friendType", value = "聊天类型 1-聊过 2-未聊过", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "search", value = "搜索字段", dataType = "Integer", paramType = "query")})
     @GetMapping("/getMessageList")
-    public R<IPage<LifeMessageVo>> getMessageList(@RequestParam String receiverId, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size, int friendType) {
-        log.info("LifeMessageController.getMessageList?receiverId={}, page={}, size={}, friendType={}", receiverId, page, size, friendType);
-        return R.data(lifeMessageService.getMessageList(receiverId, page, size, friendType));
+    public R<List<LifeMessageVo>> getMessageList(@RequestParam String receiverId,
+                                                  @RequestParam int friendType,
+                                                  @RequestParam String search) {
+        log.info("LifeMessageController.getMessageList?receiverId={}, friendType={}, search={}", receiverId, friendType, search);
+        return R.data(lifeMessageService.getMessageList(receiverId, friendType, search));
+    }
+
+    @ApiOperation("未聊过的消息数据")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({@ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query")})
+    @GetMapping("/getStrangerMessageNum")
+    public R<LifeMessageVo> getStrangerMessageNum(@RequestParam String receiverId) {
+        log.info("LifeMessageController.getStrangerMessageNum?receiverId={}", receiverId);
+        return R.data(lifeMessageService.getStrangerMessageNum(receiverId));
     }
 
     @ApiOperation("未关注人的消息数据")
-    @ApiOperationSupport(order = 1)
+    @ApiOperationSupport(order = 3)
     @ApiImplicitParams({@ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query")})
     @GetMapping("/getNoFriendMessage")
     public R<LifeMessageVo> getNoFriendMessage(@RequestParam String receiverId) {
@@ -54,7 +64,7 @@ public class LifeMessageController {
     }
 
     @ApiOperation("消息详情")
-    @ApiOperationSupport(order = 2)
+    @ApiOperationSupport(order = 4)
     @ApiImplicitParams({@ApiImplicitParam(name = "当前登录人", value = "receiverId", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
     @GetMapping("/getMessageListByReceiverId")
     public R<List<LifeMessageVo>> getMessageListByReceiverId(@RequestParam String receiverId, @RequestParam String senderId) {
@@ -63,7 +73,7 @@ public class LifeMessageController {
     }
 
     @ApiOperation("消息已读")
-    @ApiOperationSupport(order = 3)
+    @ApiOperationSupport(order = 5)
     @ApiImplicitParams({@ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
     @GetMapping("/read")
     public R<Boolean> read(@RequestParam String receiverId, @RequestParam String senderId) {
@@ -73,7 +83,7 @@ public class LifeMessageController {
     }
 
     @ApiOperation("未读消息数量")
-    @ApiOperationSupport(order = 4)
+    @ApiOperationSupport(order = 6)
     @ApiImplicitParams({@ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query")})
     @GetMapping("/noReadCount")
     public R<Integer> noReadCount(@RequestParam String receiverId) {
@@ -82,7 +92,7 @@ public class LifeMessageController {
     }
 
     @ApiOperation("删除消息")
-    @ApiOperationSupport(order = 5)
+    @ApiOperationSupport(order = 7)
     @ApiImplicitParams({@ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query")})
     @GetMapping("/deleteMessageByPhoneId")
     public R<Integer> deleteMessageByPhoneId(@RequestParam String senderId, @RequestParam String receiverId) {

+ 9 - 9
alien-store/src/main/java/shop/alien/store/controller/LifeNoticeController.java

@@ -12,6 +12,8 @@ import shop.alien.entity.store.vo.LifeNoticeVo;
 import shop.alien.mapper.LifeNoticeMapper;
 import shop.alien.store.service.LifeNoticeService;
 
+import java.util.List;
+
 @Api(tags = {"一期-公告"})
 @Slf4j
 @RestController
@@ -27,15 +29,13 @@ public class LifeNoticeController {
     @GetMapping("/getNoticeByPhoneId")
     @ApiOperation("通知列表")
     @ApiOperationSupport(order = 1)
-    @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "分页页数", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "size", value = "分页条数", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query")})
-    public R<IPage<LifeNoticeVo>> getNoticeByPhoneId(@RequestParam String receiverId,
-                                                     @RequestParam(defaultValue = "0") int noticeType,
-                                                     @RequestParam(defaultValue = "1") int page,
-                                                     @RequestParam(defaultValue = "10") int size) {
-        log.info("LifeNoticeController.getNoticeByPhoneId?receiverId={},page={},size={}, noticeType={}", receiverId, page, size, noticeType);
-        return R.data(lifeNoticeService.getNoticeList(receiverId, noticeType, page, size));
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "noticeType", value = "0-系统通知和订单提醒之外的类型 1-系统通知 2-订单提醒", dataType = "Integer", paramType = "query")})
+    public R<List<LifeNoticeVo>> getNoticeByPhoneId(@RequestParam String receiverId,
+                                                    @RequestParam(defaultValue = "0") int noticeType) {
+        log.info("LifeNoticeController.getNoticeByPhoneId?receiverId={}, noticeType={}", receiverId, noticeType);
+        return R.data(lifeNoticeService.getNoticeList(receiverId, noticeType));
     }
 
     @GetMapping("/getSystemAndOrderNoticeSum")

+ 11 - 9
alien-store/src/main/java/shop/alien/store/controller/PlatformStoreCouponController.java

@@ -22,18 +22,20 @@ public class PlatformStoreCouponController {
 
     private final PlatformStoreCouponService platformStoreCouponService;
 
-    @ApiOperation("套餐列表")
+    @ApiOperation("套餐/代金券列表")
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "分页页数", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "size", value = "分页条数", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "storeName", value = "商家名称", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "createdTime", value = "商家名称", dataType = "Date", paramType = "query"),
-            @ApiImplicitParam(name = "status", value = "审核状态", dataType = "String", paramType = "query")})
+            @ApiImplicitParam(name = "createdTime", value = "创建时间", dataType = "Date", paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "审核状态", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "type", value = "类型   1-代金券  2-团购(套餐)", dataType = "String", paramType = "query")
+    })
     @GetMapping("/getCouponList")
-    public R<IPage<LifeCouponVo>> getCouponList(Integer page, Integer size, String storeName, String status, @RequestParam(value = "createdTime", required = false) String createdTime, String phone) {
-        log.info("PlatformStoreCouponController.getCouponList?page={},size={},name={},status={},createdTime={}", page, size, storeName, status, createdTime);
-        return R.data(platformStoreCouponService.getCouponList(page, size, storeName, status, createdTime, phone));
+    public R<IPage<LifeCouponVo>> getCouponList(Integer page, Integer size, String storeName, String status, @RequestParam(value = "createdTime", required = false) String createdTime, String phone, @RequestParam(defaultValue = "2") String type) {
+        log.info("PlatformStoreCouponController.getCouponList?page={},size={},name={},status={},createdTime={},type={}", page, size, storeName, status, createdTime, type);
+        return R.data(platformStoreCouponService.getCouponList(page, size, storeName, status, createdTime, phone, type));
     }
 
     /**
@@ -81,16 +83,16 @@ public class PlatformStoreCouponController {
         return platformStoreCouponService.deleteCouponStatus(id);
     }
 
-    @ApiOperation("套餐详情")
+    @ApiOperation("套餐/代金券详情")
     @ApiOperationSupport(order = 2)
     @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主键id", dataType = "Integer", paramType = "query", required = true)})
     @GetMapping("/getCouponById")
-    public R<LifeCoupon> getCouponById(Integer id) {
+    public R<LifeCouponVo> getCouponById(Integer id) {
         log.info("PlatformStoreCouponController.getCouponById?id={}", id);
         return R.data(platformStoreCouponService.getCouponById(id));
     }
 
-    @ApiOperation("套餐审核")
+    @ApiOperation("套餐/代金券审核")
     @ApiOperationSupport(order = 2)
     @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主键id", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "status", value = "状态", dataType = "String", paramType = "query"),

+ 12 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreGroupPackageController.java

@@ -38,4 +38,16 @@ public class StoreGroupPackageController {
             return R.fail(e.getMessage());
         }
     }
+
+    @ApiOperation("创建团购(酒店)-二期")
+    @PostMapping("/addHotelGroup")
+    public R<StoreGroupPackageVO> addHotelGroup(@RequestBody StoreGroupPackageVO storeGroupPackageVO) {
+        log.info("StoreGroupPackageController.addHotelGroup,storeGroupPackageVO={}", storeGroupPackageVO.toString());
+        try {
+            StoreGroupPackageVO packageVO = storeGroupPackageService.addHotelGroup(storeGroupPackageVO);
+            return R.data(packageVO);
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
 }

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

@@ -29,19 +29,19 @@ public class UserStoreController {
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "分页页数", dataType = "String", paramType = "query", required = true),
             @ApiImplicitParam(name = "size", value = "分页条数", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "storeType", value = "storeType", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "storeType", value = "storeType", dataType = "Integer", paramType = "query"),
             @ApiImplicitParam(name = "storeName", value = "storeName", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "distance", value = "distance", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "distance", value = "distance", dataType = "Integer", paramType = "query"),
             @ApiImplicitParam(name = "jingdu", value = "jingdu", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "weidu", value = "weidu", dataType = "String", paramType = "query")})
     @GetMapping("/getStoreList")
     public R<IPage<Map<String, Object>>> getStoreList(@RequestParam("storeType") String storeType,
                                                       @RequestParam("storeName") String storeName,
-                                                      @RequestParam("distance") String distance,
+                                                      @RequestParam("distance") Integer distance,
                                                       @RequestParam("jingdu") String jingdu,
                                                       @RequestParam("weidu") String weidu,
-                                                      @RequestParam(value = "page", defaultValue = "1") int page,
-                                                      @RequestParam(value = "size", defaultValue = "10") int size) {
+                                                      @RequestParam(value = "page", defaultValue = "1") Integer page,
+                                                      @RequestParam(value = "size", defaultValue = "10") Integer size) {
         log.info("LifeUserStoreController.getStoreList?page={},size={},storeType={},storeName={},distance={},jingdu={},weidu={}", page, size, storeType, storeName, distance, jingdu, weidu);
         List<Map<String, Object>> result = lifeUserStoreService.getStoreList(storeType, storeName, distance, jingdu, weidu, page, size);
         return R.data(ListToPage.setPage(result, page, size));

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

@@ -13,7 +13,7 @@ public interface LifeCouponService extends IService<LifeCoupon> {
 
     boolean addOrUpdateCoupon(LifeCoupon lifeCoupon);
 
-    IPage<LifeCoupon> getCouponList(int page, int size, String storeId, String status);
+    IPage<LifeCoupon> getCouponList(int page, int size, String storeId, String status, String name);
 
     int updateCoupon(String id, Integer status);
 

+ 7 - 1
alien-store/src/main/java/shop/alien/store/service/LifeGroupPackageService.java

@@ -15,10 +15,16 @@ public interface LifeGroupPackageService extends IService<LifeGroupPackage> {
 
     int addOrUpdateGroupPackage(LifeTuanGouParamVo lifeTuanGouParamVo);
 
+    int addOrUpdateHotelGroupPackage(LifeTuanGouParamVo lifeTuanGouParamVo);
+
     IPage<LifeCouponVo> getGroupPackageList(Integer pageNum, Integer pageSize, String storeId, String status, String couponCode, String name);
 
+    IPage<LifeCouponVo> getHotelGroupPackageList(Integer pageNum, Integer pageSize, String storeId, String status, String couponCode, String name);
+
     int updateGroupPackageStatus(String id, Integer status);
 
-    Map<String, Object> getGroupPackageDetail(String id);
+    Map<String, Object> getGroupPackageDetail(String id, String userId);
+
+    Map<String, Object> getGroupHotelPackageDetail(String id, String userId);
 
 }

+ 5 - 1
alien-store/src/main/java/shop/alien/store/service/LifeMessageService.java

@@ -9,7 +9,9 @@ import java.util.List;
 
 public interface LifeMessageService extends IService<LifeMessage> {
 
-    IPage<LifeMessageVo> getMessageList(String receiverId, int page, int size, int friendType);
+    List<LifeMessageVo> getMessageList(String receiverId, int friendType, String search);
+
+    LifeMessageVo getStrangerMessageNum(String receiverId);
 
     LifeMessageVo getNoFriendMessageNum(String receiverId);
 
@@ -20,4 +22,6 @@ public interface LifeMessageService extends IService<LifeMessage> {
     int noReadCount(String receiverId);
 
     int deleteMessageByPhoneId(String senderId, String receiverId);
+
+    boolean notDisturb(String receiverId, int disturbId, int type);
 }

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

@@ -6,9 +6,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import shop.alien.entity.store.LifeNotice;
 import shop.alien.entity.store.vo.LifeNoticeVo;
 
+import java.util.List;
+
 public interface LifeNoticeService extends IService<LifeNotice> {
 
-    IPage<LifeNoticeVo> getNoticeList(String receiverId, int noticeType, int page, int size);
+    List<LifeNoticeVo> getNoticeList(String receiverId, int noticeType);
 
     JSONObject getSystemAndOrderNoticeSum(String receiverId);
 

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

@@ -390,7 +390,7 @@ public class LifeStoreService {
         return storeImgService.update(null, updateWrapper);
     }
 
-    // TODO 效率太低,想办法通过sql直接查询。 通过在循环外查询初步优化
+
     private void filterBlocked(String fansId, IPage<LifeFansVo> myFollowed) {
 
         // 判断自己的拉黑type

+ 60 - 9
alien-store/src/main/java/shop/alien/store/service/LifeUserStoreService.java

@@ -47,6 +47,8 @@ public class LifeUserStoreService {
 
     private final GaoDeMapUtil gaoDeMapUtil;
 
+    private final StoreClockInService storeClockInService;
+
     /**
      * 门店列表
      *
@@ -59,63 +61,95 @@ public class LifeUserStoreService {
      * @param size      页容
      * @return 门店列表
      */
-    public List<Map<String, Object>> getStoreList(String storeType, String storeName, String distance, String jingdu, String weidu, int page, int size) {
+    public List<Map<String, Object>> getStoreList(String storeType, String storeName, Integer distance, String jingdu, String weidu, int page, int size) {
         try {
+            // 初始化返回结果列表
             List<Map<String, Object>> returnMaps = new ArrayList<>();
+            // 构建查询条件对象
             QueryWrapper<StoreInfoVo> wrapper = new QueryWrapper<>();
-            wrapper.eq(!storeType.isEmpty(), "a.store_type", storeType);
+            // 添加门店类型筛选条件()
+//            wrapper.in(null != storeType, "a.business_section", storeType);
+            // 添加门店名称或相关菜品名称模糊搜索条件
             wrapper.like(!storeName.isEmpty(), "a.store_name", storeName).or().like(!storeName.isEmpty(), "c.dish_name", storeName);
+            // 过滤已删除的门店
             wrapper.eq("a.delete_flag", 0);
-            wrapper.eq("a.business_section", 1);
+            // 过滤非营业中的门店
+            wrapper.in(null != storeType && !"".equals(storeType), "a.business_section", Arrays.asList(storeType.split(",")));
             // 过滤掉永久关门的店铺
             wrapper.ne("a.business_status", 99);
+            // 根据构建的条件查询门店信息
             List<StoreInfoVo> storeInfoVoList = storeInfoMapper.getStoreInfoVoList(wrapper);
+            // 如果查询结果为空,则直接返回空列表
             if (storeInfoVoList.isEmpty()) {
                 return returnMaps;
             }
+            // 提取所有符合条件的门店ID
             List<Integer> storeIds = storeInfoVoList.stream().map(StoreInfoVo::getId).collect(Collectors.toList());
+            // 构建查询优惠券的条件对象
             LambdaUpdateWrapper<LifeCoupon> quanWrapper = new LambdaUpdateWrapper<>();
+            // 添加门店ID筛选条件
             quanWrapper.in(LifeCoupon::getStoreId, storeIds)
+                    // 添加优惠券状态筛选条件
                     .eq(LifeCoupon::getStatus, 1)
+                    // 按照创建时间降序排序
                     .orderByDesc(LifeCoupon::getCreatedTime);
+            // 查询符合条件的优惠券列表
             List<LifeCoupon> quanList = lifeCouponMapper.selectList(quanWrapper);
             // 获取全部店铺的评分与平均花销
             Map<Object, List<Map<String, Object>>> avgScoreMap = storeEvaluationMapper.allStoreAvgScore().stream().collect(Collectors.groupingBy(o -> o.get("store_id")));
-
+            // 获取用户订单信息,用于计算平均消费
             Map<Object, List<Map<String, Object>>> avgPriceMap = lifeUserOrderMapper.allStoreAvgPrice().stream().collect(Collectors.groupingBy(o -> o.get("store_id")));
-
+            // 获取所有店铺的打卡次数
+            List<Map<Integer, Integer>> storeClockInCountList = storeClockInService.getStoreClockInCount();
+            // 遍历所有门店信息,构造返回结果
             for (StoreInfoVo store : storeInfoVoList) {
                 Map<String, Object> storeMap = new HashMap<>();
+                // 如果用户提供了经纬度信息,则计算并添加门店到用户的距离
                 if ((jingdu != null && !jingdu.isEmpty()) && (weidu != null && !weidu.isEmpty())) {
                     double storeJing = Double.parseDouble(store.getStorePosition().split(",")[0]);
                     double storeWei = Double.parseDouble(store.getStorePosition().split(",")[1]);
                     double storeDistance = DistanceUtil.haversineCalculateDistance(Double.parseDouble(jingdu), Double.parseDouble(weidu), storeJing, storeWei);
                     storeMap.put("distance", storeDistance);
                 } else {
+                    // 否则,返回提示信息
                     storeMap.put("distance", "没有位置信息");
                 }
+                // 添加门店的业务状态及其描述
                 storeMap.put("businessStatus", store.getBusinessStatus());
                 storeMap.put("businessStatusStr", store.getBusinessStatusStr());
+                // 添加门店ID
                 storeMap.put("storeId", store.getId());
+                // 如果存在评分数据,则添加评分、平均消费及评价总数
                 if (avgScoreMap.containsKey(String.valueOf(store.getId()))) {
                     storeMap.put("avgScore", avgScoreMap.get(String.valueOf(store.getId())).get(0).get("avg_score"));
                     storeMap.put("avgPrice", avgPriceMap.get(String.valueOf(store.getId())).get(0).get("avg_price"));
-                    //条数
+                    // 条数
                     storeMap.put("totalNum", avgScoreMap.get(String.valueOf(store.getId())).get(0).get("total_num"));
                 } else {
+                    // 否则,设置默认值
                     storeMap.put("avgScore", 0);
                     storeMap.put("avgPrice", 0);
                     storeMap.put("totalNum", 0);
-
                 }
+                // 添加门店名称
                 storeMap.put("storeName", store.getStoreName());
+                // 添加门店地址
                 storeMap.put("storeAddress", store.getStoreAddress());
+                // 添加门店类型
                 storeMap.put("storeType", store.getStoreType());
+                // 添加门店入口图片
                 storeMap.put("entranceImage", store.getEntranceImage());
+                // 添加门店图片
                 storeMap.put("storeImage", store.getImgUrl());
+                // 解析并添加门店经纬度
+                String[] position = store.getStorePosition().split(",");
+                storeMap.put("longitude", position.length == 2 ? position[0] : "");
+                storeMap.put("latitude", position.length == 2 ? position[1] : "");
+                // 构造该门店的优惠券列表
                 List<Map<String, Object>> quanMapList = new ArrayList<>();
                 if (!quanList.isEmpty()) {
                     for (LifeCoupon quan : quanList) {
+                        // 如果优惠券的门店ID与当前门店ID匹配,则添加到优惠券列表中
                         if (store.getId().toString().equals(quan.getStoreId())) {
                             Map<String, Object> quanMap = new HashMap<>();
                             quanMap.put("quanType", quan.getType());
@@ -127,13 +161,28 @@ public class LifeUserStoreService {
                             quanMapList.add(quanMap);
                         }
                     }
+                    // 将优惠券列表添加到门店信息中
                     storeMap.put("quanList", quanMapList);
                 }
+                // 添加门店类型的描述
                 storeMap.put("storeTypeStr", store.getStoreTypeStr());
+                // 遍历打卡次数列表,找到当前门店的打卡次数并添加到门店信息中
+                storeClockInCountList.forEach(b -> {
+                    Integer storeId = b.get("storeId");
+                    if (Objects.equals(storeId, store.getId())) {
+                        storeMap.put("storeClockInCount", b.get("count"));
+                    }
+                });
+                // 如果未找到打卡次数,则设置为0
+                if (null == storeMap.get("storeClockInCount")) {
+                    storeMap.put("storeClockInCount", 0);
+                }
+                // 将当前门店的信息添加到返回结果列表中
                 returnMaps.add(storeMap);
             }
-            if (distance != null && !distance.isEmpty()) {
-                double maxDistance = Double.parseDouble(distance);
+            // 如果用户提供了距离阈值,则根据距离过滤结果,并按距离升序排序
+            if (distance != null) {
+                double maxDistance = distance;
                 returnMaps = returnMaps.stream()
                         .filter(storeMap -> {
                             Object distanceObj = storeMap.get("distance");
@@ -146,8 +195,10 @@ public class LifeUserStoreService {
                         .sorted(Comparator.comparingDouble(storeMap -> (double) storeMap.get("distance")))
                         .collect(Collectors.toList());
             }
+            // 返回最终结果列表
             return returnMaps;
         } catch (Exception e) {
+            // 捕获并抛出运行时异常
             throw new RuntimeException(e);
         }
     }

+ 3 - 5
alien-store/src/main/java/shop/alien/store/service/PlatformStoreCouponService.java

@@ -8,17 +8,15 @@ import java.io.IOException;
 
 public interface PlatformStoreCouponService {
 
-    IPage<LifeCouponVo> getCouponList(Integer page, Integer size, String storeName, String status, String createdTime, String phone);
+    IPage<LifeCouponVo> getCouponList(Integer page, Integer size, String storeName, String status, String createdTime, String phone, String type);
 
     IPage<LifeCouponVo> getCouponStatusList(Integer page, Integer size, String status, String expiredState);
 
-    LifeCoupon getCouponById(Integer id);
+    LifeCouponVo getCouponById(Integer id);
 
     int approvalCoupon(Integer id, Integer status, String comment);
 
-    String couponStatusExport(String status, String expiredState) throws IOException;
-
-    ;
+    String couponStatusExport(String status, String expiredState) throws IOException;;
 
     int deleteCouponStatus(Integer id);
 }

+ 4 - 1
alien-store/src/main/java/shop/alien/store/service/StoreClockInService.java

@@ -5,6 +5,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import shop.alien.entity.store.StoreClockIn;
 import shop.alien.entity.store.vo.StoreClockInVo;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * <p>
  * 店铺打卡 服务类
@@ -25,5 +28,5 @@ public interface StoreClockInService extends IService<StoreClockIn> {
 
     int setImg(int id, String img);
 
-
+    List<Map<Integer, Integer>> getStoreClockInCount();
 }

+ 9 - 0
alien-store/src/main/java/shop/alien/store/service/StoreGroupPackageService.java

@@ -21,4 +21,13 @@ public interface StoreGroupPackageService extends IService<StoreGroupPackage> {
      * @return 创建结果
      */
     StoreGroupPackageVO addGroup(StoreGroupPackageVO storeGroupPackageVO);
+
+
+    /**
+     * 创建酒店团购套餐
+     *
+     * @param storeGroupPackageVO 酒店团购套餐信息
+     * @return 创建结果
+     */
+    StoreGroupPackageVO addHotelGroup(StoreGroupPackageVO storeGroupPackageVO);
 }

+ 14 - 13
alien-store/src/main/java/shop/alien/store/service/impl/LifeCouponServiceImpl.java

@@ -74,18 +74,18 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
             lifeCoupon.setDiscountTagName(String.join(",", businessTypeNames));
         }
 
-        int status = 0;
-        Date now = new Date();
-        Date startDate = lifeCoupon.getStartDate();
-        Date endDate = lifeCoupon.getEndDate();
-        if (now.compareTo(startDate) >= 0 && now.compareTo(endDate) <= 0) {
-            status = 1;
-        } else if (now.compareTo(startDate) < 0) {
-            status = 0;
-        } else if (now.compareTo(endDate) >= 0) {
-            status = 3;
-        }
-        lifeCoupon.setStatus(status);
+//        int status = 0;
+//        Date now = new Date();
+//        Date startDate = lifeCoupon.getStartDate();
+//        Date endDate = lifeCoupon.getEndDate();
+//        if (now.compareTo(startDate) >= 0 && now.compareTo(endDate) <= 0) {
+//            status = 1;
+//        } else if (now.compareTo(startDate) < 0) {
+//            status = 0;
+//        } else if (now.compareTo(endDate) >= 0) {
+//            status = 3;
+//        }
+        lifeCoupon.setStatus(-1);
         if (StringUtils.isEmpty(lifeCoupon.getId())) {
             lifeCoupon.setType(1);
             lifeCoupon.setCouponCode(UniqueRandomNumGenerator.generateUniqueCode(12));
@@ -96,10 +96,11 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
     }
 
     @Override
-    public IPage<LifeCoupon> getCouponList(int page, int size, String storeId, String status) {
+    public IPage<LifeCoupon> getCouponList(int page, int size, String storeId, String status, String name) {
         LambdaUpdateWrapper<LifeCoupon> wrapper = new LambdaUpdateWrapper<>();
         wrapper.eq(storeId != null && !storeId.isEmpty(), LifeCoupon::getStoreId, storeId);
         wrapper.eq(status != null && !status.isEmpty(), LifeCoupon::getStatus, status);
+        wrapper.like(name != null && !name.isEmpty(), LifeCoupon::getName, name);
         wrapper.eq(LifeCoupon::getType, 1);
         wrapper.orderByDesc(LifeCoupon::getCreatedTime);
         IPage<LifeCoupon> lifeCouponIPage = new Page<>(page, size);

+ 8 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LifeDiscountCouponServiceImpl.java

@@ -158,6 +158,14 @@ public class LifeDiscountCouponServiceImpl extends ServiceImpl<LifeDiscountCoupo
         LifeDiscountCoupon lifeDiscountCoupon = lifeDiscountCouponMapper.selectById(counponId);
         lifeDiscountCoupon.setGetStatus(lifeDiscountCoupon.getGetStatus() == Integer.parseInt(DiscountCouponEnum.NO_GET.getValue())
                 ? Integer.parseInt(DiscountCouponEnum.CAN_GET.getValue()) : Integer.parseInt(DiscountCouponEnum.NO_GET.getValue()));
+        Date now = new Date();
+        Instant instant = now.toInstant();
+        ZoneId zoneId = ZoneId.systemDefault();
+        LocalDate localNow = instant.atZone(zoneId).toLocalDate();
+        if (localNow.compareTo(lifeDiscountCoupon.getStartDate()) < 0) {
+            lifeDiscountCoupon.setStartDate(localNow);
+            lifeDiscountCoupon.setGetStatus(Integer.parseInt(DiscountCouponEnum.CAN_GET.getValue()));
+        }
         lifeDiscountCouponMapper.updateById(lifeDiscountCoupon);
         return true;
     }

+ 0 - 2
alien-store/src/main/java/shop/alien/store/service/impl/LifeDiscountCouponStoreFriendServiceImpl.java

@@ -181,7 +181,6 @@ public class LifeDiscountCouponStoreFriendServiceImpl extends ServiceImpl<LifeDi
                 lifeDiscountCoupon.setSingleQty(lifeDiscountCoupon.getSingleQty() - couponDto.getSingleQty());
                 // 更新数据库中的优惠券库存信息
                 lifeDiscountCouponMapper.updateById(lifeDiscountCoupon);
-                // TODO 发送优惠券发放成功的通知
             }
             // 如果所有优惠券都成功处理,返回 true
             return true;
@@ -317,7 +316,6 @@ public class LifeDiscountCouponStoreFriendServiceImpl extends ServiceImpl<LifeDi
             lifeNotice.setNoticeType(1);
             lifeNoticeMapper.insert(lifeNotice);
 
-            // TODO 加系统消息通知给用户
         }
         // 返回成功发放的优惠券信息列表
         return result;

+ 226 - 4
alien-store/src/main/java/shop/alien/store/service/impl/LifeGroupPackageServiceImpl.java

@@ -15,6 +15,7 @@ import shop.alien.entity.store.vo.LifeCouponVo;
 import shop.alien.entity.store.vo.LifeTuanGouParamVo;
 import shop.alien.mapper.*;
 import shop.alien.store.service.LifeGroupPackageService;
+import shop.alien.store.util.GroupConstant;
 import shop.alien.util.common.UniqueRandomNumGenerator;
 import shop.alien.util.common.constant.DiscountCouponEnum;
 
@@ -46,6 +47,8 @@ public class LifeGroupPackageServiceImpl extends ServiceImpl<LifeGroupPackageMap
     private final StoreInfoMapper storeInfoMapper;
     private final StoreGroupInfoMapper storeGroupInfoMapper;
     private final StoreImgMapper storeImgMapper;
+    private final StoreHotelGroupRoomInfoMapper storeHotelGroupRoomInfoMapper;
+    private final LifeCollectMapper lifeCollectMapper;
 
 
     @Override
@@ -185,6 +188,133 @@ public class LifeGroupPackageServiceImpl extends ServiceImpl<LifeGroupPackageMap
         }
     }
 
+
+    @Override
+    public int addOrUpdateHotelGroupPackage(LifeTuanGouParamVo lifeTuanGouParamVo) {
+        LifeCoupon lifeCoupon = lifeTuanGouParamVo.getTuangou();
+        List<StoreHotelGroupRoomInfo> storeHotelGroupRoomInfoList = lifeTuanGouParamVo.getTuangouHotelRoomList();
+
+        if (StringUtils.isEmpty(lifeCoupon.getId())) {
+            lifeCoupon.setType(GroupConstant.LIFE_GROUP_TYPE);
+            lifeCoupon.setStatus(GroupConstant.LIFE_COUPON_STATUS_PENDING_APPROVAL);
+            lifeCoupon.setCouponCode(UniqueRandomNumGenerator.generateUniqueCode(12));
+            int ret = lifeCouponMapper.insert(lifeCoupon);
+            if (ret == 0) {
+                return 0;
+            }
+
+            if (!storeHotelGroupRoomInfoList.isEmpty()) {
+                for (StoreHotelGroupRoomInfo storeHotelGroupRoomInfos : storeHotelGroupRoomInfoList) {
+                    if (StringUtils.isEmpty(storeHotelGroupRoomInfos.getId())) {
+                        storeHotelGroupRoomInfos.setGroupId(lifeCoupon.getId());
+                        storeHotelGroupRoomInfoMapper.insert(storeHotelGroupRoomInfos);
+                    }
+                }
+            }
+            return ret;
+        } else {
+            //状态变更为待审核
+            lifeCoupon.setStatus(GroupConstant.LIFE_COUPON_STATUS_PENDING_APPROVAL);
+            int ret = lifeCouponMapper.updateById(lifeCoupon);
+            if (ret == 0) {
+                return 0;
+            }
+            // 添加保价逻辑
+            // 查询
+            LifeCoupon lifeCouponById = lifeCouponMapper.selectById(lifeCoupon.getId());
+            // 当用户购买该团购,并且在开启保价
+            if (lifeCouponById.getOpenPriceProtection() != null && lifeCouponById.getPriceBelow() != null && lifeCouponById.getCouponComp() != null && lifeCouponById.getCouponCompDate() != null && lifeCouponById.getOpenPriceProtection() > 0) {
+                // 查询购买这个团购的用户订单
+                LambdaUpdateWrapper<LifeUserOrder> wrapper = new LambdaUpdateWrapper<>();
+                wrapper.eq(LifeUserOrder::getQuanId, lifeCouponById.getId());
+                List<LifeUserOrder> lifeUserOrders = lifeUserOrderMapper.selectList(wrapper);
+                if (!lifeUserOrders.isEmpty()) {
+                    // 在保价有效期内
+                    // 七天前的时间
+                    LocalDateTime sevenDaysAgo = LocalDateTime.now().minusDays(7);
+                    for (LifeUserOrder lifeUserOrder : lifeUserOrders) {
+                        Date createdTime = lifeUserOrder.getCreatedTime();
+                        LocalDateTime orderCreatedTime = createdTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+                        if (orderCreatedTime.isAfter(sevenDaysAgo)) {
+                            // 商家修改的价格
+                            String price = lifeCoupon.getPrice();
+                            BigDecimal decimalPrice = new BigDecimal(price);
+                            // 用户购买时价格
+                            String userPrice = lifeUserOrder.getPrice();
+                            BigDecimal decimalUserPrice = new BigDecimal(userPrice);
+                            // 商户修改价格 低于最开始规定的降价范围时,触发保价服务
+                            // 计算差值,并取绝对值
+                            BigDecimal priceDifference = decimalPrice.subtract(decimalUserPrice).abs();
+
+                            // 将lifeCouponById.getPriceBelow() 转换为 BigDecimal
+                            BigDecimal priceBelow = BigDecimal.valueOf(lifeCouponById.getPriceBelow());
+
+                            // 商户修改价格 低于最开始规定的降价范围时,触发保价服务
+                            if (priceDifference.compareTo(priceBelow) > 0) {                                // 给对应用户添加这个商家的优惠券 发送通知
+                                // 优惠券
+                                LifeDiscountCoupon newLifeCoupon = new LifeDiscountCoupon();
+                                newLifeCoupon.setName("价保补偿优惠券");
+                                newLifeCoupon.setStoreId(lifeCouponById.getStoreId());
+                                newLifeCoupon.setNominalValue(new BigDecimal(lifeCouponById.getCouponComp()));
+                                // 待定 有效期
+                                newLifeCoupon.setExpirationDate(lifeCouponById.getCouponCompDate());
+                                newLifeCoupon.setStartDate(LocalDate.now());
+                                // 设置结束日期为当前时间加上有效期
+                                newLifeCoupon.setEndDate(LocalDate.now().plusDays(lifeCouponById.getCouponCompDate()));
+                                newLifeCoupon.setSingleQty(1);
+                                newLifeCoupon.setType(1);
+                                newLifeCoupon.setCreatedTime(new Date());
+                                if (lifeDiscountCouponMapper.insert(newLifeCoupon) > 0) {
+                                    // 把优惠券分给对应用户
+                                    // 获取刚刚插入的优惠券的 ID
+                                    Integer couponId = newLifeCoupon.getId();
+                                    // 根据 ID 查询刚刚插入的优惠券
+                                    LifeDiscountCoupon insertedCoupon = lifeDiscountCouponMapper.selectById(couponId);
+
+                                    // 把优惠券分给对应用户
+                                    LifeDiscountCouponUser lifeDiscountCouponUser = new LifeDiscountCouponUser();
+                                    // 设置该优惠券记录的优惠券 ID
+                                    lifeDiscountCouponUser.setCouponId(insertedCoupon.getId());
+                                    // 设置该优惠券记录的用户 ID 为当前用户 ID
+                                    lifeDiscountCouponUser.setUserId(Integer.valueOf(lifeUserOrder.getUserId()));
+                                    // 设置该优惠券的领取时间为当前时间
+                                    lifeDiscountCouponUser.setReceiveTime(new Date());
+                                    // 设置该优惠券的过期时间为优惠券本身的结束日期
+                                    lifeDiscountCouponUser.setExpirationTime(insertedCoupon.getEndDate());
+                                    // 设置该优惠券的状态为待使用
+                                    lifeDiscountCouponUser.setStatus(Integer.parseInt(DiscountCouponEnum.WAITING_USED.getValue()));
+                                    // 将该用户优惠券记录插入到数据库中
+                                    if (lifeDiscountCouponUserMapper.insert(lifeDiscountCouponUser) > 0) {
+                                        // 发送通知
+                                        LifeNotice lifeMessage = new LifeNotice();
+                                        LifeUser lifeUser = lifeUserMapper.selectById(lifeUserOrder.getUserId());
+                                        lifeMessage.setReceiverId("user_" + lifeUser.getUserPhone());
+                                        String text = "您的编号为" + lifeUserOrder.getOrderNo() + "的订单降价了,平台已为您发放优惠价补偿,现已发放至您的的优惠券中,快去查收吧";
+                                        lifeMessage.setContext(text);
+                                        lifeMessage.setSenderId("system");
+                                        lifeMessage.setIsRead(0);
+                                        lifeMessage.setNoticeType(2);
+                                        lifeNoticeMapper.insert(lifeMessage);
+                                    }
+                                }
+                            }
+                        }
+
+                    }
+                }
+
+            }
+
+            LambdaUpdateWrapper<StoreHotelGroupRoomInfo> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(StoreHotelGroupRoomInfo::getGroupId, lifeCoupon.getId());
+            storeHotelGroupRoomInfoList.stream().forEach(RoomInfoList -> {
+                RoomInfoList.setGroupId(lifeCoupon.getId());
+                storeHotelGroupRoomInfoMapper.updateById(RoomInfoList);
+            });
+            return ret;
+        }
+    }
+
     @Override
     public IPage<LifeCouponVo> getGroupPackageList(Integer pageNum, Integer pageSize, String storeId, String status, String couponCode, String name) {
         IPage<LifeCouponVo> iPage = new Page<>(pageNum, pageSize);
@@ -226,6 +356,46 @@ public class LifeGroupPackageServiceImpl extends ServiceImpl<LifeGroupPackageMap
     }
 
     @Override
+    public IPage<LifeCouponVo> getHotelGroupPackageList(Integer pageNum, Integer pageSize, String storeId, String status, String couponCode, String name) {
+        IPage<LifeCouponVo> iPage = new Page<>(pageNum, pageSize);
+        QueryWrapper<LifeCouponVo> wrapper = new QueryWrapper<>();
+        wrapper.eq(StringUtils.isNotEmpty(storeId), "coupon.store_id ", storeId)
+                .eq("coupon.type", 2)
+                .eq("coupon.delete_flag", 0)
+                .and(StringUtils.isNotEmpty(couponCode) || StringUtils.isNotEmpty(name), wq -> wq.like(StringUtils.isNotEmpty(couponCode), "coupon.coupon_code", couponCode)
+                        .or()
+                        .like(StringUtils.isNotEmpty(name), "coupon.name", name))
+                .orderByDesc("coupon.created_time");
+        if (StringUtils.isNotEmpty(status)) {
+            if (status.equals("0")) {
+                wrapper.ge("coupon.status", 0);
+            } else if (status.equals("2")) {
+                wrapper.in("coupon.status", Arrays.asList(0, 2));
+            } else {
+                wrapper.eq("coupon.status", status);
+            }
+        }
+        IPage<LifeCouponVo> groupPackageList = lifeCouponMapper.getGroupPackageList(iPage, wrapper);
+        for (LifeCouponVo record : groupPackageList.getRecords()) {
+            record.setStoreHotelGroupRoomInfos(storeHotelGroupRoomInfoMapper.selectList(new LambdaQueryWrapper<StoreHotelGroupRoomInfo>().eq(StoreHotelGroupRoomInfo::getGroupId, record.getId())));
+            if (StringUtils.isNotEmpty(record.getUploadedPiclist())) {
+                List<String> collect = Arrays.stream(record.getUploadedPiclist().split(","))
+                        .map(String::trim)
+                        .collect(Collectors.toList());
+                List<StoreImg> storeImgs = storeImgMapper.selectList(new LambdaQueryWrapper<StoreImg>().in(StoreImg::getId, collect));
+                if (storeImgs!=null) {
+                    String imgs = storeImgs.stream()
+                            .map(StoreImg::getImgUrl)
+                            .collect(Collectors.joining(","));
+                    record.setImgs(imgs);
+                }
+            }
+        }
+        return groupPackageList;
+    }
+
+
+    @Override
     public int updateGroupPackageStatus(String id, Integer status) {
         LifeCoupon lifeCoupon = new LifeCoupon();
         lifeCoupon.setId(id);
@@ -234,7 +404,7 @@ public class LifeGroupPackageServiceImpl extends ServiceImpl<LifeGroupPackageMap
     }
 
     @Override
-    public Map<String, Object> getGroupPackageDetail(String id) {
+    public Map<String, Object> getGroupPackageDetail(String id, String userId) {
         Map<String, Object> returnMap = new HashMap<>();
         LifeCoupon tuangou = lifeCouponMapper.selectById(id);
         LambdaUpdateWrapper<LifeGroupPackage> updateWrapper = new LambdaUpdateWrapper<>();
@@ -242,6 +412,8 @@ public class LifeGroupPackageServiceImpl extends ServiceImpl<LifeGroupPackageMap
         List<LifeGroupPackage> tuangouPackageList = lifeGroupPackageMapper.selectList(updateWrapper);
         Map<String, List<LifeGroupPackage>> groupedPackages = tuangouPackageList.stream().collect(Collectors.groupingBy(LifeGroupPackage::getGroupName));
         List<Map<String, Object>> resultList = new ArrayList<>();
+        // 是否收藏了该团购
+        LifeCollect lifeCollect = lifeCollectMapper.selectOne(new QueryWrapper<LifeCollect>().eq("user_id", userId).eq("coupon_id", id));
         for (Map.Entry<String, List<LifeGroupPackage>> entry : groupedPackages.entrySet()) {
             String groupName = entry.getKey();
             List<LifeGroupPackage> packageList = entry.getValue();
@@ -252,7 +424,7 @@ public class LifeGroupPackageServiceImpl extends ServiceImpl<LifeGroupPackageMap
 
                 packageMap.put("qty", pkg.getQty());
                 packageMap.put("price", pkg.getPrice());
-                packageMap.put("unit", pkg.getUnit());
+                packageMap.put("unit",pkg.getUnit());
                 packageListFormatted.add(packageMap);
             }
             Map<String, Object> groupMap = new HashMap<>();
@@ -271,14 +443,19 @@ public class LifeGroupPackageServiceImpl extends ServiceImpl<LifeGroupPackageMap
         lifeCouponVo.setStoreName(storeUser.getStoreName());
 
         LifeCouponVo tuangouVO = new LifeCouponVo();
-        BeanUtils.copyProperties(tuangou, tuangouVO);
+        BeanUtils.copyProperties(tuangou,tuangouVO);
+
+        tuangouVO.setIsCollect("0");
+        if(!Objects.isNull(lifeCollect)){
+            tuangouVO.setIsCollect("1");
+        }
 
         if (StringUtils.isNotEmpty(tuangou.getUploadedPiclist())) {
             List<String> collect = Arrays.stream(tuangou.getUploadedPiclist().split(","))
                     .map(String::trim)
                     .collect(Collectors.toList());
             List<StoreImg> storeImgs = storeImgMapper.selectList(new LambdaQueryWrapper<StoreImg>().in(StoreImg::getId, collect));
-            if (storeImgs != null) {
+            if (storeImgs!=null) {
                 String imgs = storeImgs.stream()
                         .map(StoreImg::getImgUrl)
                         .collect(Collectors.joining(","));
@@ -291,4 +468,49 @@ public class LifeGroupPackageServiceImpl extends ServiceImpl<LifeGroupPackageMap
         returnMap.put("tuangouPackageList", resultList);
         return returnMap;
     }
+
+    @Override
+    public Map<String, Object> getGroupHotelPackageDetail(String id, String userId) {
+        Map<String, Object> returnMap = new HashMap<>();
+        LifeCoupon tuangou = lifeCouponMapper.selectById(id);
+        LambdaUpdateWrapper<StoreHotelGroupRoomInfo> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(StoreHotelGroupRoomInfo::getGroupId, tuangou.getId());
+        List<StoreHotelGroupRoomInfo> storeHotelGroupRoomInfoList = storeHotelGroupRoomInfoMapper.selectList(updateWrapper);
+        // 是否收藏了该团购
+        LifeCollect lifeCollect = lifeCollectMapper.selectOne(new QueryWrapper<LifeCollect>().eq("user_id", userId).eq("coupon_id", id));
+
+        // 添加商户信息
+        StoreInfo storeUser = storeInfoMapper.selectById(tuangou.getStoreId());
+        String receiverId = "store_" + storeUser.getStoreTel();
+
+        LifeCouponVo lifeCouponVo = new LifeCouponVo();
+        lifeCouponVo.setReceiverId(receiverId);
+        lifeCouponVo.setStoreName(storeUser.getStoreName());
+
+        LifeCouponVo tuangouVO = new LifeCouponVo();
+        BeanUtils.copyProperties(tuangou,tuangouVO);
+
+        tuangouVO.setIsCollect("0");
+        if(!Objects.isNull(lifeCollect)){
+            tuangouVO.setIsCollect("1");
+        }
+
+        if (StringUtils.isNotEmpty(tuangou.getUploadedPiclist())) {
+            List<String> collect = Arrays.stream(tuangou.getUploadedPiclist().split(","))
+                    .map(String::trim)
+                    .collect(Collectors.toList());
+            List<StoreImg> storeImgs = storeImgMapper.selectList(new LambdaQueryWrapper<StoreImg>().in(StoreImg::getId, collect));
+            if (storeImgs!=null) {
+                String imgs = storeImgs.stream()
+                        .map(StoreImg::getImgUrl)
+                        .collect(Collectors.joining(","));
+                tuangouVO.setImgs(imgs);
+            }
+        }
+
+        returnMap.put("lianxishangjia", lifeCouponVo);
+        returnMap.put("tuangou", tuangouVO);
+        returnMap.put("storeHotelGroupRoomInfoList", storeHotelGroupRoomInfoList);
+        return returnMap;
+    }
 }

+ 123 - 48
alien-store/src/main/java/shop/alien/store/service/impl/LifeMessageServiceImpl.java

@@ -6,9 +6,11 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.util.StringUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.LifeFansVo;
 import shop.alien.entity.store.vo.LifeMessageVo;
@@ -17,9 +19,11 @@ import shop.alien.mapper.LifeMessageMapper;
 import shop.alien.mapper.LifeUserMapper;
 import shop.alien.store.service.LifeMessageService;
 import shop.alien.store.service.LifeUserService;
+import shop.alien.util.common.JwtUtil;
 
 import java.util.Comparator;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 @Service
@@ -37,43 +41,77 @@ public class LifeMessageServiceImpl extends ServiceImpl<LifeMessageMapper, LifeM
 
 
     @Override
-    public IPage<LifeMessageVo> getMessageList(String receiverId, int page, int size, int friendType) {
+    public List<LifeMessageVo> getMessageList(String receiverId, int friendType, String search) {
         // 查询所有好友
+//        QueryWrapper<LifeFansVo> wrapper = new QueryWrapper<>();
+//        wrapper.groupBy("foll.phoneId");
+
+//        if ("user".equals(receiverId.split("_")[0])) {
+//            String myselfUserPhone = receiverId.split("_")[1];
+//            blockerType = "2";
+//            LifeUser myLifeUser = lifeUserService.getUserByPhone(myselfUserPhone);
+//            blockerId = String.valueOf(myLifeUser.getId());
+//        } else {
+//            String myselfStorePhone = receiverId.split("_")[1];
+//            blockerType = "1";
+//            StoreUser myStoreUser = storeUserService.getUserByPhone(myselfStorePhone);
+//            blockerId = String.valueOf(myStoreUser.getId());
+//        }
+
+//        List<LifeFansVo> lifeFansList = lifeFansMapper.getMutualAttention(new Page<>(1, Integer.MAX_VALUE), receiverId, blockerType, blockerId, wrapper).getRecords();
+//        List<String> friendsIds = lifeFansList.stream().map(LifeFansVo::getPhoneId).filter(item -> !item.equals(receiverId)).collect(Collectors.toList());
+//        String friendsIdsStr = "'" + String.join("','", friendsIds) + "'";
+
+//        wrapper = new QueryWrapper<>();
+//        wrapper.eq("num", 1);
+//        if (1 == friendType) {
+//            // 当前用户的所有好友消息
+//            wrapper.apply("(sender_id in (" + friendsIdsStr + ") or receiver_id in (" + friendsIdsStr + "))");
+//        } else {
+//            // 当前用户的所有未关注人消息
+//            wrapper.apply("(sender_id not in (" + friendsIdsStr + ") and receiver_id not in (" + friendsIdsStr + "))");
+//        }
+
+        String blockerType = "user".equals(Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getString("userType")) ? "2" : "1";
+        String blockerId = JwtUtil.getCurrentUserInfo().getString("userId");
         QueryWrapper<LifeFansVo> wrapper = new QueryWrapper<>();
-        wrapper.groupBy("foll.phoneId");
-        String blockerType = "";
-        String blockerId = "";
-        if ("user".equals(receiverId.split("_")[0])) {
-            String myselfUserPhone = receiverId.split("_")[1];
-            blockerType = "2";
-            LifeUser myLifeUser = lifeUserService.getUserByPhone(myselfUserPhone);
-            blockerId = String.valueOf(myLifeUser.getId());
-        } else {
-            String myselfStorePhone = receiverId.split("_")[1];
-            blockerType = "1";
-            StoreUser myStoreUser = storeUserService.getUserByPhone(myselfStorePhone);
-            blockerId = String.valueOf(myStoreUser.getId());
-        }
-
-        List<LifeFansVo> lifeFansList = lifeFansMapper.getMutualAttention(new Page<>(1, Integer.MAX_VALUE), receiverId, blockerType, blockerId, wrapper).getRecords();
-        List<String> friendsIds = lifeFansList.stream().map(LifeFansVo::getPhoneId).filter(item -> !item.equals(receiverId)).collect(Collectors.toList());
-        String friendsIdsStr = "'" + String.join("','", friendsIds) + "'";
-
-        wrapper = new QueryWrapper<>();
-        wrapper.eq("num", 1);
-        if (1 == friendType) {
-            // 当前用户的所有好友消息
-            wrapper.apply("(sender_id in (" + friendsIdsStr + ") or receiver_id in (" + friendsIdsStr + "))");
-        } else {
-            // 当前用户的所有未关注人消息
-            wrapper.apply("(sender_id not in (" + friendsIdsStr + ") and receiver_id not in (" + friendsIdsStr + "))");
+        wrapper.eq("message.num", 1);
+        // 过滤拉黑
+        wrapper.apply("(user.id not in ( " +
+                            "     select blocked_id from life_blacklist " +
+                            "     where blocker_type = '" + blockerType + "' and blocker_id = '" + blockerId + "' and blocked_type = '2' and delete_flag = 0 " +
+                            ") or user.id is null)");
+        wrapper.apply("(suser.id not in ( " +
+                            "     select blocked_id from life_blacklist " +
+                            "     where blocker_type = '" + blockerType + "' and blocker_id = '" + blockerId + "' and blocked_type = '1' and delete_flag = 0 " +
+                            ") or suser.id is null)");
+
+        // 通过搜索查询的情况下  不区分是否聊过  搜索所有消息
+        if (0 == friendType && StringUtil.isNotEmpty(search)) {
+            wrapper.apply("(user.user_name like '%" + search + "%' or suser.name like '%" + search + "%')");
+        // 聊过
+        } else if (1 == friendType) {
+            wrapper.apply("message.phoneId in ( " +
+                    "    select receiver_id " +
+                    "    from life_message " +
+                    "    where sender_id = '" + receiverId + "'" +
+                    "    group by receiver_id " +
+                    ")");
+        // 没聊过
+        } else if (2 == friendType) {
+            wrapper.apply("message.phoneId not in ( " +
+                    "    select receiver_id " +
+                    "    from life_message " +
+                    "    where sender_id = '" + receiverId + "'" +
+                    "    group by receiver_id " +
+                    ")");
         }
-        wrapper.orderByDesc("created_time");
-        IPage<LifeMessageVo> ipage = new Page<>(page, size);
-        IPage<LifeMessageVo> lifeMessagePageList = messageMapper.getLifeMessagePageByPhoneId(ipage, receiverId, wrapper);
-        if (!CollectionUtils.isEmpty(lifeMessagePageList.getRecords())) {
+        wrapper.orderByDesc("message.created_time");
+//        IPage<LifeMessageVo> ipage = new Page<>(page, size);
+        List<LifeMessageVo> lifeMessagePageList = messageMapper.getLifeMessagePageByPhoneId(receiverId, wrapper);
+        if (!CollectionUtils.isEmpty(lifeMessagePageList)) {
             // 取出所有发送消息的用户
-            List<String> phoneIdList = lifeMessagePageList.getRecords().stream().map(LifeMessageVo::getPhoneId).filter(item -> item.contains("_")).collect(Collectors.toList());
+//            List<String> phoneIdList = lifeMessagePageList.stream().map(LifeMessageVo::getPhoneId).filter(item -> item.contains("_")).collect(Collectors.toList());
 
             // 当前用户的所有关注
             LambdaQueryWrapper<LifeFans> followWrapper = new LambdaQueryWrapper<>();
@@ -97,18 +135,18 @@ public class LifeMessageServiceImpl extends ServiceImpl<LifeMessageMapper, LifeM
             messageWrapper.eq(LifeMessage::getDeleteFlag, 0);
             List<LifeMessage> noReadList = messageMapper.selectList(messageWrapper);
 
-            // 根据手机号查询发送人信息
-            List<String> storePhoneList = phoneIdList.stream().filter(item -> "store".equals(item.split("_")[0])).map(item -> item.split("_")[1]).collect(Collectors.toList());
-            List<String> userPhoneList = phoneIdList.stream().filter(item -> "user".equals(item.split("_")[0])).map(item -> item.split("_")[1]).collect(Collectors.toList());
-            String storePhones = "'" + String.join("','", storePhoneList) + "'";
-            String userPhones = "'" + String.join("','", userPhoneList) + "'";
-            List<LifeMessageVo> userList = messageMapper.getLifeUserAndStoreUserByPhone(storePhones, userPhones);
+//            // 根据手机号查询发送人信息
+//            List<String> storePhoneList = phoneIdList.stream().filter(item -> "store".equals(item.split("_")[0])).map(item -> item.split("_")[1]).collect(Collectors.toList());
+//            List<String> userPhoneList = phoneIdList.stream().filter(item -> "user".equals(item.split("_")[0])).map(item -> item.split("_")[1]).collect(Collectors.toList());
+//            String storePhones = "'" + String.join("','", storePhoneList) + "'";
+//            String userPhones = "'" + String.join("','", userPhoneList) + "'";
+//            List<LifeMessageVo> userList = messageMapper.getLifeUserAndStoreUserByPhone(storePhones, userPhones);
 
-            for (LifeMessageVo messageVo : lifeMessagePageList.getRecords()) {
-                // 发送人信息
-                LifeMessageVo user = userList.stream().filter(item -> item.getPhoneId().equals(messageVo.getPhoneId())).findFirst().orElse(null);
-                messageVo.setUserName(null == user ? "" : user.getUserName());
-                messageVo.setUserImage(null == user ? "" : user.getUserImage());
+            for (LifeMessageVo messageVo : lifeMessagePageList) {
+//                // 发送人信息
+//                LifeMessageVo user = userList.stream().filter(item -> item.getPhoneId().equals(messageVo.getPhoneId())).findFirst().orElse(null);
+//                messageVo.setUserName(null == user ? "" : user.getUserName());
+//                messageVo.setUserImage(null == user ? "" : user.getUserImage());
 
                 // 未读消息数量
                 messageVo.setNotReadCount(noReadList.stream().filter(item -> item.getSenderId().equals(messageVo.getPhoneId())).count());
@@ -137,11 +175,43 @@ public class LifeMessageServiceImpl extends ServiceImpl<LifeMessageMapper, LifeM
             }
         }
 
-
         return lifeMessagePageList;
     }
 
     @Override
+    public LifeMessageVo getStrangerMessageNum(String receiverId) {
+        String blockerType = "user".equals(Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getString("userType")) ? "2" : "1";
+        String blockerId = JwtUtil.getCurrentUserInfo().getString("userId");
+        QueryWrapper<LifeFansVo> wrapper = new QueryWrapper<>();
+        // 过滤拉黑
+        wrapper.apply("(user.id not in ( " +
+                "     select blocked_id from life_blacklist " +
+                "     where blocker_type = '" + blockerType + "' and blocker_id = '" + blockerId + "' and blocked_type = '2' and delete_flag = 0 " +
+                ") or user.id is null)");
+        wrapper.apply("(suser.id not in ( " +
+                "     select blocked_id from life_blacklist " +
+                "     where blocker_type = '" + blockerType + "' and blocker_id = '" + blockerId + "' and blocked_type = '1' and delete_flag = 0 " +
+                ") or suser.id is null)");
+        // 没聊过
+        wrapper.apply("message.phoneId not in ( " +
+                "    select receiver_id " +
+                "    from life_message " +
+                "    where sender_id = '" + receiverId + "'" +
+                "    group by receiver_id " +
+                ")");
+        wrapper.orderByDesc("message.created_time");
+//        IPage<LifeMessageVo> ipage = new Page<>(1, Integer.MAX_VALUE);
+        List<LifeMessageVo> lifeMessagePageList = messageMapper.getLifeMessagePageByPhoneId(receiverId, wrapper);
+        LifeMessageVo vo = new LifeMessageVo();
+        if (!CollectionUtils.isEmpty(lifeMessagePageList)) {
+            vo.setUserName(lifeMessagePageList.get(0).getUserName());
+            vo.setNotReadCount(lifeMessagePageList.stream().filter(item -> 0 == item.getIsRead()).count());
+        }
+
+        return vo;
+    }
+
+    @Override
     public LifeMessageVo getNoFriendMessageNum(String receiverId) {
         // 查询所有好友
         QueryWrapper<LifeFansVo> wrapper = new QueryWrapper<>();
@@ -169,8 +239,8 @@ public class LifeMessageServiceImpl extends ServiceImpl<LifeMessageMapper, LifeM
         wrapper.eq("num", 1);
         wrapper.apply("(sender_id not in (" + friendsIdsStr + ") and receiver_id not in (" + friendsIdsStr + "))");
         wrapper.orderByDesc("created_time");
-        IPage<LifeMessageVo> ipage = new Page<>(1, Integer.MAX_VALUE);
-        List<LifeMessageVo> lifeMessageVoList = messageMapper.getLifeMessagePageByPhoneId(ipage, receiverId, wrapper).getRecords();
+//        IPage<LifeMessageVo> ipage = new Page<>(1, Integer.MAX_VALUE);
+        List<LifeMessageVo> lifeMessageVoList = messageMapper.getLifeMessagePageByPhoneId(receiverId, wrapper);
 
         LifeMessageVo messageVo = lifeMessageVoList.stream().max(Comparator.comparing(LifeMessageVo::getCreatedTime)).orElse(null);
         if (messageVo != null) {
@@ -195,7 +265,7 @@ public class LifeMessageServiceImpl extends ServiceImpl<LifeMessageMapper, LifeM
 
     @Override
     public List<LifeMessageVo> getMessageListByReceiverId(String receiverId, String senderId) {
-        // TODO 优化查询图像问题优化,主要是因为Store_ 还是 User_ 前缀问题
+
 
         // 获取发送方与接收方头像
         LifeUser lifeUser1 = null;
@@ -276,4 +346,9 @@ public class LifeMessageServiceImpl extends ServiceImpl<LifeMessageMapper, LifeM
     public int deleteMessageByPhoneId(String senderId, String receiverId) {
         return messageMapper.deleteMessageByPhoneId(senderId, receiverId);
     }
+
+    @Override
+    public boolean notDisturb(String receiverId, int disturbId, int type) {
+        return false;
+    }
 }

+ 15 - 14
alien-store/src/main/java/shop/alien/store/service/impl/LifeNoticeServiceImpl.java

@@ -1,5 +1,6 @@
 package shop.alien.store.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -30,17 +31,17 @@ public class LifeNoticeServiceImpl extends ServiceImpl<LifeNoticeMapper, LifeNot
     private final LifeMessageMapper lifeMessageMapper;
 
     @Override
-    public IPage<LifeNoticeVo> getNoticeList(String receiverId, int noticeType, int page, int size) {
-        IPage<LifeNotice> ipage = new Page<>(page, size);
+    public List<LifeNoticeVo> getNoticeList(String receiverId, int noticeType) {
+//        IPage<LifeNotice> ipage = new Page<>(page, size);
         LambdaQueryWrapper<LifeNotice> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeNotice::getReceiverId, receiverId);
         queryWrapper.eq(LifeNotice::getNoticeType, noticeType);
         queryWrapper.eq(LifeNotice::getDeleteFlag, 0);
-        IPage<LifeNotice> lifeNoticeList = lifeNoticeMapper.selectPage(ipage, queryWrapper);
+        List<LifeNotice> lifeNoticeList = lifeNoticeMapper.selectList(queryWrapper);
 
         List<String> senderIdList = new ArrayList<>();
-        if (lifeNoticeList != null && lifeNoticeList.getRecords() != null) {
-            senderIdList = lifeNoticeList.getRecords().stream()
+        if (CollectionUtil.isNotEmpty(lifeNoticeList)) {
+            senderIdList = lifeNoticeList.stream()
                     .map(LifeNotice::getSenderId)
                     .filter(item -> item != null && !"system".equals(item) && item.contains("_"))
                     .map(item -> item.split("_")[1])
@@ -52,8 +53,8 @@ public class LifeNoticeServiceImpl extends ServiceImpl<LifeNoticeMapper, LifeNot
         List<LifeMessageVo> userList = lifeMessageMapper.getLifeUserAndStoreUserByPhone(senderIds, "''");
 
         List<LifeNoticeVo> noticeVoList = new ArrayList<>();
-        if (lifeNoticeList != null && lifeNoticeList.getRecords() != null) {
-            lifeNoticeList.getRecords().forEach(item -> {
+        if (CollectionUtil.isNotEmpty(lifeNoticeList)) {
+            lifeNoticeList.forEach(item -> {
                 LifeNoticeVo noticeVo = new LifeNoticeVo();
                 BeanUtils.copyProperties(item, noticeVo);
                 LifeMessageVo userinfo = userList.stream().filter(user -> user.getPhoneId().equals(item.getSenderId())).findFirst().orElse(null);
@@ -65,14 +66,14 @@ public class LifeNoticeServiceImpl extends ServiceImpl<LifeNoticeMapper, LifeNot
             });
         }
 
-        IPage<LifeNoticeVo> result = new Page<>();
-        result.setRecords(noticeVoList);
-        result.setCurrent(lifeNoticeList.getCurrent());
-        result.setSize(lifeNoticeList.getSize());
-        result.setTotal(lifeNoticeList.getTotal());
-        result.setPages(lifeNoticeList.getPages());
+//        IPage<LifeNoticeVo> result = new Page<>();
+//        result.setRecords(noticeVoList);
+//        result.setCurrent(lifeNoticeList.getCurrent());
+//        result.setSize(lifeNoticeList.getSize());
+//        result.setTotal(lifeNoticeList.getTotal());
+//        result.setPages(lifeNoticeList.getPages());
 
-        return result;
+        return noticeVoList;
     }
 
     @Override

+ 34 - 28
alien-store/src/main/java/shop/alien/store/service/impl/PlatformStoreCouponServiceImpl.java

@@ -42,15 +42,20 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
     private String fileUrl;
 
     @Override
-    public IPage<LifeCouponVo> getCouponList(Integer page, Integer size, String storeName, String status, String createdTime, String phone) {
+    public IPage<LifeCouponVo> getCouponList(Integer page, Integer size, String storeName, String status, String createdTime, String phone, String type) {
         QueryWrapper<LifeCouponVo> wrapper = new QueryWrapper<>();
         wrapper.like(StringUtils.isNotEmpty(storeName), "store.store_name", storeName);
-        wrapper.eq(StringUtils.isNotEmpty(status), "coupon.status", status);
+        if (StringUtils.isNotEmpty(status) && !"0".equals(status)) {
+            wrapper.eq("coupon.status", status);
+        } else {
+            wrapper.notIn("coupon.status","-1","-2");
+        }
+        wrapper.eq(StringUtils.isNotEmpty(type), "coupon.type", type);
         wrapper.eq("coupon.delete_flag", 0);
         wrapper.eq("store.delete_flag", 0);
         wrapper.eq("user.delete_flag", 0);
-        wrapper.like(StringUtils.isNotEmpty(createdTime), "coupon.created_time", createdTime);
-        wrapper.like(StringUtils.isNotEmpty(phone), "user.phone", phone);
+        wrapper.like(StringUtils.isNotEmpty(createdTime),"coupon.created_time", createdTime);
+        wrapper.like(StringUtils.isNotEmpty(phone),"user.phone", phone);
         wrapper.isNotNull("coupon.status");
         wrapper.orderByDesc("coupon.created_time");
         IPage<LifeCouponVo> lifeCouponVo = platformStoreCouponMapper.getCouponList(new Page<>(page, size), wrapper);
@@ -58,14 +63,14 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
             if (item.getStatus() == -1) {
                 item.setStatusName("待审核");
             } else if (item.getStatus() == -2) {
-                item.setStatusName("已驳回");
+                item.setStatusName("已拒绝");
             } else {
                 item.setStatusName("已通过");
             }
 // expiredState 赋值逻辑(修正版)
             LocalDateTime now = LocalDateTime.now(); // 获取当前时间
             Date endDate = item.getEndDate();
-            if (endDate != null) {
+            if (endDate != null){
                 LocalDateTime endDateTime = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
                 // 核心逻辑:未过期时赋 0,已过期赋 1(与前端枚举定义一致)
                 if (now.isBefore(endDateTime)) {
@@ -88,18 +93,18 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
 
 
         // 定义允许的状态值
-        List<String> allowedStatus = Arrays.asList("1", "2", "3");
+        List<String> allowedStatus = Arrays.asList( "1","2", "3");
         if ("-3".equals(status)) { // 已售罄(逻辑状态,状态为进行中但是余量为0的)
             wrapper.eq("coupon.status", "1");
             wrapper.eq("coupon.stock_qty", 0);
-        } else if ("1".equals(status)) {
+        }else if ("1".equals(status)) {
             wrapper.eq("coupon.status", "1");
             wrapper.ne("coupon.stock_qty", 0);
-        } else if ("4".equals(status)) {
+        }else if ("4".equals(status)){
             wrapper.eq("coupon.status", "1");
-            wrapper.gt("coupon.start_date", new Date());
-        } else {
-            if (StringUtils.isNotEmpty(status)) {
+            wrapper.gt("coupon.start_date",new Date());
+        }else{
+            if (StringUtils.isNotEmpty(status)){
                 wrapper.eq("coupon.status", status);
             }
         }
@@ -114,9 +119,9 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
         wrapper.orderByDesc("coupon.created_time");
 
         Date currentDate = new Date();
-        if ("0".equals(expiredState)) {
+        if ("0".equals(expiredState)){
             wrapper.ge("coupon.end_date", currentDate);
-        } else if ("1".equals(expiredState)) {
+        }else if ("1".equals(expiredState)){
             wrapper.lt("coupon.end_date", currentDate);
         }
 
@@ -133,7 +138,7 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
             // expiredState 赋值逻辑(修正版)
             LocalDateTime now = LocalDateTime.now(); // 获取当前时间
             Date endDate = item.getEndDate(); // 假设 endDate 是 Date 类型
-            if (endDate != null) {
+            if (endDate != null){
                 LocalDateTime endDateTime = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
                 // 核心逻辑:未过期时赋 0,已过期赋 1(与前端枚举定义一致)
                 if (now.isBefore(endDateTime)) {
@@ -147,8 +152,9 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
             if (item.getStatus() == 1 && item.getStockQty() == 0) {
                 item.setStatus(-3);
             }
+
             //判断是否为未开始
-            if (item.getStatus() == 1 && item.getStartDate().after(new Date())) {
+            if (item.getStatus() == 1 && item.getStartDate().after( new Date())){
                 item.setStatus(4);
             }
         });
@@ -166,8 +172,8 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
     }
 
     @Override
-    public LifeCoupon getCouponById(Integer id) {
-        return platformStoreCouponMapper.selectById(id);
+    public LifeCouponVo getCouponById(Integer id) {
+        return platformStoreCouponMapper.getCouponById(id);
     }
 
     @Override
@@ -191,7 +197,7 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
     }
 
     @Override
-    public String couponStatusExport(String status, String expiredState) throws IOException {
+    public String couponStatusExport(String status, String expiredState) throws IOException  {
 
         QueryWrapper<LifeCouponVo> wrapper = new QueryWrapper<>();
         // 定义允许的状态值
@@ -199,12 +205,12 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
 //        wrapper.like(StringUtils.isNotEmpty(storeName), "store.store_name", storeName);
         if (StringUtils.isNotEmpty(status) && status.equals("-3")) {
             status = "1";
-            wrapper.eq("coupon.single_qty", 0);
+            wrapper.eq("coupon.single_qty",0);
         }
         if (StringUtils.isNotEmpty(status) && allowedStatus.indexOf(status) != -1) {
             wrapper.eq(StringUtils.isNotEmpty(status), "coupon.status", status);
-        } else {
-            wrapper.in("coupon.status", allowedStatus);
+        }else {
+            wrapper.in( "coupon.status", allowedStatus);
         }
         wrapper.eq("coupon.delete_flag", 0);
         wrapper.eq("store.delete_flag", 0);
@@ -216,9 +222,9 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
         wrapper.orderByDesc("coupon.created_time");
 
         Date currentDate = new Date();
-        if ("0".equals(expiredState)) {
+        if ("0".equals(expiredState)){
             wrapper.ge("coupon.end_date", currentDate);
-        } else if ("1".equals(expiredState)) {
+        }else if ("1".equals(expiredState)){
             wrapper.lt("coupon.end_date", currentDate);
         }
 
@@ -226,7 +232,7 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
         lifeCouponVo.forEach(item -> {
             if (item.getStatus() == 1 && item.getStockQty() > 0) {
                 item.setCouponState("进行中");
-            } else if (item.getStatus() == 1 && item.getStockQty() == 0) {
+            }else if (item.getStatus() == 1 && item.getStockQty() == 0) {
                 item.setCouponState("已售罄");
             } else if (item.getStatus() == 2) {
                 item.setCouponState("已暂停");
@@ -244,7 +250,7 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
             // 格式化日期
             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
             String formattedEndDate = "";
-            if (endDate != null) {
+            if (endDate != null){
                 LocalDateTime endDateTime = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
                 // 调整结束时间为前一天的23:59:59
                 endDateTime = endDateTime.minusDays(1).withHour(23).withMinute(59).withSecond(59);
@@ -292,9 +298,9 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
             storeCouponStatusVo.setId(String.valueOf(index++)); // 设置序号
             storeCouponStatusVos.add(storeCouponStatusVo);
         }
-        String fileName = UUID.randomUUID().toString().replace("-", "");
+        String fileName = UUID.randomUUID().toString().replace("-","");
 
-        ExcelGenerator.generateExcel(excelPath + excelGeneratePath + fileName + ".xlsx", storeCouponStatusVos, StoreCouponStatusVo.class);
+        ExcelGenerator.generateExcel(excelPath + excelGeneratePath + fileName + ".xlsx",storeCouponStatusVos,StoreCouponStatusVo.class);
         return fileUrl + "excel" + excelGeneratePath + fileName + ".xlsx";
     }
 

+ 12 - 1
alien-store/src/main/java/shop/alien/store/service/impl/StoreClockInServiceImpl.java

@@ -15,6 +15,7 @@ import shop.alien.store.service.StoreClockInService;
 import shop.alien.store.service.StoreCommentService;
 
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -139,7 +140,7 @@ public class StoreClockInServiceImpl extends ServiceImpl<StoreClockInMapper, Sto
 //            vo.setClockInStoreNum(clockInStoreNumMap.get(vo.getStoreId()));
 //            // 打卡次数
 //            vo.setClockInNum(clockInNum);
-            vo.setCommentCount(Integer.parseInt(storeCommentService.getCommitCountAndScore(vo.getId(), 4, vo.getUserId()).get("commitCount")));
+            vo.setCommentCount(Integer.parseInt(storeCommentService.getCommitCountAndScore(vo.getId(), 4, vo.getStoreId()).get("commitCount")));
         });
 
 
@@ -167,4 +168,14 @@ public class StoreClockInServiceImpl extends ServiceImpl<StoreClockInMapper, Sto
         wrapper.eq(StoreClockIn::getId, id);
         return storeClockInMapper.update(null, wrapper);
     }
+
+    /**
+     * 获取门店打卡次数
+     *
+     * @return list
+     */
+    @Override
+    public List<Map<Integer, Integer>> getStoreClockInCount() {
+        return storeClockInMapper.getStoreClockInCount();
+    }
 }

+ 66 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreGroupPackageServiceImpl.java

@@ -16,6 +16,7 @@ import shop.alien.mapper.StoreGroupPackageMapper;
 import shop.alien.mapper.StoreLabelTypeMapper;
 import shop.alien.store.service.LifeGroupPackageService;
 import shop.alien.store.service.StoreGroupPackageService;
+import shop.alien.store.util.GroupConstant;
 import shop.alien.util.common.UniqueRandomNumGenerator;
 
 import java.lang.reflect.Field;
@@ -100,6 +101,71 @@ public class StoreGroupPackageServiceImpl extends ServiceImpl<StoreGroupPackageM
         return storeGroupPackageVO;
     }
 
+    @Transactional
+    @Override
+    public StoreGroupPackageVO addHotelGroup(StoreGroupPackageVO storeGroupPackageVO) {
+        try {
+            log.info("开始创建酒店团购套餐,: {}", storeGroupPackageVO);
+
+            // 参数校验
+            validateStoreGroupPackageVO(storeGroupPackageVO);
+            LifeCoupon lifeCoupon = storeGroupPackageVO.getStoreGroupPackage();
+
+            // 有效期类型为天时,计算天数
+            calculateExpirationDateIfNecessary(lifeCoupon);
+
+            LifeTuanGouParamVo lifeTuanGouParamVo = new LifeTuanGouParamVo();
+            LifeCoupon tuangou = new LifeCoupon();
+            BeanUtils.copyProperties(lifeCoupon, tuangou);
+            lifeTuanGouParamVo.setTuangou(tuangou);
+            lifeCoupon.setCouponCode(UniqueRandomNumGenerator.generateUniqueCode(12));
+
+            // 处理标签中间表数据
+            try {
+                processLabelType(lifeCoupon);
+            } catch (Exception e) {
+                log.error("创建酒店团购套餐失败: 处理标签信息异常", e);
+                throw new RuntimeException("处理标签信息失败");
+            }
+            //创建子表集合
+            List<StoreHotelGroupRoomInfo> storeHotelGroupRoomInfos = new ArrayList<>();
+
+            // 将前端传入的子表信息,转换成酒店子表信息
+            List<StoreHotelGroupRoomInfo> hotelGroupRoomInfos = storeGroupPackageVO.getStoreHotelGroupRoomInfos();
+            hotelGroupRoomInfos.forEach(storeHotelGroupInfo -> {
+                StoreHotelGroupRoomInfo storeHotelGroupRoomInfo = new StoreHotelGroupRoomInfo();
+                BeanUtils.copyProperties(storeHotelGroupInfo, storeHotelGroupRoomInfo);
+                storeHotelGroupRoomInfos.add(storeHotelGroupRoomInfo);
+            });
+
+            //将主表信息子表信息存入库中
+            lifeTuanGouParamVo.setTuangouHotelRoomList(storeHotelGroupRoomInfos);
+            lifeGroupPackageService.addOrUpdateHotelGroupPackage(lifeTuanGouParamVo);
+        } catch (
+                Exception e) {
+            log.error("创建酒店团购套餐发生异常", e);
+            throw new RuntimeException(e.getMessage());
+        }
+        log.info("创建酒店团购套餐成功, 返回结果: {}", storeGroupPackageVO);
+        return storeGroupPackageVO;
+    }
+
+    private static void validateStoreGroupPackageVO(StoreGroupPackageVO storeGroupPackageVO) {
+        if (storeGroupPackageVO == null || storeGroupPackageVO.getStoreGroupPackage() == null ||
+                CollectionUtils.isEmpty(storeGroupPackageVO.getStoreHotelGroupRoomInfos())) {
+            throw new RuntimeException("请求参数不能为空");
+        }
+    }
+
+    private static void calculateExpirationDateIfNecessary(LifeCoupon lifeCoupon) {
+        if (StringUtil.isNotEmpty(lifeCoupon.getValidityPeriod()) &&
+                GroupConstant.VALIDITY_PERIOD_TYPE_DAY.equals(lifeCoupon.getValidityPeriodType())) {
+            String[] split = lifeCoupon.getValidityPeriod().split(",");
+            long diffSeconds = Math.abs(Long.parseLong(split[1]) - Long.parseLong(split[0]));
+            lifeCoupon.setExpirationDate((int) (diffSeconds / 86400000) + 1);
+        }
+    }
+
     /**
      * 处理标签整合
      *

+ 5 - 5
alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java

@@ -102,8 +102,6 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
 
     private final StoreInfoDraftMapper storeInfoDraftMapper;
 
-    private final LifeUserOrderService lifeUserOrderService;
-
     @Value("${spring.web.resources.excel-path}")
     private String excelPath;
 
@@ -217,7 +215,8 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
                 .eq(StringUtils.isNotEmpty(businessSection), "a.business_section", businessSection)
                 .eq(StringUtils.isNotEmpty(storeStatus), "a.store_status", storeStatus)
                 .like(StringUtils.isNotEmpty(id), "a.id", id)
-                .in("a.business_status", Arrays.asList(0, 2))
+                .eq("a.delete_flag", 0)
+                .eq("b.delete_flag", 0)
                 .orderByDesc("a.created_time");
         //如果查询未过期
         // 获取当前时刻
@@ -866,7 +865,7 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         result.setStorePositionLatitude(result.getStorePosition().split(",")[1]);
 
         // 设置距离
-        if (StringUtils.isNotEmpty(jingdu) && StringUtils.isNotEmpty(weidu)) {
+        if ((jingdu != null && !jingdu.isEmpty()) && (weidu != null && !weidu.isEmpty())) {
             double storeJing = Double.parseDouble(result.getStorePosition().split(",")[0]);
             double storeWei = Double.parseDouble(result.getStorePosition().split(",")[1]);
             double storeDistance = DistanceUtil.haversineCalculateDistance(Double.parseDouble(jingdu), Double.parseDouble(weidu), storeJing, storeWei);
@@ -898,6 +897,7 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         LifeCollect shouCang = lifeCollectMapper.selectOne(shouCangWrapper);
         if (null == shouCang) {
             result.setCollection(0);
+        } else {
             result.setCollection(1);
         }
 
@@ -1237,7 +1237,7 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
                         .map(item -> String.valueOf(item.getStoreId()))
                         .collect(Collectors.toList());
             }
-            if (!CollectionUtils.isEmpty(storeIds)) {
+            if(!CollectionUtils.isEmpty(storeIds)) {
                 LambdaQueryWrapper<StoreInfo> queryWrapper = new LambdaQueryWrapper<>();
                 queryWrapper.in(StoreInfo::getId, storeIds);
                 storeInfoIPage = storeInfoMapper.selectPage(page, queryWrapper);

+ 38 - 0
alien-store/src/main/java/shop/alien/store/util/GroupConstant.java

@@ -0,0 +1,38 @@
+package shop.alien.store.util;
+
+/**
+ * 八大团购常量
+ * @author zhangchen
+ * @since 2025/7/1
+ */
+public class GroupConstant {
+
+    /**
+     * 有效期类型,1:指定天数,2:指定时间段
+     */
+    public static final String VALIDITY_PERIOD_TYPE_DAY = "1";
+    public static final String VALIDITY_PERIOD_TYPE_TIME = "2";
+
+    /**
+     * 优惠券类型,1-代金券  2-团购(套餐)
+     */
+    public static final Integer LIFE_COUPON_TYPE = 1;
+    public static final Integer LIFE_GROUP_TYPE = 2;
+
+    /**
+     * 优惠券状态,-1:待审核,-2:审核不通过,0:未使用,1:使用中,2:暂停,3:已结束
+     */
+    public static final Integer LIFE_COUPON_STATUS_PENDING_APPROVAL = -1;
+    public static final Integer LIFE_COUPON_STATUS_REJECTED = -2;
+    public static final Integer LIFE_COUPON_STATUS_UNUSED = 0;
+    public static final Integer LIFE_COUPON_STATUS_USING = 1;
+    public static final Integer LIFE_COUPON_STATUS_PAUSE = 2;
+    public static final Integer LIFE_COUPON_STATUS_END = 3;
+
+    /**
+     * 标签类型 1:套餐, 2:门店
+     */
+    public static final String LABEL_TYPE_MENU = "1";
+    public static final String LABEL_TYPE_SHOP = "2";
+
+}