Explorar el Código

内容发布支持选择单独素材,同步自动生成轮播组

lihao16 hace 5 meses
padre
commit
3d84629f60

+ 44 - 2
smsb-modules/smsb-source/src/main/java/com/inspur/source/service/impl/SmsbItemPushServiceImpl.java

@@ -141,8 +141,8 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
         // 根据pushId查询所有设备信息
         List<SmsbDeviceVo> deviceList = smsbDeviceMapper.queryDeviceVoByPushId(pushId);
         reviewVo.setDeviceList(deviceList);
-        // 根据pushId查询所有节目资源信息 轮播组+分屏组OLD
-        if (itemPushVo.getItemType() == 1L || itemPushVo.getItemType() == 2L) {
+        // 根据pushId查询所有节目资源信息 轮播组+分屏组OLD+素材
+        if (itemPushVo.getItemType() == 1L || itemPushVo.getItemType() == 2L || itemPushVo.getItemType() == 4L) {
             List<SmsbMinioDataVo> sourceList = itemFileRelMapper.selectMinioDataByPushId(pushId);
             reviewVo.setResourceList(sourceList);
         }
@@ -296,6 +296,10 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
         if (bo.getItemType() == 1 || bo.getItemType() == 2 || bo.getItemType() == 3) {
             addItemPushRel(bo.getId(), bo.getItemIds());
         }
+        // 素材发布,自动生成轮播组,再进行关联
+        if (bo.getItemType() == 4) {
+            createItemAndRel(bo);
+        }
         // 下架超过播单结束时间的旧播单
         updateOldItemPushToNoUse();
         // 提交审核
@@ -303,6 +307,44 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
         return R.ok();
     }
 
+    private void createItemAndRel(SmsbItemPushBo bo) {
+        // 1、生成一个新的smsb_item
+        SmsbItem smsbItem = new SmsbItem();
+        smsbItem.setItemName(bo.getName());
+        smsbItem.setItemType(1);
+        smsbItem.setSplitScreen(0L);
+        smsbItem.setSourceNum(bo.getItemIds().size());
+        smsbItem.setCreateUser(LoginHelper.getLoginUser().getNickname());
+        smsbItem.setDelFlag(0);
+        itemMapper.insert(smsbItem);
+        Long itemId = smsbItem.getId();
+        List<Long> itemIds = new ArrayList<>();
+        itemIds.add(itemId);
+        // 2、 smsb_item_file_rel batch insert
+        List<SmsbItemFileRel> itemFileRelList = new ArrayList<>();
+        List<SmsbMinioDataVo> minioDataVoList = smsbMinioDataMapper.selectVoByIds(bo.getItemIds());
+        if (!CollectionUtil.isEmpty(minioDataVoList)) {
+            int sort = 1;
+            for (SmsbMinioDataVo minioDataVo : minioDataVoList) {
+                SmsbItemFileRel itemFileRel = new SmsbItemFileRel();
+                itemFileRel.setItemId(itemId);
+                itemFileRel.setItemType(1);
+                itemFileRel.setSort(sort);
+                itemFileRel.setFileId(minioDataVo.getId());
+                itemFileRel.setScreenNum(0);
+                if (minioDataVo.getType().equals(1L)) {
+                    itemFileRel.setDuration(10);
+                }else {
+                    itemFileRel.setDuration(Integer.parseInt(minioDataVo.getDuration()));
+                }
+                sort++;
+                itemFileRelList.add(itemFileRel);
+            }
+            itemFileRelMapper.insertBatch(itemFileRelList);
+        }
+        addItemPushRel(bo.getId(), itemIds);
+    }
+
     private void updateOldItemPushToNoUse() {
         // 查询出所有上架且已超期的push ids
         List<SmsbItemPushVo> overTimeList = baseMapper.selectOverTimePushList();

+ 56 - 17
smsb-plus-ui/src/views/smsb/itemPush/index.vue

@@ -153,7 +153,7 @@
           </el-table>
         </el-col>
         <!--发布名称-->
-        <el-col :span="10" style="height: 100%; overflow: auto; padding-left: 10px">
+        <el-col :span="9" style="height: 100%; overflow: auto; padding-left: 10px">
           <el-form ref="itemPushFormRef" :model="form" :rules="rules" label-width="60px">
             <el-form-item label="名称" prop="name">
               <el-input v-model="form.name" placeholder="请输入名称" />
@@ -196,32 +196,49 @@
             <!-- Time Periods -->
             <el-form-item label="时间">
               <div v-for="(timePeriod, index) in form.timeRange" :key="index" class="time-period">
-                <el-time-picker v-model="timePeriod.start" placeholder="开始时间" format="HH:mm:ss" :disabled="false" />
+                <el-time-picker v-model="timePeriod.start" placeholder="开始时间" format="HH:mm:ss" style="width: 150px;" :disabled="false" />
                 <span>至</span>
-                <el-time-picker v-model="timePeriod.end" placeholder="结束时间" format="HH:mm:ss" :disabled="false" />
-                <el-button @click="removeTimePeriod(index)" type="danger" icon="Delete"></el-button>
+                <el-time-picker v-model="timePeriod.end" placeholder="结束时间" format="HH:mm:ss" style="width: 150px;"  :disabled="false" />
+                <el-button @click="removeTimePeriod(index)" type="danger" style="margin-left: 10px" icon="Delete"></el-button>
               </div>
               <el-button @click="addTimePeriod" type="primary">新增时间段</el-button>
             </el-form-item>
           </el-form>
         </el-col>
         <!--发布内容-->
-        <el-col :span="8" style="height: 100%; overflow: auto; padding-left: 10px">
-          <!--轮播组-->
+        <el-col :span="9" style="height: 100%; overflow: auto; padding-left: 10px">
+          <!--轮播组 -->
           <div v-if="form.itemType === 1 || form.itemType === 3">
-            <!--<el-table v-loading="loading" :data="itemList" @selection-change="handleSelectItem">
-                            <el-table-column type="selection" width="55" align="center" />-->
             <el-table v-loading="loading" :data="itemList" style="height: 520px">
-              <el-table-column label="ID" width="220" align="left" :show-overflow-tooltip="true">
+              <el-table-column label="ID" width="200" align="left" :show-overflow-tooltip="true">
                 <template #default="{ row }">
                   <el-radio v-model="selectedRowId" :label="row.id" @change="handleRadioChange(row)" />
                 </template>
               </el-table-column>
               <el-table-column label="名称" align="left" prop="itemName" :show-overflow-tooltip="true" />
 <!--              <el-table-column label="资源数量" align="center" prop="sourceNum" width="80" />-->
-              <!--
-                            <el-table-column label="创建人" align="left" prop="createUser" width="100" :show-overflow-tooltip="true" />
-              -->
+              <el-table-column label="创建人" align="center" prop="createUser" width="120" :show-overflow-tooltip="true" />
+            </el-table>
+          </div>
+          <!-- 素材 -->
+          <div v-if="form.itemType === 4 ">
+            <el-table v-loading="loading" :data="minioDataList" style="height: 520px" @selection-change="handleSelectionMinioChange">
+              <el-table-column type="selection" width="40" align="center" />
+              <el-table-column label="ID" prop="id" width="170" align="left" :show-overflow-tooltip="true" />
+              <el-table-column label="文件" align="left" prop="originalName"  :show-overflow-tooltip="true" />
+              <el-table-column label="预览" align="center" prop="screenshot" width="80">
+                <template #default="scope">
+                  <div v-if="scope.row.type === 1">
+                    <!-- 图片类型 -->
+                    <image-preview :src="scope.row.screenshot" style="width: 40px; height: 40px; cursor: pointer" />
+                  </div>
+                  <div v-else-if="scope.row.type === 2">
+                    <el-icon class="VideoPlay" @click="viewVideo(scope.row.screenshot)" size="40" style="cursor: pointer">
+                      <VideoPlay />
+                    </el-icon>
+                  </div>
+                </template>
+              </el-table-column>
             </el-table>
           </div>
         </el-col>
@@ -292,6 +309,11 @@
         </div>
       </template>
     </el-dialog>
+
+    <!-- 用于展示播放的视频 -->
+    <el-dialog v-model="videoDialogVisible">
+      <video width="100%" controls :src="videoUrl"></video>
+    </el-dialog>
   </div>
 </template>
 
@@ -313,6 +335,8 @@ import {ItemQuery, ItemVO} from '@/api/smsb/source/item_type';
 import {listItem} from '@/api/smsb/source/item';
 import {ItemPushDeviceVO} from '@/api/smsb/source/item_push_device_type';
 import {listItemPushDeviceV2, removeItemPushDevice} from '@/api/smsb/source/item_push_device';
+import {MinioDataVO} from "@/api/smsb/source/minioData_type";
+import {listMinioData} from "@/api/smsb/source/minioData";
 
 const {proxy} = getCurrentInstance() as ComponentInternalInstance;
 const {smsb_push_state, smsb_push_device_state, smsb_push_type, smsb_push_level,smsb_push_isuse} = toRefs<any>(
@@ -321,6 +345,7 @@ const {smsb_push_state, smsb_push_device_state, smsb_push_type, smsb_push_level,
 
 const itemPushList = ref<ItemPushVO[]>([]);
 const itemList = ref<ItemVO[]>([]);
+const minioDataList = ref<MinioDataVO[]>([]);
 const buttonLoading = ref(false);
 const loading = ref(true);
 const deviceLoading = ref(true);
@@ -344,10 +369,13 @@ const deviceList = ref<DeviceVO[]>([]);
 const pushDeviceList = ref<ItemPushDeviceVO[]>([]);
 // 存储选中行的唯一标识
 const selectedRowId = ref<number | null>(null);
+const selectedMinioDataIds = ref<[]>;
 const removeItemTag = ref(false);
 const removeButtonTag = ref(true);
 const queryFormRef = ref<ElFormInstance>();
 const itemPushFormRef = ref<ElFormInstance>();
+const videoUrl = ref('');
+const videoDialogVisible = ref(false);
 
 const dialog = reactive<DialogOption>({
   visible: false,
@@ -388,7 +416,7 @@ const data = reactive<PageData<ItemPushForm, ItemPushQuery>>({
 const dialogData = reactive<DialogPageData<DeviceQuery>>({
   dialogQueryParams: {
     pageNum: 1,
-    pageSize: 10,
+    pageSize: 10000,
     pushId: undefined
   }
 });
@@ -396,7 +424,7 @@ const dialogData = reactive<DialogPageData<DeviceQuery>>({
 const itemData = reactive<TransPageData<ItemQuery>>({
   transQueryParams: {
     pageNum: 1,
-    pageSize: 10,
+    pageSize: 10000,
     itemType: undefined
   }
 });
@@ -440,8 +468,16 @@ const getItemList = async () => {
     itemList.value = res.rows;
     itemTotal.value = res.total;
   }
+  if (form.value.itemType === 4) {
+    const res = await listMinioData(transQueryParams.value);
+    minioDataList.value = res.rows;
+  }
+};
+// 播放视频
+const viewVideo = (url: string) => {
+  videoUrl.value = url;
+  videoDialogVisible.value = true;
 };
-
 const addTimePeriod = () => {
   const now = new Date();
   now.setHours(0, 0, 0, 0);
@@ -459,6 +495,7 @@ const cancel = () => {
   reset();
   dialog.visible = false;
   deviceDialog.visible = false;
+  videoDialogVisible.value = false;
 };
 
 /** 表单重置 */
@@ -555,7 +592,10 @@ const handleSelectItem = (selection: ItemVO[]) => {
   itemIds.value = selection.map((item) => item.id);
   form.value.itemIds = itemIds.value;
 };
-
+const handleSelectionMinioChange = (selection: MinioDataVO[]) => {
+  selectedMinioDataIds.value = selection.map((item) => item.id);
+  form.value.itemIds = selectedMinioDataIds.value;
+}
 const handleRadioChange = (row: ItemVO) => {
   const itemIds = [row.id];
   form.value.itemIds = itemIds;
@@ -595,7 +635,6 @@ const submitForm = () => {
           console.log(resTime.data)
           await addItemPush(form.value).finally(() => (buttonLoading.value = false));
         } else {
-          console.log(form.value)
           await addItemPush(form.value).finally(() => (buttonLoading.value = false));
         }
       }