Browse Source

后台订单列表

zoujiajian 2 năm trước cách đây
mục cha
commit
74037a286c
16 tập tin đã thay đổi với 715 bổ sung114 xóa
  1. 3 0
      netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationMapper.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonCustomerServiceRelateMapper.java
  3. 5 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
  4. 28 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonCustomerServiceRelate.java
  5. 49 72
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java
  6. 48 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryView.java
  7. 59 0
      netflix-dao/src/main/java/com/cyksj/model/views/OrderDonUserRefundDetailView.java
  8. 37 0
      netflix-dao/src/main/java/com/cyksj/model/views/RefundOrderDonServiceDataView.java
  9. 7 0
      netflix-dao/src/main/resources/mapper/GroupRelationMapper.xml
  10. 22 0
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  11. 13 0
      netflix-service/src/main/java/com/cyksj/service/mange/GoodsDonCategoryRelateService.java
  12. 5 0
      netflix-service/src/main/java/com/cyksj/service/mange/RefreshCacheService.java
  13. 19 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/GoodsDonCategoryRelateServiceImpl.java
  14. 6 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/RefreshCacheServiceImpl.java
  15. 207 42
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java
  16. 194 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonCategoryController.java

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationMapper.java

@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.model.entity.GroupsRelation;
 import com.cyksj.model.entity.GroupsRelation;
+import com.cyksj.model.manage.views.GroupsRelationBackView;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.views.GroupsRelationUserView;
 import com.cyksj.model.views.GroupsRelationUserView;
 import com.cyksj.model.views.UserRecommendGoodsFrontView;
 import com.cyksj.model.views.UserRecommendGoodsFrontView;
@@ -53,4 +54,6 @@ public interface GroupsRelationMapper extends BaseMapper<GroupsRelation> {
 	Page<UserRecommendGoodsFrontView> getRecommendGoodsViews(@Param("page") Page<UserRecommendGoodsFrontView> page, @Param("list") List<Long> filter_goods_id, @Param("isPayNf") Boolean isPayNf);
 	Page<UserRecommendGoodsFrontView> getRecommendGoodsViews(@Param("page") Page<UserRecommendGoodsFrontView> page, @Param("list") List<Long> filter_goods_id, @Param("isPayNf") Boolean isPayNf);
 
 
 	Long getOutSideGroupsTripsRelationByGoodsId(@Param("skuId") Long skuId, @Param("beginOfDay") DateTime beginOfDay, @Param("extraNum") Integer extraNum, @Param("userId") Long userId, @Param("skuNum") Integer skuNum, @Param("maxNum") Integer maxNum);
 	Long getOutSideGroupsTripsRelationByGoodsId(@Param("skuId") Long skuId, @Param("beginOfDay") DateTime beginOfDay, @Param("extraNum") Integer extraNum, @Param("userId") Long userId, @Param("skuNum") Integer skuNum, @Param("maxNum") Integer maxNum);
+
+	GroupsRelationBackView getGroupRelationAccountView(Long relationId);
 }
 }

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.OrderDonCustomerServiceRelate;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderDonCustomerServiceRelateMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/4/1 15:38
+ */
+public interface OrderDonCustomerServiceRelateMapper extends BaseMapper<OrderDonCustomerServiceRelate> {
+}

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

@@ -2,6 +2,7 @@ package com.cyksj.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.OrderDonCustomerServiceRelate;
 import com.cyksj.model.excel.ExcelOrderDonInfo;
 import com.cyksj.model.excel.ExcelOrderDonInfo;
 import com.cyksj.model.views.BrokenLineObjView;
 import com.cyksj.model.views.BrokenLineObjView;
 import com.cyksj.model.views.ChannelPopularizeView;
 import com.cyksj.model.views.ChannelPopularizeView;
@@ -44,4 +45,8 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	BigDecimal selectThisMonthDistributeOrderMoney(@Param("skuIds") Set<Long> skuIds, @Param("startDate") String startDate, @Param("endDate") String endDate);
 	BigDecimal selectThisMonthDistributeOrderMoney(@Param("skuIds") Set<Long> skuIds, @Param("startDate") String startDate, @Param("endDate") String endDate);
 
 
 	Map<String, Object> getOrderDetailByGoodsType(@Param("type") Integer type, @Param("noOrderStatus") List<String> noOrderStatus, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
 	Map<String, Object> getOrderDetailByGoodsType(@Param("type") Integer type, @Param("noOrderStatus") List<String> noOrderStatus, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
+
+	OrderDonCustomerServiceRelate selectOrderRelate(Long orderId);
+
+	String selectMaxRefundGoodsName(@Param("operator") String operator, @Param("startTime") String startTime, @Param("endTime") String endTime);
 }
 }

+ 28 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonCustomerServiceRelate.java

@@ -0,0 +1,28 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderDonCustomerServiceRelate
+ * 创建者: JavaZou
+ * 创建时间:2024/4/1 15:37
+ */
+@Getter
+@Setter
+public class OrderDonCustomerServiceRelate extends BaseEntity{
+	@NotNull
+	private Long orderId;
+
+	@NotNull
+	private Long cmsUserId;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private String nickname;
+}

+ 49 - 72
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java

@@ -1,8 +1,7 @@
 package com.cyksj.model.manage.views;
 package com.cyksj.model.manage.views;
 
 
+import com.cyksj.model.entity.GoodsDon;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.entity.OrderDon;
-import com.cyksj.model.entity.OrderDonTransport;
-import com.cyksj.model.views.GoodsDonSkuView;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.ejlchina.searcher.bean.SearchBean;
@@ -11,7 +10,6 @@ import lombok.Setter;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.Date;
-import java.util.List;
 
 
 /*
 /*
  *项目名: netflix
  *项目名: netflix
@@ -21,9 +19,9 @@ import java.util.List;
  */
  */
 @Getter
 @Getter
 @Setter
 @Setter
-@SearchBean(tables = "order_don o left join goods_don g on g.id = o.goods_id " +
-		"left join user u on o.user_id = u.id " +
-		"left join order_don_transport odt on odt.order_id = o.id"
+@SearchBean(tables = "order_don o left join goods_don g on g.id = o.goods_id" +
+		" left join goods_don_sku sku on sku.id = o.sku_id",
+		where = ":condition:"
 )
 )
 public class OrderDonBackView {
 public class OrderDonBackView {
 	@DbField("o.id")
 	@DbField("o.id")
@@ -35,6 +33,12 @@ public class OrderDonBackView {
 	@DbField("o.relation_id")
 	@DbField("o.relation_id")
 	private Long relationId;
 	private Long relationId;
 
 
+	/**
+	 * 是否是额外硬塞的虚拟车票订单
+	 */
+	@DbField("o.is_ot")
+	private Boolean isOt;
+
 	/**
 	/**
 	 * 邀请制用户账号
 	 * 邀请制用户账号
 	 */
 	 */
@@ -62,45 +66,57 @@ public class OrderDonBackView {
 	@DbField("g.title")
 	@DbField("g.title")
 	private String title;
 	private String title;
 
 
+	@DbField("g.special_type")
+	private GoodsDon.SpecialType goodsSpecialType;
+
 	@DbField("o.sku_id")
 	@DbField("o.sku_id")
 	private Long skuId;
 	private Long skuId;
 
 
-	@DbIgnore
+	/**
+	 * 平台id
+	 */
+	@DbField("o.goods_id")
+	private Long goodsId;
+
+	@DbField("sku.spec_val")
 	private String specVal;
 	private String specVal;
 
 
+	@DbField("sku.is_benefits")
+	private Boolean isBenefits;
+
 	@DbField("o.user_id")
 	@DbField("o.user_id")
 	private Long userId;
 	private Long userId;
 
 
-	@DbField("u.nickname")
+	@DbIgnore
 	private String nickname;
 	private String nickname;
 
 
-	@DbField("case when u.login_phone != '' then 'phone' when u.email != '' then 'email' when u.open_id != '' then 'wechat' else 'wechat' end")
+	@DbIgnore
 	private String register;
 	private String register;
 
 
 	/**
 	/**
 	 * 登录注册手机号
 	 * 登录注册手机号
 	 */
 	 */
-	@DbField("u.login_phone")
+	@DbIgnore
 	private String loginPhone;
 	private String loginPhone;
 
 
 	/**
 	/**
 	 * 登录注册邮箱
 	 * 登录注册邮箱
 	 */
 	 */
-	@DbField("u.email")
+	@DbIgnore
 	private String email;
 	private String email;
 
 
 	@DbField("o.money")
 	@DbField("o.money")
 	private BigDecimal money;
 	private BigDecimal money;
 
 
-	@DbField("o.currency")
-	private String currency;
-
 	@DbField("o.balance")
 	@DbField("o.balance")
 	private BigDecimal balance;
 	private BigDecimal balance;
 
 
 	@DbField("o.refund_money")
 	@DbField("o.refund_money")
 	private BigDecimal refundMoney;
 	private BigDecimal refundMoney;
 
 
+	@DbField("o.refund_balance")
+	private BigDecimal refundBalance;
+
 	@DbField("o.status")
 	@DbField("o.status")
 	private OrderDon.Status status;
 	private OrderDon.Status status;
 
 
@@ -119,12 +135,24 @@ public class OrderDonBackView {
 	@DbField("o.tv_type")
 	@DbField("o.tv_type")
 	private Integer tvType;
 	private Integer tvType;
 
 
-	@DbIgnore
+	@DbField("sku.months")
 	private Integer months;
 	private Integer months;
 
 
-	@DbIgnore
+	@DbField("sku.days")
 	private Integer days;
 	private Integer days;
 
 
+	/**
+	 * 是否是镜像服务
+	 */
+	@DbField("sku.is_mirror")
+	private Boolean isMirror;
+
+	/**
+	 * 客服id
+	 */
+	@DbIgnore
+	private Long cmsUserId;
+
 	@DbField("o.num")
 	@DbField("o.num")
 	private Integer num;
 	private Integer num;
 
 
@@ -155,60 +183,9 @@ public class OrderDonBackView {
 	@DbField("o.ex_code")
 	@DbField("o.ex_code")
 	private String exCode;
 	private String exCode;
 
 
-	@DbField("o.sub_node")
-	private String subNode;
-
-	/**
-	 * 收货人
-	 */
-	@DbField("odt.receiver")
-	private String receiver;
+	@DbField("sku.mj_fast_num")
+	private Integer mjFastNum;
 
 
-	/**
-	 * 手机号
-	 */
-	@DbField("odt.phone")
-	private String phone;
-
-	/**
-	 * 省份
-	 */
-	@DbField("odt.province")
-	private String province;
-
-	/**
-	 * 城市
-	 */
-	@DbField("odt.city")
-	private String city;
-
-	/**
-	 * 区/县
-	 */
-	@DbField("odt.district")
-	private String district;
-
-	/**
-	 * 详细地址
-	 */
-	@DbField("odt.address")
-	private String address;
-
-	@DbIgnore
-	private OrderDonTransport transport;
-
-	@DbIgnore
-	private String beforeServiceName;
-
-	@DbIgnore
-	private String afterServiceName;
-
-	/**
-	 * 是否可领取实物购买权益
-	 */
-	@DbIgnore
-	private Boolean isHasBenefits;
-
-	@DbIgnore
-	private List<GoodsDonSkuView> benefitsViews;
-}
+	@DbField("sku.mj_relax_num")
+	private Integer mjRelaxNum;
+}

+ 48 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryView.java

@@ -0,0 +1,48 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonCategoryView
+ *创建者: JavaZou
+ *创建时间:2023/8/18 10:36
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don_category gc left join goods_don_category_relate gcr on gcr.category = gc.id" +
+		" left join goods_don g on g.id = gcr.goods_id and g.deleted is true",
+		groupBy = "gc.id,gc.name,gc.icon,gc.sorted,gc.update_time")
+public class GoodsDonCategoryView {
+	@DbField("gc.id")
+	private Long id;
+
+	@DbField("gc.name")
+	private String name;
+
+	@DbField("gc.icon")
+	private String icon;
+
+	@DbField("gc.sorted")
+	private Integer sorted;
+
+	@DbField("count(g.id)")
+	private Integer count;
+
+	@DbField("select count(*) from goods_click_user_record gcur where gcur.category = gc.id")
+	private Integer click;
+
+	@DbField("select count(*) from goods_don_category_relate gcr left join order_don o on o.goods_id = gcr.goods_id where gcr.category = gc.id and o.status not in ('close','noPayment','refund')")
+	private Integer orderNum;
+
+	@DbField("gc.status")
+	private Boolean status;
+
+	@DbField("gc.update_time")
+	private Date updateTime;
+}

+ 59 - 0
netflix-dao/src/main/java/com/cyksj/model/views/OrderDonUserRefundDetailView.java

@@ -0,0 +1,59 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.OrderDon;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderDonUserRefundDetailView
+ * 创建者: JavaZou
+ * 创建时间:2024/7/2 10:05
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_don",
+		where = "status not in ('close','noPayment') :uid:")
+public class OrderDonUserRefundDetailView {
+	@DbField("count(1)")
+	private Integer orders;
+
+	@DbField("count(if(status = 'refund',1,NULL))")
+	private Integer refundOrders;
+
+
+	@Getter
+	@Setter
+	@SearchBean(tables = "order_don o left join goods_don g on g.id = o.goods_id" +
+			" left join goods_don_sku sku on sku.id = o.sku_id")
+	public static class OrderDonDetailView {
+		@DbField("o.user_id")
+		private Long userId;
+
+		@DbField("o.goods_id")
+		private Long goodsId;
+
+		@DbField("g.title")
+		private String title;
+
+		@DbField("sku.spec_val")
+		private String specVal;
+
+		@DbField("o.sku_id")
+		private Long skuId;
+
+		@DbField("ifnull(o.pay_time,o.created_time)")
+		private Date payTime;
+
+		@DbField("o.status")
+		private OrderDon.Status status;
+
+		@DbField("o.money")
+		private BigDecimal money;
+	}
+}

+ 37 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RefundOrderDonServiceDataView.java

@@ -0,0 +1,37 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RefundOrderDonServiceDataView
+ * 创建者: JavaZou
+ * 创建时间:2024/1/8 17:03
+ */
+@Getter
+@Setter
+@SearchBean(tables = "refund_order_don rd inner join order_don o on o.id = rd.order_id :time:",
+		where = "rd.refund_method not in ('EX_CODE','balance')",
+		groupBy = "rd.operator")
+public class RefundOrderDonServiceDataView {
+	@DbField("rd.operator")
+	private String operator;
+
+	@DbField("count(distinct rd.order_id)")
+	private Integer orders;
+
+	@DbField("sum(rd.refund_fee)/100")
+	private BigDecimal refundMoney;
+
+	/**
+	 * 退款最多的产品
+	 */
+	@DbIgnore
+	private String goodsName;
+}

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

@@ -245,4 +245,11 @@
           and (gt.available_parking_num = 0 or (select count(*) from groups_relation gr where gr.groups_id = gt.id and gr.user_id != 0 and gr.num &lt;= #{maxNum}) &lt; gt.available_parking_num)
           and (gt.available_parking_num = 0 or (select count(*) from groups_relation gr where gr.groups_id = gt.id and gr.user_id != 0 and gr.num &lt;= #{maxNum}) &lt; gt.available_parking_num)
         order by RAND() limit 1
         order by RAND() limit 1
     </select>
     </select>
+
+    <select id="getGroupRelationAccountView" resultType="com.cyksj.model.manage.views.GroupsRelationBackView">
+        select s.account, a.account as tripsAccount
+        from (select groups_id, account from groups_relation where id = #{relationId} limit 1) s
+                 inner join groups_trips gt on gt.id = s.groups_id
+                 left join account a on a.id = gt.account_id
+    </select>
 </mapper>
 </mapper>

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

@@ -168,4 +168,26 @@
             and created_time &lt; #{endDate}
             and created_time &lt; #{endDate}
         </if>
         </if>
     </select>
     </select>
+
+    <select id="selectOrderRelate" resultType="com.cyksj.model.entity.OrderDonCustomerServiceRelate">
+        select cms_user_id, (select nickname from cms_user where id = odr.cms_user_id limit 1) as nickname
+        from order_don_customer_service_relate odr
+        where order_id = #{orderId} limit 1
+    </select>
+
+    <select id="selectMaxRefundGoodsName" resultType="java.lang.String">
+        select (select title from goods_don where id = o.goods_id limit 1)
+        from (select distinct order_id from refund_order_don where operator = #{operator}
+        and refund_method not in ('EX_CODE'
+        , 'balance')) rd inner join order_don o
+        on o.id = rd.order_id
+        <if test="startTime != null">
+            and o.created_time >= #{startTime}
+        </if>
+        <if test="endTime != null">
+            and o.created_time &lt; #{endTime}
+        </if>
+        group by o.goods_id
+        order by count(*) desc limit 1
+    </select>
 </mapper>
 </mapper>

+ 13 - 0
netflix-service/src/main/java/com/cyksj/service/mange/GoodsDonCategoryRelateService.java

@@ -0,0 +1,13 @@
+package com.cyksj.service.mange;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.GoodsDonCategoryRelate;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonCategoryRelateService
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 14:34
+ */
+public interface GoodsDonCategoryRelateService extends IService<GoodsDonCategoryRelate> {
+}

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/mange/RefreshCacheService.java

@@ -12,4 +12,9 @@ public interface RefreshCacheService {
 	 * 清除官网首页商品缓存
 	 * 清除官网首页商品缓存
 	 */
 	 */
 	void refreshYhHomePageCache();
 	void refreshYhHomePageCache();
+
+	/**
+	 * 清除首页分类缓存
+	 */
+	void refreshYhHomeCategoryPageCache();
 }
 }

+ 19 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/GoodsDonCategoryRelateServiceImpl.java

@@ -0,0 +1,19 @@
+package com.cyksj.service.mange.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.GoodsDonCategoryRelateMapper;
+import com.cyksj.model.entity.GoodsDonCategoryRelate;
+import com.cyksj.service.mange.GoodsDonCategoryRelateService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonCategoryRelateServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 14:34
+ */
+@Service
+@RequiredArgsConstructor
+public class GoodsDonCategoryRelateServiceImpl extends ServiceImpl<GoodsDonCategoryRelateMapper, GoodsDonCategoryRelate> implements GoodsDonCategoryRelateService {
+}

+ 6 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/RefreshCacheServiceImpl.java

@@ -23,4 +23,10 @@ public class RefreshCacheServiceImpl implements RefreshCacheService {
 		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "*");
 		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "*");
 		redisService.del(keys.toArray(String[]::new));
 		redisService.del(keys.toArray(String[]::new));
 	}
 	}
+
+	@Override
+	public void refreshYhHomeCategoryPageCache() {
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "category" + "*");
+		redisService.del(keys.toArray(String[]::new));
+	}
 }
 }

+ 207 - 42
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -1,6 +1,8 @@
 package com.cyksj.web.controller.manage;
 package com.cyksj.web.controller.manage;
 
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -10,11 +12,11 @@ import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.BusinessType;
+import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.enums.GatewayResponse;
-import com.cyksj.mapper.GoodsDonSkuMapper;
-import com.cyksj.mapper.GroupsRelationMapper;
-import com.cyksj.mapper.OrderCommentMapper;
+import com.cyksj.mapper.*;
 import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.channel.ChannelPopularizeMapper;
+import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelOrderDonData;
 import com.cyksj.model.excel.ExcelOrderDonData;
@@ -26,6 +28,7 @@ import com.cyksj.model.request.OrderRefundReq;
 import com.cyksj.model.views.*;
 import com.cyksj.model.views.*;
 import com.cyksj.service.mange.CmsOrderDonService;
 import com.cyksj.service.mange.CmsOrderDonService;
 import com.cyksj.service.order.OrderDonCommentService;
 import com.cyksj.service.order.OrderDonCommentService;
+import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.EasyExcelUtils;
 import com.cyksj.web.util.EasyExcelUtils;
 import com.cyksj.web.util.StpAbroadUtil;
 import com.cyksj.web.util.StpAbroadUtil;
@@ -36,15 +39,18 @@ import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
 import java.util.Optional;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 
 /**
 /**
  * @author chan
  * @author chan
@@ -75,9 +81,19 @@ public class CmsOrderController {
 
 
 	private final GroupsRelationMapper relationMapper;
 	private final GroupsRelationMapper relationMapper;
 
 
+	private final CmsUserMapper cmsUserMapper;
+
+	private final UserMapper userMapper;
+
+	private final OrderDonMapper orderDonMapper;
+
+	private final UserBindRelationService userBindRelationService;
+
+	private final OrderDonCustomerServiceRelateMapper orderDonCustomerServiceRelateMapper;
+
 
 
 	@GetMapping("/get")
 	@GetMapping("/get")
-	public Result<SearchResult<OrderDonBackView>> get(Long channelId, String account, String showId) {
+	public Result<SearchResult<OrderDonBackView>> get(Long channelId, String account, String showId, Long acId, String nickname, String register, Boolean isGoogle, Boolean isSubsidy) {
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		if (channelId != null) {
 		if (channelId != null) {
 			List<Long> popularizeIds = channelPopularizeMapper.getPopularizeIdByChannelId(channelId);
 			List<Long> popularizeIds = channelPopularizeMapper.getPopularizeIdByChannelId(channelId);
@@ -95,6 +111,41 @@ public class CmsOrderController {
 		if (StrUtil.isNotBlank(showId)) {
 		if (StrUtil.isNotBlank(showId)) {
 			builder.field(OrderDonBackView::getUserId, userService.getUserIdByShowId(showId));
 			builder.field(OrderDonBackView::getUserId, userService.getUserIdByShowId(showId));
 		}
 		}
+		String conditionSql = StrUtil.EMPTY;
+		if (acId != null) {
+			conditionSql += String.format(" o.user_id in (select user_id from corp_user where ac_id = %s)", acId);
+		}
+		if (!ObjectUtil.isAllEmpty(nickname, register, isGoogle)) {
+			if (StrUtil.isNotEmpty(conditionSql)) {
+				conditionSql += " and ";
+			}
+			conditionSql += " exists (select u.id from user u where u.id = o.user_id";
+			if (StrUtil.isNotEmpty(nickname)) {
+				conditionSql += String.format(" and u.nickname like '%s%%'", nickname);
+			}
+			if (StrUtil.isNotEmpty(register)) {
+				if ("phone".equals(register)) {
+					conditionSql += " and u.login_phone != ''";
+				} else if ("email".equals(register)) {
+					conditionSql += " and u.email != ''";
+				} else if ("wechat".equals(register)) {
+					conditionSql += " and u.unionid != ''";
+				}
+			}
+			if (isGoogle != null && isGoogle) {
+				conditionSql += String.format(" and u.is_google is %s", isGoogle);
+			}
+			conditionSql += " limit 1)";
+		}
+		if (isSubsidy != null) {
+			if (StrUtil.isNotEmpty(conditionSql)) {
+				conditionSql += " and ";
+			}
+			conditionSql += " exists (select 1 from order_don_subsidy_relate ocr where ocr.order_id = o.id limit 1)";
+		}
+		if (StrUtil.isNotBlank(conditionSql)) {
+			builder.put("condition", conditionSql);
+		}
 		SearchResult<OrderDonBackView> search = beanSearcher.search(OrderDonBackView.class, builder.build());
 		SearchResult<OrderDonBackView> search = beanSearcher.search(OrderDonBackView.class, builder.build());
 		search.getDataList().forEach(data -> {
 		search.getDataList().forEach(data -> {
 			if (data.getPopularizeId() != null) {
 			if (data.getPopularizeId() != null) {
@@ -105,18 +156,30 @@ public class CmsOrderController {
 				data.setCouponName(couponMapper.getCouponNameByCouponUserId(data.getCouponUserId()));
 				data.setCouponName(couponMapper.getCouponNameByCouponUserId(data.getCouponUserId()));
 				data.setCouponMoney(data.getCouponMoney() == null ? BigDecimal.ZERO : data.getCouponMoney());
 				data.setCouponMoney(data.getCouponMoney() == null ? BigDecimal.ZERO : data.getCouponMoney());
 			}
 			}
-			Optional.ofNullable(relationMapper.selectById(data.getRelationId()))
-					.ifPresent(relation -> {
-						data.setAccount(relation.getAccount());
-						AccountView accountView = beanSearcher.searchFirst(AccountView.class, MapUtils.builder().field(AccountView::getGroupsId, relation.getGroupsId()).onlySelect(AccountView::getAccount).build());
-						Optional.ofNullable(accountView).ifPresent(view -> data.setGtAccount(view.getAccount()));
-					});
-			Optional.ofNullable(skuMapper.selectById(data.getSkuId()))
-					.ifPresent(sku -> {
-						data.setSpecVal(sku.getSpecVal());
-						data.setMonths(sku.getMonths());
-						data.setDays(sku.getDays());
-					});
+
+			if (data.getRelationId() != 0) {
+				Optional.ofNullable(relationMapper.getGroupRelationAccountView(data.getRelationId()))
+						.ifPresent(e -> {
+							data.setGtAccount(e.getTripsAccount());
+							data.setAccount(e.getAccount());
+						});
+			}
+
+			User user = userMapper.selectById(data.getUserId());
+			if (user != null) {
+				data.setNickname(user.getNickname());
+				data.setLoginPhone(user.getLoginPhone());
+				data.setEmail(user.getEmail());
+				data.setRegister(StrUtil.isNotEmpty(user.getUnionid()) ? "wechat" : StrUtil.isNotEmpty(user.getLoginPhone()) ? "phone" : "email");
+
+			}
+			if (data.getGoodsDonType() != null && data.getGoodsDonType() == 1) {
+				//获取订单关联客服
+				Optional.ofNullable(orderDonMapper.selectOrderRelate(data.getId())).ifPresent(e -> {
+					data.setCmsUserId(e.getCmsUserId());
+					data.setNickname(e.getNickname());
+				});
+			}
 		});
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 	}
@@ -151,16 +214,6 @@ public class CmsOrderController {
 			if (data.getChannelId() == null) {
 			if (data.getChannelId() == null) {
 				data.setChannel("自然流量渠道");
 				data.setChannel("自然流量渠道");
 			}
 			}
-			if (data.getGoodsDonType() != null && Constant.realGoodsType.contains(data.getGoodsDonType())) {
-				OrderDonTransportView transportView = beanSearcher.searchFirst(OrderDonTransportView.class, MapUtils.builder().field(OrderDonTransportView::getOrderId, data.getId()).build());
-				if (transportView != null) {
-					data.setTransportStr(String.format("%s%s%s%s", transportView.getProvince(), transportView.getCity(), transportView.getDistrict(), transportView.getAddress()));
-					data.setPhone(transportView.getPhone());
-					data.setReceiver(transportView.getReceiver());
-					data.setCodeCn(transportView.getCodeCn());
-					data.setTrackingNumber(transportView.getTrackingNumber());
-				}
-			}
 			if (data.getCouponUserId() != 0) {
 			if (data.getCouponUserId() != 0) {
 				data.setCouponName(couponMapper.getCouponNameByCouponUserId(data.getCouponUserId()));
 				data.setCouponName(couponMapper.getCouponNameByCouponUserId(data.getCouponUserId()));
 				data.setCouponMoney(data.getCouponMoney() == null ? BigDecimal.ZERO : data.getCouponMoney().divide(BigDecimal.valueOf(100)));
 				data.setCouponMoney(data.getCouponMoney() == null ? BigDecimal.ZERO : data.getCouponMoney().divide(BigDecimal.valueOf(100)));
@@ -284,25 +337,18 @@ public class CmsOrderController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 	}
 
 
-	/**
-	 * 客服修改订单来源
-	 */
-	@PutMapping("/update/order/source")
-	public Result<String> updateOrderSource(@RequestBody OrderDon orderDon) {
-		Long id = orderDon.getId();
-		String labelSource = orderDon.getLabelSource();
-		cmsOrderDonService.update(null, Wrappers.lambdaUpdate(OrderDon.class)
-				.set(OrderDon::getLabelSource, labelSource)
-				.eq(OrderDon::getId, id));
-		return GatewayResponse.SUCCESS.newBuilder().toResult();
-	}
-
 	/**
 	/**
 	 * 订单统一退款
 	 * 订单统一退款
 	 */
 	 */
 	@PostMapping("/unified/refund")
 	@PostMapping("/unified/refund")
 	@Log(module = "订单管理/统一退款", businessType = BusinessType.PUT, isSaveRequestData = true)
 	@Log(module = "订单管理/统一退款", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> unifiedRefund(@RequestBody @Validated OrderRefundReq refundReq) throws Exception {
 	public Result<String> unifiedRefund(@RequestBody @Validated OrderRefundReq refundReq) throws Exception {
+		long adminId = StpAbroadUtil.getLoginIdAsLong();
+		CmsUser cmsUser = cmsUserMapper.selectById(adminId);
+		if (cmsUser == null) {
+			throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
+		}
+		refundReq.setOperator(cmsUser.getNickname());
 		cmsOrderDonService.unifiedRefund(refundReq);
 		cmsOrderDonService.unifiedRefund(refundReq);
 		return GatewayResponse.SUCCESS.newBuilder().toResult("退款成功");
 		return GatewayResponse.SUCCESS.newBuilder().toResult("退款成功");
 	}
 	}
@@ -312,6 +358,7 @@ public class CmsOrderController {
 	 * 更换用户车票
 	 * 更换用户车票
 	 */
 	 */
 	@PutMapping("/put/sameSpec/empty/relation")
 	@PutMapping("/put/sameSpec/empty/relation")
+	@Log(module = "更换用户车票", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> changeRelation(@RequestBody @Validated ChangeRelationReq req) throws Exception {
 	public Result<String> changeRelation(@RequestBody @Validated ChangeRelationReq req) throws Exception {
 		cmsOrderDonService.changeRelation(req);
 		cmsOrderDonService.changeRelation(req);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
@@ -327,6 +374,7 @@ public class CmsOrderController {
 				.field(EmptyGroupsRelationView::getStatus, GroupsTrips.Status.down.name()).op(Operator.NotEqual)
 				.field(EmptyGroupsRelationView::getStatus, GroupsTrips.Status.down.name()).op(Operator.NotEqual)
 				.field(EmptyGroupsRelationView::getSkuId, skuId).orderBy(EmptyGroupsRelationView::getAvailableNum)
 				.field(EmptyGroupsRelationView::getSkuId, skuId).orderBy(EmptyGroupsRelationView::getAvailableNum)
 				.desc();
 				.desc();
+		GoodsDonSku sku = skuMapper.selectById(skuId);
 		Date expiryTime = null;
 		Date expiryTime = null;
 		if (relationId != null) {
 		if (relationId != null) {
 			GroupsRelation relation = relationMapper.selectById(relationId);
 			GroupsRelation relation = relationMapper.selectById(relationId);
@@ -335,19 +383,136 @@ public class CmsOrderController {
 		if (groupsId != null) {
 		if (groupsId != null) {
 			builder.field(EmptyGroupsRelationView::getGroupsId, groupsId).op(Operator.NotEqual);
 			builder.field(EmptyGroupsRelationView::getGroupsId, groupsId).op(Operator.NotEqual);
 		}
 		}
+		String condition = StrUtil.EMPTY;
 		if (isNormal != null && isNormal) {
 		if (isNormal != null && isNormal) {
-			builder.put("account_id", String.format("gt.account_id not in (select account_id from work_order where sku_id = %s and account_id is not null)", skuId));
+			condition += String.format("gt.account_id not in (select account_id from work_order where sku_id = %s and account_id is not null)", skuId);
+		}
+		if (StrUtil.isNotEmpty(condition)) {
+			condition += " and ";
+		}
+		Integer maxNum = sku.getNum();
+		Integer extraNum = 5;
+		//GPT 4人月付
+		if (sku.getId() == 178l) {
+			extraNum = 2;
+		}
+		maxNum += extraNum;
+		condition += String.format("(available_parking_num = 0 or available_parking_num > (select count(*) from groups_relation gr where gr.groups_id = gt.id and gr.user_id != 0 and gr.num <= %s))", maxNum);
+		if (StrUtil.isNotEmpty(condition)) {
+			builder.put("condition", condition);
 		}
 		}
 		if (expiryTime != null) {
 		if (expiryTime != null) {
 			builder.field(AccountView::getExpiryTime, expiryTime).op(Operator.GreaterEqual);
 			builder.field(AccountView::getExpiryTime, expiryTime).op(Operator.GreaterEqual);
 			builder.orderBy(AccountView::getExpiryTime).asc();
 			builder.orderBy(AccountView::getExpiryTime).asc();
 		}
 		}
-		GoodsDonSku sku = skuMapper.selectById(skuId);
-		if (!Constant.AI_goodsIds.contains(sku.getGoodsId())) {
+		if (sku.getNum() == 1 || !Constant.AI_goodsIds.contains(sku.getGoodsId())) {
 			builder.field(EmptyGroupsRelationView::getAvailableNum, 0).op(Operator.GreaterThan);
 			builder.field(EmptyGroupsRelationView::getAvailableNum, 0).op(Operator.GreaterThan);
 		}
 		}
 		SearchResult<EmptyGroupsRelationView> search = beanSearcher.search(EmptyGroupsRelationView.class,
 		SearchResult<EmptyGroupsRelationView> search = beanSearcher.search(EmptyGroupsRelationView.class,
 				builder.build());
 				builder.build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 	}
+
+	/**
+	 * 客服退款每月数据
+	 */
+	@GetMapping("/get/refundOrder/data")
+	public Result<SearchResult<RefundOrderDonServiceDataView>> getRefundOrderData(String startTime, String endTime, String operator) {
+		String time = StrUtil.EMPTY;
+		if (StrUtil.isNotBlank(startTime)) {
+			time += String.format(" and o.created_time >= '%s'", startTime);
+		}
+		if (StrUtil.isNotBlank(endTime)) {
+			time += String.format(" and o.created_time < '%s'", endTime);
+		}
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (StrUtil.isNotBlank(time)) {
+			builder.put("time", time);
+		}
+		if (StrUtil.isEmpty(operator)) {
+			List<CmsUserVO> userVOS = beanSearcher.searchAll(CmsUserVO.class, MapUtils.builder().field(CmsUserVO::getRoleNames, "客服").op(Operator.Contain).build());
+			List<String> collect = userVOS.stream().map(CmsUserVO::getNickname).collect(Collectors.toList());
+			if (CollUtil.isNotEmpty(collect)) {
+				builder.field(RefundOrderDonServiceDataView::getOperator, collect).op(Operator.InList);
+			}
+		}
+		SearchResult<RefundOrderDonServiceDataView> search = beanSearcher.search(RefundOrderDonServiceDataView.class, builder.build());
+		search.getDataList().forEach(e->{
+			String goodsName = orderDonMapper.selectMaxRefundGoodsName(e.getOperator(), startTime, endTime);
+			e.setGoodsName(goodsName);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 设置订单客服
+	 */
+	@PutMapping("/set/service")
+	public Result<String> setOrderCustomerService(@RequestBody OrderDonCustomerServiceRelate relate) {
+		OrderDonCustomerServiceRelate orderDonCustomerServiceRelate = orderDonCustomerServiceRelateMapper.selectOne(Wrappers.lambdaQuery(OrderDonCustomerServiceRelate.class)
+				.eq(OrderDonCustomerServiceRelate::getOrderId, relate.getOrderId()).last("limit 1"));
+		if (orderDonCustomerServiceRelate != null) {
+			relate.setId(orderDonCustomerServiceRelate.getId());
+		}
+		try {
+			if (relate.getId() == null) {
+				orderDonCustomerServiceRelateMapper.insert(relate);
+			} else {
+				orderDonCustomerServiceRelateMapper.updateById(relate);
+
+			}
+		} catch (DuplicateKeyException e) {
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 用户退款详情
+	 */
+	@GetMapping("/get/user/refund/detail")
+	public Result<OrderDonUserRefundDetailView> getUserRefundDetail(Long userId) {
+		if (userId == null || userId == 0) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult();
+		}
+		List<Long> userIdList = null;
+		try {
+			userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		} catch (Exception e) {
+		}
+		String userIds = null;
+		if (CollUtil.isNotEmpty(userIdList)) {
+			userIds = userIdList.toString().replaceAll("\\[", "").replaceAll("]", "");
+		}
+		MapBuilder builder = MapUtils.builder();
+		if (StrUtil.isNotBlank(userIds)) {
+			builder.put("uid", String.format(" and user_id in (%s)", userIds));
+		} else {
+			builder.put("uid", String.format(" and user_id = %s", userId));
+		}
+		OrderDonUserRefundDetailView orderDonUserRefundDetailView = beanSearcher.searchFirst(OrderDonUserRefundDetailView.class, builder.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(orderDonUserRefundDetailView);
+	}
+
+	/**
+	 *  用户订单列表
+	 */
+	@GetMapping("/get/user/orders")
+	public Result<SearchResult<OrderDonUserRefundDetailView.OrderDonDetailView>> getUserOrdersDetail(Long userId) {
+		if (userId == null || userId == 0) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult();
+		}
+		List<Long> userIdList = null;
+		try {
+			userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		} catch (Exception e) {
+		}
+		if (userIdList == null) {
+			userIdList = new ArrayList<>();
+			userIdList.add(userId);
+		}
+		SearchResult<OrderDonUserRefundDetailView.OrderDonDetailView> search = beanSearcher.search(OrderDonUserRefundDetailView.OrderDonDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(OrderDonUserRefundDetailView.OrderDonDetailView::getUserId, userIdList).op(Operator.InList)
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
 }
 }

+ 194 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonCategoryController.java

@@ -0,0 +1,194 @@
+package com.cyksj.web.controller.manage.goods;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.GoodsDonCategory;
+import com.cyksj.model.entity.GoodsDonCategoryRelate;
+import com.cyksj.model.views.GoodsDonCategoryGoodsView;
+import com.cyksj.model.views.GoodsDonCategoryView;
+import com.cyksj.service.mange.CmsGoodsDonService;
+import com.cyksj.service.mange.GoodsDonCategoryRelateService;
+import com.cyksj.service.mange.GoodsDonCategoryService;
+import com.cyksj.service.mange.RefreshCacheService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapBuilder;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: CmsGoodsDonCategoryController
+ *创建者: JavaZou
+ *创建时间:2023/8/11 13:40
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/goods/category")
+public class CmsGoodsDonCategoryController {
+	private final GoodsDonCategoryService goodsDonCategoryService;
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final CmsGoodsDonService goodsDonService;
+
+	private final GoodsDonCategoryRelateService goodsDonCategoryRelateService;
+
+	private final RefreshCacheService refreshCacheService;
+
+	/**
+	 * 新增分类
+	 */
+	@PostMapping("/post")
+	public Result<GoodsDonCategory> saveGoodsDonCategory(@RequestBody @Validated GoodsDonCategory category) {
+		goodsDonCategoryService.saveOrUpdateGoods(category);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(category);
+	}
+
+	/**
+	 * 编辑分类
+	 */
+	@PutMapping("/put")
+	public Result<String> updateGoodsDonCategory(@RequestBody List<GoodsDonCategory> categorys) {
+		categorys.forEach(category -> goodsDonCategoryService.saveOrUpdateGoods(category));
+		refreshCacheService.refreshYhHomeCategoryPageCache();
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 分类上下架
+	 */
+	@PutMapping("/update/status/{id}")
+	public Result<String> updateStatusById(@PathVariable Long id) {
+		GoodsDonCategory byId = goodsDonCategoryService.getById(id);
+		Assert.notNull(byId, "分类不存在");
+		byId.setStatus(!byId.getStatus());
+		goodsDonCategoryService.updateById(byId);
+		refreshCacheService.refreshYhHomeCategoryPageCache();
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 根据id删除分类
+	 */
+	@DeleteMapping("/del/{id}")
+	public Result<String> del(@PathVariable Long id) {
+		int count = goodsDonService.count(Wrappers.lambdaQuery(GoodsDon.class)
+				.eq(GoodsDon::getCategory, id));
+		if (count > 0) {
+			throw BusinessRuntimeException.getInstance("存在该分类下平台");
+		}
+		goodsDonCategoryService.delById(id);
+		refreshCacheService.refreshYhHomeCategoryPageCache();
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 修改分类排序
+	 */
+	@PutMapping("/sort")
+	public Result<String> sortCategory(@RequestBody GoodsDonCategory category) {
+		Long id = category.getId();
+		Assert.notNull(id, "分类不存在");
+		GoodsDonCategory byId = goodsDonCategoryService.getById(id);
+		if (category.getSorted() != null) {
+			byId.setSorted(category.getSorted());
+			goodsDonCategoryService.updateById(byId);
+			refreshCacheService.refreshYhHomeCategoryPageCache();
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 分类列表 分页
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<GoodsDonCategoryView>> getCategory() {
+		SearchResult<GoodsDonCategoryView> search = beanSearcher.search(GoodsDonCategoryView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 分类平台列表
+	 */
+	@GetMapping("/get/goods")
+	public Result<SearchResult<GoodsDonCategoryGoodsView>> getCategoryGoodsView() {
+		MapBuilder mapBuilder = MapUtils.flatBuilder(request.getParameterMap());
+		SearchResult<GoodsDonCategoryGoodsView> search = beanSearcher.search(GoodsDonCategoryGoodsView.class, mapBuilder.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 修改平台排序
+	 */
+	@PutMapping("/sort/goods")
+	public Result<String> sortGoods(@RequestBody List<GoodsDonCategoryGoodsView> request) {
+		List<GoodsDonCategoryRelate> updateList = new ArrayList<>(request.size());
+		request.forEach(data->{
+			Long goodsId = data.getGoodsId();
+			Integer sorted = data.getSorted();
+			GoodsDonCategoryRelate relate = goodsDonCategoryRelateService.getOne(Wrappers.lambdaQuery(GoodsDonCategoryRelate.class)
+					.eq(GoodsDonCategoryRelate::getCategory, data.getCategory())
+					.eq(GoodsDonCategoryRelate::getGoodsId, goodsId).last("limit 1"));
+			if (sorted != null && sorted != relate.getSorted()) {
+				relate.setSorted(sorted);
+				updateList.add(relate);
+			}
+		});
+		if (CollUtil.isNotEmpty(updateList)) {
+			goodsDonCategoryRelateService.updateBatchById(updateList);
+			refreshCacheService.refreshYhHomeCategoryPageCache();
+		}
+
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 移除分类下的平台
+	 */
+	@DeleteMapping("/delete/{relateId}")
+	public Result<String> deleteCategoryByRelateId(@PathVariable Long relateId) {
+		goodsDonCategoryRelateService.removeById(relateId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 获取所有分类列表
+	 */
+	@GetMapping("/get/all")
+	public Result<List<GoodsDonCategory>> getAll() {
+		List<GoodsDonCategory> search = beanSearcher.searchAll(GoodsDonCategory.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 获取所有分类下平台 树形结构
+	 */
+	@GetMapping("/get/goods/tree")
+	public Result<List<GoodsDonCategory>> getCategoryGoodsTreeView() {
+		List<GoodsDonCategory> all = beanSearcher.searchAll(GoodsDonCategory.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(GoodsDonCategory::getStatus, true)
+				.orderBy(GoodsDonCategory::getSorted).desc()
+				.build());
+		all.forEach(data -> {
+			List<GoodsDonCategoryGoodsView> categoryGoodsViewList = beanSearcher.searchAll(GoodsDonCategoryGoodsView.class, MapUtils.
+					builder().field(GoodsDonCategoryGoodsView::getCategory, data.getId())
+					.field(GoodsDonCategoryGoodsView::getStatus, true).build());
+			data.setCategoryGoodsList(categoryGoodsViewList);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(all);
+	}
+}