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

Commit 7cbf19f4 authored by wangyifan's avatar wangyifan

演出管理关联艺人

parent 087c6eb9
...@@ -48,10 +48,10 @@ CREATE TABLE `kylin_artist_performance` ( ...@@ -48,10 +48,10 @@ CREATE TABLE `kylin_artist_performance` (
`created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`mid`), PRIMARY KEY (`mid`),
UNIQUE KEY `uk_artist_performance` (`artist_id`,`performances_id`), UNIQUE KEY `uk_artist_performance` (`artist_id`,`performances_id`,`times_id`) USING BTREE COMMENT '艺人、演出、场次唯一索引',
KEY `idx_performances_id` (`performances_id`), KEY `idx_performances_id` (`performances_id`),
KEY `idx_artist_id` (`artist_id`) KEY `idx_artist_id` (`artist_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='艺人-演出关联表'; ) ENGINE=InnoDB AUTO_INCREMENT=83 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='艺人-演出关联表';
-- 艺人操作记录表 -- 艺人操作记录表
......
package com.liquidnet.client.admin.web.controller.zhengzai.kylin; package com.liquidnet.client.admin.web.controller.zhengzai.kylin;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.liquidnet.client.admin.common.annotation.Log; import com.liquidnet.client.admin.common.annotation.Log;
import com.liquidnet.client.admin.common.core.controller.BaseController; import com.liquidnet.client.admin.common.core.controller.BaseController;
import com.liquidnet.client.admin.common.core.domain.AjaxResult; import com.liquidnet.client.admin.common.core.domain.AjaxResult;
import com.liquidnet.client.admin.common.core.page.TableDataInfo; import com.liquidnet.client.admin.common.core.page.TableDataInfo;
import com.liquidnet.client.admin.common.enums.BusinessType; import com.liquidnet.client.admin.common.enums.BusinessType;
import com.liquidnet.service.kylin.dao.KylinArtistAssociationStatusDto;
import com.liquidnet.service.kylin.dao.KylinArtistDao; 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.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.ArtistVo; import com.liquidnet.service.kylin.dto.vo.ArtistVo;
import com.liquidnet.service.kylin.entity.KylinArtistPerformance;
import com.liquidnet.service.kylin.mapper.KylinArtistPerformanceMapper;
import com.liquidnet.service.kylin.service.admin.IKylinArtistService; import com.liquidnet.service.kylin.service.admin.IKylinArtistService;
import com.liquidnet.service.kylin.service.admin.IKylinArtistOperationLogService; import com.liquidnet.service.kylin.service.admin.IKylinArtistOperationLogService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -21,7 +26,10 @@ import org.springframework.stereotype.Controller; ...@@ -21,7 +26,10 @@ 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.List; import com.liquidnet.service.kylin.entity.KylinArtist;
import java.util.*;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
...@@ -47,13 +55,15 @@ public class KylinArtistController extends BaseController { ...@@ -47,13 +55,15 @@ public class KylinArtistController extends BaseController {
@Autowired @Autowired
private IKylinArtistOperationLogService operationLogService; private IKylinArtistOperationLogService operationLogService;
@Autowired
private KylinArtistPerformanceMapper artistPerformanceMapper;
@GetMapping("/create") @GetMapping("/create")
@RequiresPermissions("kylin:artist:create") @RequiresPermissions("kylin:artist:create")
public String create(ModelMap mmap) { public String create(ModelMap mmap) {
mmap.put("platformUrl", platformUrl); mmap.put("platformUrl", platformUrl);
return prefix + "/create"; return prefix + "/create";
} }
@GetMapping("/update/{artistId}") @GetMapping("/update/{artistId}")
@RequiresPermissions("kylin:artist:update") @RequiresPermissions("kylin:artist:update")
public String update(@PathVariable("artistId") String artistId, ModelMap mmap) { public String update(@PathVariable("artistId") String artistId, ModelMap mmap) {
...@@ -200,4 +210,167 @@ public class KylinArtistController extends BaseController { ...@@ -200,4 +210,167 @@ public class KylinArtistController extends BaseController {
operationLogService.getOperationLogs(artistId, pageNum, pageSize); operationLogService.getOperationLogs(artistId, pageNum, pageSize);
return getDataTable(result.getList()); return getDataTable(result.getList());
} }
/**
* 获取指定场次的艺人阵容
*/
@GetMapping("/getSessionArtists")
@ResponseBody
public AjaxResult getSessionArtists(String performancesId, String timesId) {
try {
if (performancesId == null || timesId == null) {
return error("参数不能为空");
}
// 查询该场次的艺人
List<KylinArtistPerformanceDao> artists = artistPerformanceMapper.selectArtistsByPerformanceAndTimes(
performancesId, timesId
);
return AjaxResult.success(artists);
} catch (Exception e) {
return error("获取艺人阵容失败: " + e.getMessage());
}
}
/**
* 更新艺人排序
*/
@Log(title = "更新演出艺人排序", businessType = BusinessType.UPDATE)
@PostMapping("/updateArtistOrder")
@ResponseBody
public AjaxResult updateArtistOrder(@RequestBody Map<String, Object> params) {
try {
String performancesId = (String) params.get("performancesId");
String timesId = (String) params.get("timesId");
List<Map<String, Object>> orderData = (List<Map<String, Object>>) params.get("orderData");
if (orderData == null || orderData.isEmpty()) {
return error("排序数据不能为空");
}
// 更新每个艺人的排序
for (Map<String, Object> item : orderData) {
Long mid = Long.valueOf(item.get("mid").toString());
Integer sort = Integer.valueOf(item.get("sort").toString());
KylinArtistPerformance entity = artistPerformanceMapper.selectById(mid);
if (entity != null) {
entity.setSort(sort);
artistPerformanceMapper.updateById(entity);
}
}
return success("排序更新成功");
} catch (Exception e) {
return error("更新排序失败: " + e.getMessage());
}
}
/**
* 删除演出艺人关联
*/
@Log(title = "删除演出艺人", businessType = BusinessType.DELETE)
@PostMapping("/deletePerformanceArtist")
@ResponseBody
public AjaxResult deletePerformanceArtist(Long mid, String performancesId, String timesId) {
try {
if (mid == null) {
return error("参数错误");
}
int result = artistPerformanceMapper.deleteById(mid);
if (result > 0) {
return success("删除成功");
} else {
return error("删除失败");
}
} catch (Exception e) {
return error("删除失败: " + e.getMessage());
}
}
/**
* 获取所有艺人以供关联
*/
@GetMapping("/getAllArtists")
@ResponseBody
public AjaxResult getAllArtists(String performancesId, String timesId, String keyword) {
try {
// 1. 获取所有艺人
List<KylinArtist> allArtists = kylinArtistService.list(new QueryWrapper<KylinArtist>()
.like(keyword != null && !keyword.isEmpty(), "artist_name", keyword)
.orderByDesc("created_at"));
// 2. 获取当前场次已关联的艺人,用 Map 保留各自的 sort 值
List<KylinArtistPerformanceDao> associatedArtists =
artistPerformanceMapper.selectArtistsByPerformanceAndTimes(performancesId, timesId);
// key: artistId value: 演出关联表中的 sort(越大越靠前)
Map<String, Integer> associatedSortMap = associatedArtists.stream()
.collect(Collectors.toMap(
KylinArtistPerformanceDao::getArtistId,
KylinArtistPerformanceDao::getSort,
(existing, replacement) -> existing // 重复 key 保留已有值
));
// 3. 组装返回结果
List<KylinArtistAssociationStatusDto> resultList = allArtists.stream().map(artist -> {
KylinArtistAssociationStatusDto dto = new KylinArtistAssociationStatusDto();
dto.setArtistId(artist.getArtistId());
dto.setArtistName(artist.getArtistName());
dto.setAvatarUrl(artist.getAvatarUrl());
boolean associated = associatedSortMap.containsKey(artist.getArtistId());
dto.setAssociated(associated);
// sort 取演出关联表的值;未关联的艺人 sort 置 0
dto.setSort(associated ? associatedSortMap.get(artist.getArtistId()) : 0);
return dto;
}).collect(Collectors.toList());
return AjaxResult.success(resultList);
} catch (Exception e) {
return error("获取艺人列表失败: " + e.getMessage());
}
}
/**
* 修改艺人关联
* @param payload
* @return
*/
@PostMapping("/updateArtistAssociations")
@ResponseBody
public AjaxResult updateArtistAssociations(@RequestBody Map<String, Object> payload) {
try {
String performancesId = (String) payload.get("performancesId");
String timesId = (String) payload.get("timesId");
List<Map<String, Object>> artistOrders = (List<Map<String, Object>>) payload.get("artistOrders");
// 1. 删除当前场次所有已关联的艺人
artistPerformanceMapper.delete(new QueryWrapper<KylinArtistPerformance>()
.eq("performances_id", performancesId)
.eq("times_id", timesId));
// 2. 按前端传入的顺序重新关联,sort 越大越靠前
if (artistOrders != null && !artistOrders.isEmpty()) {
for (Map<String, Object> item : artistOrders) {
String artistId = (String) item.get("artistId");
Integer sort = item.get("sort") != null
? Integer.valueOf(item.get("sort").toString()) : 0;
KylinArtistPerformance newAssociation = new KylinArtistPerformance();
newAssociation.setPerformancesId(performancesId);
newAssociation.setTimesId(timesId);
newAssociation.setArtistId(artistId);
newAssociation.setSort(sort);
artistPerformanceMapper.insert(newAssociation);
}
}
return success("关联更新成功");
} catch (Exception e) {
logger.error("error", e);
return error("更新关联失败: " + e.getMessage());
}
}
} }
...@@ -26,6 +26,7 @@ import com.liquidnet.service.kylin.dto.param.SysDamaiParam; ...@@ -26,6 +26,7 @@ import com.liquidnet.service.kylin.dto.param.SysDamaiParam;
import com.liquidnet.service.kylin.dto.vo.admin.*; import com.liquidnet.service.kylin.dto.vo.admin.*;
import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformanceMisVo; import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformanceMisVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformancesVo; import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformancesVo;
import com.liquidnet.service.kylin.dto.vo.partner.TicketTimesTicketCreatePartnerVo;
import com.liquidnet.service.kylin.entity.KylinOrderImport; import com.liquidnet.service.kylin.entity.KylinOrderImport;
import com.liquidnet.service.kylin.service.admin.IKylinPerformancesAdminService; import com.liquidnet.service.kylin.service.admin.IKylinPerformancesAdminService;
import com.liquidnet.service.kylin.service.other.DamaiService; import com.liquidnet.service.kylin.service.other.DamaiService;
...@@ -258,6 +259,38 @@ public class KylinPerformancesController extends BaseController { ...@@ -258,6 +259,38 @@ public class KylinPerformancesController extends BaseController {
return prefix + "/subscribe"; return prefix + "/subscribe";
} }
/**
* 演出阵容页面
*/
@GetMapping(value = "/artistLineup/{performancesId}")
public String artistLineup(@PathVariable("performancesId") String performancesId, ModelMap mmap) {
try {
// 获取演出信息
KylinPerformanceMisVo performance = kylinPerformancesService.performanceDetails(performancesId);
if (performance == null) {
mmap.put("errorMsg", "演出不存在");
return prefix + "/artistLineup";
}
// 将场次数据转换为JSON
List<TicketTimesTicketCreatePartnerVo> ticketTimes = performance.getTicketTimes();
String ticketTimesJson = "[]";
if (ticketTimes != null && !ticketTimes.isEmpty()) {
com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper();
ticketTimesJson = mapper.writeValueAsString(ticketTimes);
}
mmap.put("performancesId", performancesId);
mmap.put("performanceTitle", performance.getTitle());
mmap.put("ticketTimesJson", ticketTimesJson);
return prefix + "/artistLineup";
} catch (Exception e) {
mmap.put("errorMsg", "加载演出阵容失败: " + e.getMessage());
return prefix + "/artistLineup";
}
}
@Log(title = "预约统计:导出列表") @Log(title = "预约统计:导出列表")
@PostMapping("/subscribe/export") @PostMapping("/subscribe/export")
@ResponseBody @ResponseBody
......
...@@ -43,6 +43,8 @@ ...@@ -43,6 +43,8 @@
</li> </li>
<li id="li-tab-11"><a data-toggle="tab" href="#tab-11" aria-expanded="false" onclick="subscribeInfo()">预约统计</a> <li id="li-tab-11"><a data-toggle="tab" href="#tab-11" aria-expanded="false" onclick="subscribeInfo()">预约统计</a>
</li> </li>
<li id="li-tab-12"><a data-toggle="tab" href="#tab-12" aria-expanded="false" onclick="artistLineupInfo()">演出阵容</a>
</li>
</ul> </ul>
<div class="tab-content"> <div class="tab-content">
<div id="tab-1" class="tab-pane"> <div id="tab-1" class="tab-pane">
...@@ -364,6 +366,13 @@ ...@@ -364,6 +366,13 @@
height=800px frameborder=0></iframe> height=800px frameborder=0></iframe>
</div> </div>
</div> </div>
<div id="tab-12" class="tab-pane">
<div class="panel-body">
<iframe id="artist_lineup_iframe" name="artist_lineup_iframe" marginwidth=0 marginheight=0
width=100%
height=800px frameborder=0></iframe>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -563,6 +572,11 @@ ...@@ -563,6 +572,11 @@
document.getElementById("subscribe_iframe").src = "../subscribe/" + '[[${kylinPerformanceMisVo.performancesId}]]'.replaceAll("\"", ""); document.getElementById("subscribe_iframe").src = "../subscribe/" + '[[${kylinPerformanceMisVo.performancesId}]]'.replaceAll("\"", "");
} }
//演出阵容
function artistLineupInfo() {
document.getElementById("artist_lineup_iframe").src = "../artistLineup/" + '[[${kylinPerformanceMisVo.performancesId}]]'.replaceAll("\"", "");
}
$("#tab-nav-1").bind("click", function () { $("#tab-nav-1").bind("click", function () {
$("#tab_iframe_1").attr("src", prefix + "/performanceStatic/" + '[[${kylinPerformanceMisVo.performancesId}]]'.replaceAll("\"", "")); $("#tab_iframe_1").attr("src", prefix + "/performanceStatic/" + '[[${kylinPerformanceMisVo.performancesId}]]'.replaceAll("\"", ""));
}); });
......
package com.liquidnet.service.kylin.dao;
import lombok.Data;
@Data
public class KylinArtistAssociationStatusDto {
/**
* 艺人ID
*/
private String artistId;
/**
* 艺人名称
*/
private String artistName;
/**
* 艺人头像地址
*/
private String avatarUrl;
/**
* 是否关联
*/
private boolean isAssociated;
/**
* 排序 越大越靠前
*/
private int sort;
}
...@@ -11,6 +11,26 @@ public class KylinArtistPerformanceDao implements Serializable { ...@@ -11,6 +11,26 @@ public class KylinArtistPerformanceDao implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/**
* 关联记录ID
*/
private Long mid;
/**
* 艺人ID
*/
private String artistId;
/**
* 艺人名称
*/
private String artistName;
/**
* 艺人头像
*/
private String avatarUrl;
/** /**
* 演出ID * 演出ID
*/ */
...@@ -36,4 +56,9 @@ public class KylinArtistPerformanceDao implements Serializable { ...@@ -36,4 +56,9 @@ public class KylinArtistPerformanceDao implements Serializable {
*/ */
private String timeTitle; private String timeTitle;
/**
* 排序权重
*/
private Integer sort;
} }
...@@ -17,4 +17,13 @@ public interface KylinArtistPerformanceMapper extends BaseMapper<KylinArtistPerf ...@@ -17,4 +17,13 @@ public interface KylinArtistPerformanceMapper extends BaseMapper<KylinArtistPerf
*/ */
List<KylinArtistPerformanceDao> selectPerformanceDaoByArtistId(@Param("artistId") String artistId); List<KylinArtistPerformanceDao> selectPerformanceDaoByArtistId(@Param("artistId") String artistId);
/**
* 根据演出ID和场次ID查询艺人阵容
*
* @param performancesId 演出ID
* @param timesId 场次ID
* @return 艺人阵容列表
*/
List<KylinArtistPerformanceDao> selectArtistsByPerformanceAndTimes(@Param("performancesId") String performancesId, @Param("timesId") String timesId);
} }
...@@ -4,12 +4,18 @@ ...@@ -4,12 +4,18 @@
<select id="selectPerformanceDaoByArtistId" parameterType="java.lang.String" resultType="com.liquidnet.service.kylin.dao.KylinArtistPerformanceDao"> <select id="selectPerformanceDaoByArtistId" parameterType="java.lang.String" resultType="com.liquidnet.service.kylin.dao.KylinArtistPerformanceDao">
SELECT SELECT
ap.mid,
ap.artist_id as artistId,
a.artist_name as artistName,
a.avatar_url as avatarUrl,
p.performances_id as performanceId, p.performances_id as performanceId,
p.title, p.title,
DATE_FORMAT(p.time_start, '%Y-%m-%d %H:%i:%s') as timeStart, DATE_FORMAT(p.time_start, '%Y-%m-%d %H:%i:%s') as timeStart,
t.ticket_times_id as timesId, t.ticket_times_id as timesId,
t.title as timeTitle t.title as timeTitle,
ap.sort
FROM kylin_artist_performance ap FROM kylin_artist_performance ap
INNER JOIN kylin_artist a ON ap.artist_id = a.artist_id
INNER JOIN kylin_performances p ON ap.performances_id = p.performances_id INNER JOIN kylin_performances p ON ap.performances_id = p.performances_id
INNER JOIN kylin_ticket_times t ON ap.times_id = t.ticket_times_id INNER JOIN kylin_ticket_times t ON ap.times_id = t.ticket_times_id
WHERE ap.artist_id = #{artistId} WHERE ap.artist_id = #{artistId}
...@@ -24,4 +30,28 @@ ...@@ -24,4 +30,28 @@
AND status = 1 AND status = 1
</select> </select>
<!-- 根据演出ID和场次ID查询艺人阵容 -->
<select id="selectArtistsByPerformanceAndTimes" resultType="com.liquidnet.service.kylin.dao.KylinArtistPerformanceDao">
SELECT
ap.mid,
ap.artist_id as artistId,
ap.times_id as timesId,
ap.sort,
a.artist_name as artistName,
a.avatar_url as avatarUrl,
p.performances_id as performanceId,
p.title,
DATE_FORMAT(p.time_start, '%Y-%m-%d %H:%i:%s') as timeStart,
t.title as timeTitle
FROM kylin_artist_performance ap
INNER JOIN kylin_artist a ON ap.artist_id = a.artist_id
INNER JOIN kylin_performances p ON ap.performances_id = p.performances_id
INNER JOIN kylin_ticket_times t ON ap.times_id = t.ticket_times_id
WHERE ap.performances_id = #{performancesId}
<if test="timesId != null and timesId != ''">
AND ap.times_id = #{timesId}
</if>
ORDER BY ap.sort DESC, ap.created_at ASC
</select>
</mapper> </mapper>
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