记得上下班打卡 | git大法好,push需谨慎

Commit c304cebb authored by wangyifan's avatar wangyifan

艺人专题:B端partner相关接口

parent 931332ff
-- 正在现场 v1.8.0 商城艺人专题
-- 关联开发文档:docu/zhengzai-v1.8.0-艺人专题-开发文档.md
-- 艺人关联申请表
CREATE TABLE `goblin_artist_auth_apply` (
`mid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`apply_id` varchar(64) NOT NULL COMMENT '申请ID',
`store_id` varchar(64) NOT NULL COMMENT '申请店铺ID',
`artist_id` varchar(64) NOT NULL COMMENT '申请关联艺人ID,对应 kylin_artist.artist_id',
`attachment_urls` text NOT NULL COMMENT '申请资料图片URL列表,JSON数组',
`status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0待审核 1已通过 2已拒绝 3已撤销',
`reviewer_id` varchar(64) DEFAULT NULL COMMENT '审核人ID',
`reviewer_name` varchar(100) DEFAULT NULL COMMENT '审核人名称',
`review_time` datetime DEFAULT NULL COMMENT '审核时间',
`review_remark` varchar(500) DEFAULT NULL COMMENT '通过备注',
`reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因',
`auth_expire_at` datetime DEFAULT NULL COMMENT '授权截止时间(通过时写入)',
`created_at` datetime NOT NULL COMMENT '申请时间',
`updated_at` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`mid`),
UNIQUE KEY `uk_apply_id` (`apply_id`),
KEY `idx_store_status` (`store_id`, `status`),
KEY `idx_artist_status` (`artist_id`, `status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='艺人关联申请表';
-- 店铺-艺人授权关系表
CREATE TABLE `goblin_artist_auth` (
`mid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`auth_id` varchar(64) NOT NULL COMMENT '授权ID',
`store_id` varchar(64) NOT NULL COMMENT '店铺ID',
`artist_id` varchar(64) NOT NULL COMMENT '艺人ID',
`apply_id` varchar(64) NOT NULL COMMENT '来源申请ID',
`expire_at` datetime NOT NULL COMMENT '授权截止时间',
`status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '1有效 0失效',
`created_at` datetime NOT NULL COMMENT '创建时间',
`updated_at` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`mid`),
UNIQUE KEY `uk_auth_id` (`auth_id`),
UNIQUE KEY `uk_store_artist` (`store_id`, `artist_id`),
KEY `idx_expire_at` (`expire_at`),
KEY `idx_store_status` (`store_id`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='店铺艺人授权关系表';
-- 艺人专题表
CREATE TABLE `goblin_artist_topic` (
`mid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`topic_id` varchar(64) NOT NULL COMMENT '专题ID',
`store_id` varchar(64) NOT NULL COMMENT '所属店铺ID',
`topic_name` varchar(100) NOT NULL COMMENT '专题名称',
`artist_id` varchar(64) DEFAULT NULL COMMENT '关联艺人ID,可空',
`template_type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '1双列网格 2单列列表',
`banner_url` varchar(500) DEFAULT NULL COMMENT '专题banner',
`banner_height` int(11) NOT NULL DEFAULT 240 COMMENT 'banner高度px',
`on_sale_start` datetime DEFAULT NULL COMMENT '上架区间开始',
`on_sale_end` datetime DEFAULT NULL COMMENT '上架区间结束',
`status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0待上架 1已上架 2已下架',
`sort` int(11) NOT NULL DEFAULT 0 COMMENT 'Admin排序值,越小越靠前',
`recommend_position` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0无推荐 1~5推荐位',
`del_flg` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0正常 1删除',
`created_at` datetime NOT NULL COMMENT '创建时间',
`updated_at` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`mid`),
UNIQUE KEY `uk_topic_id` (`topic_id`),
KEY `idx_store_status` (`store_id`, `status`, `del_flg`),
KEY `idx_sort` (`sort`, `created_at`),
KEY `idx_recommend` (`recommend_position`),
KEY `idx_artist_id` (`artist_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='艺人专题表';
-- 艺人专题商品关联表
CREATE TABLE `goblin_artist_topic_goods` (
`mid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`relation_id` varchar(64) NOT NULL COMMENT '关联ID',
`topic_id` varchar(64) NOT NULL COMMENT '专题ID',
`spu_id` varchar(64) NOT NULL COMMENT '本店商品SPU ID',
`sort` int(11) NOT NULL DEFAULT 0 COMMENT '专题内排序,越小越靠前',
`created_at` datetime NOT NULL COMMENT '创建时间',
`updated_at` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`mid`),
UNIQUE KEY `uk_relation_id` (`relation_id`),
UNIQUE KEY `uk_topic_spu` (`topic_id`, `spu_id`),
KEY `idx_topic_sort` (`topic_id`, `sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='艺人专题商品关联表';
package com.liquidnet.service.goblin.constant;
/**
* 艺人专题相关状态常量
*/
public final class GoblinArtistConst {
private GoblinArtistConst() {
}
/** 申请:待审核 */
public static final int APPLY_PENDING = 0;
/** 申请:已通过 */
public static final int APPLY_APPROVED = 1;
/** 申请:已拒绝 */
public static final int APPLY_REJECTED = 2;
/** 申请:已撤销 */
public static final int APPLY_REVOKED = 3;
/** 授权:有效 */
public static final int AUTH_VALID = 1;
/** 授权:失效 */
public static final int AUTH_INVALID = 0;
/** 专题:待上架 */
public static final int TOPIC_PENDING = 0;
/** 专题:已上架 */
public static final int TOPIC_ONLINE = 1;
/** 专题:已下架 */
public static final int TOPIC_OFFLINE = 2;
/** 模版:双列 */
public static final int TEMPLATE_GRID = 1;
/** 模版:单列 */
public static final int TEMPLATE_LIST = 2;
/** 未删除 */
public static final int DEL_NO = 0;
/** 已删除 */
public static final int DEL_YES = 1;
public static final int DEFAULT_BANNER_HEIGHT = 240;
}
......@@ -471,4 +471,38 @@ public class GoblinRedisConst {
*/
public static final String SQB_SKU_PRICE = PREFIX.concat("sqb:sku:price:");
/* ----------------------------------------------------------------- */
/* 艺人专题 */
/* ----------------------------------------------------------------- */
/**
* 艺人专题信息
* {goblin:artist:topic:{store_id}_{topic_id}, GoblinArtistTopicVo}
*/
public static final String ARTIST_TOPIC = PREFIX.concat("artist:topic:");
/**
* 店铺艺人专题列表
* {goblin:artist:topic:list:{store_id}, List<GoblinArtistTopicVo>}
*/
public static final String ARTIST_TOPIC_LIST = PREFIX.concat("artist:topic:list:");
/**
* 艺人授权关系
* {goblin:artist:auth:{store_id}_{artist_id}, GoblinArtistAuthVo}
*/
public static final String ARTIST_AUTH = PREFIX.concat("artist:auth:");
/**
* 店铺艺人授权列表
* {goblin:artist:auth:list:{store_id}, List<GoblinArtistAuthVo>}
*/
public static final String ARTIST_AUTH_LIST = PREFIX.concat("artist:auth:list:");
/**
* 艺人关联申请
* {goblin:artist:apply:{store_id}_{apply_id}, GoblinArtistAuthApplyVo}
*/
public static final String ARTIST_APPLY = PREFIX.concat("artist:apply:");
}
package com.liquidnet.service.goblin.dto.manage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@ApiModel("商家端-撤销艺人关联申请入参")
@Data
public class GoblinStoreMgtArtistApplyRevokeParams implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(required = true, value = "申请ID")
@NotBlank(message = "申请ID不能为空")
private String applyId;
}
package com.liquidnet.service.goblin.dto.manage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;
@ApiModel("商家端-提交艺人关联申请入参")
@Data
public class GoblinStoreMgtArtistApplySubmitParams implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(required = true, value = "艺人ID")
@NotBlank(message = "艺人ID不能为空")
private String artistId;
@ApiModelProperty(required = true, value = "申请资料图片URL列表")
@NotEmpty(message = "申请资料不能为空")
@Size(max = 20, message = "申请资料数量超限")
private List<String> attachmentUrls;
}
package com.liquidnet.service.goblin.dto.manage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@ApiModel("商家端-创建艺人专题入参")
@Data
public class GoblinStoreMgtArtistTopicCreateParams implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(required = true, value = "专题名称")
@NotBlank(message = "专题名称不能为空")
@Size(max = 100, message = "专题名称长度超限")
private String topicName;
@ApiModelProperty(value = "关联艺人ID,非必填")
private String artistId;
@ApiModelProperty(value = "模版类型 1双列 2单列")
@NotNull(message = "模版类型不能为空")
private Integer templateType;
@ApiModelProperty(value = "专题banner")
private String bannerUrl;
@ApiModelProperty(value = "banner高度")
private Integer bannerHeight;
@ApiModelProperty(value = "上架开始时间")
private LocalDateTime onSaleStart;
@ApiModelProperty(value = "上架结束时间")
private LocalDateTime onSaleEnd;
@ApiModelProperty(value = "专题商品")
@Valid
private List<GoblinStoreMgtArtistTopicGoodsItemParams> goods;
}
package com.liquidnet.service.goblin.dto.manage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@ApiModel("商家端-删除艺人专题入参")
@Data
public class GoblinStoreMgtArtistTopicDeleteParams implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(required = true, value = "专题ID")
@NotBlank(message = "专题ID不能为空")
private String topicId;
}
package com.liquidnet.service.goblin.dto.manage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@ApiModel("商家端-专题商品项入参")
@Data
public class GoblinStoreMgtArtistTopicGoodsItemParams implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(required = true, value = "商品SPU ID")
@NotBlank(message = "商品SPU不能为空")
private String spuId;
@ApiModelProperty(required = true, value = "排序,越小越靠前")
@NotNull(message = "商品排序不能为空")
private Integer sort;
}
package com.liquidnet.service.goblin.dto.manage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@ApiModel("商家端-艺人专题上下架入参")
@Data
public class GoblinStoreMgtArtistTopicStatusParams implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(required = true, value = "专题ID")
@NotBlank(message = "专题ID不能为空")
private String topicId;
@ApiModelProperty(required = true, value = "状态 0待上架 1已上架 2已下架")
@NotNull(message = "状态不能为空")
private Integer status;
}
package com.liquidnet.service.goblin.dto.manage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@ApiModel("商家端-编辑艺人专题入参")
@Data
public class GoblinStoreMgtArtistTopicUpdateParams implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(required = true, value = "专题ID")
@NotBlank(message = "专题ID不能为空")
private String topicId;
@ApiModelProperty(required = true, value = "专题名称")
@NotBlank(message = "专题名称不能为空")
@Size(max = 100, message = "专题名称长度超限")
private String topicName;
@ApiModelProperty(value = "关联艺人ID,非必填;传空字符串表示清空")
private String artistId;
@ApiModelProperty(value = "模版类型 1双列 2单列")
@NotNull(message = "模版类型不能为空")
private Integer templateType;
@ApiModelProperty(value = "专题banner")
private String bannerUrl;
@ApiModelProperty(value = "banner高度")
private Integer bannerHeight;
@ApiModelProperty(value = "上架开始时间")
private LocalDateTime onSaleStart;
@ApiModelProperty(value = "上架结束时间")
private LocalDateTime onSaleEnd;
@ApiModelProperty(value = "专题商品,全量替换")
@Valid
private List<GoblinStoreMgtArtistTopicGoodsItemParams> goods;
}
package com.liquidnet.service.goblin.dto.manage.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@ApiModel("商家端-艺人关联申请列表项")
@Data
public class GoblinStoreMgtArtistApplyListItemVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("申请ID")
private String applyId;
@ApiModelProperty("艺人ID")
private String artistId;
@ApiModelProperty("艺人名称")
private String artistName;
@ApiModelProperty("艺人头像")
private String avatarUrl;
@ApiModelProperty("申请附件")
private List<String> attachmentUrls;
@ApiModelProperty("申请时间")
private LocalDateTime applyTime;
@ApiModelProperty("审核状态 0待审核 1已通过 2已拒绝 3已撤销")
private Integer status;
@ApiModelProperty("审核时间")
private LocalDateTime reviewTime;
@ApiModelProperty("审核人")
private String reviewerName;
@ApiModelProperty("授权截止时间")
private LocalDateTime authExpireAt;
@ApiModelProperty("驳回原因")
private String rejectReason;
}
package com.liquidnet.service.goblin.dto.manage.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@ApiModel("商家端-已授权艺人列表出参")
@Data
public class GoblinStoreMgtArtistAuthListVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("列表")
private List<Item> list = new ArrayList<>();
@ApiModel("已授权艺人项")
@Data
public static class Item implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("艺人ID")
private String artistId;
@ApiModelProperty("艺人名称")
private String artistName;
@ApiModelProperty("艺人头像")
private String avatarUrl;
@ApiModelProperty("授权截止时间")
private LocalDateTime expireAt;
}
}
package com.liquidnet.service.goblin.dto.manage.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@ApiModel("商家端-搜索艺人列表项")
@Data
public class GoblinStoreMgtArtistSearchItemVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("艺人ID")
private String artistId;
@ApiModelProperty("艺人名称")
private String artistName;
@ApiModelProperty("艺人头像")
private String avatarUrl;
@ApiModelProperty("艺人类型")
private Integer artistType;
}
package com.liquidnet.service.goblin.dto.manage.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@ApiModel("商家端-艺人专题详情出参")
@Data
public class GoblinStoreMgtArtistTopicDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("专题ID")
private String topicId;
@ApiModelProperty("专题名称")
private String topicName;
@ApiModelProperty("关联艺人ID")
private String artistId;
@ApiModelProperty("关联艺人名称")
private String artistName;
@ApiModelProperty("艺人头像")
private String avatarUrl;
@ApiModelProperty("模版类型")
private Integer templateType;
@ApiModelProperty("banner")
private String bannerUrl;
@ApiModelProperty("banner高度")
private Integer bannerHeight;
@ApiModelProperty("上架开始")
private LocalDateTime onSaleStart;
@ApiModelProperty("上架结束")
private LocalDateTime onSaleEnd;
@ApiModelProperty("状态")
private Integer status;
@ApiModelProperty("商品列表")
private List<GoodsItem> goods = new ArrayList<>();
@ApiModel("专题详情商品项")
@Data
public static class GoodsItem implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("SPU ID")
private String spuId;
@ApiModelProperty("商品名称")
private String name;
@ApiModelProperty("封面")
private String coverPic;
@ApiModelProperty("售价")
private BigDecimal sellPrice;
@ApiModelProperty("排序")
private Integer sort;
}
}
package com.liquidnet.service.goblin.dto.manage.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@ApiModel("商家端-专题可添加商品搜索项")
@Data
public class GoblinStoreMgtArtistTopicGoodsSearchItemVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("SPU ID")
private String spuId;
@ApiModelProperty("商品名称")
private String name;
@ApiModelProperty("封面")
private String coverPic;
@ApiModelProperty("售价")
private BigDecimal sellPrice;
}
package com.liquidnet.service.goblin.dto.manage.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@ApiModel("商家端-艺人专题分页出参")
@Data
public class GoblinStoreMgtArtistTopicPageVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("总数(当前筛选)")
private long total;
@ApiModelProperty("已上架数量")
private long countOnline;
@ApiModelProperty("待上架数量")
private long countPending;
@ApiModelProperty("已下架数量")
private long countOffline;
@ApiModelProperty("列表")
private List<Item> list = new ArrayList<>();
@ApiModel("艺人专题列表项")
@Data
public static class Item implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("专题ID")
private String topicId;
@ApiModelProperty("专题名称")
private String topicName;
@ApiModelProperty("关联艺人ID")
private String artistId;
@ApiModelProperty("关联艺人名称")
private String artistName;
@ApiModelProperty("艺人头像")
private String avatarUrl;
@ApiModelProperty("关联商品数量")
private Integer goodsCount;
@ApiModelProperty("上架开始时间")
private LocalDateTime onSaleStart;
@ApiModelProperty("上架结束时间")
private LocalDateTime onSaleEnd;
@ApiModelProperty("状态 0待上架 1已上架 2已下架")
private Integer status;
}
}
package com.liquidnet.service.goblin.dto.vo;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class GoblinArtistAuthApplyVo implements Serializable {
private static final long serialVersionUID = 1L;
private String applyId;
private String storeId;
private String artistId;
private String attachmentUrls;
private Integer status;
private String reviewerId;
private String reviewerName;
private LocalDateTime reviewTime;
private String reviewRemark;
private String rejectReason;
private LocalDateTime authExpireAt;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
package com.liquidnet.service.goblin.dto.vo;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class GoblinArtistAuthVo implements Serializable {
private static final long serialVersionUID = 1L;
private String authId;
private String storeId;
private String artistId;
private String applyId;
private LocalDateTime expireAt;
private Integer status;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
package com.liquidnet.service.goblin.dto.vo;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Data
public class GoblinArtistTopicVo implements Serializable {
private static final long serialVersionUID = 1L;
private String topicId;
private String storeId;
private String topicName;
private String artistId;
private Integer templateType;
private String bannerUrl;
private Integer bannerHeight;
private LocalDateTime onSaleStart;
private LocalDateTime onSaleEnd;
private Integer status;
private Integer sort;
private Integer recommendPosition;
private Integer delFlg;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private List<GoodsItem> goods = new ArrayList<>();
@Data
public static class GoodsItem implements Serializable {
private static final long serialVersionUID = 1L;
private String spuId;
private Integer sort;
private String name;
private String coverPic;
private BigDecimal sellPrice;
}
}
package com.liquidnet.service.goblin.service.manage;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtArtistApplyRevokeParams;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtArtistApplySubmitParams;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtArtistTopicCreateParams;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtArtistTopicDeleteParams;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtArtistTopicStatusParams;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtArtistTopicUpdateParams;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtArtistApplyListItemVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtArtistAuthListVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtArtistSearchItemVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtArtistTopicDetailVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtArtistTopicGoodsSearchItemVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtArtistTopicPageVo;
/**
* 商家端-艺人关联申请 / 艺人专题
* <p>店铺上下文:登录 UID → Redis 店铺信息取 storeId(对齐售后单管理)</p>
*/
public interface IGoblinStoreMgtArtistService {
/**
* 搜索可申请艺人(仅启用状态),支持关键词模糊匹配,DB 真分页
*/
ResponseDto<PagedResult<GoblinStoreMgtArtistSearchItemVo>> searchArtist(String keyword, int page, int size);
/**
* 提交艺人关联申请,校验艺人存在且启用、同店同艺人无待审核申请
*
* @return data = applyId
*/
ResponseDto<String> submitApply(GoblinStoreMgtArtistApplySubmitParams params);
/**
* 本店艺人关联申请列表,支持按状态筛选
*/
ResponseDto<PagedResult<GoblinStoreMgtArtistApplyListItemVo>> applyList(Integer status, int page, int size);
/**
* 撤销艺人关联申请,仅待审核状态可撤销
*/
ResponseDto<Void> revokeApply(GoblinStoreMgtArtistApplyRevokeParams params);
/**
* 本店已授权艺人列表,过滤过期和失效授权
*/
ResponseDto<GoblinStoreMgtArtistAuthListVo> authList();
/**
* 本店艺人专题列表(未删除),响应含各状态数量统计
*/
ResponseDto<GoblinStoreMgtArtistTopicPageVo> topicList(Integer status, int page, int size);
/**
* 艺人专题详情,含内嵌商品列表(名称/图片/价格),艺人名联查 kylin_artist
*/
ResponseDto<GoblinStoreMgtArtistTopicDetailVo> topicDetail(String topicId);
/**
* 创建艺人专题,校验关联艺人有本店有效授权、商品属本店且未删除
*
* @return data = topicId
*/
ResponseDto<String> topicCreate(GoblinStoreMgtArtistTopicCreateParams params);
/**
* 编辑艺人专题,商品全量替换
*/
ResponseDto<Void> topicUpdate(GoblinStoreMgtArtistTopicUpdateParams params);
/**
* 删除艺人专题(逻辑删除 delFlg=1)
*/
ResponseDto<Void> topicDelete(GoblinStoreMgtArtistTopicDeleteParams params);
/**
* 专题上下架,0=待上架 1=已上架 2=已下架
*/
ResponseDto<Void> topicStatus(GoblinStoreMgtArtistTopicStatusParams params);
/**
* 搜索本店可添加商品(普通商品,非市场活动),支持关键词模糊匹配,DB 真分页
*/
ResponseDto<PagedResult<GoblinStoreMgtArtistTopicGoodsSearchItemVo>> searchGoods(String keyword, int page, int size);
}
package com.liquidnet.service.goblin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 店铺-艺人授权关系
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinArtistAuth implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
private String authId;
private String storeId;
private String artistId;
private String applyId;
private LocalDateTime expireAt;
/** 1有效 0失效 */
private Integer status;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
package com.liquidnet.service.goblin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 艺人关联申请
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinArtistAuthApply implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
private String applyId;
private String storeId;
private String artistId;
/** JSON 数组字符串 */
private String attachmentUrls;
/** 0待审核 1已通过 2已拒绝 3已撤销 */
private Integer status;
private String reviewerId;
private String reviewerName;
private LocalDateTime reviewTime;
private String reviewRemark;
private String rejectReason;
private LocalDateTime authExpireAt;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
package com.liquidnet.service.goblin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 艺人专题
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinArtistTopic implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
private String topicId;
private String storeId;
private String topicName;
private String artistId;
/** 1双列 2单列 */
private Integer templateType;
private String bannerUrl;
private Integer bannerHeight;
private LocalDateTime onSaleStart;
private LocalDateTime onSaleEnd;
/** 0待上架 1已上架 2已下架 */
private Integer status;
private Integer sort;
private Integer recommendPosition;
/** 0正常 1删除 */
private Integer delFlg;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
package com.liquidnet.service.goblin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 艺人专题商品关联
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinArtistTopicGoods implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
private String relationId;
private String topicId;
private String spuId;
private Integer sort;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
package com.liquidnet.service.goblin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.goblin.entity.GoblinArtistAuthApply;
public interface GoblinArtistAuthApplyMapper extends BaseMapper<GoblinArtistAuthApply> {
}
package com.liquidnet.service.goblin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.goblin.entity.GoblinArtistAuth;
public interface GoblinArtistAuthMapper extends BaseMapper<GoblinArtistAuth> {
}
package com.liquidnet.service.goblin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.goblin.entity.GoblinArtistTopicGoods;
public interface GoblinArtistTopicGoodsMapper extends BaseMapper<GoblinArtistTopicGoods> {
}
package com.liquidnet.service.goblin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.goblin.entity.GoblinArtistTopic;
public interface GoblinArtistTopicMapper extends BaseMapper<GoblinArtistTopic> {
}
package com.liquidnet.service.goblin.controller.manage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.manage.*;
import com.liquidnet.service.goblin.dto.manage.vo.*;
import com.liquidnet.service.goblin.service.manage.IGoblinStoreMgtArtistService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
/**
* 商家端-艺人关联申请 / 艺人专题
* <p>店铺由登录 UID 解析,对齐售后单管理</p>
*/
@ApiSupport(order = 149020)
@Api(tags = "艺人管理")
@Slf4j
@Validated
@RestController
@RequestMapping("store/mgt/artist")
public class GoblinStoreMgtArtistController {
@Autowired
private IGoblinStoreMgtArtistService artistService;
@ApiOperationSupport(order = 1)
@ApiOperation("搜索可申请艺人")
@ApiImplicitParams({
@ApiImplicitParam(name = "keyword", value = "艺人名称关键词", dataType = "String"),
@ApiImplicitParam(name = "page", value = "页码", dataType = "int", required = true),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "int", required = true),
})
@GetMapping("list")
public ResponseDto<PagedResult<GoblinStoreMgtArtistSearchItemVo>> searchArtist(
@RequestParam(required = false) String keyword,
@Min(1) @RequestParam(defaultValue = "1") int page,
@Min(1) @RequestParam(defaultValue = "20") int size) {
return artistService.searchArtist(keyword, page, size);
}
@ApiOperationSupport(order = 2)
@ApiOperation("提交艺人关联申请")
@PostMapping("apply/submit")
public ResponseDto<String> submitApply(
@Valid @RequestBody GoblinStoreMgtArtistApplySubmitParams params) {
return artistService.submitApply(params);
}
@ApiOperationSupport(order = 3)
@ApiOperation("艺人关联申请列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "status", value = "状态 0待审核 1已通过 2已拒绝 3已撤销", dataType = "int"),
@ApiImplicitParam(name = "page", value = "页码", dataType = "int", required = true),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "int", required = true),
})
@GetMapping("apply/list")
public ResponseDto<PagedResult<GoblinStoreMgtArtistApplyListItemVo>> applyList(
@RequestParam(required = false) Integer status,
@Min(1) @RequestParam(defaultValue = "1") int page,
@Min(1) @RequestParam(defaultValue = "20") int size) {
return artistService.applyList(status, page, size);
}
@ApiOperationSupport(order = 4)
@ApiOperation("撤销艺人关联申请")
@PostMapping("apply/revoke")
public ResponseDto<Void> revokeApply(
@Valid @RequestBody GoblinStoreMgtArtistApplyRevokeParams params) {
return artistService.revokeApply(params);
}
@ApiOperationSupport(order = 5)
@ApiOperation("本店已授权艺人列表")
@GetMapping("auth/list")
public ResponseDto<GoblinStoreMgtArtistAuthListVo> authList() {
return artistService.authList();
}
@ApiOperationSupport(order = 6)
@ApiOperation("艺人专题列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "status", value = "状态 0待上架 1已上架 2已下架", dataType = "int"),
@ApiImplicitParam(name = "page", value = "页码", dataType = "int", required = true),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "int", required = true),
})
@GetMapping("topic/list")
public ResponseDto<GoblinStoreMgtArtistTopicPageVo> topicList(
@RequestParam(required = false) Integer status,
@Min(1) @RequestParam(defaultValue = "1") int page,
@Min(1) @RequestParam(defaultValue = "20") int size) {
return artistService.topicList(status, page, size);
}
@ApiOperationSupport(order = 7)
@ApiOperation("艺人专题详情")
@GetMapping("topic/detail")
public ResponseDto<GoblinStoreMgtArtistTopicDetailVo> topicDetail(
@NotBlank(message = "专题ID不能为空") @RequestParam String topicId) {
return artistService.topicDetail(topicId);
}
@ApiOperationSupport(order = 8)
@ApiOperation("创建艺人专题")
@PostMapping("topic/create")
public ResponseDto<String> topicCreate(
@Valid @RequestBody GoblinStoreMgtArtistTopicCreateParams params) {
return artistService.topicCreate(params);
}
@ApiOperationSupport(order = 9)
@ApiOperation("编辑艺人专题")
@PostMapping("topic/update")
public ResponseDto<Void> topicUpdate(
@Valid @RequestBody GoblinStoreMgtArtistTopicUpdateParams params) {
return artistService.topicUpdate(params);
}
@ApiOperationSupport(order = 10)
@ApiOperation("删除艺人专题")
@PostMapping("topic/delete")
public ResponseDto<Void> topicDelete(
@Valid @RequestBody GoblinStoreMgtArtistTopicDeleteParams params) {
return artistService.topicDelete(params);
}
@ApiOperationSupport(order = 11)
@ApiOperation("艺人专题上下架")
@PostMapping("topic/status")
public ResponseDto<Void> topicStatus(
@Valid @RequestBody GoblinStoreMgtArtistTopicStatusParams params) {
return artistService.topicStatus(params);
}
@ApiOperationSupport(order = 12)
@ApiOperation("搜索本店可添加商品")
@ApiImplicitParams({
@ApiImplicitParam(name = "keyword", value = "商品名称关键词", dataType = "String"),
@ApiImplicitParam(name = "page", value = "页码", dataType = "int", required = true),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "int", required = true),
})
@GetMapping("topic/searchGoods")
public ResponseDto<PagedResult<GoblinStoreMgtArtistTopicGoodsSearchItemVo>> searchGoods(
@RequestParam(required = false) String keyword,
@Min(1) @RequestParam(defaultValue = "1") int page,
@Min(1) @RequestParam(defaultValue = "20") int size) {
return artistService.searchGoods(keyword, page, size);
}
}
......@@ -86,6 +86,10 @@ public class GoblinRedisUtils {
return redisUtil.incr(key, delta);
}
public void set(String key, Object value, long seconds) {
redisUtil.set(key, value, seconds);
}
/* ---------------------------------------- 短信相关 ---------------------------------------- */
public boolean setSmsCodeByMobile(String mobile, String smsCode) {
......
......@@ -206,3 +206,19 @@ gpblin_bracelet_order_update= update goblin_bracelet_order set out_trans_id=?, e
goblin_bracelet_order_update_cardno=UPDATE goblin_bracelet_order SET cardno=?,updated_at=? WHERE order_id=?
goblin_bracelet_order_update_fout_trade_no=UPDATE goblin_bracelet_order SET fout_trade_no=?,updated_at=? WHERE order_id=?
goblin_bracelet_order_update_refund=UPDATE goblin_bracelet_order SET status=?,refund_status=?,refund_status_note=?,updated_at=? WHERE order_id=?
#---- \u827A\u4EBA\u5173\u8054\u7533\u8BF7
goblin_artist_auth_apply.insert=INSERT INTO goblin_artist_auth_apply (apply_id,store_id,artist_id,attachment_urls,status,created_at,updated_at)VALUES(?,?,?,?,?,?,?)
goblin_artist_auth_apply.revoke=UPDATE goblin_artist_auth_apply SET status=3,updated_at=? WHERE apply_id=?
goblin_artist_auth_apply.approve=UPDATE goblin_artist_auth_apply SET status=1,reviewer_id=?,reviewer_name=?,review_time=?,review_remark=?,auth_expire_at=?,updated_at=? WHERE apply_id=?
goblin_artist_auth_apply.reject=UPDATE goblin_artist_auth_apply SET status=2,reviewer_id=?,reviewer_name=?,review_time=?,reject_reason=?,updated_at=? WHERE apply_id=?
#---- \u827A\u4EBA\u6388\u6743\u5173\u7CFB
goblin_artist_auth.insert=INSERT INTO goblin_artist_auth (auth_id,store_id,artist_id,apply_id,expire_at,status,created_at,updated_at)VALUES(?,?,?,?,?,?,?,?)
goblin_artist_auth.update_expire=UPDATE goblin_artist_auth SET expire_at=?,updated_at=? WHERE store_id=? AND artist_id=? AND status=1
#---- \u827A\u4EBA\u4E13\u9898
goblin_artist_topic.insert=INSERT INTO goblin_artist_topic (topic_id,store_id,topic_name,artist_id,template_type,banner_url,banner_height,on_sale_start,on_sale_end,status,sort,recommend_position,del_flg,created_at,updated_at)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_artist_topic.update=UPDATE goblin_artist_topic SET topic_name=?,artist_id=?,template_type=?,banner_url=?,banner_height=?,on_sale_start=?,on_sale_end=?,updated_at=? WHERE topic_id=?
goblin_artist_topic.delete=UPDATE goblin_artist_topic SET del_flg=1,updated_at=? WHERE topic_id=?
goblin_artist_topic.status=UPDATE goblin_artist_topic SET status=?,updated_at=? WHERE topic_id=?
#---- \u4E13\u9898\u5546\u54C1
goblin_artist_topic_goods.insert=INSERT INTO goblin_artist_topic_goods (relation_id,topic_id,spu_id,sort,created_at,updated_at)VALUES(?,?,?,?,?,?)
goblin_artist_topic_goods.delete_by_topic=DELETE FROM goblin_artist_topic_goods WHERE topic_id=?
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment