Переглянути джерело

✨feat: Implement carousel group file order update

Shinohara Haruna 6 місяців тому
батько
коміт
670eb5c98a

+ 1 - 0
smsb-modules/smsb-source/src/main/java/com/inspur/source/controller/SmsbItemController.java

@@ -113,6 +113,7 @@ public class SmsbItemController extends BaseController {
     @RepeatSubmit()
     @PutMapping()
     public R<Void> edit(@Validated(EditGroup.class) @RequestBody SmsbItemBo bo) {
+        System.out.println("Edit controller got SmsbItemBo: " + bo);
         return toAjax(smsbItemService.updateByBo(bo));
     }
 

+ 6 - 0
smsb-modules/smsb-source/src/main/java/com/inspur/source/domain/bo/SmsbItemBo.java

@@ -22,6 +22,12 @@ import java.util.List;
 @AutoMapper(target = SmsbItem.class, reverseConvertGenerate = false)
 public class SmsbItemBo extends BaseEntity {
 
+    /**
+     * 资源ID列表(轮播组顺序即此顺序)
+     */
+    private List<Long> fileIdList;
+
+
     private Long id;
 
     /**

+ 1 - 1
smsb-modules/smsb-source/src/main/java/com/inspur/source/mapper/SmsbItemMapper.java

@@ -37,5 +37,5 @@ public interface SmsbItemMapper extends BaseMapperPlus<SmsbItem, SmsbItemVo> {
      */
     List<SmsbItemPushVo> selectRunItemPushVoById(@Param("itemId") Long itemId);
 
-    List<EditHistoryVo> selectEditHistory(@Param("itemId") String itemId);
+    List<EditHistoryVo> selectEditHistory(@Param("id") String id);
 }

+ 32 - 1
smsb-modules/smsb-source/src/main/java/com/inspur/source/service/impl/SmsbItemServiceImpl.java

@@ -234,8 +234,39 @@ public class SmsbItemServiceImpl implements ISmsbItemService {
     @Override
     public Boolean updateByBo(SmsbItemBo bo) {
         SmsbItem update = MapstructUtils.convert(bo, SmsbItem.class);
+        System.out.println("Update service got update(SmsbItem): " + update);
         validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
+        boolean result = baseMapper.updateById(update) > 0;
+
+        // 轮播组资源顺序更新处理
+        if (bo.getFileIdList() != null) {
+            System.out.println("[updateByBo] fileIdList: " + bo.getFileIdList());
+            // 先删除老的关联
+            int delCount = itemFileRelMapper.delete(new LambdaQueryWrapper<SmsbItemFileRel>().eq(SmsbItemFileRel::getItemId, bo.getId()));
+            System.out.println("[updateByBo] 删除旧关联数: " + delCount);
+            // 插入新的关联,按顺序
+            List<SmsbItemFileRel> rels = new ArrayList<>();
+            int idx = 1;
+            for (Long fileId : bo.getFileIdList()) {
+                SmsbItemFileRel rel = new SmsbItemFileRel();
+                rel.setItemId(bo.getId());
+                rel.setFileId(fileId);
+                rel.setSort(idx++); // 顺序
+                rel.setItemType(update.getItemType());
+                rels.add(rel);
+            }
+            if (!rels.isEmpty()) {
+                boolean insertResult = itemFileRelMapper.insertBatch(rels);
+                System.out.println("[updateByBo] 新增关联状态: " + insertResult);
+            }
+            // 更新资源数量
+            SmsbItem updateItem = new SmsbItem();
+            updateItem.setId(bo.getId());
+            updateItem.setSourceNum(rels.size());
+            baseMapper.updateById(updateItem);
+            System.out.println("[updateByBo] 资源数量已更新: " + rels.size());
+        }
+        return result;
     }
 
     @Override

+ 1 - 1
smsb-modules/smsb-source/src/main/resources/mapper/SmsbItemMapper.xml

@@ -35,7 +35,7 @@
         SELECT oper_name, oper_param, MIN(oper_time) as oper_time
         FROM sys_oper_log
         WHERE oper_url = '/source/item'
-          AND JSON_CONTAINS(oper_param, CONCAT('"', #{itemId}, '"'), '$.itemId')
+          AND JSON_CONTAINS(oper_param, CONCAT('"', #{id}, '"'), '$.id')
         GROUP BY oper_name, oper_param
         ORDER BY oper_time;
     </select>

+ 74 - 20
smsb-plus-ui/src/views/smsb/item/index.vue

@@ -342,7 +342,26 @@ function onShowEditHistory(row: ItemVO) {
   editHistoryDialog.type = type;
   getEditHistory(row.id, type).then((res) => {
     console.log('编辑历史数据:', res.data);
-    editHistoryDialog.list = res.data || [];
+    let list = res.data || [];
+    if (type === 1) {
+      // 轮播组过滤掉无selectedFiles的异常数据(第一条保留)
+      list = list.filter((item: any, idx: number, arr: any[]) => {
+        if (idx === 0) return true;
+        try {
+          const curr = JSON.parse(item.operParam || '{}');
+          const prev = idx > 0 ? JSON.parse(arr[idx - 1].operParam || '{}') : {};
+          // 没有selectedFiles字段直接过滤
+          if (!Array.isArray(curr.selectedFiles)) return false;
+          // diff结果为无变化也过滤
+          const diff = diffSelectedFiles({ selectedFiles: prev.selectedFiles || [] }, { selectedFiles: curr.selectedFiles || [] }, 'selectedFiles');
+          return diff && diff !== '无变化';
+        } catch {
+          return false;
+        }
+      });
+    }
+    editHistoryDialog.list = list;
+    console.log('编辑历史数据处理后:', list);
   });
 }
 
@@ -363,11 +382,42 @@ function diffSelectedFiles(prev: any, curr: any, key: string) {
 }
 
 function renderOperParam(row: EditHistoryVo, index: number, list: EditHistoryVo[], type: 1 | 2) {
+  // 轮播组和分屏组都采用diff方式展示
+  let curr, prev;
+  // 轮播组只处理selectedFiles字段,分屏组处理每一屏
   if (type === 1) {
-    return `<span style='white-space:pre-line;'>${row.operParam}</span>`;
+    try {
+      curr = JSON.parse(row.operParam || '{}');
+    } catch {
+      curr = {};
+    }
+    try {
+      prev = index > 0 ? JSON.parse(list[index - 1].operParam || '{}') : {};
+    } catch {
+      prev = {};
+    }
+    // 只要没有selectedFiles字段就视为异常数据,不显示
+    if (!Array.isArray(curr.selectedFiles)) {
+      return '';
+    }
+    const currFiles = curr.selectedFiles || [];
+    const prevFiles = prev.selectedFiles || [];
+    if (index === 0) {
+      // 第一条记录,全部按“创建”显示
+      return `<span style='color:#409EFF;font-weight:bold;'>创建</span>`;
+    }
+    const diff = diffSelectedFiles({ selectedFiles: prevFiles }, { selectedFiles: currFiles }, 'selectedFiles');
+    if (diff && diff !== '无变化') {
+      let styled = diff
+        .replace(/新增:/g, "<span style='color:#67C23A;font-weight:bold;'>新增:</span>")
+        .replace(/减少:/g, "<span style='color:#F56C6C;font-weight:bold;'>减少:</span>");
+      return `<span style='font-weight:bold;'>文件</span>:${styled}`;
+    }
+    return '';
   }
-  // 分屏组
-  let curr, prev;
+  // 分屏组diff逻辑修正,严格一一对应
+  const screenFields = ['selectedFiles1', 'selectedFiles2', 'selectedFiles3', 'selectedFiles4'];
+  const screenNames = ['第一屏', '第二屏', '第三屏', '第四屏'];
   try {
     curr = JSON.parse(row.operParam || '{}');
   } catch {
@@ -378,25 +428,23 @@ function renderOperParam(row: EditHistoryVo, index: number, list: EditHistoryVo[
   } catch {
     prev = {};
   }
-  const screenNames = ['第一屏', '第二屏', '第三屏', '第四屏'];
   if (index === 0) {
-    // 第一条记录,全部按“创建”显示
+    // 第一条记录,固定显示“创建”
     return `<span style='color:#409EFF;font-weight:bold;'>创建</span>`;
   }
-  const keys = ['selectedFiles1', 'selectedFiles2', 'selectedFiles3', 'selectedFiles4'];
-  const diffs = keys
-    .map((key, idx) => {
-      const diff = diffSelectedFiles(prev, curr, key);
-      if (diff && diff !== '无变化') {
-        // 仅“新增”“减少”文字加色,文件名不加色
-        let styled = diff
-          .replace(/新增:/g, "<span style='color:#67C23A;font-weight:bold;'>新增:</span>")
-          .replace(/减少:/g, "<span style='color:#F56C6C;font-weight:bold;'>减少:</span>");
-        return `<span style='font-weight:bold;'>${screenNames[idx]}</span>:${styled}`;
-      }
-      return '';
-    })
-    .filter(Boolean);
+  const diffs = screenFields.map((field, idx) => {
+    const currFiles = curr[field] || [];
+    const prevFiles = prev[field] || [];
+    if (!Array.isArray(currFiles) && !Array.isArray(prevFiles)) return '';
+    const diff = diffSelectedFiles({ selectedFiles: prevFiles }, { selectedFiles: currFiles }, 'selectedFiles');
+    if (diff && diff !== '无变化') {
+      let styled = diff
+        .replace(/新增:/g, "<span style='color:#67C23A;font-weight:bold;'>新增:</span>")
+        .replace(/减少:/g, "<span style='color:#F56C6C;font-weight:bold;'>减少:</span>");
+      return `<span style='font-weight:bold;'>${screenNames[idx]}</span>:${styled}`;
+    }
+    return '';
+  }).filter(Boolean);
   return diffs.length ? diffs.join('<br/>') : '';
 }
 
@@ -663,10 +711,16 @@ const submitForm = async () => {
   buttonLoading.value = true;
   try {
     if (form.value.id) {
+      if (form.value.itemType === 1) {
+        form.value.selectedFiles = selectedFiles.value;
+        form.value.fileIdList = selectedFiles.value.map(f => f.id);
+        form.value.itemName = itemName.value;
+      }
       await updateItem(form.value);
     } else {
       if (form.value.itemType === 1) {
         form.value.selectedFiles = selectedFiles.value;
+        form.value.fileIdList = selectedFiles.value.map(f => f.id);
         form.value.itemName = itemName.value;
       }
       await addItem(form.value);