Explorar o código

Merge branch 'shelf_status'

zoujiajian %!s(int64=2) %!d(string=hai) anos
pai
achega
940c566c54
Modificáronse 36 ficheiros con 497 adicións e 75 borrados
  1. 2 2
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
  2. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpUserFollowRelationMapper.java
  3. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponMapper.java
  4. 1 1
      netflix-dao/src/main/java/com/cyksj/mapper/sys/SysConfigChangeRecordMapper.java
  5. 1 1
      netflix-dao/src/main/java/com/cyksj/mapper/sys/SysConfigMapper.java
  6. 1 1
      netflix-dao/src/main/java/com/cyksj/mapper/sys/SysEmailMapper.java
  7. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/sys/SysFuncTimingShelfMapper.java
  8. 8 3
      netflix-dao/src/main/java/com/cyksj/model/entity/CorpMsgBulkTask.java
  9. 14 0
      netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfig.java
  10. 44 0
      netflix-dao/src/main/java/com/cyksj/model/entity/SysFuncTimingShelf.java
  11. 27 0
      netflix-dao/src/main/java/com/cyksj/model/request/HomeConfigTimingReq.java
  12. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementConfigView.java
  13. 33 0
      netflix-dao/src/main/resources/mapper/CorpUserFollowRelationMapper.xml
  14. 7 0
      netflix-dao/src/main/resources/mapper/CouponMapper.xml
  15. 28 28
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  16. 1 1
      netflix-dao/src/main/resources/mapper/SysEmailMapper.xml
  17. 1 1
      netflix-service/src/main/java/com/cyksj/service/corp/CorpTagService.java
  18. 1 1
      netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpFollowDynamicConfigServiceImpl.java
  19. 41 19
      netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpMsgBulkTaskServiceImpl.java
  20. 3 3
      netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpTagServiceImpl.java
  21. 9 0
      netflix-service/src/main/java/com/cyksj/service/home/HomeManagementConfigService.java
  22. 101 0
      netflix-service/src/main/java/com/cyksj/service/home/impl/HomeManagementConfigServiceImpl.java
  23. 1 2
      netflix-service/src/main/java/com/cyksj/service/mail/impl/MailServiceImpl.java
  24. 1 1
      netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java
  25. 1 1
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonPostServiceImpl.java
  26. 1 0
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  27. 1 1
      netflix-service/src/main/java/com/cyksj/service/shop/impl/YhShopServiceImpl.java
  28. 14 0
      netflix-service/src/main/java/com/cyksj/service/sys/SysFuncTimingShelfService.java
  29. 1 1
      netflix-service/src/main/java/com/cyksj/service/sys/impl/SysConfigChangeRecordServiceImpl.java
  30. 1 1
      netflix-service/src/main/java/com/cyksj/service/sys/impl/SysConfigServiceImpl.java
  31. 91 0
      netflix-service/src/main/java/com/cyksj/service/sys/impl/SysFuncTimingShelfServiceImpl.java
  32. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  33. 1 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java
  34. 3 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgBulkTaskController.java
  35. 3 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpTagController.java
  36. 31 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/home/HomeManageConfigController.java

+ 2 - 2
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java

@@ -65,7 +65,7 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 
 	BrokenLineObjView selectDsPlatBrokenLineMoney(@Param("sharedId") Long sharedId, @Param("first") String first, @Param("end") String end);
 
-	UserOrderDetailView getTagUserData(@Param("tagName") String tagName, @Param("startTime") String startTime, @Param("endTime") String endTime);
+	UserOrderDetailView getTagUserData(@Param("tagIdStr") String tagIdStr, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
-	Page<UserOrderDetailView> getTagUserDataPage(@Param("page") Page<UserOrderDetailView> page, @Param("tagName") String tagName, @Param("startTime") String startTime, @Param("endTime") String endTime);
+	Page<UserOrderDetailView> getTagUserDataPage(@Param("page") Page<UserOrderDetailView> page, @Param("tagIdStr") String tagIdStr, @Param("startTime") String startTime, @Param("endTime") String endTime);
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpUserFollowRelationMapper.java

@@ -18,4 +18,6 @@ public interface CorpUserFollowRelationMapper extends BaseMapper<CorpUserFollowR
 	List<CorpUserFollowRelationDto> selectCorpUserFollowRelationByTagIds(@Param("list") List<String> tagIds, @Param("wxCorpId") Long wxCorpId, @Param("followIds") List<String> followIds, @Param("userScope") Integer userScope);
 
 	List<CorpUserFollowRelationDto> selectCorpUserFollowRelation(@Param("wxCorpId") Long wxCorpId, @Param("followIds") List<String> service_follow_ids);
+
+	List<CorpUserFollowRelationDto> selectCorpUserNotUnderTagIds(@Param("list") List<String> tagIds, @Param("wxCorpId") Long wxCorpId, @Param("followIds") List<String> followIds, @Param("userScope") Integer userScope);
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponMapper.java

@@ -31,5 +31,7 @@ public interface CouponMapper extends BaseMapper<Coupon> {
 	@Select("select name from coupon where id = #{couponId}")
 	String getCouponNameById(Long couponId);
 
+	String getCouponNameByIds(List<Long> couponIds);
+
 	Coupon getRenewCouponBySkuId(@Param("skuId") Long skuId, @Param("couponIds") Set<Long> couponIds, @Param("userId") Long userId);
 }

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/mapper/SysConfigChangeRecordMapper.java → netflix-dao/src/main/java/com/cyksj/mapper/sys/SysConfigChangeRecordMapper.java

@@ -1,4 +1,4 @@
-package com.cyksj.mapper;
+package com.cyksj.mapper.sys;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.SysConfigChangeRecord;

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/mapper/SysConfigMapper.java → netflix-dao/src/main/java/com/cyksj/mapper/sys/SysConfigMapper.java

@@ -1,4 +1,4 @@
-package com.cyksj.mapper;
+package com.cyksj.mapper.sys;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.SysConfig;

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/mapper/SysEmailMapper.java → netflix-dao/src/main/java/com/cyksj/mapper/sys/SysEmailMapper.java

@@ -1,4 +1,4 @@
-package com.cyksj.mapper;
+package com.cyksj.mapper.sys;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.SysEmail;

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/sys/SysFuncTimingShelfMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.sys;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.SysFuncTimingShelf;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: SysFuncTimingShelfMapper
+ * 创建者: JavaZou
+ * 创建时间:2023/12/28 10:27
+ */
+public interface SysFuncTimingShelfMapper extends BaseMapper<SysFuncTimingShelf> {
+}

+ 8 - 3
netflix-dao/src/main/java/com/cyksj/model/entity/CorpMsgBulkTask.java

@@ -9,7 +9,6 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 
-import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 import java.util.Arrays;
@@ -54,7 +53,7 @@ public class CorpMsgBulkTask implements Serializable {
 	/**
 	 * 群发任务选择标签
 	 */
-	@NotEmpty(message = "标签不能为空")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String chooseTagStr;
 
 	/**
@@ -67,6 +66,7 @@ public class CorpMsgBulkTask implements Serializable {
 	/**
 	 * 标签组
 	 */
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String tagGroups;
 
 	/**
@@ -97,7 +97,7 @@ public class CorpMsgBulkTask implements Serializable {
 	 * 优惠券id
 	 */
 	@TableField(updateStrategy = FieldStrategy.IGNORED)
-	private Long couponId;
+	private String couponIds;
 
 	@DbIgnore
 	@TableField(exist = false)
@@ -137,6 +137,11 @@ public class CorpMsgBulkTask implements Serializable {
 	 */
 	private Integer userScope;
 
+	/** 发送范围 默认2标签用户
+	 * 1.全部用户、2标签用户
+	 */
+	private Integer sendScope;
+
 	private Boolean deleted;
 
 	/**

+ 14 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfig.java

@@ -1,5 +1,7 @@
 package com.cyksj.model.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -28,6 +30,18 @@ public class HomeManagementConfig extends BaseEntity{
 
 	private Boolean status;
 
+	/**
+	 * 定时上下架状态 默认null
+	 */
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private Boolean preStatus;
+
+	/**
+	 * 定时上下架时间
+	 */
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private Long time;
+
 	private Boolean deleted;
 
 	@Getter

+ 44 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/SysFuncTimingShelf.java

@@ -0,0 +1,44 @@
+package com.cyksj.model.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: SysFuncTimingShelf
+ * 创建者: JavaZou
+ * 创建时间:2023/12/28 10:25
+ */
+@Getter
+@Setter
+public class SysFuncTimingShelf extends BaseEntity {
+
+	private String type;
+
+	private Long funcId;
+
+	/**
+	 * 定时上下架状态
+	 */
+	private Boolean preStatus;
+
+	/**
+	 * 定时上下架时间
+	 */
+	private Long time;
+
+	private String timeStr;
+
+	private Boolean deleted;
+
+
+	@Getter
+	@AllArgsConstructor
+	public enum Type {
+		hc("首页配置"),
+		;
+		String desc;
+	}
+
+}

+ 27 - 0
netflix-dao/src/main/java/com/cyksj/model/request/HomeConfigTimingReq.java

@@ -0,0 +1,27 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: HomeConfigTimingReq
+ * 创建者: JavaZou
+ * 创建时间:2023/12/27 14:46
+ */
+@Getter
+@Setter
+public class HomeConfigTimingReq {
+	@NotNull(message = "请选择对应配置")
+	private Long id;
+
+	/**
+	 * 预上架状态 true预上架 false预下架
+	 */
+	private Boolean preStatus;
+
+	@NotNull(message = "定时上下架时间不为空")
+	private Long time;
+}

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementConfigView.java

@@ -53,6 +53,12 @@ public class HomeManagementConfigView {
 	@DbIgnore
 	private Integer click;
 
+	@DbField("hc.pre_status")
+	private Boolean preStatus;
+
+	@DbField("hc.time")
+	private Long time;
+
 	@DbField("hc.created_time")
 	private Date createdTime;
 }

+ 33 - 0
netflix-dao/src/main/resources/mapper/CorpUserFollowRelationMapper.xml

@@ -60,4 +60,37 @@
         </if>
         group by cufr.corp_user_id
     </select>
+
+    <select id="selectCorpUserNotUnderTagIds" resultType="com.cyksj.model.dto.CorpUserFollowRelationDto">
+        select cufr.corp_user_id,
+        any_value(cufr.follow_id) as follow_id,
+        any_value(cu.user_id) as user_id
+        from corp_user cu inner join corp_user_auth ca on ca.corp_user_id = cu.id
+        and ca.wx_corp_id = #{wxCorpId}
+        <choose>
+            <when test="userScope == 2">
+                and cu.user_id != 0
+            </when>
+            <when test="userScope == 3">
+                and cu.user_id = 0
+            </when>
+        </choose>
+        inner join corp_user_follow_relation cufr on cufr.corp_user_id = ca.external_userid
+        and cufr.wx_corp_id = #{wxCorpId}
+        <if test="followIds != null and followIds.size() > 0">
+            and cufr.follow_id in
+            <foreach collection="followIds" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="list != null and list.size() > 0">
+            and not exists (select s.corp_user_id from (select corp_user_id from corp_user_follow_relation cufr inner
+            join `corp_user_tag` ct on ct.relation_id = cufr.id and ct.tag_id in
+            <foreach collection="list" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+            group by cufr.corp_user_id) s where s.corp_user_id = cufr.corp_user_id limit 1)
+        </if>
+        group by cufr.corp_user_id
+    </select>
 </mapper>

+ 7 - 0
netflix-dao/src/main/resources/mapper/CouponMapper.xml

@@ -57,4 +57,11 @@
         and (select count(*) from coupon_user where user_id = #{userId} and coupon_id = c.id) = 0
         order by discount desc limit 1
     </select>
+
+    <select id="getCouponNameByIds" resultType="java.lang.String">
+        select group_concat(name) from coupon where id in
+        <foreach collection="list" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

+ 28 - 28
netflix-dao/src/main/resources/mapper/OrderDonMapper.xml

@@ -314,46 +314,46 @@
     </select>
 
     <select id="getTagUserData" resultType="com.cyksj.model.views.UserOrderDetailView">
-        select count(if(status != 'refund', 1, NULL)) as numOfOrder, (sum(money) - sum(ifnull(refund_money, 0))) / 100 as orderMoney
-        from `order_don` o
-        where exists (select cu.user_id
+        select count(if(status != 'refund', 1, NULL)) as numOfOrder, (sum(money) - sum(ifnull(refund_money, 0))) / 100
+        as orderMoney
+        from (select cu.user_id
         from (select relation_id
-        from `corp_user_tag`
-        where tag_name = #{tagName}) s
-        left join corp_user_follow_relation cufr on cufr.id = s.relation_id
-        left join corp_user_auth ca on ca.external_userid = cufr.corp_user_id
-        left join corp_user cu on cu.id = ca.corp_user_id
-        where cu.user_id != 0 and cu.user_id = o.user_id )
-        and status not in ('close', 'noPayment')
+        from `corp_user_tag` ct
+        where tag_id = #{tagIdStr}
         <if test="startTime != null">
-            and o.created_time >= #{startTime}
+            and ct.created_time >= #{startTime}
         </if>
         <if test="endTime != null">
-            and o.created_time &lt; #{endTime}
-        </if>
-        and money > 0
+            and ct.created_time &lt; #{endTime}
+        </if>) s
+        left join corp_user_follow_relation cufr on cufr.id = s.relation_id
+        left join corp_user_auth ca on ca.external_userid = cufr.corp_user_id
+        left join corp_user cu on cu.id = ca.corp_user_id where cu.user_id != 0) s left join order_don o on o.user_id =
+        s.user_id
+        and o.status not in ('close', 'noPayment')
+        and o.money > 0
+        and o.money > ifnull(o.refund_money,0)
     </select>
 
     <select id="getTagUserDataPage" resultType="com.cyksj.model.views.UserOrderDetailView">
         select count(if(status != 'refund', 1, NULL)) as numOfOrder, (sum(money) - sum(ifnull(refund_money, 0))) / 100
-        as orderMoney,date_format(o.created_time,'%Y-%m-%d')  as date
-        from `order_don` o
-        where exists (select cu.user_id
+        as orderMoney,date_format(o.created_time,'%Y-%m-%d') as date from (select cu.user_id
         from (select relation_id
-        from `corp_user_tag`
-        where tag_name = #{tagName}) s
-        left join corp_user_follow_relation cufr on cufr.id = s.relation_id
-        left join corp_user_auth ca on ca.external_userid = cufr.corp_user_id
-        left join corp_user cu on cu.id = ca.corp_user_id
-        where cu.user_id != 0 and cu.user_id = o.user_id )
-        and status not in ('close', 'noPayment')
+        from `corp_user_tag` ct
+        where tag_id = #{tagIdStr}
         <if test="startTime != null">
-            and o.created_time >= #{startTime}
+            and ct.created_time >= #{startTime}
         </if>
         <if test="endTime != null">
-            and o.created_time &lt; #{endTime}
-        </if>
-        and money > 0
+            and ct.created_time &lt; #{endTime}
+        </if>) s
+        left join corp_user_follow_relation cufr on cufr.id = s.relation_id
+        left join corp_user_auth ca on ca.external_userid = cufr.corp_user_id
+        left join corp_user cu on cu.id = ca.corp_user_id where cu.user_id != 0) s left join order_don o on o.user_id =
+        s.user_id
+        and o.status not in ('close', 'noPayment')
+        and o.money > 0
+        and o.money > ifnull(o.refund_money,0)
         group by date_format(o.created_time,'%Y-%m-%d')
         order by date_format(o.created_time,'%Y-%m-%d') desc
     </select>

+ 1 - 1
netflix-dao/src/main/resources/mapper/SysEmailMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
-<mapper namespace="com.cyksj.mapper.SysEmailMapper">
+<mapper namespace="com.cyksj.mapper.sys.SysEmailMapper">
 
     <insert id="batchInsert">
         insert ignore into sys_email(`email`,`password`,`created_time`,`update_time`)

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/corp/CorpTagService.java

@@ -45,5 +45,5 @@ public interface CorpTagService {
 	 */
 	CorpTagGroupView addGroup(CorpTagGroupView tagGroup) throws Exception;
 
-	UserOrderDetailView getTagUserData(Integer start, Integer limit, String tagName, String startTime, String endTime);
+	UserOrderDetailView getTagUserData(Integer start, Integer limit, String tagIdStr, String startTime, String endTime);
 }

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpFollowDynamicConfigServiceImpl.java

@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;
-import com.cyksj.mapper.SysConfigMapper;
+import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.mapper.corp.CorpFollowConfigMapper;
 import com.cyksj.mapper.corp.CorpTagMapper;
 import com.cyksj.model.dto.CorpFollowActiveCodeDto;

+ 41 - 19
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpMsgBulkTaskServiceImpl.java

@@ -102,6 +102,17 @@ public class CorpMsgBulkTaskServiceImpl extends ServiceImpl<CorpMsgBulkTaskMappe
 				XxlJobUtil.stopJob(dbCorpMsgBulkTask.getJobId());
 			}
 		}
+		Optional.ofNullable(corpMsgBulkTask.getSendScope()).ifPresent(sendScope -> {
+			//发送全部用户范围
+			if (sendScope == 1) {
+				if (StrUtil.isEmpty(corpMsgBulkTask.getChooseTagStr())) {
+					corpMsgBulkTask.setChooseTagStr(null);
+					corpMsgBulkTask.setTagGroups(null);
+				}
+			} else if (StrUtil.isEmpty(corpMsgBulkTask.getChooseTagStr())) {
+				throw BusinessRuntimeException.getInstance("标签筛选发送范围下,标签不能为空");
+			}
+		});
 		this.saveOrUpdate(corpMsgBulkTask);
 		//处理群发任务和标签的关系
 		handleTaskTagRelation(corpMsgBulkTask);
@@ -246,7 +257,15 @@ public class CorpMsgBulkTaskServiceImpl extends ServiceImpl<CorpMsgBulkTaskMappe
 		}
 		Integer userScope = corpMsgBulkTask.getUserScope();
 
-		List<CorpUserFollowRelationDto> corpUserFollowRelations = corpUserFollowRelationMapper.selectCorpUserFollowRelationByTagIds(tagIds, wxCorpApp.getId(), service_follow_ids, userScope);
+		Integer sendScope = corpMsgBulkTask.getSendScope();
+		List<CorpUserFollowRelationDto> corpUserFollowRelations = null;
+		//全部用户
+		if (sendScope == 1) {
+			//此时tagIds是 需要过滤的用户标签
+			corpUserFollowRelations = corpUserFollowRelationMapper.selectCorpUserNotUnderTagIds(tagIds, wxCorpApp.getId(), service_follow_ids, userScope);
+		} else {
+			corpUserFollowRelations = corpUserFollowRelationMapper.selectCorpUserFollowRelationByTagIds(tagIds, wxCorpApp.getId(), service_follow_ids, userScope);
+		}
 		//将成员与客户相同关联聚合
 		Map<String, List<CorpUserFollowRelationDto>> userRelationMap = corpUserFollowRelations.stream().collect(Collectors.groupingBy(CorpUserFollowRelationDto::getFollowId));
 		//附件
@@ -314,7 +333,7 @@ public class CorpMsgBulkTaskServiceImpl extends ServiceImpl<CorpMsgBulkTaskMappe
 			try {
 				List<String> extendIds = new ArrayList<>(val.size());
 				List<Long> userIds = null;
-				if (corpMsgBulkTask.getCouponId() != null) {
+				if (StrUtil.isNotEmpty(corpMsgBulkTask.getCouponIds())) {
 					userIds = new ArrayList<>(val.size());
 				}
 				for (CorpUserFollowRelationDto dto : val) {
@@ -356,24 +375,27 @@ public class CorpMsgBulkTaskServiceImpl extends ServiceImpl<CorpMsgBulkTaskMappe
 				}
 				//若需要发优惠券
 				if (CollUtil.isNotEmpty(userIds)) {
-					Long couponId = corpMsgBulkTask.getCouponId();
-					Coupon coupon = couponMapper.getCouponById(couponId);
-					Date validStartTime = null;
-					Date validEndTime = null;
-					if (coupon != null) {
-						if (coupon.getIsValidTime()) {
-							validStartTime = coupon.getValidStartTime();
-							validEndTime = coupon.getValidEndTime();
-						} else {
-							validStartTime = DateTime.now();
-							validEndTime = DateUtil.offsetDay(validStartTime, coupon.getValidDays());
+					String couponIds = corpMsgBulkTask.getCouponIds();
+					List<Long> couponIdList = Jsons.parseList(couponIds, Long.class);
+					for (Long couponId : couponIdList) {
+						Coupon coupon = couponMapper.getCouponById(couponId);
+						Date validStartTime = null;
+						Date validEndTime = null;
+						if (coupon != null) {
+							if (coupon.getIsValidTime()) {
+								validStartTime = coupon.getValidStartTime();
+								validEndTime = coupon.getValidEndTime();
+							} else {
+								validStartTime = DateTime.now();
+								validEndTime = DateUtil.offsetDay(validStartTime, coupon.getValidDays());
+							}
 						}
-					}
-					if (userIds.size() <= 500) {
-						couponMapper.batchSendCouponToUsers(userIds, corpMsgBulkTask.getCouponId(), CouponUser.Channel.corp_bulk_task, CouponUser.Status.unused, validStartTime, validEndTime);
-					} else {
-						for (List<Long> userIdsList : Lists.partition(userIds, 500)) {
-							couponMapper.batchSendCouponToUsers(userIdsList, corpMsgBulkTask.getCouponId(), CouponUser.Channel.corp_bulk_task, CouponUser.Status.unused, validStartTime, validEndTime);
+						if (userIds.size() <= 500) {
+							couponMapper.batchSendCouponToUsers(userIds, couponId, CouponUser.Channel.corp_bulk_task, CouponUser.Status.unused, validStartTime, validEndTime);
+						} else {
+							for (List<Long> userIdsList : Lists.partition(userIds, 500)) {
+								couponMapper.batchSendCouponToUsers(userIdsList, couponId, CouponUser.Channel.corp_bulk_task, CouponUser.Status.unused, validStartTime, validEndTime);
+							}
 						}
 					}
 				}

+ 3 - 3
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpTagServiceImpl.java

@@ -419,10 +419,10 @@ public class CorpTagServiceImpl implements CorpTagService {
 	}
 
 	@Override
-	public UserOrderDetailView getTagUserData(Integer start, Integer limit, String tagName, String startTime, String endTime) {
-		UserOrderDetailView u = orderDonMapper.getTagUserData(tagName, startTime, endTime);
+	public UserOrderDetailView getTagUserData(Integer start, Integer limit, String tagIdStr, String startTime, String endTime) {
+		UserOrderDetailView u = orderDonMapper.getTagUserData(tagIdStr, startTime, endTime);
 
-		Page<UserOrderDetailView> records = orderDonMapper.getTagUserDataPage(new Page<>(start, limit), tagName, startTime, endTime);
+		Page<UserOrderDetailView> records = orderDonMapper.getTagUserDataPage(new Page<>(start, limit), tagIdStr, startTime, endTime);
 
 		u.setRecords(records);
 		return u;

+ 9 - 0
netflix-service/src/main/java/com/cyksj/service/home/HomeManagementConfigService.java

@@ -2,8 +2,11 @@ package com.cyksj.service.home;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.cyksj.model.entity.HomeManagementConfig;
+import com.cyksj.model.request.HomeConfigTimingReq;
 import com.cyksj.model.request.HomeManageConfigReq;
 
+import java.util.List;
+
 /*
  *项目名: netflix
  *文件名: HomeManagementConfigService
@@ -12,4 +15,10 @@ import com.cyksj.model.request.HomeManageConfigReq;
  */
 public interface HomeManagementConfigService extends IService<HomeManagementConfig> {
 	void saveOrUpdateConfig(HomeManageConfigReq config);
+
+	void timingUpdateStatus(HomeConfigTimingReq req);
+
+	void timingCancel(Long id);
+
+	void batchCancelTimingStatus(List<Long> ids);
 }

+ 101 - 0
netflix-service/src/main/java/com/cyksj/service/home/impl/HomeManagementConfigServiceImpl.java

@@ -2,6 +2,7 @@ package com.cyksj.service.home.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -10,13 +11,19 @@ import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.manage.home.HomeManagementConfigMapper;
 import com.cyksj.model.entity.GoodsDon;
 import com.cyksj.model.entity.HomeManagementConfig;
+import com.cyksj.model.entity.SysFuncTimingShelf;
+import com.cyksj.model.request.HomeConfigTimingReq;
 import com.cyksj.model.request.HomeManageConfigReq;
 import com.cyksj.service.home.HomeManagementConfigService;
+import com.cyksj.service.sys.SysFuncTimingShelfService;
+import com.cyksj.task.JobManager;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Optional;
 
 /*
  *项目名: netflix
@@ -30,6 +37,10 @@ import java.util.List;
 public class HomeManagementConfigServiceImpl extends ServiceImpl<HomeManagementConfigMapper, HomeManagementConfig> implements HomeManagementConfigService {
 	private final GoodsDonMapper goodsDonMapper;
 
+	private final SysFuncTimingShelfService sysFuncTimingShelfService;
+
+	private final JobManager jobManager;
+
 	@Override
 	public void saveOrUpdateConfig(HomeManageConfigReq config) {
 		if (isSpecialType(config.getType())) {
@@ -73,4 +84,94 @@ public class HomeManagementConfigServiceImpl extends ServiceImpl<HomeManagementC
 		}
 		return false;
 	}
+
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void timingUpdateStatus(HomeConfigTimingReq req) {
+		Long id = req.getId();
+		HomeManagementConfig config = this.getById(id);
+		if (config == null || !config.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("对应配置不存在..");
+		}
+		Boolean preStatus = Optional.ofNullable(req.getPreStatus()).orElse(false);
+		//上架状态
+		if (config.getStatus() && preStatus) {
+			throw BusinessRuntimeException.getInstance("该首页配置已上架,只能定时下架..");
+		}
+
+		if (!config.getStatus() && !preStatus) {
+			throw BusinessRuntimeException.getInstance("该首页配置已下架,只能定时上架..");
+		}
+
+		Long time = req.getTime();
+		Long nowMills = System.currentTimeMillis();
+
+		//直接将配置改为对应 定时上下架状态
+		Boolean timingJob = true;
+		if (time <= nowMills) {
+			config.setStatus(preStatus);
+			config.setTime(null);
+			config.setPreStatus(null);
+			timingJob = false;
+		} else {
+			config.setTime(time);
+			config.setPreStatus(preStatus);
+		}
+		this.updateById(config);
+
+		//删除之前设置的定时任务
+		cancelTimingJob(List.of(id));
+
+		if (timingJob) {
+			SysFuncTimingShelf timingShelf = new SysFuncTimingShelf();
+
+			timingShelf.setTime(time);
+			timingShelf.setTimeStr(DateTime.of(time).toString());
+			timingShelf.setPreStatus(preStatus);
+			timingShelf.setFuncId(id);
+			timingShelf.setType(SysFuncTimingShelf.Type.hc.name());
+			sysFuncTimingShelfService.save(timingShelf);
+
+			sysFuncTimingShelfService.addTimingJob(SysFuncTimingShelf.Type.hc.name(), id, timingShelf.getPreStatus(), time, nowMills);
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void timingCancel(Long id) {
+		HomeManagementConfig config = this.getById(id);
+		if (config == null || !config.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("对应配置不存在..");
+		}
+		//删除之前设置的定时任务
+		cancelTimingJob(List.of(id));
+
+		if (config.getTime() != null) {
+			config.setTime(null);
+			config.setPreStatus(null);
+			this.updateById(config);
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void batchCancelTimingStatus(List<Long> ids) {
+		cancelTimingJob(ids);
+	}
+
+	public void cancelTimingJob(List<Long> ids) {
+		Integer count = sysFuncTimingShelfService.count(Wrappers.lambdaQuery(SysFuncTimingShelf.class)
+				.eq(SysFuncTimingShelf::getType, SysFuncTimingShelf.Type.hc)
+				.in(SysFuncTimingShelf::getFuncId, ids)
+				.eq(SysFuncTimingShelf::getDeleted, 1));
+		if (count > 0) {
+			sysFuncTimingShelfService.update(null, Wrappers.lambdaUpdate(SysFuncTimingShelf.class)
+					.set(SysFuncTimingShelf::getDeleted, 0)
+					.eq(SysFuncTimingShelf::getType, SysFuncTimingShelf.Type.hc)
+					.in(SysFuncTimingShelf::getFuncId, ids)
+					.eq(SysFuncTimingShelf::getDeleted, 1));
+			log.info("将之前设置的同配置下{},ids:{}的定时上下架删除", SysFuncTimingShelf.Type.hc.getDesc(), ids.toString());
+		}
+	}
 }

+ 1 - 2
netflix-service/src/main/java/com/cyksj/service/mail/impl/MailServiceImpl.java

@@ -25,7 +25,6 @@ import org.springframework.mail.javamail.JavaMailSenderImpl;
 import org.springframework.mail.javamail.MimeMessageHelper;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.PostConstruct;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeUtility;
 import java.io.File;
@@ -68,7 +67,7 @@ public class MailServiceImpl implements MailService {
 	/**
 	 * 获取邮箱客户端
 	 */
-	@PostConstruct
+	//@PostConstruct
 	public void init() throws Exception {
 		List<EmailConfig> emailConfigs = emailConfigMapper.selectList(null);
 		senders = new ArrayList<>(emailConfigs.size());

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java

@@ -13,7 +13,7 @@ import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.mapper.AccountMapper;
 import com.cyksj.mapper.AccountUpdatePasswordRecordMapper;
-import com.cyksj.mapper.SysEmailMapper;
+import com.cyksj.mapper.sys.SysEmailMapper;
 import com.cyksj.mapper.manage.AutoUpdateAccountPwdLogMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.model.entity.*;

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonPostServiceImpl.java

@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.mapper.OrderDonMapper;
-import com.cyksj.mapper.SysConfigMapper;
+import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.mapper.order.OrderDonPostMapper;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.entity.OrderDonPost;

+ 1 - 0
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -17,6 +17,7 @@ import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.mapper.*;
+import com.cyksj.mapper.sys.SysEmailMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.SpecialGoodsTicketReq;
 import com.cyksj.model.views.*;

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/shop/impl/YhShopServiceImpl.java

@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.ValidatorUtil;
-import com.cyksj.mapper.SysConfigMapper;
+import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.mapper.shop.YhShopApplyRecordMapper;
 import com.cyksj.mapper.shop.YhShopMapper;

+ 14 - 0
netflix-service/src/main/java/com/cyksj/service/sys/SysFuncTimingShelfService.java

@@ -0,0 +1,14 @@
+package com.cyksj.service.sys;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.SysFuncTimingShelf;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: SysFuncTimingShelfService
+ * 创建者: JavaZou
+ * 创建时间:2023/12/28 11:03
+ */
+public interface SysFuncTimingShelfService extends IService<SysFuncTimingShelf> {
+	void addTimingJob(String type, Long funcId, Boolean preStatus, Long time, Long nowMills);
+}

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/sys/impl/SysConfigChangeRecordServiceImpl.java

@@ -3,7 +3,7 @@ package com.cyksj.service.sys.impl;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.common.constant.Constant;
-import com.cyksj.mapper.SysConfigChangeRecordMapper;
+import com.cyksj.mapper.sys.SysConfigChangeRecordMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.model.entity.SysConfigChangeRecord;
 import com.cyksj.service.sys.SysConfigChangeRecordService;

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/sys/impl/SysConfigServiceImpl.java

@@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.service.CropDutyServiceDateService;
 import com.cyksj.common.util.Jsons;
-import com.cyksj.mapper.SysConfigMapper;
+import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.model.dto.DefaultShopConfig;
 import com.cyksj.model.dto.YhServiceDto;
 import com.cyksj.model.entity.ShopConfig;

+ 91 - 0
netflix-service/src/main/java/com/cyksj/service/sys/impl/SysFuncTimingShelfServiceImpl.java

@@ -0,0 +1,91 @@
+package com.cyksj.service.sys.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.RandomUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.manage.home.HomeManagementConfigMapper;
+import com.cyksj.mapper.sys.SysFuncTimingShelfMapper;
+import com.cyksj.model.entity.SysFuncTimingShelf;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.sys.SysFuncTimingShelfService;
+import com.cyksj.task.JobManager;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: SysFuncTimingShelfServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2023/12/28 11:03
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class SysFuncTimingShelfServiceImpl extends ServiceImpl<SysFuncTimingShelfMapper, SysFuncTimingShelf> implements SysFuncTimingShelfService {
+	private final JobManager jobManager;
+
+	private final HomeManagementConfigMapper homeManagementConfigMapper;
+
+	private final RedisService redisService;
+
+
+	@PostConstruct
+	public void initShelfTimingJob() {
+		List<SysFuncTimingShelf> list = this.list(Wrappers.lambdaQuery(SysFuncTimingShelf.class).eq(SysFuncTimingShelf::getDeleted, 1));
+
+		long nowMills = System.currentTimeMillis();
+		log.info("初始化添加定时上下架任务数量:{}", list.size());
+		list.forEach(sysFuncTimingShelf -> {
+			addTimingJob(sysFuncTimingShelf.getType(), sysFuncTimingShelf.getFuncId(), sysFuncTimingShelf.getPreStatus(), sysFuncTimingShelf.getTime(), nowMills);
+		});
+	}
+
+	@Override
+	public void addTimingJob(String type, Long funcId, Boolean preStatus, Long time, Long nowMills) {
+		Runnable task = null;
+		if (SysFuncTimingShelf.Type.valueOf(type) == SysFuncTimingShelf.Type.hc) {
+			log.info("添加首页配置id:{},time{},状态为:{}定时任务-------------->", funcId, DateTime.of(time), preStatus);
+			task = () -> addHomeConfigTimingJob(funcId);
+		}
+		if (task != null) {
+			Long startTime = time - nowMills;
+			if (startTime < 0) {
+				//随机一个2s
+				startTime = RandomUtil.randomLong(2000);
+			}
+			jobManager.addJob(startTime, task);
+		}
+	}
+
+
+	@Transactional(rollbackFor = Throwable.class)
+	public void addHomeConfigTimingJob(Long funcId) {
+		Optional.ofNullable(this.getOne(Wrappers.lambdaQuery(SysFuncTimingShelf.class)
+				.eq(SysFuncTimingShelf::getType, SysFuncTimingShelf.Type.hc)
+				.eq(SysFuncTimingShelf::getFuncId, funcId)
+				.le(SysFuncTimingShelf::getTime, System.currentTimeMillis())
+				.eq(SysFuncTimingShelf::getDeleted, 1)
+				.last("limit 1"))).ifPresent(timingShelf -> {
+			timingShelf.setDeleted(false);
+			this.updateById(timingShelf);
+			Optional.ofNullable(homeManagementConfigMapper.selectById(funcId)).ifPresent(homeManagementConfig -> {
+				homeManagementConfig.setTime(null);
+				homeManagementConfig.setPreStatus(null);
+				homeManagementConfig.setStatus(timingShelf.getPreStatus());
+				homeManagementConfigMapper.updateById(homeManagementConfig);
+				log.info("将首页配置:{}的状态置为:{}状态", funcId, timingShelf.getPreStatus());
+
+				Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "*");
+				redisService.del(keys.toArray(String[]::new));
+			});
+		});
+	}
+}

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -17,7 +17,7 @@ import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.RegisterOrderDonMapper;
-import com.cyksj.mapper.SysConfigMapper;
+import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.ClickRecordReq;
 import com.cyksj.model.views.*;

+ 1 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java

@@ -24,6 +24,7 @@ import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.*;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.mapper.sys.SysEmailMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.*;
 import com.cyksj.model.manage.request.ReqAccountIncrExpiryTime;

+ 3 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgBulkTaskController.java

@@ -124,8 +124,9 @@ public class CorpMsgBulkTaskController {
 				if (StrUtil.isNotBlank(data.getAttachmentsStr())) {
 					data.setAttachments(Jsons.parseList(data.getAttachmentsStr(), Attachments.class));
 				}
-				if (data.getCouponId() != null) {
-					data.setCouponName(couponMapper.getCouponNameById(data.getCouponId()));
+				if (StrUtil.isNotEmpty(data.getCouponIds())) {
+					List<Long> couponIds = Jsons.parseList(data.getCouponIds(), Long.class);
+					data.setCouponName(couponMapper.getCouponNameByIds(couponIds));
 				}
 				if (data.getCategory() != null && data.getCategory() > 0) {
 					Optional.ofNullable(corpMsgBulkTaskCategoryMapper.selectById(data.getCategory())).ifPresent(e -> data.setCategoryName(e.getName()));

+ 3 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpTagController.java

@@ -173,9 +173,9 @@ public class CorpTagController {
 	 * 通过标签 查找对应用户订单数据
 	 */
 	@GetMapping("/get/tagUser/data")
-	public Result<UserOrderDetailView> getTagUserData(@RequestParam(defaultValue = "1") Integer start, @RequestParam(defaultValue = "10") Integer limit, @RequestParam(required = true) String tagName, String startTime, String endTime) {
-		Assert.notEmpty(tagName, "请输入对应标签");
-		UserOrderDetailView userOrderDetailView = corpTagService.getTagUserData(start, limit, tagName, startTime, endTime);
+	public Result<UserOrderDetailView> getTagUserData(@RequestParam(defaultValue = "1") Integer start, @RequestParam(defaultValue = "10") Integer limit, @RequestParam(required = true) String tagIdStr, String startTime, String endTime) {
+		Assert.notEmpty(tagIdStr, "请输入对应标签");
+		UserOrderDetailView userOrderDetailView = corpTagService.getTagUserData(start, limit, tagIdStr, startTime, endTime);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(userOrderDetailView);
 	}
 }

+ 31 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/home/HomeManageConfigController.java

@@ -7,6 +7,7 @@ import com.cyksj.enums.GatewayResponse;
 import com.cyksj.model.entity.GoodsDonCategory;
 import com.cyksj.model.entity.HomeManagementConfig;
 import com.cyksj.model.entity.HomeManagementConfigUserClickRecord;
+import com.cyksj.model.request.HomeConfigTimingReq;
 import com.cyksj.model.request.HomeManageConfigReq;
 import com.cyksj.model.views.HomeManagementAvailableGoodsView;
 import com.cyksj.model.views.HomeManagementConfigView;
@@ -23,7 +24,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Set;
 
-/*
+/** admin/首页管理/首页配置管理
  *项目名: netflix
  *文件名: HomeManageConfigController
  *创建者: JavaZou
@@ -72,6 +73,8 @@ public class HomeManageConfigController {
 		HomeManagementConfig byId = homeManagementConfigService.getById(id);
 		Assert.notNull(byId, "配置不存在");
 		byId.setStatus(!byId.getStatus());
+		byId.setTime(null);
+		byId.setPreStatus(null);
 		homeManagementConfigService.updateById(byId);
 		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "*");
 		redisService.del(keys.toArray(String[]::new));
@@ -84,8 +87,14 @@ public class HomeManageConfigController {
 	@PutMapping("/batch/update/status/{status}")
 	public Result<String> batchUpdateStatus(@RequestBody List<Long> ids, @PathVariable Boolean status) {
 		homeManagementConfigService.update(null, Wrappers.lambdaUpdate(HomeManagementConfig.class)
+				.set(HomeManagementConfig::getTime, null)
+				.set(HomeManagementConfig::getPreStatus, null)
 				.set(HomeManagementConfig::getStatus, status)
 				.in(HomeManagementConfig::getId, ids));
+		//批量取消定时上下架状态
+		homeManagementConfigService.batchCancelTimingStatus(ids);
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "*");
+		redisService.del(keys.toArray(String[]::new));
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
@@ -97,6 +106,8 @@ public class HomeManageConfigController {
 		goodsDonCategoryService.update(null, Wrappers.lambdaUpdate(GoodsDonCategory.class)
 				.set(GoodsDonCategory::getStatus, status)
 				.in(GoodsDonCategory::getId, ids));
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "*");
+		redisService.del(keys.toArray(String[]::new));
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
@@ -159,4 +170,23 @@ public class HomeManageConfigController {
 				.build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(views);
 	}
+
+	/**
+	 * 定时上下架时间
+	 */
+	@PutMapping("/timing/update/status")
+	public Result<String> timingUpdateStatus(@RequestBody HomeConfigTimingReq req) {
+		homeManagementConfigService.timingUpdateStatus(req);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 取消定时上下架
+	 */
+	@PutMapping("/timing/cancel/{id}")
+	public Result<String> timingCancel(@PathVariable Long id) {
+		homeManagementConfigService.timingCancel(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
 }