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

Commit cf4aa441 authored by 姜秀龙's avatar 姜秀龙

Merge branch 'refs/heads/jxl-yirenhebing' into test-ecs

parents 483408e7 2508891b
-- 艺人关联商品表
CREATE TABLE IF NOT EXISTS `kylin_artist_product` (
`mid` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`relation_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '关联记录ID',
`artist_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '艺人ID',
`spu_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品SPU ID',
`sort` int DEFAULT 0 COMMENT '排序权重,越大越靠前',
`status` tinyint DEFAULT 1 COMMENT '1启用 0禁用',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`mid`),
UNIQUE KEY `uk_relation_id` (`relation_id`),
UNIQUE KEY `uk_artist_spu` (`artist_id`, `spu_id`),
KEY `idx_artist_id` (`artist_id`),
KEY `idx_spu_id` (`spu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='艺人关联商品';
...@@ -6,6 +6,7 @@ CREATE TABLE `kylin_artist` ( ...@@ -6,6 +6,7 @@ CREATE TABLE `kylin_artist` (
`mid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `mid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`artist_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '艺人ID', `artist_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '艺人ID',
`artist_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '艺人名称', `artist_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '艺人名称',
`pinyin` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '姓名拼音',
`artist_type` tinyint(4) NOT NULL COMMENT '艺人类型 1音乐人 2艺术家 3厂牌 4品牌方', `artist_type` tinyint(4) NOT NULL COMMENT '艺人类型 1音乐人 2艺术家 3厂牌 4品牌方',
`avatar_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '艺人头像', `avatar_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '艺人头像',
`introduction` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '艺人简介', `introduction` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '艺人简介',
......
...@@ -6,6 +6,10 @@ public class KylinRedisConst { ...@@ -6,6 +6,10 @@ public class KylinRedisConst {
public static final String PERFORMANCES_INVOICE_REMINDER = "kylin:performances:invoice_reminder:id:"; public static final String PERFORMANCES_INVOICE_REMINDER = "kylin:performances:invoice_reminder:id:";
public static final String PERFORMANCES_NOTICE_REMIND_STATUS = "kylin:performances:noticeRemindStatus:id:"; public static final String PERFORMANCES_NOTICE_REMIND_STATUS = "kylin:performances:noticeRemindStatus:id:";
public static final String PERFORMANCES_ARTISTS = "kylin:performances:artists:id:"; public static final String PERFORMANCES_ARTISTS = "kylin:performances:artists:id:";
public static final String ARTIST_DETAIL = "kylin:artist:detail:id:";
public static final String ARTIST_ALBUM = "kylin:artist:album:id:";
public static final String ARTIST_PERFORMANCES = "kylin:artist:performances:id:";
public static final String ARTIST_PRODUCTS = "kylin:artist:products:id:";
public static final String PERFORMANCES_TRUE_NAME = "kylin:performances_true_name:id:"; public static final String PERFORMANCES_TRUE_NAME = "kylin:performances_true_name:id:";
public static final String PERFORMANCES_LIST_CITY = "kylin:performances:city:"; public static final String PERFORMANCES_LIST_CITY = "kylin:performances:city:";
public static final String PERFORMANCES_LIST_SYSTEM_RECOMMEND = "kylin:performances:systemRecommend"; public static final String PERFORMANCES_LIST_SYSTEM_RECOMMEND = "kylin:performances:systemRecommend";
......
package com.liquidnet.service.kylin.dto.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel("艺人关联商品保存参数")
public class ArtistProductSaveParam {
@ApiModelProperty("艺人ID")
private String artistId;
@ApiModelProperty("商品SPU ID列表")
private List<String> spuIds;
}
package com.liquidnet.service.kylin.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 艺人关联商品搜索选项
*/
@Data
@ApiModel("艺人关联商品搜索选项")
public class ArtistGoodsOptionVo {
@ApiModelProperty("商品SPU ID")
private String spuId;
@ApiModelProperty("商品编码")
private String spuNo;
@ApiModelProperty("商品名称")
private String name;
@ApiModelProperty("封面图")
private String coverPic;
@ApiModelProperty("售价")
private BigDecimal sellPrice;
@ApiModelProperty("上架状态文案")
private String shelfStatusLabel;
@ApiModelProperty("是否可选择")
private Boolean selectable;
}
...@@ -40,9 +40,6 @@ public class ArtistVo { ...@@ -40,9 +40,6 @@ public class ArtistVo {
@ApiModelProperty(value = "关联演出") @ApiModelProperty(value = "关联演出")
private List<PerformanceVo> performanceVoList; private List<PerformanceVo> performanceVoList;
@ApiModelProperty(value = "关联商品")
private List<ProductVo> productVoList;
@ApiModelProperty(value = "排序权重") @ApiModelProperty(value = "排序权重")
private Integer sort; private Integer sort;
...@@ -79,7 +76,27 @@ public class ArtistVo { ...@@ -79,7 +76,27 @@ public class ArtistVo {
@Data @Data
@ApiModel("商品VO") @ApiModel("商品VO")
private static class ProductVo { public static class ProductVo {
@ApiModelProperty("商品SPU ID")
private String spuId;
@ApiModelProperty("商品编码")
private String productCode;
@ApiModelProperty("商品名称")
private String productName;
@ApiModelProperty("商品头图")
private String imageUrl;
@ApiModelProperty("商品分类")
private String category;
@ApiModelProperty("商品售价")
private String price;
@ApiModelProperty("上架状态 1已上架 0未上架")
private Integer status;
} }
} }
package com.liquidnet.service.kylin.dto.vo.returns;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
@ApiModel("C端艺人详情")
public class KylinArtistDetailFrontVo implements Serializable {
@ApiModelProperty("艺人ID")
private String artistId;
@ApiModelProperty("艺人名称")
private String artistName;
@ApiModelProperty("艺人类型 1音乐人 2艺术家 3厂牌 4品牌方")
private Integer artistType;
@ApiModelProperty("艺人类型名称")
private String artistTypeName;
@ApiModelProperty("艺人头像")
private String avatarUrl;
@ApiModelProperty("艺人简介")
private String introduction;
@ApiModelProperty("艺人相册")
private List<String> albumImages;
}
package com.liquidnet.service.kylin.dto.vo.returns;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("C端艺人关联演出")
public class KylinArtistPerformanceFrontVo implements Serializable {
@ApiModelProperty("演出ID")
private String performanceId;
@ApiModelProperty("演出名称")
private String title;
@ApiModelProperty("封面")
private String coverPic;
@ApiModelProperty("演出开始时间")
private String timeStart;
@ApiModelProperty("状态 6购买 8售罄 9未开始")
private Integer appStatus;
@ApiModelProperty("状态文案")
private String statusName;
}
package com.liquidnet.service.kylin.dto.vo.returns;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel("C端艺人关联商品")
public class KylinArtistProductFrontVo implements Serializable {
@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.kylin.service;
import com.liquidnet.service.kylin.dto.vo.returns.KylinArtistDetailFrontVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinArtistPerformanceFrontVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinArtistProductFrontVo;
import java.util.List;
/**
* C端艺人详情
*/
public interface IKylinArtistFrontService {
KylinArtistDetailFrontVo getArtistDetail(String artistId);
List<String> getArtistAlbum(String artistId);
List<KylinArtistPerformanceFrontVo> getArtistPerformances(String artistId);
List<KylinArtistProductFrontVo> getArtistProducts(String artistId);
}
...@@ -5,6 +5,7 @@ import com.github.pagehelper.PageInfo; ...@@ -5,6 +5,7 @@ import com.github.pagehelper.PageInfo;
import com.liquidnet.service.kylin.dao.KylinArtistDao; import com.liquidnet.service.kylin.dao.KylinArtistDao;
import com.liquidnet.service.kylin.dto.param.ArtistParam; import com.liquidnet.service.kylin.dto.param.ArtistParam;
import com.liquidnet.service.kylin.dto.param.ArtistSearchParam; import com.liquidnet.service.kylin.dto.param.ArtistSearchParam;
import com.liquidnet.service.kylin.dto.vo.ArtistGoodsOptionVo;
import com.liquidnet.service.kylin.dto.vo.ArtistVo; import com.liquidnet.service.kylin.dto.vo.ArtistVo;
import com.liquidnet.service.kylin.entity.KylinArtist; import com.liquidnet.service.kylin.entity.KylinArtist;
...@@ -32,4 +33,10 @@ public interface IKylinArtistService extends IService<KylinArtist> { ...@@ -32,4 +33,10 @@ public interface IKylinArtistService extends IService<KylinArtist> {
Boolean checkArtistNameExists(String artistName, String artistId); Boolean checkArtistNameExists(String artistName, String artistId);
List<ArtistGoodsOptionVo> searchGoods(String keyword, String artistId, List<String> excludeSpuIds);
List<ArtistVo.ProductVo> listArtistProducts(String artistId);
Boolean saveArtistProducts(String artistId, List<String> spuIds);
} }
...@@ -4,16 +4,11 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -4,16 +4,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.entity.SweetArtists; import com.liquidnet.service.sweet.entity.SweetArtists;
import com.liquidnet.service.sweet.entity.SweetArtistsList;
import com.liquidnet.service.sweet.entity.SweetArtistsUrl;
import com.liquidnet.service.sweet.param.SweetArtistsListParam;
import com.liquidnet.service.sweet.vo.SweetArtistsVo; import com.liquidnet.service.sweet.vo.SweetArtistsVo;
import java.util.List;
/** /**
* <p> * <p>
* 艺人表 服务类 * 艺人表 服务类(读 kylin_artist,写已迁移至 admin)
* </p> * </p>
* *
* @author liquidnet * @author liquidnet
...@@ -23,12 +18,6 @@ public interface ISweetArtistsService extends IService<SweetArtists> { ...@@ -23,12 +18,6 @@ public interface ISweetArtistsService extends IService<SweetArtists> {
ResponseDto<PageInfo<SweetArtists>> getList(int page, int size, String name); ResponseDto<PageInfo<SweetArtists>> getList(int page, int size, String name);
ResponseDto<Boolean> add(SweetArtistsListParam sweetArtistsList);
ResponseDto<SweetArtistsVo> detail(String artistsId); ResponseDto<SweetArtistsVo> detail(String artistsId);
ResponseDto<Boolean> change(String artistsId, SweetArtistsListParam sweetArtistsList);
ResponseDto<SweetArtists> del(String artistsId);
} }
...@@ -11,7 +11,9 @@ import com.liquidnet.service.kylin.dao.KylinArtistDao; ...@@ -11,7 +11,9 @@ import com.liquidnet.service.kylin.dao.KylinArtistDao;
import com.liquidnet.service.kylin.dao.KylinArtistOperationLogDao; import com.liquidnet.service.kylin.dao.KylinArtistOperationLogDao;
import com.liquidnet.service.kylin.dao.KylinArtistPerformanceDao; import com.liquidnet.service.kylin.dao.KylinArtistPerformanceDao;
import com.liquidnet.service.kylin.dto.param.ArtistParam; import com.liquidnet.service.kylin.dto.param.ArtistParam;
import com.liquidnet.service.kylin.dto.param.ArtistProductSaveParam;
import com.liquidnet.service.kylin.dto.param.ArtistSearchParam; import com.liquidnet.service.kylin.dto.param.ArtistSearchParam;
import com.liquidnet.service.kylin.dto.vo.ArtistGoodsOptionVo;
import com.liquidnet.service.kylin.dto.vo.ArtistVo; import com.liquidnet.service.kylin.dto.vo.ArtistVo;
import com.liquidnet.service.kylin.service.admin.IKylinArtistOperationLogService; import com.liquidnet.service.kylin.service.admin.IKylinArtistOperationLogService;
import com.liquidnet.service.kylin.service.admin.IKylinArtistPerformanceService; import com.liquidnet.service.kylin.service.admin.IKylinArtistPerformanceService;
...@@ -24,6 +26,7 @@ import org.springframework.stereotype.Controller; ...@@ -24,6 +26,7 @@ import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -305,4 +308,66 @@ public class KylinArtistController extends BaseController { ...@@ -305,4 +308,66 @@ public class KylinArtistController extends BaseController {
} }
} }
/**
* 关联商品页面
*/
@RequiresPermissions("kylin:artist:update")
@GetMapping("/products/{artistId}")
public String productsPage(@PathVariable("artistId") String artistId, ModelMap mmap) {
ArtistVo artistVo = kylinArtistService.detail(artistId);
mmap.put("artistId", artistId);
mmap.put("artistName", artistVo != null ? artistVo.getArtistName() : "");
return prefix + "/products";
}
/**
* 查询艺人已关联商品
*/
@RequiresPermissions("kylin:artist:update")
@GetMapping("/products/list")
@ResponseBody
public AjaxResult productsList(@RequestParam String artistId) {
return AjaxResult.success(kylinArtistService.listArtistProducts(artistId));
}
/**
* 保存艺人关联商品
*/
@Log(title = "保存艺人关联商品", businessType = BusinessType.UPDATE)
@RequiresPermissions("kylin:artist:update")
@PostMapping("/products/save")
@ResponseBody
public AjaxResult productsSave(@RequestBody ArtistProductSaveParam param) {
try {
Boolean result = kylinArtistService.saveArtistProducts(param.getArtistId(), param.getSpuIds());
if (result) {
return success("保存成功");
}
return error("艺人不存在");
} catch (IllegalArgumentException e) {
return error(e.getMessage());
}
}
/**
* 搜索可选商品(按名称)
*/
@GetMapping("/searchGoods")
@ResponseBody
public AjaxResult searchGoods(
@RequestParam(value = "keyword", required = false) String keyword,
@RequestParam(value = "artistId", required = false) String artistId,
@RequestParam(value = "excludeSpuIds", required = false) String excludeSpuIds) {
List<String> excludeList = new ArrayList<>();
if (excludeSpuIds != null && !excludeSpuIds.isEmpty()) {
for (String spuId : excludeSpuIds.split(",")) {
if (spuId != null && !spuId.trim().isEmpty()) {
excludeList.add(spuId.trim());
}
}
}
List<ArtistGoodsOptionVo> list = kylinArtistService.searchGoods(keyword, artistId, excludeList);
return AjaxResult.success(list);
}
} }
...@@ -127,6 +127,7 @@ ...@@ -127,6 +127,7 @@
var actions = []; var actions = [];
actions.push('<a class="btn btn-info btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="$.operate.detail(\'' + row.artistId + '\')"><i class="fa fa-eye"></i>详情</a> '); actions.push('<a class="btn btn-info btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="$.operate.detail(\'' + row.artistId + '\')"><i class="fa fa-eye"></i>详情</a> ');
actions.push('<a class="btn btn-success btn-xs ' + updateFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.artistId + '\')"><i class="fa fa-edit"></i>编辑</a> '); actions.push('<a class="btn btn-success btn-xs ' + updateFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.artistId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
actions.push('<a class="btn btn-primary btn-xs ' + updateFlag + '" href="javascript:void(0)" onclick="openProductModal(\'' + row.artistId + '\')"><i class="fa fa-shopping-bag"></i>关联商品</a> ');
actions.push('<a class="btn btn-warning btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="showOperationLog(\'' + row.artistId + '\')"><i class="fa fa-history"></i>操作日志</a> '); actions.push('<a class="btn btn-warning btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="showOperationLog(\'' + row.artistId + '\')"><i class="fa fa-history"></i>操作日志</a> ');
return actions.join(''); return actions.join('');
} }
...@@ -171,6 +172,21 @@ ...@@ -171,6 +172,21 @@
var url = prefix + '/operationLog/' + artistId; var url = prefix + '/operationLog/' + artistId;
$.modal.openTab("艺人操作记录", url); $.modal.openTab("艺人操作记录", url);
} }
function openProductModal(artistId) {
var url = prefix + '/products/' + artistId;
$.modal.openOptions({
title: '关联商品',
url: url,
width: '900',
height: '600',
btn: ['保存', '关闭'],
yes: function (index, layero) {
var iframeWin = layero.find('iframe')[0];
iframeWin.contentWindow.submitHandler(index, layero);
}
});
}
</script> </script>
</body> </body>
</html> </html>
...@@ -282,54 +282,6 @@ ...@@ -282,54 +282,6 @@
暂无演出信息 暂无演出信息
</div> </div>
</div> </div>
<!-- 关联商品信息 -->
<div>
<div class="section-title">
艺人关联商品信息
<span th:if="*{productVoList != null}" style="font-size: 14px; color: #666; margin-left: 10px;">
(共<span th:text="*{productVoList.size()}">2</span>条)
</span>
</div>
<div class="table-container" th:if="*{productVoList != null and !productVoList.isEmpty()}">
<table class="custom-table">
<thead>
<tr>
<th width="15%">商品编码</th>
<th width="20%">商品名称</th>
<th width="15%">商品头图</th>
<th width="15%">商品分类</th>
<th width="15%">商品售价</th>
<th width="15%">上架状态</th>
</tr>
</thead>
<tbody>
<tr th:each="product : ${ArtistVo.productVoList}">
<td th:text="${product.productCode} ?: '--'">goods001</td>
<td th:text="${product.productName} ?: '--'">摩登天空T恤</td>
<td>
<div class="product-image" th:if="${product.imageUrl}">
<img th:src="${product.imageUrl}" alt="商品图片">
</div>
<span th:unless="${product.imageUrl}">--</span>
</td>
<td th:text="${product.category} ?: '--'">服饰</td>
<td th:text="${product.price} ?: '--'">99.00元</td>
<td>
<span th:if="${product.status == 1}" class="status-badge status-on">已上架</span>
<span th:if="${product.status == 0}" class="status-badge status-off">未上架</span>
<span th:if="${product.status != 1 and product.status != 0}" th:text="${product.status}">--</span>
</td>
</tr>
</tbody>
</table>
</div>
<div th:if="*{productVoList == null or productVoList.isEmpty()}" class="empty-data">
暂无关联商品信息
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
......
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<th:block th:include="include :: header('关联商品')"/>
<link rel="stylesheet" th:href="@{/ajax/libs/select2/select2.min.css}"/>
<style>
body { background: #fff; }
.page-wrap { padding: 16px; }
.section-title { font-weight: bold; margin: 16px 0 8px; }
.img-thumb { width: 40px; height: 40px; object-fit: cover; border-radius: 4px; }
.select2-container { min-width: 380px; }
.add-row { margin-bottom: 16px; display: flex; align-items: center; gap: 10px; }
</style>
</head>
<body class="white-bg">
<div class="page-wrap">
<div class="section-title">
艺人:<span th:text="${artistName}">--</span>
<span style="font-size:12px;color:#999;margin-left:8px;" th:text="'ID: ' + ${artistId}"></span>
</div>
<div class="add-row">
<select id="goodsSelect" style="width:400px;">
<option value="">默认最近20条,输入名称搜索全部匹配</option>
</select>
<span style="color:#999;font-size:12px;">选中商品后自动添加到列表</span>
</div>
<div class="section-title">已关联商品</div>
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>商品SPU ID</th>
<th>头图</th>
<th>商品名称</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="linkedProductsBody">
<tr id="linkedProductsEmptyRow">
<td colspan="5" style="text-align:center;color:#999;">暂无关联商品</td>
</tr>
</tbody>
</table>
</div>
</div>
<th:block th:include="include :: footer"/>
<script th:src="@{/ajax/libs/select2/select2.min.js}"></script>
<script th:inline="javascript">
var artistId = /*[[${artistId}]]*/ '';
var prefix = ctx + 'kylin/artist';
var linkedProducts = [];
$(function () {
initSelect2();
loadLinkedProducts();
});
function initSelect2() {
$('#goodsSelect').select2({
allowClear: true,
placeholder: '默认最近20条,输入名称搜索全部匹配',
minimumInputLength: 0,
ajax: {
url: prefix + '/searchGoods',
dataType: 'json',
delay: 300,
data: function (params) {
return {
keyword: params.term || '',
artistId: artistId,
excludeSpuIds: linkedProducts.map(function (item) { return item.spuId; }).join(',')
};
},
processResults: function (resp) {
var list = (resp && resp.data) ? resp.data : [];
return { results: list.map(function (item) {
var text = item.name || item.spuId;
if (item.spuNo) {
text += ' (' + item.spuNo + ')';
}
return { id: item.spuId, text: text, disabled: item.selectable === false, _raw: item };
})};
}
}
}).on('select2:select', function (e) {
var raw = e.params.data._raw;
if (raw && raw.selectable === false) {
$.modal.alertWarning('该商品不可关联');
$(this).val(null).trigger('change');
return;
}
if (raw) {
addLinkedProduct(raw);
}
$(this).val(null).trigger('change');
});
}
function loadLinkedProducts() {
$.get(prefix + '/products/list', { artistId: artistId }, function (resp) {
if (resp.code === 0 && resp.data) {
linkedProducts = resp.data.map(function (item) {
return {
spuId: item.spuId,
name: item.productName,
coverPic: item.imageUrl,
shelfStatusLabel: item.status === 1 ? '已上架' : '未上架'
};
});
renderLinkedProducts();
}
});
}
function renderLinkedProducts() {
var $body = $('#linkedProductsBody');
$body.empty();
if (!linkedProducts.length) {
$body.append('<tr><td colspan="5" style="text-align:center;color:#999;">暂无关联商品</td></tr>');
return;
}
linkedProducts.forEach(function (item, index) {
$body.append('<tr>' +
'<td>' + (item.spuId || '--') + '</td>' +
'<td>' + (item.coverPic ? '<img class="img-thumb" src="' + item.coverPic + '">' : '--') + '</td>' +
'<td>' + (item.name || '--') + '</td>' +
'<td>' + (item.shelfStatusLabel || '--') + '</td>' +
'<td><button type="button" class="btn btn-danger btn-xs" onclick="removeLinkedProduct(' + index + ')">移除</button></td>' +
'</tr>');
});
}
function addLinkedProduct(raw) {
if (!raw || !raw.spuId) {
return;
}
if (linkedProducts.some(function (item) { return item.spuId === raw.spuId; })) {
$.modal.alertWarning('该商品已在列表中');
return;
}
linkedProducts.push({
spuId: raw.spuId,
name: raw.name,
coverPic: raw.coverPic,
shelfStatusLabel: raw.shelfStatusLabel
});
renderLinkedProducts();
}
function removeLinkedProduct(index) {
linkedProducts.splice(index, 1);
renderLinkedProducts();
}
function submitHandler(index, layero) {
var spuIds = linkedProducts.map(function (item) { return item.spuId; });
$.ajax({
url: prefix + '/products/save',
type: 'post',
contentType: 'application/json',
data: JSON.stringify({ artistId: artistId, spuIds: spuIds }),
success: function (resp) {
if (resp.code === 0) {
if (parent && parent.$ && parent.$.modal) {
parent.$.modal.msgSuccess('保存成功');
if (parent.$.table) {
parent.$.table.refresh();
}
} else {
$.modal.msgSuccess('保存成功');
}
if (typeof index !== 'undefined') {
parent.layer.close(index);
} else {
$.modal.close();
}
} else {
$.modal.alertError(resp.msg || '保存失败');
}
}
});
}
</script>
</body>
</html>
...@@ -699,8 +699,10 @@ ...@@ -699,8 +699,10 @@
$('#selected-artists-container').html(''); $('#selected-artists-container').html('');
// 打开弹窗 // 打开弹窗
$('#associateArtistModal').modal('show'); $('#associateArtistModal').modal('show');
// 加载初始艺人列表(含已关联状态) // 已绑定艺人从 getSessionArtists 初始化(含逻辑删除但仍关联的);可选列表走 getAllArtists
loadAllArtistsForModal(timesId, true); initSelectedArtistsFromSession(timesId, function () {
loadAllArtistsForModal(timesId);
});
} }
// 防抖 // 防抖
...@@ -715,15 +717,45 @@ ...@@ -715,15 +717,45 @@
const debouncedSearch = debounce(function () { const debouncedSearch = debounce(function () {
const timesId = $('#associateArtistModal').data('timesId'); const timesId = $('#associateArtistModal').data('timesId');
loadAllArtistsForModal(timesId, false); loadAllArtistsForModal(timesId);
}, 300); }, 300);
/** 从本场次已绑定阵容初始化已选艺人(不按 status 过滤) */
function initSelectedArtistsFromSession(timesId, callback) {
$.ajax({
url: ctx + "kylin/artist/getSessionArtists",
type: "GET",
data: {
performancesId: performancesId,
timesId: timesId
},
success: function (response) {
if (response.code === 0) {
selectedArtists = (response.data || [])
.map(function (a) {
return {
artistId: a.artistId,
artistName: a.artistName,
avatarUrl: a.avatarUrl,
sort: a.sort || 0
};
})
.sort(function (a, b) { return b.sort - a.sort; });
updateSelectedArtistsView();
}
if (callback) callback();
},
error: function () {
if (callback) callback();
}
});
}
/** /**
* 从后端加载艺人列表 * 从后端加载可选艺人列表(仅 status=1)
* @param {string} timesId * @param {string} timesId
* @param {boolean} isInitialLoad 是否首次加载(用于初始化已选艺人)
*/ */
function loadAllArtistsForModal(timesId, isInitialLoad) { function loadAllArtistsForModal(timesId) {
const keyword = $('#artist-search-input').val().trim(); const keyword = $('#artist-search-input').val().trim();
// 显示加载中 // 显示加载中
...@@ -742,7 +774,7 @@ ...@@ -742,7 +774,7 @@
success: function (response) { success: function (response) {
if (response.code === 0) { if (response.code === 0) {
currentModalArtists = response.data || []; currentModalArtists = response.data || [];
renderArtistsInModal(currentModalArtists, isInitialLoad); renderArtistsInModal(currentModalArtists);
} else { } else {
$('#modal-artist-list').html( $('#modal-artist-list').html(
'<div class="modal-empty">加载艺人列表失败,请重试</div>' '<div class="modal-empty">加载艺人列表失败,请重试</div>'
...@@ -760,9 +792,8 @@ ...@@ -760,9 +792,8 @@
/** /**
* 渲染搜索结果列表 * 渲染搜索结果列表
* @param {Array} artists * @param {Array} artists
* @param {boolean} isInitialLoad
*/ */
function renderArtistsInModal(artists, isInitialLoad) { function renderArtistsInModal(artists) {
const listContainer = $('#modal-artist-list'); const listContainer = $('#modal-artist-list');
if (!artists || artists.length === 0) { if (!artists || artists.length === 0) {
...@@ -771,14 +802,6 @@ ...@@ -771,14 +802,6 @@
return; return;
} }
// 首次加载时,从后端的 associated 字段初始化已选列表,并按 sort 降序排列(sort 越大越靠前)
if (isInitialLoad) {
selectedArtists = artists
.filter(a => a.associated)
.map(a => ({ artistId: a.artistId, artistName: a.artistName, avatarUrl: a.avatarUrl, sort: a.sort || 0 }))
.sort((a, b) => b.sort - a.sort);
}
let html = ''; let html = '';
artists.forEach(function (artist) { artists.forEach(function (artist) {
const isSelected = selectedArtists.some(a => a.artistId === artist.artistId); const isSelected = selectedArtists.some(a => a.artistId === artist.artistId);
......
...@@ -14,10 +14,10 @@ import lombok.extern.slf4j.Slf4j; ...@@ -14,10 +14,10 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.HashSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.liquidnet.service.kylin.service.admin.IKylinArtistOperationLogService; import com.liquidnet.service.kylin.service.admin.IKylinArtistOperationLogService;
...@@ -79,6 +79,7 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe ...@@ -79,6 +79,7 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe
// 删除缓存演出阵容 // 删除缓存演出阵容
dataUtils.delPerformanceArtists(performanceId); dataUtils.delPerformanceArtists(performanceId);
dataUtils.delArtistPerformancesCache(artistId);
int result = artistPerformanceMapper.deleteById(mid); int result = artistPerformanceMapper.deleteById(mid);
// 记录删除后的关联数量 // 记录删除后的关联数量
...@@ -95,8 +96,9 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe ...@@ -95,8 +96,9 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe
@Override @Override
public List<KylinArtistAssociationStatusDto> getAllArtists(String performancesId, String timesId, String keyword) { public List<KylinArtistAssociationStatusDto> getAllArtists(String performancesId, String timesId, String keyword) {
// 1. 获取所有艺人 // 1. 可选艺人:仅启用中(已逻辑删除的不出现在选艺人列表;已绑定展示走 getSessionArtists)
List<KylinArtist> allArtists = artistMapper.selectList(new QueryWrapper<KylinArtist>() List<KylinArtist> allArtists = artistMapper.selectList(new QueryWrapper<KylinArtist>()
.eq("status", 1)
.like(keyword != null && !keyword.isEmpty(), "artist_name", keyword) .like(keyword != null && !keyword.isEmpty(), "artist_name", keyword)
.orderByDesc("created_at")); .orderByDesc("created_at"));
...@@ -108,7 +110,7 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe ...@@ -108,7 +110,7 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe
.collect(Collectors.toMap( .collect(Collectors.toMap(
KylinArtistPerformanceDao::getArtistId, KylinArtistPerformanceDao::getArtistId,
KylinArtistPerformanceDao::getSort, KylinArtistPerformanceDao::getSort,
(existing, replacement) -> existing // 重复 key 保留已有值 (existing, replacement) -> existing
)); ));
// 3. 组装返回结果 // 3. 组装返回结果
...@@ -190,6 +192,9 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe ...@@ -190,6 +192,9 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe
// 删除缓存演出阵容 // 删除缓存演出阵容
dataUtils.delPerformanceArtists(performancesId); dataUtils.delPerformanceArtists(performancesId);
for (String artistId : affectedArtistIds) {
dataUtils.delArtistPerformancesCache(artistId);
}
return true; return true;
} }
} }
package com.liquidnet.client.admin.zhengzai.kylin.service.impl; package com.liquidnet.client.admin.zhengzai.kylin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.liquidnet.client.admin.zhengzai.kylin.utils.DataUtils; import com.liquidnet.client.admin.zhengzai.kylin.utils.DataUtils;
import com.liquidnet.client.admin.zhengzai.kylin.utils.SweetArtistCacheUtils;
import com.liquidnet.commons.lang.util.BeanUtil; import com.liquidnet.commons.lang.util.BeanUtil;
import com.liquidnet.commons.lang.util.DateUtil; import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator; import com.liquidnet.commons.lang.util.IDGenerator;
...@@ -12,9 +15,14 @@ import com.liquidnet.service.kylin.dao.KylinArtistDao; ...@@ -12,9 +15,14 @@ import com.liquidnet.service.kylin.dao.KylinArtistDao;
import com.liquidnet.service.kylin.dao.KylinArtistPerformanceDao; import com.liquidnet.service.kylin.dao.KylinArtistPerformanceDao;
import com.liquidnet.service.kylin.dto.param.ArtistParam; import com.liquidnet.service.kylin.dto.param.ArtistParam;
import com.liquidnet.service.kylin.dto.param.ArtistSearchParam; import com.liquidnet.service.kylin.dto.param.ArtistSearchParam;
import com.liquidnet.service.kylin.dto.vo.ArtistGoodsOptionVo;
import com.liquidnet.service.kylin.dto.vo.ArtistVo; import com.liquidnet.service.kylin.dto.vo.ArtistVo;
import com.liquidnet.service.kylin.entity.KylinArtist; import com.liquidnet.service.kylin.entity.KylinArtist;
import com.liquidnet.service.goblin.entity.GoblinGoods;
import com.liquidnet.service.goblin.mapper.GoblinGoodsMapper;
import com.liquidnet.service.kylin.entity.KylinArtistAlbum; import com.liquidnet.service.kylin.entity.KylinArtistAlbum;
import com.liquidnet.service.kylin.entity.KylinArtistProduct;
import com.liquidnet.service.kylin.mapper.KylinArtistProductMapper;
import com.liquidnet.service.kylin.mapper.KylinArtistAlbumMapper; import com.liquidnet.service.kylin.mapper.KylinArtistAlbumMapper;
import com.liquidnet.service.kylin.mapper.KylinArtistMapper; import com.liquidnet.service.kylin.mapper.KylinArtistMapper;
import com.liquidnet.service.kylin.mapper.KylinArtistPerformanceMapper; import com.liquidnet.service.kylin.mapper.KylinArtistPerformanceMapper;
...@@ -27,8 +35,12 @@ import org.springframework.stereotype.Service; ...@@ -27,8 +35,12 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -50,6 +62,9 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin ...@@ -50,6 +62,9 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin
@Autowired @Autowired
private KylinArtistAlbumMapper artistAlbumMapper; private KylinArtistAlbumMapper artistAlbumMapper;
@Autowired
private KylinArtistProductMapper artistProductMapper;
@Autowired @Autowired
private KylinArtistPerformanceMapper artistPerformanceMapper; private KylinArtistPerformanceMapper artistPerformanceMapper;
...@@ -59,6 +74,12 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin ...@@ -59,6 +74,12 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin
@Autowired @Autowired
private DataUtils dataUtils; private DataUtils dataUtils;
@Autowired
private SweetArtistCacheUtils sweetArtistCacheUtils;
@Autowired
private GoblinGoodsMapper goblinGoodsMapper;
/** /**
* 创建艺人 * 创建艺人
*/ */
...@@ -147,6 +168,8 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin ...@@ -147,6 +168,8 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin
dataUtils.delPerformanceArtists(p); dataUtils.delPerformanceArtists(p);
} }
} }
sweetArtistCacheUtils.invalidateByArtistId(artistId);
dataUtils.delArtistDetailAndAlbumCache(artistId);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
log.error("修改艺人失败", e); log.error("修改艺人失败", e);
...@@ -272,28 +295,16 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin ...@@ -272,28 +295,16 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin
new UpdateWrapper<KylinArtist>().in("artist_id", artistIds) new UpdateWrapper<KylinArtist>().in("artist_id", artistIds)
); );
// 删除相册图片并记录日志 // 逻辑删除艺人,保留相册/商品/演出关联等历史数据;关联与展示内容未变,缓存自然过期即可
for (String artistId : artistIds) { for (String artistId : artistIds) {
// 获取艺人信息用于日志
KylinArtist artist = artistMapper.selectOne( KylinArtist artist = artistMapper.selectOne(
new UpdateWrapper<KylinArtist>().eq("artist_id", artistId) new UpdateWrapper<KylinArtist>().eq("artist_id", artistId)
); );
artistAlbumMapper.deleteByArtistId(artistId);
// 记录删除日志
String logContent = "删除艺人:" + (artist != null ? artist.getArtistName() + "(ID:" + artistId + ")" : artistId); String logContent = "删除艺人:" + (artist != null ? artist.getArtistName() + "(ID:" + artistId + ")" : artistId);
operationLogService.recordLog(artistId, 3, logContent); operationLogService.recordLog(artistId, 3, logContent);
} }
// 根据艺人ID查询所有关联的演出
List<String> performanceIdList = artistPerformanceMapper.selectPerformanceIdsByArtistIds(artistIds);
if (!performanceIdList.isEmpty()) {
for (String p : performanceIdList) {
dataUtils.delPerformanceArtists(p);
}
}
return true; return true;
} catch (Exception e) { } catch (Exception e) {
log.error("删除艺人失败", e); log.error("删除艺人失败", e);
...@@ -301,6 +312,126 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin ...@@ -301,6 +312,126 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin
} }
} }
@Override
public List<ArtistVo.ProductVo> listArtistProducts(String artistId) {
KylinArtist artist = artistMapper.selectOne(
new UpdateWrapper<KylinArtist>().eq("artist_id", artistId).eq("status", 1)
);
if (artist == null) {
return Collections.emptyList();
}
List<KylinArtistProduct> productRelations = artistProductMapper.selectByArtistId(artistId);
if (productRelations == null || productRelations.isEmpty()) {
return Collections.emptyList();
}
List<ArtistVo.ProductVo> productVoList = new ArrayList<>();
for (KylinArtistProduct relation : productRelations) {
ArtistVo.ProductVo productVo = buildProductVo(relation.getSpuId());
if (productVo != null) {
productVoList.add(productVo);
}
}
return productVoList;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean saveArtistProducts(String artistId, List<String> spuIds) {
KylinArtist artist = artistMapper.selectOne(
new UpdateWrapper<KylinArtist>().eq("artist_id", artistId).eq("status", 1)
);
if (artist == null) {
return false;
}
LinkedHashSet<String> uniqueSpuIds = new LinkedHashSet<>();
if (spuIds != null) {
for (String spuId : spuIds) {
if (spuId != null && !spuId.trim().isEmpty()) {
uniqueSpuIds.add(spuId.trim());
}
}
}
artistProductMapper.deleteByArtistId(artistId);
if (!uniqueSpuIds.isEmpty()) {
saveProductRelations(artistId, new ArrayList<>(uniqueSpuIds));
}
operationLogService.recordLog(artistId, 2, "更新了艺人关联商品");
dataUtils.delArtistProductsCache(artistId);
return true;
}
@Override
public List<ArtistGoodsOptionVo> searchGoods(String keyword, String artistId, List<String> excludeSpuIds) {
Set<String> excludeSet = buildExcludeSpuIds(artistId, excludeSpuIds);
boolean hasKeyword = keyword != null && !keyword.trim().isEmpty();
LambdaQueryWrapper<GoblinGoods> query = Wrappers.lambdaQuery(GoblinGoods.class)
.ne(GoblinGoods::getDelFlg, "1")
.orderByDesc(GoblinGoods::getMid);
if (!excludeSet.isEmpty()) {
query.notIn(GoblinGoods::getSpuId, excludeSet);
}
if (hasKeyword) {
query.like(GoblinGoods::getName, keyword.trim());
} else {
query.last("LIMIT 20");
}
List<GoblinGoods> goodsList = goblinGoodsMapper.selectList(query);
List<ArtistGoodsOptionVo> result = new ArrayList<>();
for (GoblinGoods goods : goodsList) {
result.add(buildGoodsOption(goods));
}
return result;
}
private Set<String> buildExcludeSpuIds(String artistId, List<String> excludeSpuIds) {
Set<String> excludeSet = new HashSet<>();
if (artistId != null && !artistId.isEmpty()) {
List<KylinArtistProduct> relations = artistProductMapper.selectByArtistId(artistId);
if (relations != null) {
for (KylinArtistProduct relation : relations) {
if (relation.getSpuId() != null && !relation.getSpuId().isEmpty()) {
excludeSet.add(relation.getSpuId());
}
}
}
}
if (excludeSpuIds != null) {
for (String spuId : excludeSpuIds) {
if (spuId != null && !spuId.trim().isEmpty()) {
excludeSet.add(spuId.trim());
}
}
}
return excludeSet;
}
private ArtistGoodsOptionVo buildGoodsOption(GoblinGoods goods) {
ArtistGoodsOptionVo vo = new ArtistGoodsOptionVo();
vo.setSpuId(goods.getSpuId());
vo.setSpuNo(goods.getSpuNo());
vo.setName(goods.getName());
vo.setCoverPic(goods.getCoverPic());
vo.setShelfStatusLabel(resolveShelfStatusLabel(goods.getShelvesStatus(), goods.getDelFlg()));
vo.setSelectable(!"1".equals(goods.getDelFlg()));
return vo;
}
private String resolveShelfStatusLabel(String shelvesStatus, String delFlg) {
if (!"0".equals(delFlg)) {
return "已删除";
}
if ("3".equals(shelvesStatus)) {
return "已上架";
}
if ("0".equals(shelvesStatus)) {
return "待上架";
}
if ("1".equals(shelvesStatus)) {
return "未上架";
}
return "不可售";
}
/** /**
* 检查艺人名称是否存在 * 检查艺人名称是否存在
*/ */
...@@ -337,6 +468,49 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin ...@@ -337,6 +468,49 @@ public class KylinArtistServiceImpl extends ServiceImpl<KylinArtistMapper, Kylin
} }
} }
private void saveProductRelations(String artistId, List<String> spuIds) {
LocalDateTime now = LocalDateTime.now();
int sort = spuIds.size();
for (String spuId : spuIds) {
if (spuId == null || spuId.trim().isEmpty()) {
continue;
}
KylinArtistProduct product = KylinArtistProduct.getNew();
product.setRelationId(IDGenerator.nextSnowId());
product.setArtistId(artistId);
product.setSpuId(spuId.trim());
product.setSort(sort--);
product.setStatus(1);
product.setCreatedAt(now);
product.setUpdatedAt(now);
artistProductMapper.insert(product);
}
}
private ArtistVo.ProductVo buildProductVo(String spuId) {
GoblinGoods goods = goblinGoodsMapper.selectOne(
Wrappers.lambdaQuery(GoblinGoods.class)
.eq(GoblinGoods::getSpuId, spuId)
.ne(GoblinGoods::getDelFlg, "1")
);
if (goods == null) {
ArtistVo.ProductVo vo = new ArtistVo.ProductVo();
vo.setSpuId(spuId);
vo.setProductCode(spuId);
vo.setProductName("商品不存在");
vo.setStatus(0);
return vo;
}
ArtistVo.ProductVo vo = new ArtistVo.ProductVo();
vo.setSpuId(goods.getSpuId());
vo.setProductCode(goods.getSpuNo() != null ? goods.getSpuNo() : goods.getSpuId());
vo.setProductName(goods.getName());
vo.setImageUrl(goods.getCoverPic());
vo.setCategory("--");
vo.setStatus("3".equals(goods.getShelvesStatus()) ? 1 : 0);
return vo;
}
/** /**
* 构建新增操作的日志内容 * 构建新增操作的日志内容
*/ */
......
...@@ -631,4 +631,39 @@ public class DataUtils { ...@@ -631,4 +631,39 @@ public class DataUtils {
final String redisKey = KylinRedisConst.PERFORMANCES_ARTISTS + performancesId; final String redisKey = KylinRedisConst.PERFORMANCES_ARTISTS + performancesId;
redisDataSourceUtil.getRedisKylinUtil().del(redisKey); redisDataSourceUtil.getRedisKylinUtil().del(redisKey);
} }
/**
* 删除艺人 C 端缓存(详情/相册/演出/商品)
*/
public void delArtistCache(String artistId) {
if (artistId == null || artistId.isEmpty()) {
return;
}
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.ARTIST_DETAIL + artistId);
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.ARTIST_ALBUM + artistId);
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.ARTIST_PERFORMANCES + artistId);
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.ARTIST_PRODUCTS + artistId);
}
public void delArtistDetailAndAlbumCache(String artistId) {
if (artistId == null || artistId.isEmpty()) {
return;
}
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.ARTIST_DETAIL + artistId);
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.ARTIST_ALBUM + artistId);
}
public void delArtistPerformancesCache(String artistId) {
if (artistId == null || artistId.isEmpty()) {
return;
}
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.ARTIST_PERFORMANCES + artistId);
}
public void delArtistProductsCache(String artistId) {
if (artistId == null || artistId.isEmpty()) {
return;
}
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.ARTIST_PRODUCTS + artistId);
}
} }
package com.liquidnet.client.admin.zhengzai.kylin.utils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.liquidnet.common.cache.redis.util.RedisDataSourceUtil;
import com.liquidnet.service.sweet.constant.SweetConstant;
import com.liquidnet.service.sweet.entity.SweetManualArtists;
import com.liquidnet.service.sweet.entity.SweetManualArtistsFive;
import com.liquidnet.service.sweet.entity.SweetManualArtistsMdsk;
import com.liquidnet.service.sweet.entity.SweetManualArtistsTfc;
import com.liquidnet.service.sweet.mapper.SweetManualArtistsFiveMapper;
import com.liquidnet.service.sweet.mapper.SweetManualArtistsMapper;
import com.liquidnet.service.sweet.mapper.SweetManualArtistsMdskMapper;
import com.liquidnet.service.sweet.mapper.SweetManualArtistsTfcMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
/**
* admin 修改 kylin 艺人后,失效 sweet 小程序相关 Redis 缓存
*/
@Slf4j
@Component
public class SweetArtistCacheUtils {
@Autowired
private RedisDataSourceUtil redisDataSourceUtil;
@Autowired
private SweetManualArtistsMapper sweetManualArtistsMapper;
@Autowired
private SweetManualArtistsMdskMapper sweetManualArtistsMdskMapper;
@Autowired
private SweetManualArtistsTfcMapper sweetManualArtistsTfcMapper;
@Autowired
private SweetManualArtistsFiveMapper sweetManualArtistsFiveMapper;
public void invalidateByArtistId(String artistId) {
if (artistId == null || artistId.isEmpty()) {
return;
}
try {
redisDataSourceUtil.getRedisSweetUtil().del(SweetConstant.REDIS_KEY_SWEET_ARTISTS_DETAILS.concat(artistId));
invalidateManualTimeList(
sweetManualArtistsMapper.selectList(
Wrappers.lambdaQuery(SweetManualArtists.class).eq(SweetManualArtists::getArtistsId, artistId)
).stream().map(SweetManualArtists::getManualId).collect(Collectors.toSet()),
SweetConstant.REDIS_KEY_SWEET_MANUAL_TIME_LIST
);
invalidateManualTimeList(
sweetManualArtistsMdskMapper.selectList(
Wrappers.lambdaQuery(SweetManualArtistsMdsk.class).eq(SweetManualArtistsMdsk::getArtistsId, artistId)
).stream().map(SweetManualArtistsMdsk::getManualId).collect(Collectors.toSet()),
SweetConstant.REDIS_KEY_SWEET_MDSK_MANUAL_TIME_LIST
);
invalidateManualTimeList(
sweetManualArtistsTfcMapper.selectList(
Wrappers.lambdaQuery(SweetManualArtistsTfc.class).eq(SweetManualArtistsTfc::getArtistsId, artistId)
).stream().map(SweetManualArtistsTfc::getManualId).collect(Collectors.toSet()),
SweetConstant.REDIS_KEY_SWEET_TFC_MANUAL_TIME_LIST
);
invalidateManualTimeList(
sweetManualArtistsFiveMapper.selectList(
Wrappers.lambdaQuery(SweetManualArtistsFive.class).eq(SweetManualArtistsFive::getArtistsId, artistId)
).stream().map(SweetManualArtistsFive::getManualId).collect(Collectors.toSet()),
SweetConstant.REDIS_KEY_SWEET_FIVE_MANUAL_TIME_LIST
);
} catch (Exception e) {
log.error("invalidate sweet artist cache failed, artistId={}", artistId, e);
}
}
private void invalidateManualTimeList(Set<String> manualIds, String keyPrefix) {
if (manualIds == null || manualIds.isEmpty()) {
return;
}
for (String manualId : new HashSet<>(manualIds)) {
if (manualId != null && !manualId.isEmpty()) {
redisDataSourceUtil.getRedisSweetUtil().del(keyPrefix.concat(manualId));
}
}
}
}
...@@ -57,6 +57,9 @@ public class RedisKeyExpireConst { ...@@ -57,6 +57,9 @@ public class RedisKeyExpireConst {
// 演出关联阵容缓存过期时间 // 演出关联阵容缓存过期时间
public static final long PERFORMANCES_ARTISTS_EXPIRE = 30 * 24 * 60 * 60; public static final long PERFORMANCES_ARTISTS_EXPIRE = 30 * 24 * 60 * 60;
// C端艺人详情相关缓存过期时间
public static final long ARTIST_FRONT_CACHE_EXPIRE = 30 * 24 * 60 * 60;
/** /**
* 演出关联收钱吧商品缓存过期时间 (30天) * 演出关联收钱吧商品缓存过期时间 (30天)
*/ */
......
...@@ -161,6 +161,8 @@ global-auth: ...@@ -161,6 +161,8 @@ global-auth:
- ${liquidnet.info.context}/health - ${liquidnet.info.context}/health
# 演出阵容 # 演出阵容
- ${liquidnet.info.context}/performance/artists/** - ${liquidnet.info.context}/performance/artists/**
# 艺人详情 C 端(无需登录)
- ${liquidnet.info.context}/artist/**
oncheck-url-pattern: oncheck-url-pattern:
- ${liquidnet.info.context}/order/details - ${liquidnet.info.context}/order/details
- ${liquidnet.info.context}/order/transfer* - ${liquidnet.info.context}/order/transfer*
......
...@@ -36,6 +36,11 @@ public class KylinArtist implements Serializable, Cloneable { ...@@ -36,6 +36,11 @@ public class KylinArtist implements Serializable, Cloneable {
*/ */
private String artistName; private String artistName;
/**
* 姓名拼音
*/
private String pinyin;
/** /**
* 艺人类型 1音乐人 2艺术家 3厂牌 4品牌方 * 艺人类型 1音乐人 2艺术家 3厂牌 4品牌方
*/ */
......
package com.liquidnet.service.kylin.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 KylinArtistProduct implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
private String relationId;
private String artistId;
private String spuId;
private Integer sort;
private Integer status;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private static final KylinArtistProduct obj = new KylinArtistProduct();
public static KylinArtistProduct getNew() {
try {
return (KylinArtistProduct) obj.clone();
} catch (CloneNotSupportedException e) {
return new KylinArtistProduct();
}
}
}
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.entity.KylinArtistProduct;
import java.util.List;
public interface KylinArtistProductMapper extends BaseMapper<KylinArtistProduct> {
List<KylinArtistProduct> selectByArtistId(String artistId);
int deleteByArtistId(String artistId);
}
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
a.introduction, a.introduction,
a.created_at, a.created_at,
(SELECT COUNT(1) FROM kylin_artist_performance ap WHERE ap.artist_id = a.artist_id) as performance_count, (SELECT COUNT(1) FROM kylin_artist_performance ap WHERE ap.artist_id = a.artist_id) as performance_count,
0 as product_count (SELECT COUNT(1) FROM kylin_artist_product ap2 WHERE ap2.artist_id = a.artist_id AND ap2.status = 1) as product_count
FROM kylin_artist a FROM kylin_artist a
<where> <where>
a.status = 1 a.status = 1
......
<?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.liquidnet.service.kylin.mapper.KylinArtistProductMapper">
<select id="selectByArtistId" parameterType="java.lang.String"
resultType="com.liquidnet.service.kylin.entity.KylinArtistProduct">
SELECT mid, relation_id, artist_id, spu_id, sort, status, created_at, updated_at
FROM kylin_artist_product
WHERE artist_id = #{artistId} AND status = 1
ORDER BY sort DESC, mid DESC
</select>
<delete id="deleteByArtistId" parameterType="java.lang.String">
DELETE FROM kylin_artist_product
WHERE artist_id = #{artistId}
</delete>
</mapper>
...@@ -23,11 +23,11 @@ ...@@ -23,11 +23,11 @@
<select id="getManualList" parameterType="java.util.Map" resultMap="getManualListResult"> <select id="getManualList" parameterType="java.util.Map" resultMap="getManualListResult">
select manual_relation_id, select manual_relation_id,
sa.`artists_id`, sa.`artist_id` as artists_id,
sa.`name`, sa.`artist_name` as name,
sa.pinyin, sa.pinyin,
sa.describes, sa.introduction as describes,
sa.pic_url, sa.avatar_url as pic_url,
ss.stage_id, ss.stage_id,
ss.title, ss.title,
performance_start, performance_start,
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
signature_start, signature_start,
signature_end signature_end
from sweet_manual_artists_Five as sma from sweet_manual_artists_Five as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
<where> <where>
sma.status = 1 and manual_id = #{manualId} sma.status = 1 and manual_id = #{manualId}
...@@ -45,8 +45,8 @@ ...@@ -45,8 +45,8 @@
<select id="getManualDetails" parameterType="java.util.Map" resultMap="getManualListResult"> <select id="getManualDetails" parameterType="java.util.Map" resultMap="getManualListResult">
select manual_relation_id, select manual_relation_id,
sa.`name`, sa.`artist_name` as name,
sa.`artists_id`, sa.`artist_id` as artists_id,
ss.title, ss.title,
ss.stage_id, ss.stage_id,
performance_start, performance_start,
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
signature_start, signature_start,
signature_end signature_end
from sweet_manual_artists_Five as sma from sweet_manual_artists_Five as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
where manual_relation_id = #{manualRelationId} where manual_relation_id = #{manualRelationId}
</select> </select>
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
<select id="getStageNameList" parameterType="java.util.Map" resultMap="getStageNameListResult"> <select id="getStageNameList" parameterType="java.util.Map" resultMap="getStageNameListResult">
select ss.title select ss.title
from sweet_manual_artists_Five as sma from sweet_manual_artists_Five as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
where sma.status = 1 where sma.status = 1
and manual_id = #{manualId} and manual_id = #{manualId}
......
...@@ -23,11 +23,11 @@ ...@@ -23,11 +23,11 @@
<select id="getManualList" parameterType="java.util.Map" resultMap="getManualListResult"> <select id="getManualList" parameterType="java.util.Map" resultMap="getManualListResult">
select manual_relation_id, select manual_relation_id,
sa.`artists_id`, sa.`artist_id` as artists_id,
sa.`name`, sa.`artist_name` as name,
sa.pinyin, sa.pinyin,
sa.describes, sa.introduction as describes,
sa.pic_url, sa.avatar_url as pic_url,
ss.stage_id, ss.stage_id,
ss.title, ss.title,
performance_start, performance_start,
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
signature_start, signature_start,
signature_end signature_end
from sweet_manual_artists as sma from sweet_manual_artists as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
<where> <where>
sma.status = 1 and manual_id = #{manualId} sma.status = 1 and manual_id = #{manualId}
...@@ -45,8 +45,8 @@ ...@@ -45,8 +45,8 @@
<select id="getManualDetails" parameterType="java.util.Map" resultMap="getManualListResult"> <select id="getManualDetails" parameterType="java.util.Map" resultMap="getManualListResult">
select manual_relation_id, select manual_relation_id,
sa.`name`, sa.`artist_name` as name,
sa.`artists_id`, sa.`artist_id` as artists_id,
ss.title, ss.title,
ss.stage_id, ss.stage_id,
performance_start, performance_start,
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
signature_start, signature_start,
signature_end signature_end
from sweet_manual_artists as sma from sweet_manual_artists as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
where manual_relation_id = #{manualRelationId} where manual_relation_id = #{manualRelationId}
</select> </select>
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
<select id="getStageNameList" parameterType="java.util.Map" resultMap="getStageNameListResult"> <select id="getStageNameList" parameterType="java.util.Map" resultMap="getStageNameListResult">
select ss.title select ss.title
from sweet_manual_artists as sma from sweet_manual_artists as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
where sma.status = 1 where sma.status = 1
and manual_id = #{manualId} and manual_id = #{manualId}
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
select ss.title, ss.stage_id select ss.title, ss.stage_id
from sweet_manual_artists as sma from sweet_manual_artists as sma
join sweet_manual as sm on sm.manual_id = sma.manual_id join sweet_manual as sm on sm.manual_id = sma.manual_id
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
where sma.status = 1 where sma.status = 1
and sm.performance_id = #{performanceId} and sm.performance_id = #{performanceId}
...@@ -82,11 +82,11 @@ ...@@ -82,11 +82,11 @@
</select> </select>
<select id="getManualListAr" resultType="com.liquidnet.service.sweet.dto.SweetManualArtistListArDto"> <select id="getManualListAr" resultType="com.liquidnet.service.sweet.dto.SweetManualArtistListArDto">
select manual_relation_id, select manual_relation_id,
sa.`artists_id`, sa.`artist_id` as artists_id,
sa.`name`, sa.`artist_name` as name,
sa.pinyin, sa.pinyin,
sa.describes, sa.introduction as describes,
sa.pic_url, sa.avatar_url as pic_url,
ss.stage_id, ss.stage_id,
ss.title, ss.title,
performance_start, performance_start,
...@@ -95,7 +95,7 @@ ...@@ -95,7 +95,7 @@
signature_end signature_end
from sweet_manual_artists as sma from sweet_manual_artists as sma
join sweet_manual as sm on sm.manual_id = sma.manual_id join sweet_manual as sm on sm.manual_id = sma.manual_id
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
<where> <where>
sma.status = 1 and sm.performance_id = #{performanceId} sma.status = 1 and sm.performance_id = #{performanceId}
......
...@@ -23,11 +23,11 @@ ...@@ -23,11 +23,11 @@
<select id="getManualList" parameterType="java.util.Map" resultMap="getManualListResult"> <select id="getManualList" parameterType="java.util.Map" resultMap="getManualListResult">
select manual_relation_id, select manual_relation_id,
sa.`artists_id`, sa.`artist_id` as artists_id,
sa.`name`, sa.`artist_name` as name,
sa.pinyin, sa.pinyin,
sa.describes, sa.introduction as describes,
sa.pic_url, sa.avatar_url as pic_url,
ss.stage_id, ss.stage_id,
ss.title, ss.title,
performance_start, performance_start,
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
signature_start, signature_start,
signature_end signature_end
from sweet_manual_artists_mdsk as sma from sweet_manual_artists_mdsk as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
<where> <where>
sma.status = 1 and manual_id = #{manualId} sma.status = 1 and manual_id = #{manualId}
...@@ -45,8 +45,8 @@ ...@@ -45,8 +45,8 @@
<select id="getManualDetails" parameterType="java.util.Map" resultMap="getManualListResult"> <select id="getManualDetails" parameterType="java.util.Map" resultMap="getManualListResult">
select manual_relation_id, select manual_relation_id,
sa.`name`, sa.`artist_name` as name,
sa.`artists_id`, sa.`artist_id` as artists_id,
ss.title, ss.title,
ss.stage_id, ss.stage_id,
performance_start, performance_start,
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
signature_start, signature_start,
signature_end signature_end
from sweet_manual_artists_mdsk as sma from sweet_manual_artists_mdsk as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
where manual_relation_id = #{manualRelationId} where manual_relation_id = #{manualRelationId}
</select> </select>
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
<select id="getStageNameList" parameterType="java.util.Map" resultMap="getStageNameListResult"> <select id="getStageNameList" parameterType="java.util.Map" resultMap="getStageNameListResult">
select ss.title select ss.title
from sweet_manual_artists_mdsk as sma from sweet_manual_artists_mdsk as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
where sma.status = 1 where sma.status = 1
and manual_id = #{manualId} and manual_id = #{manualId}
......
...@@ -23,11 +23,11 @@ ...@@ -23,11 +23,11 @@
<select id="getManualList" parameterType="java.util.Map" resultMap="getManualListResult"> <select id="getManualList" parameterType="java.util.Map" resultMap="getManualListResult">
select manual_relation_id, select manual_relation_id,
sa.`artists_id`, sa.`artist_id` as artists_id,
sa.`name`, sa.`artist_name` as name,
sa.pinyin, sa.pinyin,
sa.describes, sa.introduction as describes,
sa.pic_url, sa.avatar_url as pic_url,
ss.stage_id, ss.stage_id,
ss.title, ss.title,
performance_start, performance_start,
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
signature_start, signature_start,
signature_end signature_end
from sweet_manual_artists_tfc as sma from sweet_manual_artists_tfc as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
<where> <where>
sma.status = 1 and manual_id = #{manualId} sma.status = 1 and manual_id = #{manualId}
...@@ -45,8 +45,8 @@ ...@@ -45,8 +45,8 @@
<select id="getManualDetails" parameterType="java.util.Map" resultMap="getManualListResult"> <select id="getManualDetails" parameterType="java.util.Map" resultMap="getManualListResult">
select manual_relation_id, select manual_relation_id,
sa.`name`, sa.`artist_name` as name,
sa.`artists_id`, sa.`artist_id` as artists_id,
ss.title, ss.title,
ss.stage_id, ss.stage_id,
performance_start, performance_start,
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
signature_start, signature_start,
signature_end signature_end
from sweet_manual_artists_tfc as sma from sweet_manual_artists_tfc as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
where manual_relation_id = #{manualRelationId} where manual_relation_id = #{manualRelationId}
</select> </select>
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
<select id="getStageNameList" parameterType="java.util.Map" resultMap="getStageNameListResult"> <select id="getStageNameList" parameterType="java.util.Map" resultMap="getStageNameListResult">
select ss.title select ss.title
from sweet_manual_artists_tfc as sma from sweet_manual_artists_tfc as sma
left join sweet_artists as sa on sa.artists_id = sma.artists_id left join kylin_artist as sa on sa.artist_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id left join sweet_stage as ss on ss.stage_id = sma.stage_id
where sma.status = 1 where sma.status = 1
and manual_id = #{manualId} and manual_id = #{manualId}
......
package com.liquidnet.service.kylin.controller;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.vo.returns.KylinArtistDetailFrontVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinArtistPerformanceFrontVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinArtistProductFrontVo;
import com.liquidnet.service.kylin.service.IKylinArtistFrontService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Api(tags = "前端-艺人")
@RestController
@RequestMapping("artist")
@Slf4j
public class KylinArtistController {
@Autowired
private IKylinArtistFrontService kylinArtistFrontService;
@GetMapping("detail/{artistId}")
@ApiOperation("艺人详情(简介)")
@ApiImplicitParam(type = "path", dataType = "String", name = "artistId", value = "艺人ID", required = true)
public ResponseDto<KylinArtistDetailFrontVo> detail(@PathVariable String artistId) {
KylinArtistDetailFrontVo vo = kylinArtistFrontService.getArtistDetail(artistId);
if (vo == null) {
return ResponseDto.failure("艺人不存在");
}
return ResponseDto.success(vo);
}
@GetMapping("{artistId}/album")
@ApiOperation("艺人相册")
@ApiImplicitParam(type = "path", dataType = "String", name = "artistId", value = "艺人ID", required = true)
public ResponseDto<List<String>> album(@PathVariable String artistId) {
return ResponseDto.success(kylinArtistFrontService.getArtistAlbum(artistId));
}
@GetMapping("{artistId}/performances")
@ApiOperation("艺人关联演出(未开售/已开售,不含已结束)")
@ApiImplicitParam(type = "path", dataType = "String", name = "artistId", value = "艺人ID", required = true)
public ResponseDto<List<KylinArtistPerformanceFrontVo>> performances(@PathVariable String artistId) {
return ResponseDto.success(kylinArtistFrontService.getArtistPerformances(artistId));
}
@GetMapping("{artistId}/products")
@ApiOperation("艺人关联商品")
@ApiImplicitParam(type = "path", dataType = "String", name = "artistId", value = "艺人ID", required = true)
public ResponseDto<List<KylinArtistProductFrontVo>> products(@PathVariable String artistId) {
return ResponseDto.success(kylinArtistFrontService.getArtistProducts(artistId));
}
}
package com.liquidnet.service.kylin.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.liquidnet.service.kylin.constant.KylinPerformanceStatusEnum;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.dao.KylinArtistPerformanceDao;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinArtistDetailFrontVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinArtistPerformanceFrontVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinArtistProductFrontVo;
import com.liquidnet.service.kylin.entity.KylinArtist;
import com.liquidnet.service.kylin.entity.KylinArtistAlbum;
import com.liquidnet.service.kylin.entity.KylinArtistProduct;
import com.liquidnet.service.kylin.mapper.KylinArtistAlbumMapper;
import com.liquidnet.service.kylin.mapper.KylinArtistMapper;
import com.liquidnet.service.kylin.mapper.KylinArtistPerformanceMapper;
import com.liquidnet.service.kylin.mapper.KylinArtistProductMapper;
import com.liquidnet.service.kylin.service.IKylinArtistFrontService;
import com.liquidnet.service.kylin.utils.DataUtils;
import com.liquidnet.service.kylin.utils.GoblinRedisUtils;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsInfoVo;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.math.BigDecimal;
import java.util.stream.Collectors;
@Slf4j
@Service
public class KylinArtistFrontServiceImpl implements IKylinArtistFrontService {
@Autowired
private KylinArtistMapper kylinArtistMapper;
@Autowired
private KylinArtistAlbumMapper kylinArtistAlbumMapper;
@Autowired
private KylinArtistPerformanceMapper kylinArtistPerformanceMapper;
@Autowired
private KylinArtistProductMapper kylinArtistProductMapper;
@Autowired
private DataUtils dataUtils;
@Autowired
private GoblinRedisUtils goblinRedisUtils;
@Autowired
private KylinPerformancesServiceImpl kylinPerformancesService;
@Override
public KylinArtistDetailFrontVo getArtistDetail(String artistId) {
String cacheKey = KylinRedisConst.ARTIST_DETAIL + artistId;
KylinArtistDetailFrontVo cached = dataUtils.getArtistFrontCache(cacheKey);
if (cached != null) {
return cached;
}
KylinArtist artist = loadArtistForFront(artistId);
if (artist == null) {
return null;
}
KylinArtistDetailFrontVo vo = new KylinArtistDetailFrontVo();
vo.setArtistId(artist.getArtistId());
vo.setArtistName(artist.getArtistName());
vo.setArtistType(artist.getArtistType());
vo.setArtistTypeName(resolveArtistTypeName(artist.getArtistType()));
vo.setAvatarUrl(artist.getAvatarUrl());
vo.setIntroduction(artist.getIntroduction());
dataUtils.setArtistFrontCache(cacheKey, vo);
return vo;
}
@Override
public List<String> getArtistAlbum(String artistId) {
String cacheKey = KylinRedisConst.ARTIST_ALBUM + artistId;
List<String> cached = dataUtils.getArtistFrontCache(cacheKey);
if (cached != null) {
return cached;
}
List<KylinArtistAlbum> albumList = kylinArtistAlbumMapper.selectByArtistId(artistId);
List<String> imageUrls = new ArrayList<>();
if (!CollectionUtils.isEmpty(albumList)) {
imageUrls = albumList.stream().map(KylinArtistAlbum::getImageUrl).collect(Collectors.toList());
}
dataUtils.setArtistFrontCache(cacheKey, imageUrls);
return imageUrls;
}
@Override
public List<KylinArtistPerformanceFrontVo> getArtistPerformances(String artistId) {
String cacheKey = KylinRedisConst.ARTIST_PERFORMANCES + artistId;
List<KylinArtistPerformanceDao> baseList = dataUtils.getArtistFrontCache(cacheKey);
if (baseList == null) {
baseList = loadPerformanceBaseList(artistId);
dataUtils.setArtistFrontCache(cacheKey, baseList);
}
return buildPerformanceFrontList(baseList);
}
@Override
public List<KylinArtistProductFrontVo> getArtistProducts(String artistId) {
String cacheKey = KylinRedisConst.ARTIST_PRODUCTS + artistId;
List<KylinArtistProduct> baseList = dataUtils.getArtistFrontCache(cacheKey);
if (baseList == null) {
baseList = loadProductRelationBaseList(artistId);
dataUtils.setArtistFrontCache(cacheKey, baseList);
}
return buildProductFrontList(baseList);
}
private List<KylinArtistProduct> loadProductRelationBaseList(String artistId) {
List<KylinArtistProduct> relations = kylinArtistProductMapper.selectByArtistId(artistId);
if (CollectionUtils.isEmpty(relations)) {
return new ArrayList<>();
}
return relations;
}
private List<KylinArtistPerformanceDao> loadPerformanceBaseList(String artistId) {
List<KylinArtistPerformanceDao> performanceList = kylinArtistPerformanceMapper.selectPerformanceDaoByArtistId(artistId);
if (CollectionUtils.isEmpty(performanceList)) {
return new ArrayList<>();
}
Map<String, KylinArtistPerformanceDao> dedup = new LinkedHashMap<>();
for (KylinArtistPerformanceDao item : performanceList) {
dedup.putIfAbsent(item.getPerformanceId(), item);
}
return new ArrayList<>(dedup.values());
}
private List<KylinArtistPerformanceFrontVo> buildPerformanceFrontList(List<KylinArtistPerformanceDao> baseList) {
List<KylinArtistPerformanceFrontVo> result = new ArrayList<>();
if (CollectionUtils.isEmpty(baseList)) {
return result;
}
for (KylinArtistPerformanceDao item : baseList) {
KylinPerformanceVo performanceVo = dataUtils.getPerformanceVo(item.getPerformanceId());
if (performanceVo == null) {
continue;
}
performanceVo = kylinPerformancesService.checkAppStatusInfo(performanceVo);
Integer appStatus = performanceVo.getAppStatus();
if (appStatus == null || appStatus == 10 || appStatus == 7 || appStatus == 3 || appStatus == 11) {
continue;
}
if (appStatus != 6 && appStatus != 9 && appStatus != 8) {
continue;
}
KylinArtistPerformanceFrontVo vo = new KylinArtistPerformanceFrontVo();
vo.setPerformanceId(item.getPerformanceId());
vo.setTitle(item.getTitle());
vo.setCoverPic(performanceVo.getImgPoster());
vo.setTimeStart(item.getTimeStart());
vo.setAppStatus(appStatus == 8 ? 6 : appStatus);
vo.setStatusName(KylinPerformanceStatusEnum.getName(appStatus));
result.add(vo);
}
return result;
}
private List<KylinArtistProductFrontVo> buildProductFrontList(List<KylinArtistProduct> relations) {
List<KylinArtistProductFrontVo> result = new ArrayList<>();
if (CollectionUtils.isEmpty(relations)) {
return result;
}
for (KylinArtistProduct relation : relations) {
GoblinGoodsInfoVo goods = goblinRedisUtils.getGoodsInfoVo(relation.getSpuId());
if (goods == null || !"0".equals(goods.getDelFlg()) || !"3".equals(goods.getShelvesStatus())) {
continue;
}
KylinArtistProductFrontVo vo = new KylinArtistProductFrontVo();
vo.setSpuId(goods.getSpuId());
vo.setName(goods.getName());
vo.setCoverPic(goods.getCoverPic());
vo.setSellPrice(resolveGoodsSellPrice(goods));
vo.setSort(relation.getSort());
result.add(vo);
}
return result;
}
/**
* SPU sellPrice 常为空,与 goblin 前台一致:SKU 最低价 → priceGe → priceLe
*/
private BigDecimal resolveGoodsSellPrice(GoblinGoodsInfoVo goodsInfoVo) {
if (goodsInfoVo == null) {
return null;
}
if (goodsInfoVo.getSellPrice() != null) {
return goodsInfoVo.getSellPrice();
}
BigDecimal minSkuPrice = null;
if (!CollectionUtils.isEmpty(goodsInfoVo.getSkuIdList())) {
for (String skuId : goodsInfoVo.getSkuIdList()) {
GoblinGoodsSkuInfoVo skuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
if (skuInfoVo == null) {
continue;
}
BigDecimal skuShowPrice = skuInfoVo.getSellPrice() != null
? skuInfoVo.getSellPrice() : skuInfoVo.getPrice();
if (skuShowPrice == null) {
continue;
}
if (minSkuPrice == null || skuShowPrice.compareTo(minSkuPrice) < 0) {
minSkuPrice = skuShowPrice;
}
}
}
if (minSkuPrice != null) {
return minSkuPrice;
}
if (goodsInfoVo.getPriceGe() != null) {
return goodsInfoVo.getPriceGe();
}
return goodsInfoVo.getPriceLe();
}
/**
* 简介详情用:按 artist_id 查 kylin_artist(不按 status 过滤)
*/
private KylinArtist loadArtistForFront(String artistId) {
if (artistId == null || artistId.isEmpty()) {
return null;
}
return kylinArtistMapper.selectOne(
Wrappers.lambdaQuery(KylinArtist.class).eq(KylinArtist::getArtistId, artistId)
);
}
private String resolveArtistTypeName(Integer artistType) {
if (artistType == null) {
return "未知";
}
switch (artistType) {
case 1:
return "音乐人";
case 2:
return "艺术家";
case 3:
return "厂牌";
case 4:
return "品牌方";
default:
return "未知";
}
}
}
...@@ -1782,4 +1782,23 @@ public class DataUtils { ...@@ -1782,4 +1782,23 @@ public class DataUtils {
final String redisKey = KylinRedisConst.PERFORMANCES_ARTISTS + performancesId; final String redisKey = KylinRedisConst.PERFORMANCES_ARTISTS + performancesId;
redisUtil.set(redisKey, artistLineupVos, RedisKeyExpireConst.PERFORMANCES_ARTISTS_EXPIRE); redisUtil.set(redisKey, artistLineupVos, RedisKeyExpireConst.PERFORMANCES_ARTISTS_EXPIRE);
} }
public void delArtistCache(String artistId) {
if (artistId == null || artistId.isEmpty()) {
return;
}
redisUtil.del(KylinRedisConst.ARTIST_DETAIL + artistId);
redisUtil.del(KylinRedisConst.ARTIST_ALBUM + artistId);
redisUtil.del(KylinRedisConst.ARTIST_PERFORMANCES + artistId);
redisUtil.del(KylinRedisConst.ARTIST_PRODUCTS + artistId);
}
@SuppressWarnings("unchecked")
public <T> T getArtistFrontCache(String redisKey) {
return (T) redisUtil.get(redisKey);
}
public void setArtistFrontCache(String redisKey, Object value) {
redisUtil.set(redisKey, value, RedisKeyExpireConst.ARTIST_FRONT_CACHE_EXPIRE);
}
} }
...@@ -85,6 +85,12 @@ ...@@ -85,6 +85,12 @@
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-service-kylin-do</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.data</groupId> <groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId> <artifactId>spring-data-mongodb</artifactId>
......
...@@ -4,12 +4,7 @@ package com.liquidnet.service.sweet.controller; ...@@ -4,12 +4,7 @@ package com.liquidnet.service.sweet.controller;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.entity.SweetArtists; import com.liquidnet.service.sweet.entity.SweetArtists;
import com.liquidnet.service.sweet.entity.SweetArtistsList;
import com.liquidnet.service.sweet.entity.SweetArtistsUrl;
import com.liquidnet.service.sweet.entity.SweetStage;
import com.liquidnet.service.sweet.param.SweetArtistsListParam;
import com.liquidnet.service.sweet.service.ISweetArtistsService; import com.liquidnet.service.sweet.service.ISweetArtistsService;
import com.liquidnet.service.sweet.service.ISweetStageService;
import com.liquidnet.service.sweet.vo.SweetArtistsVo; import com.liquidnet.service.sweet.vo.SweetArtistsVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
...@@ -18,11 +13,9 @@ import io.swagger.annotations.ApiOperation; ...@@ -18,11 +13,9 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List;
/** /**
* <p> * <p>
* 艺人表 前端控制器 * 艺人表 前端控制器(读 kylin_artist,写已迁移至 admin /kylin/artist)
* </p> * </p>
* *
* @author liquidnet * @author liquidnet
...@@ -49,20 +42,6 @@ public class SweetArtistsController { ...@@ -49,20 +42,6 @@ public class SweetArtistsController {
return sweetArtistsService.getList(page, size, name); return sweetArtistsService.getList(page, size, name);
} }
@PostMapping("add")
@ApiOperation("添加艺人")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "picUrl", value = "封面图片", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "name", value = "艺人姓名", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "pinyin", value = "姓名拼音", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "describes", value = "艺人简介", required = true),
@ApiImplicitParam(type = "query", dataType = "String[]", name = "picArray", value = "图片数组", required = false),
@ApiImplicitParam(type = "query", dataType = "String[]", name = "videoArray", value = "视频数组", required = false)
})
public ResponseDto<Boolean> add(SweetArtistsListParam sweetArtistsList) {
return sweetArtistsService.add(sweetArtistsList);
}
@GetMapping("detail") @GetMapping("detail")
@ApiOperation("艺人详情") @ApiOperation("艺人详情")
@ApiImplicitParams({ @ApiImplicitParams({
...@@ -71,28 +50,4 @@ public class SweetArtistsController { ...@@ -71,28 +50,4 @@ public class SweetArtistsController {
public ResponseDto<SweetArtistsVo> detail(@RequestParam() String artistsId) { public ResponseDto<SweetArtistsVo> detail(@RequestParam() String artistsId) {
return sweetArtistsService.detail(artistsId); return sweetArtistsService.detail(artistsId);
} }
@PostMapping("change")
@ApiOperation("修改艺人")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "picUrl", value = "封面图片", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "artistsId", value = "艺人Id", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "name", value = "艺人姓名", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "pinyin", value = "姓名拼音", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "describes", value = "艺人简介", required = true),
@ApiImplicitParam(type = "query", dataType = "String[]", name = "picArray", value = "图片数组", required = false),
@ApiImplicitParam(type = "query", dataType = "String[]", name = "videoArray", value = "视频数组", required = false)
})
public ResponseDto<Boolean> change(@RequestParam() String artistsId, SweetArtistsListParam sweetArtistsList) {
return sweetArtistsService.change(artistsId, sweetArtistsList);
}
@GetMapping("del")
@ApiOperation("删除艺人")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "artistsId", value = "艺人Id", required = true),
})
public ResponseDto<SweetArtists> del(@RequestParam() String artistsId) {
return sweetArtistsService.del(artistsId);
}
} }
package com.liquidnet.service.sweet.service.impl; package com.liquidnet.service.sweet.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.liquidnet.commons.lang.util.BeanUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.dto.SweetManualArtistList2Dto; import com.liquidnet.service.kylin.entity.KylinArtist;
import com.liquidnet.service.sweet.dto.SweetManualArtistListDto; import com.liquidnet.service.kylin.mapper.KylinArtistMapper;
import com.liquidnet.service.sweet.dto.SweetManualArtistStageListDto; import com.liquidnet.service.sweet.entity.SweetArtists;
import com.liquidnet.service.sweet.entity.*; import com.liquidnet.service.sweet.entity.SweetArtistsUrl;
import com.liquidnet.service.sweet.mapper.SweetArtistsMapper; import com.liquidnet.service.sweet.mapper.SweetArtistsMapper;
import com.liquidnet.service.sweet.mapper.SweetArtistsUrlMapper; import com.liquidnet.service.sweet.mapper.SweetArtistsUrlMapper;
import com.liquidnet.service.sweet.mapper.SweetManualArtistsMapper;
import com.liquidnet.service.sweet.mapper.SweetStageMapper;
import com.liquidnet.service.sweet.param.SweetArtistsListParam;
import com.liquidnet.service.sweet.service.ISweetArtistsService; import com.liquidnet.service.sweet.service.ISweetArtistsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.service.sweet.utils.RedisDataUtils;
import com.liquidnet.service.sweet.vo.SweetArtistsVo; import com.liquidnet.service.sweet.vo.SweetArtistsVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
* 艺人表 服务实现类 * 艺人表 服务实现类(读 kylin_artist,写已迁移至 admin)
* </p> * </p>
* *
* @author liquidnet * @author liquidnet
...@@ -43,142 +34,74 @@ import java.util.List; ...@@ -43,142 +34,74 @@ import java.util.List;
public class SweetArtistsServiceImpl extends ServiceImpl<SweetArtistsMapper, SweetArtists> implements ISweetArtistsService { public class SweetArtistsServiceImpl extends ServiceImpl<SweetArtistsMapper, SweetArtists> implements ISweetArtistsService {
@Autowired @Autowired
private SweetArtistsMapper sweetArtistsMapper; private KylinArtistMapper kylinArtistMapper;
@Autowired
private SweetManualArtistsMapper sweetManualArtistsMapper;
@Autowired
private RedisDataUtils redisDataUtils;
@Autowired @Autowired
private SweetArtistsUrlMapper sweetArtistsUrlMapper; private SweetArtistsUrlMapper sweetArtistsUrlMapper;
@Override @Override
public ResponseDto<PageInfo<SweetArtists>> getList(int page, int size, String name) { public ResponseDto<PageInfo<SweetArtists>> getList(int page, int size, String name) {
PageInfo<SweetArtists> pageInfo = null; PageInfo<SweetArtists> pageInfo = null;
try { try {
List<SweetArtists> data;
PageHelper.startPage(page, size); PageHelper.startPage(page, size);
if (name != null) { List<KylinArtist> kylinList;
data = sweetArtistsMapper.selectList(Wrappers.lambdaQuery(SweetArtists.class).like(SweetArtists::getName, name)); if (name != null && !name.isEmpty()) {
kylinList = kylinArtistMapper.selectList(
Wrappers.lambdaQuery(KylinArtist.class)
.like(KylinArtist::getArtistName, name)
.eq(KylinArtist::getStatus, 1)
.orderByDesc(KylinArtist::getSort)
.orderByDesc(KylinArtist::getCreatedAt)
);
} else { } else {
data = sweetArtistsMapper.selectList(Wrappers.lambdaQuery(SweetArtists.class)); kylinList = kylinArtistMapper.selectList(
} Wrappers.lambdaQuery(KylinArtist.class)
.eq(KylinArtist::getStatus, 1)
.orderByDesc(KylinArtist::getSort)
.orderByDesc(KylinArtist::getCreatedAt)
);
}
List<SweetArtists> data = kylinList.stream().map(this::toSweetArtists).collect(Collectors.toList());
pageInfo = new PageInfo(data); pageInfo = new PageInfo(data);
return ResponseDto.success(pageInfo); return ResponseDto.success(pageInfo);
} catch (Exception e) { } catch (Exception e) {
log.error("getList error", e);
return ResponseDto.success(pageInfo); return ResponseDto.success(pageInfo);
} }
} }
@Override
@Transactional
public ResponseDto<Boolean> add(SweetArtistsListParam sweetArtistsList) {
try {
String mid = IDGenerator.nextSnowId();
LocalDateTime time = LocalDateTime.now();
SweetArtistsUrl sweetArtistsUrl = SweetArtistsUrl.getNew();
SweetArtists sweetArtists = SweetArtists.getNew();
sweetArtists.setArtistsId(mid);
sweetArtists.setName(sweetArtistsList.getName());
sweetArtists.setPinyin(sweetArtistsList.getPinyin());
sweetArtists.setDescribes(sweetArtistsList.getDescribes());
sweetArtists.setPicUrl(sweetArtistsList.getPicUrl());
sweetArtists.setCreatedAt(time);
sweetArtists.setUpdatdAt(time);
sweetArtistsMapper.insert(sweetArtists);
sweetArtistsUrl.setArtistsId(mid);
sweetArtistsUrl.setCreatedAt(time);
if (sweetArtistsList.getPicArray() != null) {
for (String img : sweetArtistsList.getPicArray()) {
sweetArtistsUrl.setUrl(img);
sweetArtistsUrl.setType("1");
sweetArtistsUrlMapper.insert(sweetArtistsUrl);
}
}
if (sweetArtistsList.getVideoArray() != null) {
for (String video : sweetArtistsList.getVideoArray()) {
sweetArtistsUrl.setUrl(video);
sweetArtistsUrl.setType("2");
sweetArtistsUrlMapper.insert(sweetArtistsUrl);
}
}
return ResponseDto.success();
} catch (Exception e) {
return ResponseDto.failure();
}
}
@Override @Override
public ResponseDto<SweetArtistsVo> detail(String artistsId) { public ResponseDto<SweetArtistsVo> detail(String artistsId) {
try { try {
SweetArtistsVo vo = SweetArtistsVo.getNew(); SweetArtistsVo vo = SweetArtistsVo.getNew();
SweetArtists sweetArtists = sweetArtistsMapper.selectOne(Wrappers.lambdaQuery(SweetArtists.class).eq(SweetArtists::getArtistsId, artistsId)); KylinArtist kylinArtist = kylinArtistMapper.selectOne(
Wrappers.lambdaQuery(KylinArtist.class)
BeanUtils.copyProperties(sweetArtists, vo); .eq(KylinArtist::getArtistId, artistsId)
List<SweetArtistsUrl> sweetArtistsUrl = sweetArtistsUrlMapper.selectList(Wrappers.lambdaQuery(SweetArtistsUrl.class).eq(SweetArtistsUrl::getArtistsId, artistsId)); );
if (kylinArtist == null) {
return ResponseDto.failure();
}
BeanUtils.copyProperties(toSweetArtists(kylinArtist), vo);
List<SweetArtistsUrl> sweetArtistsUrl = sweetArtistsUrlMapper.selectList(
Wrappers.lambdaQuery(SweetArtistsUrl.class).eq(SweetArtistsUrl::getArtistsId, artistsId)
);
vo.setSweetArtistsUrl(sweetArtistsUrl); vo.setSweetArtistsUrl(sweetArtistsUrl);
return ResponseDto.success(vo); return ResponseDto.success(vo);
} catch (Exception e) { } catch (Exception e) {
log.error("==", e); log.error("detail error", e);
return ResponseDto.failure(); return ResponseDto.failure();
} }
} }
@Override private SweetArtists toSweetArtists(KylinArtist kylinArtist) {
@Transactional
public ResponseDto<Boolean> change(String artistsId, SweetArtistsListParam sweetArtistsList) {
try {
LocalDateTime time = LocalDateTime.now();
SweetArtists sweetArtists = SweetArtists.getNew(); SweetArtists sweetArtists = SweetArtists.getNew();
sweetArtists.setName(sweetArtistsList.getName()); sweetArtists.setArtistsId(kylinArtist.getArtistId());
sweetArtists.setPinyin(sweetArtistsList.getPinyin()); sweetArtists.setName(kylinArtist.getArtistName());
sweetArtists.setPicUrl(sweetArtistsList.getPicUrl()); sweetArtists.setPinyin(kylinArtist.getPinyin());
sweetArtists.setDescribes(sweetArtistsList.getDescribes()); sweetArtists.setDescribes(kylinArtist.getIntroduction());
sweetArtists.setUpdatdAt(time); sweetArtists.setPicUrl(kylinArtist.getAvatarUrl());
SweetArtistsUrl sweetArtistsUrl = SweetArtistsUrl.getNew(); sweetArtists.setStatus(kylinArtist.getStatus());
sweetArtistsUrl.setCreatedAt(time); sweetArtists.setCreatedAt(kylinArtist.getCreatedAt());
sweetArtistsMapper.update(sweetArtists, Wrappers.lambdaUpdate(SweetArtists.class).eq(SweetArtists::getArtistsId, artistsId)); sweetArtists.setUpdatdAt(kylinArtist.getUpdatedAt());
//更新关联表 return sweetArtists;
sweetArtistsUrlMapper.delete(Wrappers.lambdaQuery(SweetArtistsUrl.class).eq(SweetArtistsUrl::getArtistsId, artistsId));
sweetArtistsUrl.setArtistsId(artistsId);
sweetArtistsUrl.setCreatedAt(time);
for (String img : sweetArtistsList.getPicArray()) {
sweetArtistsUrl.setUrl(img);
sweetArtistsUrl.setType("1");
sweetArtistsUrlMapper.insert(sweetArtistsUrl);
}
String[] videoArray = sweetArtistsList.getVideoArray();
if (null != videoArray && videoArray.length > 0) {
for (String video : sweetArtistsList.getVideoArray()) {
sweetArtistsUrl.setUrl(video);
sweetArtistsUrl.setType("2");
sweetArtistsUrlMapper.insert(sweetArtistsUrl);
}
}
List<SweetManualArtists> data = sweetManualArtistsMapper.selectList(Wrappers.lambdaQuery(SweetManualArtists.class).eq(SweetManualArtists::getArtistsId, artistsId));
for (SweetManualArtists item : data) {
redisDataUtils.deleteTimeListRedisData(item.getManualId());
}
return ResponseDto.success();
} catch (Exception e) {
log.error("sweetArtistsChangeExc", e);
log.error("sweetArtistsChangeE [e:{}]", e);
return ResponseDto.failure();
}
} }
@Override
@Transactional
public ResponseDto<SweetArtists> del(String artistsId) {
try {
sweetArtistsMapper.delete(Wrappers.lambdaQuery(SweetArtists.class).eq(SweetArtists::getArtistsId, artistsId));
sweetArtistsUrlMapper.delete(Wrappers.lambdaQuery(SweetArtistsUrl.class).eq(SweetArtistsUrl::getArtistsId, artistsId));
return ResponseDto.success();
} catch (Exception e) {
return ResponseDto.failure();
}
}
} }
...@@ -15,6 +15,8 @@ import com.liquidnet.service.base.constant.MQConst; ...@@ -15,6 +15,8 @@ import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.base.constant.RedisKeyExpireConst; import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.service.feign.slime.api.FeignSlimeApiClient; import com.liquidnet.service.feign.slime.api.FeignSlimeApiClient;
import com.liquidnet.service.slime.dto.vo.SlimeFieldsDetailsVo; import com.liquidnet.service.slime.dto.vo.SlimeFieldsDetailsVo;
import com.liquidnet.service.kylin.entity.KylinArtist;
import com.liquidnet.service.kylin.mapper.KylinArtistMapper;
import com.liquidnet.service.sweet.constant.SweetConstant; import com.liquidnet.service.sweet.constant.SweetConstant;
import com.liquidnet.service.sweet.dto.*; import com.liquidnet.service.sweet.dto.*;
import com.liquidnet.service.sweet.dto.param.poster.SweetStrawberryParam; import com.liquidnet.service.sweet.dto.param.poster.SweetStrawberryParam;
...@@ -58,7 +60,7 @@ public class RedisDataUtils { ...@@ -58,7 +60,7 @@ public class RedisDataUtils {
@Autowired @Autowired
private SweetManualShopMapper sweetManualShopMapper; private SweetManualShopMapper sweetManualShopMapper;
@Autowired @Autowired
private SweetArtistsMapper sweetArtistsMapper; private KylinArtistMapper kylinArtistMapper;
@Autowired @Autowired
private SweetIntegralActivityDrawMapper sweetIntegralActivityDrawMapper; private SweetIntegralActivityDrawMapper sweetIntegralActivityDrawMapper;
@Autowired @Autowired
...@@ -405,7 +407,21 @@ public class RedisDataUtils { ...@@ -405,7 +407,21 @@ public class RedisDataUtils {
// 艺人详情 // 艺人详情
public SweetArtists setArtistsDetails(String artistsId) { public SweetArtists setArtistsDetails(String artistsId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_ARTISTS_DETAILS.concat(artistsId); String redisKey = SweetConstant.REDIS_KEY_SWEET_ARTISTS_DETAILS.concat(artistsId);
SweetArtists sweetArtists = sweetArtistsMapper.selectOne(Wrappers.lambdaQuery(SweetArtists.class).eq(SweetArtists::getArtistsId, artistsId).eq(SweetArtists::getStatus, 1)); KylinArtist kylinArtist = kylinArtistMapper.selectOne(
Wrappers.lambdaQuery(KylinArtist.class).eq(KylinArtist::getArtistId, artistsId)
);
SweetArtists sweetArtists = null;
if (kylinArtist != null) {
sweetArtists = SweetArtists.getNew();
sweetArtists.setArtistsId(kylinArtist.getArtistId());
sweetArtists.setName(kylinArtist.getArtistName());
sweetArtists.setPinyin(kylinArtist.getPinyin());
sweetArtists.setDescribes(kylinArtist.getIntroduction());
sweetArtists.setPicUrl(kylinArtist.getAvatarUrl());
sweetArtists.setStatus(kylinArtist.getStatus());
sweetArtists.setCreatedAt(kylinArtist.getCreatedAt());
sweetArtists.setUpdatdAt(kylinArtist.getUpdatedAt());
}
redisUtil.set(redisKey, sweetArtists); redisUtil.set(redisKey, sweetArtists);
return sweetArtists; return sweetArtists;
} }
......
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