Browse Source

增加删除分组内节目

licailing 4 years ago
parent
commit
d8796a18e4

+ 5 - 0
src/main/java/com/izouma/wenlvju/domain/performance/Arrange.java

@@ -12,6 +12,7 @@ import org.hibernate.annotations.Where;
 
 import javax.persistence.Convert;
 import javax.persistence.Entity;
+import javax.persistence.Transient;
 import java.time.LocalDate;
 import java.time.LocalTime;
 import java.util.List;
@@ -26,6 +27,8 @@ import java.util.List;
 public class Arrange extends BaseEntity {
     private Long performanceId;
 
+    private String name;
+
     @ApiModelProperty(value = "活动地点")
     private String address;
 
@@ -53,4 +56,6 @@ public class Arrange extends BaseEntity {
     @ApiModelProperty(value = "联系电话")
     private String phone;
 
+    @Transient
+    private List<String> specialtyName;
 }

+ 14 - 0
src/main/java/com/izouma/wenlvju/domain/performance/Programme.java

@@ -16,6 +16,7 @@ import lombok.NoArgsConstructor;
 import org.hibernate.annotations.Where;
 
 import javax.persistence.*;
+import java.time.LocalDateTime;
 
 @Data
 @AllArgsConstructor
@@ -68,6 +69,19 @@ public class Programme extends BaseEntity {
     @ApiModelProperty(value = "节目视频")
     private VideoObject video;
 
+    @ApiModelProperty(value = "分组id")
+    private Long arrangeId;
+
+    /*
+    初始状态为0,已初编排入分组为1,确定分组为2
+    */
+    private int status;
+
+    /*
+    表演时间
+     */
+//    private LocalDateTime showTime;
+
     public Programme(ProgrammeDTO dto) {
         BeanUtil.copyProperties(dto, this);
     }

+ 2 - 0
src/main/java/com/izouma/wenlvju/repo/ArtTypeRepo.java

@@ -16,4 +16,6 @@ public interface ArtTypeRepo extends JpaRepository<ArtType, Long>, JpaSpecificat
     void softDelete(Long id);
 
     List<ArtType> findAllByParentIsNull();
+
+    List<ArtType> findAllByParentIn(Iterable<Long> parent);
 }

+ 10 - 0
src/main/java/com/izouma/wenlvju/repo/performance/ArrangeRepo.java

@@ -13,4 +13,14 @@ public interface ArrangeRepo extends JpaRepository<Arrange, Long>, JpaSpecificat
     @Modifying
     @Transactional
     void softDelete(Long id);
+
+    @Query("update Arrange t set t.quantity = t.quantity + 1 where t.id = ?1")
+    @Modifying
+    @Transactional
+    void plusQuantity(Long id);
+
+    @Query("update Arrange t set t.quantity = t.quantity - 1 where t.id = ?1")
+    @Modifying
+    @Transactional
+    void minusQuantity(Long id);
 }

+ 8 - 0
src/main/java/com/izouma/wenlvju/repo/performance/ProgrammeRepo.java

@@ -7,6 +7,8 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.time.LocalDateTime;
+import java.util.List;
 
 public interface ProgrammeRepo extends JpaRepository<Programme, Long>, JpaSpecificationExecutor<Programme> {
     @Query("update Programme t set t.del = true where t.id = ?1")
@@ -15,4 +17,10 @@ public interface ProgrammeRepo extends JpaRepository<Programme, Long>, JpaSpecif
     void softDelete(Long id);
 
     long countAllByPerformanceId(Long performanceId);
+
+    List<Programme> findAllByPerformanceIdAndStatus(Long performanceId, int status);
+
+//    List<Programme> findAllByArrangeIdAndShowTimeAfter(Long arrangeId, LocalDateTime showTime);
+
+//    Programme findFirstByArrangeIdOrderByShowTimeDesc(Long arrangeId);
 }

+ 14 - 0
src/main/java/com/izouma/wenlvju/service/ArtTypeService.java

@@ -1,5 +1,6 @@
 package com.izouma.wenlvju.service;
 
+import cn.hutool.core.collection.CollUtil;
 import com.izouma.wenlvju.domain.ArtType;
 import com.izouma.wenlvju.dto.PageQuery;
 import com.izouma.wenlvju.repo.ArtTypeRepo;
@@ -59,4 +60,17 @@ public class ArtTypeService {
                 .map(ArtType::getId)
                 .collect(Collectors.toList());
     }
+
+    public List<Long> getChild(List<Long> id, List<Long> result) {
+        List<Long> list = artTypeRepo.findAllByParentIn(id)
+                .stream()
+                .map(ArtType::getId)
+                .collect(Collectors.toList());
+        if (CollUtil.isNotEmpty(list)) {
+            result.addAll(list);
+            this.getChild(list, result);
+
+        }
+        return result;
+    }
 }

+ 39 - 3
src/main/java/com/izouma/wenlvju/service/performance/ArrangeService.java

@@ -1,8 +1,10 @@
 package com.izouma.wenlvju.service.performance;
 
+import com.izouma.wenlvju.domain.ArtType;
 import com.izouma.wenlvju.domain.performance.Arrange;
 import com.izouma.wenlvju.dto.ArrangeDTO;
 import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.repo.ArtTypeRepo;
 import com.izouma.wenlvju.repo.performance.ArrangeRepo;
 import com.izouma.wenlvju.utils.JpaUtils;
 import lombok.AllArgsConstructor;
@@ -13,15 +15,30 @@ import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalTime;
 import java.time.Period;
+import java.time.format.DateTimeFormatter;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
 @AllArgsConstructor
 public class ArrangeService {
 
-    private ArrangeRepo arrangeRepo;
+    private ArrangeRepo      arrangeRepo;
+    private ProgrammeService programmeService;
+    private ArtTypeRepo      artTypeRepo;
 
     public Page<Arrange> all(PageQuery pageQuery) {
-        return arrangeRepo.findAll(JpaUtils.toSpecification(pageQuery, Arrange.class), JpaUtils.toPageRequest(pageQuery));
+        Map<Long, String> artMap = artTypeRepo.findAll()
+                .stream()
+                .collect(Collectors.toMap(ArtType::getId, ArtType::getName));
+        return arrangeRepo.findAll(JpaUtils.toSpecification(pageQuery, Arrange.class), JpaUtils.toPageRequest(pageQuery))
+                .map(arrange -> {
+                    arrange.setSpecialtyName(arrange.getSpecialtyId()
+                            .stream()
+                            .map(artMap::get)
+                            .collect(Collectors.toList()));
+                    return arrange;
+                });
     }
 
     /*
@@ -45,6 +62,10 @@ public class ArrangeService {
 
         LocalDate date = dto.getStartDate();
         LocalTime startTime = dto.getMorningStartTime();
+        DateTimeFormatter format = DateTimeFormatter.ofPattern("MM月dd日");
+        String[] arr = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
+        String amPm = "上午";
+        int j = 0;
         for (int i = 0; i < group; i++) {
             LocalTime endTime = startTime.plusMinutes(time);
 //            if (!endTime.isBefore(dto.getMorningEndTime())) {
@@ -52,6 +73,7 @@ public class ArrangeService {
 //
 //                }
 //            }
+            String name = format.format(date) + amPm + "第" + arr[j] + "场";
             Arrange arrange = Arrange.builder()
                     .address(dto.getAddress())
                     .duration(dto.getDuration())
@@ -61,16 +83,30 @@ public class ArrangeService {
                     .startTime(startTime)
                     .endTime(endTime)
                     .duration(dto.getDuration())
+                    .specialtyId(dto.getSpecialtyId())
+                    .name(name)
                     .build();
-            arrangeRepo.save(arrange);
+            arrange = arrangeRepo.save(arrange);
+
+            // 插入节目
+            if (!programmeService.group(arrange)) {
+                // 不需要这么多分组
+                break;
+            }
 
             startTime = endTime.plusMinutes(10);
             if (startTime.isAfter(dto.getMorningEndTime()) && startTime.isBefore(dto.getAfternoonStartTime())) {
                 startTime = dto.getAfternoonStartTime();
+                j = 0;
+                amPm = "下午";
             } else if (startTime.isAfter(dto.getAfternoonEndTime())) {
                 date = date.plusDays(1);
                 startTime = dto.getMorningStartTime();
+                j = 0;
+                amPm = "上午";
             }
+            j++;
         }
     }
+
 }

+ 126 - 0
src/main/java/com/izouma/wenlvju/service/performance/ProgrammeService.java

@@ -8,6 +8,7 @@ import com.izouma.wenlvju.domain.ArtType;
 import com.izouma.wenlvju.domain.GradingOrganization;
 import com.izouma.wenlvju.domain.Organization;
 import com.izouma.wenlvju.domain.Setting;
+import com.izouma.wenlvju.domain.performance.Arrange;
 import com.izouma.wenlvju.domain.performance.Participant;
 import com.izouma.wenlvju.domain.performance.Performance;
 import com.izouma.wenlvju.domain.performance.Programme;
@@ -19,6 +20,7 @@ import com.izouma.wenlvju.repo.ArtTypeRepo;
 import com.izouma.wenlvju.repo.GradingOrganizationRepo;
 import com.izouma.wenlvju.repo.OrganizationRepo;
 import com.izouma.wenlvju.repo.SettingRepo;
+import com.izouma.wenlvju.repo.performance.ArrangeRepo;
 import com.izouma.wenlvju.repo.performance.ParticipantRepo;
 import com.izouma.wenlvju.repo.performance.PerformanceRepo;
 import com.izouma.wenlvju.repo.performance.ProgrammeRepo;
@@ -35,7 +37,9 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -52,6 +56,7 @@ public class ProgrammeService {
     private SettingRepo             settingRepo;
     private ArtTypeService          artTypeService;
     private PerformanceRepo         performanceRepo;
+    private ArrangeRepo             arrangeRepo;
 
     public Page<Programme> all(PageQuery pageQuery) {
         return programmeRepo.findAll(JpaUtils.toSpecification(pageQuery, Programme.class), JpaUtils.toPageRequest(pageQuery));
@@ -231,4 +236,125 @@ public class ProgrammeService {
 
         programmeRepo.saveAll(programmes);
     }
+
+    @Transactional(rollbackOn = Exception.class)
+    public boolean group(Arrange arrange) {
+        boolean flag = true;
+
+        List<Programme> byPerformanceId = programmeRepo.findAllByPerformanceIdAndStatus(arrange.getPerformanceId(), 0);
+        int quantity = arrange.getQuantity();
+        if (byPerformanceId.size() < quantity) {
+            flag = false;
+        }
+
+        List<Programme> result = new ArrayList<>(quantity);
+        if (CollUtil.isNotEmpty(arrange.getSpecialtyId())) {
+
+            List<Long> artTypeChild = artTypeService.getChild(arrange.getSpecialtyId(), new ArrayList<>(arrange.getSpecialtyId()));
+            List<Programme> programmeList = byPerformanceId.stream()
+                    .filter(programme -> artTypeChild.contains(programme.getSpecialtyId()))
+                    .collect(Collectors.toList());
+
+            int size = programmeList.size();
+            if (size < quantity) {
+                programmeList.addAll(byPerformanceId.stream()
+                        .filter(programme -> !artTypeChild.contains(programme.getSpecialtyId()))
+                        .limit(quantity - size)
+                        .collect(Collectors.toList()));
+                flag = false;
+            }
+
+            this.sort(programmeList);
+            result.addAll(programmeList.stream().limit(quantity).collect(Collectors.toList()));
+        } else {
+            this.sort(byPerformanceId);
+            result.addAll(byPerformanceId.stream().limit(quantity).collect(Collectors.toList()));
+        }
+//        LocalDateTime showTime = LocalDateTime.of(arrange.getDate(), arrange.getStartTime());
+
+        for (Programme programme : result) {
+            programme.setArrangeId(arrange.getId());
+//            programme.setShowTime(showTime);
+            programme.setStatus(1);
+//            showTime = showTime.plusMinutes(arrange.getDuration());
+        }
+        programmeRepo.saveAll(result);
+        if (result.size() < quantity) {
+            arrange.setQuantity(result.size());
+            arrangeRepo.save(arrange);
+        }
+        return flag;
+    }
+
+    public void sort(List<Programme> programmes) {
+        programmes.sort((a, b) -> {
+            if (a.getOrganizationId().equals(b.getOrganizationId())) {
+                if (a.getOrganizationId().equals(b.getOrganizationId())) {
+//                    if (StrUtil.isNotBlank(a.getExamPoint()) && StrUtil.isNotBlank(b.getExamPoint()) && a.getExamPoint()
+//                            .equals(b.getExamPoint())) {
+                    return a.getSpecialtyId().compareTo(b.getSpecialtyId());
+//                    } else {
+//                        return a.getExamPoint().compareTo(b.getExamPoint());
+//                    }
+                } else {
+                    return a.getOrganizationId().compareTo(b.getOrganizationId());
+                }
+            } else {
+                return a.getOrganizationId().compareTo(b.getOrganizationId());
+            }
+        });
+    }
+
+
+    /*
+    移除分组
+     */
+    public void removeArrange(Long id) {
+        Programme programme = programmeRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        Long arrangeId = programme.getArrangeId();
+
+//        final LocalDateTime[] showTime = {programme.getShowTime()};
+        // 分组下的所有节目
+//        List<Programme> programmes = programmeRepo.findAllByArrangeIdAndShowTimeAfter(arrangeId, showTime[0]);
+//        programmes.sort(Comparator.comparing(Programme::getShowTime));
+//        programmes.forEach(pro -> {
+//            LocalDateTime tmp = pro.getShowTime();
+//            pro.setShowTime(showTime[0]);
+//            showTime[0] = tmp;
+//        });
+
+        programme.setStatus(0);
+        programme.setArrangeId(null);
+        programmeRepo.save(programme);
+
+//        programmes.add(programme);
+//        programmeRepo.saveAll(programmes);
+
+        arrangeRepo.minusQuantity(arrangeId);
+    }
+
+    /*
+    增加节目
+     */
+    public void add(Long id, Long arrangeId) {
+//        LocalDateTime showTime = programmeRepo.findFirstByArrangeIdOrderByShowTimeDesc(arrangeId).getShowTime();
+        Arrange arrange = arrangeRepo.findById(arrangeId).orElseThrow(new BusinessException("无记录"));
+        Programme programme = programmeRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+//        programme.setShowTime(showTime.plusMinutes(arrange.getDuration()));
+        programme.setArrangeId(arrangeId);
+        programme.setStatus(1);
+        programmeRepo.save(programme);
+
+        arrange.setQuantity(arrange.getQuantity() + 1);
+        arrangeRepo.save(arrange);
+    }
+
+    /*
+    未分组节目
+     */
+    public List<Programme> ungrouped(Long performanceId) {
+        List<Programme> programmes = programmeRepo.findAllByPerformanceIdAndStatus(performanceId, 0);
+        this.sort(programmes);
+        return programmes;
+    }
 }

+ 14 - 0
src/main/java/com/izouma/wenlvju/web/performance/ProgrammeController.java

@@ -81,5 +81,19 @@ public class ProgrammeController extends BaseController {
         }
     }
 
+    @PostMapping("/removeGroup/{id}")
+    public void removeGroup(@PathVariable Long id) {
+        programmeService.removeArrange(id);
+    }
+
+    @PostMapping("/intoGroup")
+    public void intoGroup(@RequestParam Long id, @RequestParam Long arrangeId) {
+        programmeService.add(id, arrangeId);
+    }
+
+    @PostMapping("/unGrouped")
+    public List<Programme> unGrouped(@RequestParam Long performanceId) {
+        return programmeService.ungrouped(performanceId);
+    }
 }
 

+ 11 - 0
src/main/vue/src/router.js

@@ -654,6 +654,17 @@ const router = new Router({
                         title: '节目管理'
                     }
                 },
+                {
+                    path: '/programmeGroupList',
+                    name: 'ProgrammeGroupList',
+                    component: () =>
+                        import(
+                            /* webpackChunkName: "programmeGroupList" */ '@/views/performance/ProgrammeGroupList.vue'
+                        ),
+                    meta: {
+                        title: '节目管理'
+                    }
+                },
                 {
                     path: '/participantEdit',
                     name: 'ParticipantEdit',

+ 19 - 5
src/main/vue/src/views/performance/ArrangeList.vue

@@ -118,19 +118,23 @@
             <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
             <!-- <el-table-column prop="id" label="ID" width="100"> </el-table-column> -->
             <el-table-column prop="address" label="活动地点"> </el-table-column>
-            <el-table-column prop="date" label="活动日期"> </el-table-column>
+            <el-table-column prop="name" label="分组名称" min-width="100"> </el-table-column>
             <el-table-column label="时间安排" min-width="100">
                 <template slot-scope="{ row }"> {{ row.startTime }}-{{ row.endTime }} </template>
             </el-table-column>
             <el-table-column prop="quantity" label="节目数量"> </el-table-column>
             <!-- <el-table-column prop="duration" label="节目时长"> </el-table-column> -->
-            <el-table-column prop="specialtyId" label="参赛专业"> </el-table-column>
+            <el-table-column label="参赛专业">
+                <template slot-scope="{ row }">
+                    {{ row.specialtyName.join(',') }}
+                </template>
+            </el-table-column>
             <el-table-column prop="writerDirector" label="编导姓名"> </el-table-column>
             <el-table-column prop="phone" label="联系电话"> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right" min-width="320">
                 <template slot-scope="{ row, $index }">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
-                    <el-button @click="editRow(row)" size="mini" plain>查看节目</el-button>
+                    <el-button @click="programme(row)" size="mini" plain>查看节目</el-button>
                     <!-- <el-button @click="editRow(row)" type="warning" size="mini" plain>上移</el-button>
                     <el-button @click="editRow(row)" type="warning" size="mini" plain>下移</el-button> -->
 
@@ -284,6 +288,14 @@ export default {
                 }
             });
         },
+        programme(row) {
+            this.$router.push({
+                path: '/programmeGroupList',
+                query: {
+                    aid: row.id
+                }
+            });
+        },
         download() {
             this.downloading = true;
             this.$axios
@@ -375,7 +387,8 @@ export default {
                     {
                         ...startInfo,
                         startTime: endInfo.startTime,
-                        endTime: endInfo.endTime
+                        endTime: endInfo.endTime,
+                        name: endInfo.name
                     },
                     { body: 'json' }
                 ),
@@ -384,7 +397,8 @@ export default {
                     {
                         ...endInfo,
                         startTime: startInfo.startTime,
-                        endTime: startInfo.endTime
+                        endTime: startInfo.endTime,
+                        name: startInfo.name
                     },
                     { body: 'json' }
                 )

+ 350 - 0
src/main/vue/src/views/performance/ProgrammeGroupList.vue

@@ -0,0 +1,350 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-table
+                :data="arrange"
+                row-key="id"
+                header-row-class-name="table-header-row"
+                header-cell-class-name="table-header-cell"
+                row-class-name="table-row"
+                cell-class-name="table-cell"
+                height="80"
+            >
+                <el-table-column prop="address" label="活动地点"> </el-table-column>
+                <el-table-column prop="name" label="分组名称" min-width="100"> </el-table-column>
+                <el-table-column label="时间安排" min-width="100">
+                    <template slot-scope="{ row }"> {{ row.startTime }}-{{ row.endTime }} </template>
+                </el-table-column>
+                <el-table-column prop="quantity" label="节目数量"> </el-table-column>
+                <!-- <el-table-column prop="duration" label="节目时长"> </el-table-column> -->
+                <el-table-column label="参赛专业">
+                    <template slot-scope="{ row }">
+                        {{ row.specialtyName.join(',') }}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="writerDirector" label="编导姓名"> </el-table-column>
+                <el-table-column prop="phone" label="联系电话"> </el-table-column>
+            </el-table>
+            <el-button style="margin: 10px" @click="showProgramme = true" type="primary">添加节目</el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <!-- <el-table-column prop="id" label="ID" width="100"> </el-table-column> -->
+            <el-table-column prop="name" label="节目名称"> </el-table-column>
+            <el-table-column prop="specialty" label="参赛专业"> </el-table-column>
+            <el-table-column
+                prop="competitionGroup"
+                label="参赛组别"
+                :formatter="competitionGroupFormatter"
+                min-width="70"
+            >
+            </el-table-column>
+            <el-table-column prop="level" label="参赛级别" min-width="70"> </el-table-column>
+            <el-table-column prop="durationOfWork" label="作品时长" min-width="70"> </el-table-column>
+            <el-table-column prop="quantity" label="参赛人数" min-width="70"> </el-table-column>
+            <el-table-column prop="contact" label="联系人" min-width="68"> </el-table-column>
+            <el-table-column prop="phone" label="联系电话" min-width="95"> </el-table-column>
+            <el-table-column prop="gradingOrganization" label="考级机构" show-overflow-tooltip min-width="160">
+            </el-table-column>
+            <el-table-column prop="organization" label="承办单位" min-width="160"> </el-table-column>
+            <el-table-column prop="examPoint" label="考级点"> </el-table-column>
+            <el-table-column label="操作" align="left" fixed="right" min-width="280">
+                <template slot-scope="{ row }">
+                    <el-button @click="showRow(row)" size="mini" plain>查看</el-button>
+                    <el-button @click="removeRow(row)" type="danger" size="mini" plain>移除</el-button>
+                    <el-button
+                        type="warning"
+                        @click="playVideo(row)"
+                        size="mini"
+                        plain
+                        v-if="row.video && row.video.src"
+                        >浏览视频</el-button
+                    >
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+
+        <el-dialog
+            class="videoDialog"
+            destroy-on-close
+            center
+            append-to-body
+            :visible.sync="showViedo"
+            @close="closeEvent"
+            width="70%"
+        >
+            <video
+                :src="videoUrl.src"
+                controlsList="nodownload noremote footbar"
+                controls
+                style="height: 100%; max-width: 100%"
+                oncontextmenu="return false;"
+                onmouseleave="leaveVideo(this)"
+                ref="video"
+                v-if="showViedo"
+            >
+                您的浏览器不支持 video 标签。
+            </video>
+        </el-dialog>
+
+        <el-dialog :visible.sync="showProgramme"></el-dialog>
+    </div>
+</template>
+<script>
+import delChild from '@/mixins/delChild';
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+import QrcodeVue from 'qrcode.vue';
+
+export default {
+    name: 'ProgrammeList',
+    mixins: [pageableTable, delChild],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/programme/backAll',
+            downloading: false,
+            competitionGroupOptions: [
+                { label: '个人', value: 'SINGLE' },
+                { label: '集体', value: 'COLLECTIVE' }
+            ],
+            dialogUrl: '',
+            dialogCode: false,
+            artTypes: [],
+            showViedo: false,
+            videoUrl: '',
+            arrange: [],
+            showProgramme: false
+        };
+    },
+    created() {
+        if (this.$route.query.aid) {
+            this.$http
+                .post('/arrange/all', { query: { id: this.$route.query.aid } }, { body: 'json' })
+                .then(res => {
+                    this.arrange = res.content;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        competitionGroupFormatter(row, column, cellValue, index) {
+            let selectedOption = this.competitionGroupOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            let data = {
+                sort: 'gradingOrganizationId,asc;organizationId,asc;',
+                query: {
+                    arrangeId: Number(this.$route.query.aid)
+                }
+            };
+            return data;
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        showRow(row) {
+            this.$router.push({
+                path: '/programmeShow',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+
+            let data = {
+                sort: 'gradingOrganizationId,asc;organizationId,asc;',
+                query: {
+                    arrangeId: Number(this.$route.query.aid)
+                }
+            };
+
+            this.$axios
+                .get('/programme/excel', {
+                    responseType: 'blob',
+                    params: data
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        removeRow(row) {
+            this.$alert('移除将无法恢复,确认要移除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/programme/removeGroup/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('移除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        },
+        showCode(row) {
+            this.dialogCode = true;
+            this.dialogUrl =
+                'http://wljtest.izouma.com/h5/home?performanceId=' +
+                row.performanceId +
+                '&performanceApplyId=' +
+                row.id;
+        },
+        getCode(value) {
+            return this.forTree(this.artTypes, value).code;
+        },
+        forTree(list, value) {
+            var result = null;
+            if (!list) {
+                return;
+            }
+            for (var i in list) {
+                if (result !== null) {
+                    break;
+                }
+                var item = list[i];
+                if (item.id == value) {
+                    result = item;
+                    break;
+                } else if (item.children && item.children.length > 0) {
+                    result = this.forTree(item.children, value);
+                }
+            }
+            return result;
+        },
+        closeEvent() {
+            document.exitPictureInPicture();
+        },
+        playVideo(row) {
+            this.showViedo = true;
+            this.videoUrl = row.video;
+            console.log(row.video);
+        },
+        intoGroup() {
+            this.showProgramme = true;
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.right {
+    float: right;
+}
+/deep/.el-form-item--mini.el-form-item,
+.el-form-item--small.el-form-item {
+    margin-bottom: 10px;
+}
+.videoDialog {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    .el-dialog {
+        max-width: 900px;
+        margin-top: 0px;
+
+        .close {
+            position: absolute;
+            right: 0px;
+            top: -42px;
+            width: 71px;
+            height: 32px;
+            background: #00000015;
+
+            font-size: 12px;
+            color: #fdffff;
+            line-height: 32px;
+            text-align: center;
+            cursor: pointer;
+
+            &:hover {
+                background: #00000055;
+            }
+        }
+    }
+    .el-dialog__header {
+        display: none;
+    }
+
+    .el-dialog__body {
+        padding: 0;
+
+        video {
+            display: block;
+            height: auto;
+            width: 100%;
+            outline: none;
+        }
+    }
+}
+</style>

+ 23 - 0
src/test/java/com/izouma/wenlvju/service/ArtTypeServiceTest.java

@@ -0,0 +1,23 @@
+package com.izouma.wenlvju.service;
+
+import com.izouma.wenlvju.ApplicationTests;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ArtTypeServiceTest extends ApplicationTests {
+    @Autowired
+    private ArtTypeService artTypeService;
+
+    @Test
+    public void test() {
+        List<Long> id = new ArrayList<>();
+        id.add(121L);
+        List<Long> result = new ArrayList<>();
+        result.add(121L);
+        System.out.println(artTypeService.getChild(id, result));
+    }
+
+}