xiaohaizhao před 1 týdnem
rodič
revize
20f45cd936

+ 0 - 1
dist/assets/index-01d524ab.css

@@ -1 +0,0 @@
-.file-list[data-v-284bfb25]{display:flex;flex-wrap:wrap}.item[data-v-284bfb25]{margin:10px}

+ 1 - 1
dist/index.html

@@ -5,7 +5,7 @@
     <link rel="icon" type="image/svg+xml" href="./vite.svg" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>营销宝</title>
-    <script type="module" crossorigin src="./assets/index-423e4909.js"></script>
+    <script type="module" crossorigin src="./assets/index-3561162a.js"></script>
     <link rel="modulepreload" crossorigin href="./assets/vue-8259307b.js">
     <link rel="modulepreload" crossorigin href="./assets/vue-router-55bfd43b.js">
     <link rel="stylesheet" href="./assets/index-77018d0f.css">

+ 74 - 5
src/MAR/assetsStore/detail/index.vue

@@ -53,7 +53,8 @@
         <photoWall v-else :attinfos="mainData.attinfos_pic" :fileType="mainData.type"
           :disabled="mainData.status == '发布'" pic ownertable="sat_sharematerial" :ownerid="mainData.sat_sharematerialid"
           :duplicateLinksMap="duplicateLinksMap"
-          @allUploadSuccess="mianData()" />
+          @uploadSuccess="handleUploadSuccess"
+          @allUploadSuccess="handleUploadAllSuccess" />
       </template>
       <template #tab1>
         <span class="normal-title" style="margin-bottom: 10px">基本信息</span>
@@ -94,6 +95,7 @@ import {
   defineComponent,
   onMounted,
   provide,
+  nextTick,
 } from "vue";
 import { Modal } from "ant-design-vue";
 import photoWall from "@/components/photoWall/index.vue";
@@ -105,7 +107,19 @@ let systemInfo = ref([]);
 let classList = ref([]);
 // 记录重复附件的映射:key 为 url,value 为同一 url 下的所有 linksid
 const duplicateLinksMap = ref({});
+// 待排序的新上传文件信息(上传成功后用于排序)
+const pendingUploadedItems = ref({ count: 0 });
 provide("classList", () => classList.value);
+
+// 处理上传成功事件,保存新上传的文件数量
+const handleUploadSuccess = ({ uploadedCount }) => {
+  pendingUploadedItems.value = { count: uploadedCount };
+};
+
+// 处理全部上传完成事件
+const handleUploadAllSuccess = async () => {
+  await mianData();
+};
 const mianData = async () => {
   const res = await Api.requested({
     id: "20240407094602",
@@ -150,9 +164,7 @@ const mianData = async () => {
       content: {
         linksids: excludedAttachments.map(item => item.linksid)
       }
-    }).then(() => {
-      console.log('Unlinked attachments:', excludedAttachments.map(item => item.linksid));
-    })
+    });
   }
 
   res.data.attinfos_pic = utils.fileList(res.data.attinfos.filter(v => v.usetype == 'file' || v.usetype == 'sat_sharematerial'));
@@ -196,8 +208,65 @@ const mianData = async () => {
     console.error('Error processing attinfos_pic:', error);
     res.data.attinfos_pic = [];
   }
+
+  // 如果有待排序的新上传文件,在这里执行排序
+  if (pendingUploadedItems.value.count > 0) {
+    // 获取今天的日期字符串(用于识别新上传的文件)
+    const today = new Date().toISOString().split('T')[0];
+
+    // 将 attinfos_pic 分为:老文件 + 新上传的文件
+    const existingItems = [];
+    const newUploadedItems = [];
+
+    res.data.attinfos_pic.forEach(item => {
+      // 判断是否是新上传的文件:createdate 是今天且 sequence=0
+      const createdateStr = item.createdate?.split(' ')[0]; // '2026-04-24'
+      const isNewUploaded = createdateStr === today && (item.sequence == 0 || item.sequence == '0');
+
+      if (isNewUploaded) {
+        newUploadedItems.push(item);
+      } else {
+        existingItems.push(item);
+      }
+    });
+
+    // 按 createdate 升序排序新上传的文件(越早创建的排在前面)
+    newUploadedItems.sort((a, b) => {
+      const dateA = new Date(a.createdate).getTime();
+      const dateB = new Date(b.createdate).getTime();
+      return dateA - dateB;
+    });
+
+    // 合并:老文件 + 排序后的新上传文件
+    const sortedList = [...existingItems, ...newUploadedItems];
+
+    // 生成排序参数
+    const sequencesorts = sortedList.map((item, index) => ({
+      ownerid: item.linksid,
+      sequence: index,
+    }));
+
+    if (sequencesorts.length > 0) {
+      await Api.requested({
+        id: "20221201134901",
+        content: {
+          ownertable: "sys_attachment_links",
+          sequencesorts,
+        },
+      });
+      // 直接使用本地已排好序的列表,不再重新获取数据
+      // 更新每个 item 的 sequence 值,避免 photoWall init 重复触发排序
+      sortedList.forEach((item, index) => {
+        item.sequence = index;
+      });
+      res.data.attinfos_pic = sortedList;
+    }
+
+    // 清空待排序计数
+    pendingUploadedItems.value = {};
+  }
+
   mainData.value = res.data;
-  console.log("mainData", mainData.value);
   changeDataStructure(res.data);
   // 富文本类型显示内容
   if (mainData.value.type == 3) {

+ 34 - 8
src/components/photoWall/index.vue

@@ -112,7 +112,7 @@ import Up from "@/api/upload";
 import utils from "@/utils/utils";
 import { DeleteOutlined, FileOutlined, FileTextOutlined, PlayCircleOutlined, LeftOutlined, RightOutlined } from "@ant-design/icons-vue";
 import { Empty } from "ant-design-vue";
-const emit = defineEmits(['allUploadSuccess']);
+const emit = defineEmits(['allUploadSuccess', 'uploadSuccess']);
 
 const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
 
@@ -410,6 +410,7 @@ function beforeUpload(file) {
 
   const uploadItem = reactive({
     uploadId: `${Date.now()}_${Math.random().toString(36).slice(2)}`,
+    uploadOrder: ++uploadOrderCounter, // 上传顺序号
     document: file.name,
     postfix: ext,
     fileType: inferFileType(ext, type),
@@ -434,8 +435,10 @@ function beforeUpload(file) {
   return false;
 }
 
-// 全局待上传计数,用于精确判断“所有文件都已处理完毕”
+// 全局待上传计数,用于精确判断"所有文件都已处理完毕"
 let pendingUploadCount = 0;
+// 全局上传顺序计数器,用于保证批量上传时的顺序
+let uploadOrderCounter = 0;
 
 // 实际上传逻辑
 async function performUpload(uploadItem, file) {
@@ -487,8 +490,19 @@ async function performUpload(uploadItem, file) {
     });
     if (feedback.code != 1) throw new Error(feedback.msg || '上传结果确认失败');
 
+    // 尝试从 uploadSuccess 返回的各种可能字段获取 linksid
+    const feedbackData = feedback.data || {};
+    if (feedbackData.linksid) {
+      uploadItem.linksid = feedbackData.linksid;
+    } else if (feedbackData.attachmentids && feedbackData.attachmentids[0]) {
+      uploadItem.attachmentid = feedbackData.attachmentids[0];
+      uploadItem.linksid = feedbackData.attachmentids[0];
+    } else if (feedbackData.attachmentid) {
+      uploadItem.linksid = feedbackData.attachmentid;
+    }
+
     if (uploadItem.ownertable != 'sat_sharematerial') {
-      const attachmentid = feedback.data.attachmentids[0];
+      const attachmentid = feedbackData.attachmentids ? feedbackData.attachmentids[0] : feedbackData.attachmentid;
       const binding = await Api.requested({
         id: 20240407135802,
         content: {
@@ -498,6 +512,10 @@ async function performUpload(uploadItem, file) {
         },
       });
       if (binding.code != 1) throw new Error(binding.msg || '附件绑定失败');
+      // 绑定接口也可能返回 linksid
+      if (binding.data && binding.data.linksid) {
+        uploadItem.linksid = binding.data.linksid;
+      }
     }
 
     uploadItem.status = 'done';
@@ -514,10 +532,20 @@ async function performUpload(uploadItem, file) {
 
 // 检查是否全部上传完成(等待所有 pending 任务结束,并给后端落库预留时间)
 let dowmTime = null;
-const checkAllUploadComplete = () => {
+const checkAllUploadComplete = async () => {
   clearTimeout(dowmTime);
-  dowmTime = setTimeout(() => {
+  dowmTime = setTimeout(async () => {
     if (pendingUploadCount === 0 && !list.value.some((v) => v.status === 'uploading')) {
+      const invalidLinksidItems = list.value.filter(v => v.linksid === -1 || !v.linksid);
+
+      if (invalidLinksidItems.length > 0) {
+        dowmTime = setTimeout(() => checkAllUploadComplete(), 1000);
+        return;
+      }
+
+      const uploadedCount = list.value.filter(v => v.status === 'done' && v.uploadOrder).length;
+
+      emit('uploadSuccess', { uploadedCount });
       emit('allUploadSuccess');
     }
   }, 1500);
@@ -570,9 +598,7 @@ function init(attinfos, pic = props.pic) {
     setSequenceAll();
   }
 }
-function addImage() {
-  console.log("添加图片");
-}
+function addImage() { }
 
 let linksid = ref(null);