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

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

Merge branch 'jxl-guanlianyiren-bug' into 'master'

fix(admin): 修复关联艺人时老自增 artistId 无法选中

See merge request !441
parents 38ca5494 6aace560
......@@ -688,6 +688,15 @@
let selectedArtists = []; // 当前已选艺人列表
let currentModalArtists = []; // 当前搜索结果中的艺人列表
/** 艺人 ID 统一成字符串。jQuery .data() 会把 191 这类短数字转成 Number,导致 === 匹配失败 */
function artistIdStr(id) {
return id == null ? '' : String(id);
}
function sameArtistId(a, b) {
return artistIdStr(a) === artistIdStr(b);
}
function openAssociateArtistModal(timesId) {
$('#associateArtistModal').data('timesId', timesId);
// 重置状态
......@@ -734,7 +743,7 @@
selectedArtists = (response.data || [])
.map(function (a) {
return {
artistId: a.artistId,
artistId: artistIdStr(a.artistId),
artistName: a.artistName,
avatarUrl: a.avatarUrl,
sort: a.sort || 0
......@@ -804,8 +813,9 @@
let html = '';
artists.forEach(function (artist) {
const isSelected = selectedArtists.some(a => a.artistId === artist.artistId);
html += '<div class="modal-artist-item" data-artist-id="' + artist.artistId + '">';
const artistId = artistIdStr(artist.artistId);
const isSelected = selectedArtists.some(a => sameArtistId(a.artistId, artistId));
html += '<div class="modal-artist-item" data-artist-id="' + artistId + '">';
html += '<img src="' + (artist.avatarUrl || '/img/profile.jpg') + '" class="modal-artist-avatar" onerror="this.src=\'/img/profile.jpg\'">';
html += '<div class="modal-artist-name">' + escapeHtml(artist.artistName) + '</div>';
html += '<div class="artist-radio-btn' + (isSelected ? ' selected' : '') + '"></div>';
......@@ -817,22 +827,22 @@
// 点击整行切换选中状态
listContainer.find('.modal-artist-item').on('click', function () {
const artistId = $(this).data('artist-id');
const artist = currentModalArtists.find(a => a.artistId === artistId);
const artistId = artistIdStr($(this).attr('data-artist-id'));
const artist = currentModalArtists.find(a => sameArtistId(a.artistId, artistId));
if (!artist) return;
const radioBtn = $(this).find('.artist-radio-btn');
const isSelected = selectedArtists.some(a => a.artistId === artistId);
const isSelected = selectedArtists.some(a => sameArtistId(a.artistId, artistId));
if (isSelected) {
// 取消选中
selectedArtists = selectedArtists.filter(a => a.artistId !== artistId);
selectedArtists = selectedArtists.filter(a => !sameArtistId(a.artistId, artistId));
radioBtn.removeClass('selected');
} else {
// 选中,防止重复
if (!selectedArtists.some(a => a.artistId === artistId)) {
if (!selectedArtists.some(a => sameArtistId(a.artistId, artistId))) {
selectedArtists.push({
artistId: artist.artistId,
artistId: artistId,
artistName: artist.artistName,
avatarUrl: artist.avatarUrl
});
......@@ -856,7 +866,7 @@
let html = '';
selectedArtists.forEach(function (artist) {
html += '<div class="selected-artist-card" draggable="true" data-artist-id="' + artist.artistId + '">';
html += '<div class="selected-artist-card" draggable="true" data-artist-id="' + artistIdStr(artist.artistId) + '">';
html += '<img src="' + (artist.avatarUrl || '/img/profile.jpg') + '" class="selected-artist-avatar" onerror="this.src=\'/img/profile.jpg\'">';
html += '<div class="selected-artist-name">' + escapeHtml(artist.artistName) + '</div>';
html += '<div class="remove-selected-artist" title="移除">&times;</div>';
......@@ -870,8 +880,8 @@
// 点击"已选艺人"区域的 × 移除艺人
$(document).on('click', '.remove-selected-artist', function () {
const artistId = $(this).closest('.selected-artist-card').data('artist-id');
selectedArtists = selectedArtists.filter(a => a.artistId !== artistId);
const artistId = artistIdStr($(this).closest('.selected-artist-card').attr('data-artist-id'));
selectedArtists = selectedArtists.filter(a => !sameArtistId(a.artistId, artistId));
updateSelectedArtistsView();
// 同步取消搜索列表中对应的选中状态
const item = $('#modal-artist-list .modal-artist-item[data-artist-id="' + artistId + '"]');
......@@ -962,7 +972,7 @@
// 根据当前显示顺序计算 sort:越靠前的 sort 值越大
const total = selectedArtists.length;
const artistOrders = selectedArtists.map((a, index) => ({
artistId: a.artistId,
artistId: artistIdStr(a.artistId),
sort: total - index // 第 0 位 → sort 最大
}));
......
......@@ -144,7 +144,7 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe
if (artistOrders != null && !artistOrders.isEmpty()) {
for (Map<String, Object> item : artistOrders) {
String artistId = (String) item.get("artistId");
String artistId = toArtistId(item.get("artistId"));
if (artistId != null) {
affectedArtistIds.add(artistId);
}
......@@ -166,7 +166,10 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe
// 2. 按前端传入的顺序重新关联,sort 越大越靠前
if (artistOrders != null && !artistOrders.isEmpty()) {
for (Map<String, Object> item : artistOrders) {
String artistId = (String) item.get("artistId");
String artistId = toArtistId(item.get("artistId"));
if (artistId == null) {
continue;
}
Integer sort = item.get("sort") != null
? Integer.parseInt(item.get("sort").toString()) : 0;
......@@ -197,4 +200,13 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe
}
return true;
}
/** 兼容老自增 ID(JSON 可能是 Number)与雪花 ID(String) */
private String toArtistId(Object artistId) {
if (artistId == null) {
return null;
}
String id = artistId.toString().trim();
return id.isEmpty() ? null : id;
}
}
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