licailing 4 лет назад
Родитель
Сommit
4d7d729bb1

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

@@ -58,8 +58,8 @@ public class Arrange extends BaseEntity {
     @ApiModelProperty(value = "联系电话")
     private String phone;
 
-    @ApiModelProperty(value = "发布")
-    private boolean publish;
+//    @ApiModelProperty(value = "发布")
+//    private boolean publish;
 
     @ApiModelProperty(value = "审核次数")
     private int auditTimes;

+ 11 - 13
src/main/java/com/izouma/wenlvju/domain/performance/Programme.java

@@ -87,29 +87,27 @@ public class Programme extends BaseEntity {
     @ApiModelProperty(value = "分组id")
     private Long arrangeId;
 
-    /*
-    初始状态为0,已提交1,考级机构初审未通过2,初审中3,未进入复审4,复审中5,评奖中6,完成7
-    */
-//    private int status;
+    @ApiModelProperty(value = "复审分组id")
+    private Long reviewArrangeId;
 
     @ApiModelProperty(value = "状态")
     @Enumerated(EnumType.STRING)
     private ProgrammeStatus programmeStatus;
 
-    @ApiModelProperty(value = "流程")
-    @Enumerated(EnumType.STRING)
-    private ProgrammeProcess programmeProcess;
+//    @ApiModelProperty(value = "流程")
+//    @Enumerated(EnumType.STRING)
+//    private ProgrammeProcess programmeProcess;
 
     @ApiModelProperty(value = "签到管理")
     @Enumerated(EnumType.STRING)
     private SignedIn signedIn;
 
-    @Column(columnDefinition = "TEXT")
-    @ApiModelProperty(value = "情况说明")
-    private String description;
-
-    @ApiModelProperty(value = "签到时间")
-    private LocalDateTime signedAt;
+//    @Column(columnDefinition = "TEXT")
+//    @ApiModelProperty(value = "情况说明")
+//    private String description;
+//
+//    @ApiModelProperty(value = "签到时间")
+//    private LocalDateTime signedAt;
 
     @ApiModelProperty(value = "参演人数")
     private int quantity;

+ 22 - 18
src/main/java/com/izouma/wenlvju/enums/PerformanceStatus.java

@@ -2,11 +2,15 @@ package com.izouma.wenlvju.enums;
 
 public enum PerformanceStatus {
     /*
-    待分组
+    审核中
+     */
+    UNDER_REVIEW,
+    /*
+    分组中
      */
     ARRANGE,
     /*
-    待分配评委
+    分配评委
      */
     ARRANGE_JUDGE,
     /*
@@ -19,20 +23,20 @@ public enum PerformanceStatus {
     RATE,
 
     //复审
-//    /*
-//    待分组
-//    */
-//    SECOND_ARRANGE,
-//    /*
-//    待分配评委
-//     */
-//    SECOND_ARRANGE_JUDGE,
-//    /*
-//    待签到
-//     */
-//    SECOND_SIGN_IN,
-//    /*
-//    待评分
-//     */
-//    SECOND_RATE
+    /*
+    待分组
+    */
+    SECOND_ARRANGE,
+    /*
+    待分配评委
+     */
+    SECOND_ARRANGE_JUDGE,
+    /*
+    待签到
+     */
+    SECOND_SIGN_IN,
+    /*
+    待评分
+     */
+    SECOND_RATE
 }

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

@@ -31,8 +31,8 @@ public interface ArrangeRepo extends JpaRepository<Arrange, Long>, JpaSpecificat
 
     Arrange findFirstByPerformanceIdAndAuditTimes(Long performanceId, int auditTimes);
 
-    @Query("update Arrange t set t.publish = true where t.performanceId = ?1")
-    @Modifying
-    @Transactional
-    void publish(Long performanceId);
+//    @Query("update Arrange t set t.publish = true where t.performanceId = ?1")
+//    @Modifying
+//    @Transactional
+//    void publish(Long performanceId);
 }

+ 4 - 5
src/main/java/com/izouma/wenlvju/repo/performance/ProgrammeRepo.java

@@ -18,13 +18,8 @@ public interface ProgrammeRepo extends JpaRepository<Programme, Long>, JpaSpecif
 
     long countAllByPerformanceId(Long performanceId);
 
-//    long countAllByPerformanceIdAndStatusGreaterThan(Long performanceId, int status);
-
-//    List<Programme> findAllByPerformanceIdAndStatus(Long performanceId, int status);
     List<Programme> findAllByPerformanceIdAndProgrammeStatus(Long performanceId, ProgrammeStatus status);
 
-//    List<Programme> findAllByStatusGreaterThan(int status);
-
     long countAllByArrangeIdAndProgrammeStatusIsNotNull(Long arrangeId);
 
     @Query("update Programme t set t.allSigned = true where t.arrangeId = ?1")
@@ -37,6 +32,10 @@ public interface ProgrammeRepo extends JpaRepository<Programme, Long>, JpaSpecif
     @Transactional
     void score(double score, Long id);
 
+    List<Programme> findAllByPerformanceIdAndArrangeIdIsNull(Long performanceId);
+
+    List<Programme> findAllByPerformanceIdAndReviewArrangeIdIsNull(Long performanceId);
+
 //    List<Programme> findAllByArrangeId(Long arrangeId);
 
 //    Programme findFirstByArrangeIdOrderByShowTimeDesc(Long arrangeId);

+ 40 - 13
src/main/java/com/izouma/wenlvju/service/performance/ArrangeService.java

@@ -95,9 +95,19 @@ public class ArrangeService {
     public void chooseGroup(ArrangeDTO dto) {
         Performance performance = performanceRepo.findById(dto.getPerformanceId())
                 .orElseThrow(new BusinessException("无展演活动"));
+        if (LocalDate.now().isBefore(performance.getEndDate())) {
+            throw new BusinessException("活动报名未结束");
+        }
+        PerformanceStatus status = performance.getStatus();
+        // 第一次分组
+        if (performance.getAuditTimes() == 0 && PerformanceStatus.UNDER_REVIEW.equals(status)) {
+            performance.setStatus(PerformanceStatus.ARRANGE);
+            status = PerformanceStatus.ARRANGE;
+            performance.setAuditTimes(1);
+            performanceRepo.save(performance);
+        }
 
-        Arrange first = arrangeRepo.findFirstByPerformanceIdAndAuditTimes(dto.getPerformanceId(), performance.getAuditTimes() + 1);
-        if (ObjectUtil.isNotNull(first) && first.isPublish()) {
+        if (!PerformanceStatus.ARRANGE.equals(status)) {
             throw new BusinessException("活动分组已发布");
         }
         boolean online = performance.isOnline();
@@ -105,16 +115,16 @@ public class ArrangeService {
             online = performance.getReviewOnline();
         }
         if (online) {
-            this.groupOnline(dto, performance.getStatus());
+            this.groupOnline(dto, performance.getAuditTimes());
             return;
         }
-        this.group(dto, performance.getStatus());
+        this.group(dto, performance.getAuditTimes());
     }
 
     /*
     分组
      */
-    public void group(ArrangeDTO dto, PerformanceStatus status) {
+    public void group(ArrangeDTO dto, int times) {
         long total = 0;
         int days = Period.between(dto.getStartDate(), dto.getEndDate()).getDays();
         for (int i = 0; i <= days; i++) {
@@ -138,7 +148,7 @@ public class ArrangeService {
         List<Programme> byPerformanceId = programmeRepo.findAllByPerformanceIdAndProgrammeStatus(dto.getPerformanceId(), ProgrammeStatus.SUBMIT);
 
         if (dto.isMorning() && dto.isAfternoon()) {
-            this.saveArrange(byPerformanceId, dto, group, time, format1, arr);
+            this.saveArrange(byPerformanceId, dto, group, time, format1, arr, times);
         } else {
             LocalTime startAt;
             LocalTime endAt;
@@ -176,6 +186,7 @@ public class ArrangeService {
                         .specialtyId(dto.getSpecialtyId())
                         .name(name)
                         .morning(morning)
+                        .auditTimes(times)
                         .build();
 
                 Map<String, String> programmes = programmeService.group(byPerformanceId, arrange);
@@ -209,7 +220,8 @@ public class ArrangeService {
 
     }
 
-    public void saveArrange(List<Programme> byPerformanceId, ArrangeDTO dto, int group, int time, String format1, String[] arr) {
+
+    public void saveArrange(List<Programme> byPerformanceId, ArrangeDTO dto, int group, int time, String format1, String[] arr, int times) {
         LocalDate date = dto.getStartDate();
         LocalTime startTime = dto.getMorningStartTime();
         boolean morning = true;
@@ -231,6 +243,7 @@ public class ArrangeService {
                     .specialtyId(dto.getSpecialtyId())
                     .name(name)
                     .morning(morning)
+                    .auditTimes(times)
                     .build();
 
             Map<String, String> programmes = programmeService.group(byPerformanceId, arrange);
@@ -269,16 +282,17 @@ public class ArrangeService {
     展演形式为线上进行分组
     不需要时间、上下午、地点
      */
-    public void groupOnline(ArrangeDTO dto, PerformanceStatus status) {
+    public void groupOnline(ArrangeDTO dto, int times) {
         List<Programme> byPerformanceId = programmeRepo.findAllByPerformanceIdAndProgrammeStatus(dto.getPerformanceId(), ProgrammeStatus.SUBMIT);
         int group = (int) Math.ceil((double) byPerformanceId.size() / dto.getQuantity());
 
-        for (int i = 0; i < group; i++) {
+        for (int i = 1; i <= group; i++) {
             Arrange arrange = Arrange.builder()
                     .performanceId(dto.getPerformanceId())
                     .quantity(dto.getQuantity())
                     .specialtyId(dto.getSpecialtyId())
-                    .name("第" + i + 1 + "场")
+                    .name("第" + i + "场")
+                    .auditTimes(times)
                     .build();
 
             Map<String, String> programmes = programmeService.group(byPerformanceId, arrange);
@@ -302,8 +316,22 @@ public class ArrangeService {
     }
 
     public void publish(Long performanceId) {
+        Performance performance = performanceRepo.findById(performanceId).orElseThrow(new BusinessException("无展演"));
+        boolean online = performance.isOnline();
+        if (performance.getAuditTimes() > 1) {
+            online = performance.getReviewOnline();
+        }
+        // 改为分配评委
+        performance.setStatus(PerformanceStatus.ARRANGE_JUDGE);
+        performanceRepo.save(performance);
+        if (!online) {
+            this.publishOffline(performanceId);
+        }
+    }
+
+    public void publishOffline(Long performanceId) {
         // 分布发布
-        arrangeRepo.publish(performanceId);
+//        arrangeRepo.publish(performanceId);
         Map<Long, Arrange> arranges = arrangeRepo.findAllByPerformanceId(performanceId)
                 .stream()
                 .collect(Collectors.toMap(Arrange::getId, arrange -> arrange));
@@ -324,9 +352,8 @@ public class ArrangeService {
                 p.setShowBegin(beginAt[0]);
                 p.setShowEnd(endAt);
                 p.setAddress(arrange.getAddress());
-//                p.setStatus(5);
                 // 待签到
-                p.setProgrammeProcess(ProgrammeProcess.SIGN_IN);
+//                p.setProgrammeProcess(ProgrammeProcess.SIGN_IN);
                 beginAt[0] = endAt;
             });
         });

+ 16 - 0
src/main/java/com/izouma/wenlvju/service/performance/PerformanceService.java

@@ -2,12 +2,16 @@ package com.izouma.wenlvju.service.performance;
 
 import com.izouma.wenlvju.domain.performance.Performance;
 import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.enums.PerformanceStatus;
+import com.izouma.wenlvju.exception.BusinessException;
 import com.izouma.wenlvju.repo.performance.PerformanceRepo;
 import com.izouma.wenlvju.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+
 @Service
 @AllArgsConstructor
 public class PerformanceService {
@@ -17,4 +21,16 @@ public class PerformanceService {
     public Page<Performance> all(PageQuery pageQuery) {
         return performanceRepo.findAll(JpaUtils.toSpecification(pageQuery, Performance.class), JpaUtils.toPageRequest(pageQuery));
     }
+
+    /*
+    设置复审比例
+     */
+    public Performance settingUpReview(Long id, BigDecimal ratio, boolean online) {
+        Performance performance = performanceRepo.findById(id).orElseThrow(new BusinessException("无展演"));
+        performance.setStatus(PerformanceStatus.ARRANGE);
+        performance.setAuditTimes(2);
+        performance.setReviewRatio(ratio);
+        performance.setReviewOnline(online);
+        return performanceRepo.save(performance);
+    }
 }

+ 62 - 16
src/main/java/com/izouma/wenlvju/service/performance/ProgrammeService.java

@@ -11,10 +11,7 @@ import com.izouma.wenlvju.config.DateConfig;
 import com.izouma.wenlvju.domain.*;
 import com.izouma.wenlvju.domain.performance.*;
 import com.izouma.wenlvju.dto.*;
-import com.izouma.wenlvju.enums.CompetitionGroup;
-import com.izouma.wenlvju.enums.ProgrammeProcess;
-import com.izouma.wenlvju.enums.ProgrammeStatus;
-import com.izouma.wenlvju.enums.SignedIn;
+import com.izouma.wenlvju.enums.*;
 import com.izouma.wenlvju.exception.BusinessException;
 import com.izouma.wenlvju.repo.*;
 import com.izouma.wenlvju.repo.performance.*;
@@ -409,7 +406,7 @@ public class ProgrammeService {
     public void saveAll(List<Programme> programmes, Long arrangeId) {
         programmes.forEach(programme -> {
             programme.setArrangeId(arrangeId);
-            programme.setProgrammeProcess(ProgrammeProcess.ARRANGE);
+//            programme.setProgrammeProcess(ProgrammeProcess.ARRANGE);
 //            programme.setStatus(4);
         });
         programmeRepo.saveAll(programmes);
@@ -447,13 +444,9 @@ public class ProgrammeService {
     增加节目
      */
     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(4);
-        programme.setProgrammeProcess(ProgrammeProcess.ARRANGE);
         programmeRepo.save(programme);
 
         arrange.setQuantity(arrange.getQuantity() + 1);
@@ -463,10 +456,50 @@ public class ProgrammeService {
     /*
     未分组节目
      */
-    public List<Programme> ungrouped(Long performanceId) {
-        List<Programme> programmes = programmeRepo.findAllByPerformanceIdAndProgrammeStatus(performanceId, ProgrammeStatus.SUBMIT);
-        this.sort(programmes);
-        return programmes;
+    public List<ProgrammeShowDTO> ungrouped(Long performanceId) {
+        Performance performance = performanceRepo.findById(performanceId).orElseThrow(new BusinessException("无展演"));
+        if (performance.getAuditTimes() > 1) {
+            List<Programme> programmes = programmeRepo.findAllByPerformanceIdAndReviewArrangeIdIsNull(performanceId);
+            if (CollUtil.isNotEmpty(programmes)) {
+                this.sort(programmes);
+                return this.toShowDTOList(programmes, performance.getName());
+            }
+            return null;
+        }
+        List<Programme> programmes = programmeRepo.findAllByPerformanceIdAndArrangeIdIsNull(performanceId);
+        if (CollUtil.isNotEmpty(programmes)) {
+            this.sort(programmes);
+            return this.toShowDTOList(programmes, performance.getName());
+        }
+        return null;
+    }
+
+    private List<ProgrammeShowDTO> toShowDTOList(List<Programme> programmes, String name) {
+        Map<Long, String> settingMap = settingRepo.findAllByFlagIn(CollUtil.newArrayList(3, 4))
+                .stream()
+                .collect(Collectors.toMap(Setting::getId, Setting::getName));
+
+        Map<Long, String> gradeMap = gradingOrganizationRepo.findAll()
+                .stream()
+                .collect(Collectors.toMap(GradingOrganization::getId, GradingOrganization::getName));
+
+        Map<Long, String> artTypeMap = artTypeRepo.findAll()
+                .stream()
+                .collect(Collectors.toMap(ArtType::getId, ArtType::getName));
+
+        Set<Long> ids = programmes.stream().map(Programme::getOrganizationId).collect(Collectors.toSet());
+        Map<Long, String> organizationMap = organizationRepo.findAllById(ids)
+                .stream()
+                .collect(Collectors.toMap(Organization::getId, Organization::getName));
+
+       return programmes.stream().map(programme -> {
+            ProgrammeShowDTO dto = new ProgrammeShowDTO(programme);
+            dto.setLevel(settingMap.get(programme.getLevelSettingId()));
+            dto.setGradingOrganization(gradeMap.get(programme.getGradingOrganizationId()));
+            dto.setOrganization(organizationMap.get(programme.getOrganizationId()));
+            dto.setSpecialty(artTypeMap.get(programme.getSpecialtyId()));
+            return dto;
+        }).collect(Collectors.toList());
     }
 
     /*
@@ -505,17 +538,25 @@ public class ProgrammeService {
     /*
     签到
      */
-    public void signIn(Long id, SignedIn signedIn, String description) {
+    public void signIn(Long id, SignedIn signedIn, String description, Long userId) {
         Programme programme = programmeRepo.findById(id).orElseThrow(new BusinessException("无节目"));
         programme.setSignedIn(signedIn);
-        programme.setDescription(description);
-        programme.setSignedAt(LocalDateTime.now());
+//        programme.setDescription(description);
+//        programme.setSignedAt(LocalDateTime.now());
         programmeRepo.save(programme);
 
         long unSigned = programmeRepo.countAllByArrangeIdAndProgrammeStatusIsNotNull(programme.getArrangeId());
         if (unSigned == 0) {
             programmeRepo.allSigned(programme.getArrangeId());
         }
+        if (SignedIn.SIGNED_IN.equals(signedIn) && StrUtil.isEmpty(description)) {
+            description = "已签到";
+        }
+        rateAuditRepo.save(RateAudit.builder()
+                .userId(userId)
+                .status(PerformanceStatus.SIGN_IN.toString())
+                .remark(description)
+                .build());
     }
 
     public ProgrammeScoreDTO getDTO(Long id, Long userId) {
@@ -621,6 +662,11 @@ public class ProgrammeService {
                 .map(ParticipantDTO::new)
                 .collect(Collectors.toList());
         dto.setParticipants(participants);
+        organizationRepo.findById(programme.getOrganizationId()).ifPresent(og -> dto.setOrganization(og.getName()));
+        gradingOrganizationRepo.findById(programme.getGradingOrganizationId())
+                .ifPresent(go -> dto.setGradingOrganization(go.getName()));
+        artTypeRepo.findById(programme.getSpecialtyId()).ifPresent(at -> dto.setSpecialty(at.getName()));
+        settingRepo.findById(programme.getLevelSettingId()).ifPresent(st -> dto.setLevel(st.getName()));
         return dto;
     }
 }

+ 3 - 2
src/main/java/com/izouma/wenlvju/web/performance/ProgrammeController.java

@@ -1,6 +1,7 @@
 package com.izouma.wenlvju.web.performance;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.izouma.wenlvju.domain.ArtType;
 import com.izouma.wenlvju.domain.performance.Performance;
 import com.izouma.wenlvju.domain.performance.Programme;
@@ -123,7 +124,7 @@ public class ProgrammeController extends BaseController {
 
     @ApiOperation("未分组")
     @PostMapping("/unGrouped")
-    public List<Programme> unGrouped(@RequestParam Long performanceId) {
+    public List<ProgrammeShowDTO> unGrouped(@RequestParam Long performanceId) {
         return programmeService.ungrouped(performanceId);
     }
 
@@ -139,7 +140,7 @@ public class ProgrammeController extends BaseController {
     @ApiOperation("签到")
     @PostMapping("/signIn")
     public void signIn(@RequestParam Long id, @RequestParam SignedIn signedIn, String description) {
-        programmeService.signIn(id, signedIn, description);
+        programmeService.signIn(id, signedIn, description, SecurityUtils.getAuthenticatedUser().getId());
     }
 
     @PostMapping("/byExpert")

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

@@ -661,6 +661,17 @@ const router = new Router({
                         title: '节目分组'
                     }
                 },
+                {
+                    path: '/progGroupOnlineList',
+                    name: 'ProgGroupOnlineList',
+                    component: () =>
+                        import(
+                            /* webpackChunkName: "progGroupOnlineList" */ '@/views/performance/ProgGroupOnlineList.vue'
+                        ),
+                    meta: {
+                        title: '节目分组'
+                    }
+                },
                 {
                     path: '/programmeSignList',
                     name: 'ProgrammeSignList',

+ 17 - 8
src/main/vue/src/views/performance/PerformanceList.vue

@@ -27,7 +27,7 @@
             <!-- <el-table-column prop="id" label="ID" width="100"> </el-table-column> -->
             <el-table-column prop="name" label="活动名称" min-width="230"> </el-table-column>
             <el-table-column prop="year" label="年度" min-width="50"> </el-table-column>
-            <el-table-column prop="status" label="活动状态" width="80">
+            <el-table-column label="活动状态" width="80">
                 <template slot-scope="{ row }">
                     <el-link style="font-size: 13px" :underline="false" type="info" v-if="currentTime < row.startDate"
                         >未开始</el-link
@@ -35,17 +35,20 @@
                     <el-link
                         style="font-size: 13px"
                         :underline="false"
-                        type="info"
-                        v-else-if="currentTime > row.endDate"
-                        >已结束</el-link
+                        type="success"
+                        v-else-if="currentTime <= row.endDate"
+                        >报名中</el-link
                     >
                     <el-link
                         style="font-size: 13px"
                         :underline="false"
-                        type="success"
-                        v-else-if="currentTime <= row.endDate"
-                        >报名中</el-link
+                        type="warning"
+                        v-else-if="currentTime > row.endDate"
                     >
+                        <span v-if="row.status == 'UNDER_REVIEW'">审核中</span>
+                        <span v-else-if="row.status == 'ARRANGE'">分组中</span>
+                        <span v-else-if="row.status == 'ARRANGE_JUDGE'">分配评委中</span>
+                    </el-link>
                 </template>
             </el-table-column>
             <el-table-column label="发布状态">
@@ -125,7 +128,13 @@ export default {
             search: '',
             url: '/performance/backAll',
             downloading: false,
-            currentTime: ''
+            currentTime: '',
+            statusOptions: [
+                { label: '审核中', value: 'UNDER_REVIEW' },
+                { label: '分组中', value: 'ARRANGE' },
+                { label: '分配评委中', value: 'ARRANGE_JUDGE' },
+                { label: '待签到', value: 'SIGN_IN' }
+            ]
         };
     },
     created() {

+ 396 - 0
src/main/vue/src/views/performance/ProgGroupOnlineList.vue

@@ -0,0 +1,396 @@
+<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="name" label="分组名称" min-width="100"> </el-table-column>
+                <el-table-column prop="quantity" 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="intoGroup" 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="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="考级点" min-width="160"> </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"
+                        >浏览视频</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"
+                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" width="80%" title="未分组节目" center>
+            <el-table
+                :data="unGrouped"
+                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="300"
+            >
+                <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="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="考级点" min-width="160"> </el-table-column>
+                <el-table-column label="操作">
+                    <template slot-scope="{ row }">
+                        <el-button @click="choose(row)" size="mini" type="primary">增加</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </el-dialog>
+    </div>
+</template>
+<script>
+import delChild from '@/mixins/delChild';
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+import QrcodeVue from 'qrcode.vue';
+import { time } from 'echarts';
+
+export default {
+    name: 'ProgGroupOfflineList',
+    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,
+            unGrouped: [],
+            performanceId: ''
+        };
+    },
+    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;
+                    this.performanceId = res.content[0].performanceId;
+                })
+                .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;
+            this.$http
+                .post('/programme/unGrouped', { performanceId: this.performanceId })
+                .then(res => {
+                    this.unGrouped = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        },
+        choose(row) {
+            this.$http
+                .post('/programme/intoGroup', { id: row.id, arrangeId: this.$route.query.aid })
+                .then(res => {
+                    this.showProgramme = false;
+                    this.$message.success('添加成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    }
+};
+</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>

+ 3 - 2
src/main/vue/src/views/performance/ProgrammeEdit.vue

@@ -574,9 +574,10 @@ export default {
         submit(isSubmit) {
             let lenght = this.participants.filter(item => !item.del).length;
             let data = { ...this.formData, quantity: lenght };
-            console.log(data);
             if (isSubmit) {
-                data.status = 1;
+                data.status = 'SUBMIT';
+            } else {
+                data.status = 'INITIAL';
             }
             this.saving = true;
             this.$http

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

@@ -134,8 +134,6 @@
                 <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>

+ 29 - 15
src/main/vue/src/views/performance/ProgrammeList.vue

@@ -161,8 +161,8 @@
             :height="tableHeight"
         >
             <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
-            <el-table-column prop="id" label="节目编号" width="80"> </el-table-column>
-            <el-table-column prop="name" label="节目名称"> </el-table-column>
+            <el-table-column prop="id" label="节目编号" width="80" fixed="left"> </el-table-column>
+            <el-table-column prop="name" label="节目名称" fixed="left"> </el-table-column>
             <el-table-column prop="specialty" label="参赛专业"> </el-table-column>
             <el-table-column
                 prop="competitionGroup"
@@ -180,13 +180,13 @@
             </el-table-column>
             <el-table-column prop="organization" label="承办单位" min-width="160"> </el-table-column>
             <el-table-column prop="examPoint" label="考级点" min-width="160"> </el-table-column>
-            <el-table-column prop="status" label="节目状态" min-width="180"
-                ><template slot-scope="{ row }">
-                    <span v-if="row.status == 0">未提交</span>
-                    <span v-else>已提交</span>
-                </template></el-table-column
-            >
-            <el-table-column label="操作" align="left" fixed="right" min-width="320">
+            <el-table-column
+                prop="programmeStatus"
+                label="节目状态"
+                min-width="180"
+                :formatter="programmeStatusFormatter"
+            ></el-table-column>
+            <el-table-column label="操作" align="left" fixed="right" min-width="260">
                 <template slot-scope="{ row }">
                     <el-button @click="showRow(row)" size="mini" plain>查看</el-button>
                     <el-button
@@ -229,7 +229,7 @@
                         type="danger"
                         size="mini"
                         plain
-                        v-if="row.programmeStatus == 'SUBMIT'"
+                        v-if="row.programmeStatus == 'SUBMIT' && performance.auditTimes == 0"
                         >不通过</el-button
                     >
                     <el-button
@@ -237,7 +237,7 @@
                         type="info"
                         size="mini"
                         plain
-                        v-if="row.programmeStatus == 'AUDIT_FAILED'"
+                        v-if="row.programmeStatus == 'AUDIT_FAILED' && performance.auditTimes == 0"
                         >撤回</el-button
                     >
                     <!-- <el-button @click="showCode(row)" type="primary" size="mini" plain>查看二维码</el-button> -->
@@ -322,6 +322,7 @@ export default {
             organizationIdOptions: [],
             performanceId: '',
             performances: [],
+            performance: {},
             artTypes: [],
             optionProps: {
                 value: 'id',
@@ -335,10 +336,18 @@ export default {
             showViedo: false,
             showImg: false,
             videoUrl: '',
-            annex: ''
+            annex: '',
+            programmeStatusOptions: [
+                { label: '未提交', value: 'INITIAL' },
+                { label: '已提交', value: 'SUBMIT' },
+                { label: '初选未通过', value: 'AUDIT_FAILED' }
+            ]
         };
     },
     created() {
+        if (this.$route.query.pid) {
+            this.performanceId = Number(this.$route.query.pid);
+        }
         this.$http
             .post('/setting/byFlag', { flag: 3 })
             .then(res => {
@@ -356,9 +365,6 @@ export default {
                 console.log(e);
                 this.$message.error(e.error);
             });
-        if (this.$route.query.pid) {
-            this.performanceId = Number(this.$route.query.pid);
-        }
         this.$http
             .post('/setting/byFlag', { flag: 4 })
             .then(res => {
@@ -429,6 +435,7 @@ export default {
                         });
                     });
                     this.performanceId = res.content[0].id;
+                    this.performance = res.content[0];
                     this.getData();
                 }
             })
@@ -455,6 +462,13 @@ export default {
         }
     },
     methods: {
+        programmeStatusFormatter(row, column, cellValue, index) {
+            let selectedOption = this.programmeStatusOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
         competitionGroupFormatter(row, column, cellValue, index) {
             let selectedOption = this.competitionGroupOptions.find(i => i.value === cellValue);
             if (selectedOption) {

+ 40 - 49
src/main/vue/src/views/performance/ProgrammeOrgList.vue

@@ -25,7 +25,7 @@
                     <el-col :span="8">
                         <el-form-item label="考级机构名称">
                             <el-select
-                                v-model="gradingOrganizationId"
+                                v-model="form.gradingOrganizationId"
                                 clearable
                                 filterable
                                 placeholder="考级机构"
@@ -52,7 +52,7 @@
                             <el-cascader
                                 ref="artCascader"
                                 style="width: 100%"
-                                v-model="specialtyId"
+                                v-model="form.specialtyId"
                                 :props="optionProps"
                                 :options="artTypes"
                                 :show-all-levels="false"
@@ -64,7 +64,7 @@
                     </el-col>
                     <el-col :span="8"
                         ><el-form-item label="参赛组别">
-                            <el-select v-model="competitionGroup" clearable filterable placeholder="参赛组别">
+                            <el-select v-model="form.competitionGroup" clearable filterable placeholder="参赛组别">
                                 <el-option
                                     v-for="item in competitionGroupOptions"
                                     :key="item.value"
@@ -75,14 +75,14 @@
                             </el-select> </el-form-item
                     ></el-col>
                     <el-col :span="8"
-                        ><el-form-item label="参赛级别" v-if="competitionGroup">
+                        ><el-form-item label="参赛级别" v-if="form.competitionGroup">
                             <el-select
-                                v-model="levelSettingId"
+                                v-model="form.levelSettingId"
                                 clearable
                                 filterable
                                 placeholder="参赛级别"
                                 style="width: 100%"
-                                v-if="competitionGroup == 'SINGLE'"
+                                v-if="form.competitionGroup == 'SINGLE'"
                             >
                                 <el-option
                                     v-for="item in levelSingleOptions"
@@ -95,7 +95,7 @@
                                 </el-option>
                             </el-select>
                             <el-select
-                                v-model="levelSettingId"
+                                v-model="form.levelSettingId"
                                 clearable
                                 filterable
                                 placeholder="请选择"
@@ -118,12 +118,12 @@
                 <el-row>
                     <el-col :span="8">
                         <el-form-item label="节目名称">
-                            <el-input placeholder="节目名称" v-model="name" clearable></el-input>
+                            <el-input placeholder="节目名称" v-model="form.name" clearable></el-input>
                         </el-form-item>
                     </el-col>
                     <el-col :span="8">
                         <el-form-item label="指导老师">
-                            <el-input placeholder="指导老师" v-model="instructor" clearable></el-input>
+                            <el-input placeholder="指导老师" v-model="form.instructor" clearable></el-input>
                         </el-form-item>
                     </el-col>
                 </el-row>
@@ -304,14 +304,11 @@ export default {
                 { label: '集体', value: 'COLLECTIVE' }
             ],
             form: {},
-            competitionGroup: '',
             levelSingleOptions: [],
             levelCollectiveOptions: [],
-            levelSettingId: '',
             dialogUrl: '',
             dialogCode: false,
             gradingOrganizationIdOptions: [],
-            gradingOrganizationId: '',
             performanceId: '',
             performances: [],
             artTypes: [],
@@ -324,16 +321,18 @@ export default {
                 checkStrictly: true,
                 expandTrigger: 'hover'
             },
-            specialtyId: '',
             showViedo: false,
             showImg: false,
             videoUrl: '',
             annex: '',
-            name: '',
-            instructor: '',
             uploadUrl: '',
             currentTime: '',
-            add: false
+            add: false,
+            programmeStatusOptions: [
+                { label: '未提交', value: 'INITIAL' },
+                { label: '已提交', value: 'SUBMIT' },
+                { label: '初选未通过', value: 'AUDIT_FAILED' }
+            ]
         };
     },
     created() {
@@ -342,7 +341,6 @@ export default {
         this.$http
             .post('/setting/byFlag', { flag: 3 })
             .then(res => {
-                // console.log(res);
                 if (res.length > 0) {
                     res.forEach(item => {
                         this.levelSingleOptions.push({
@@ -363,7 +361,6 @@ export default {
         this.$http
             .post('/setting/byFlag', { flag: 4 })
             .then(res => {
-                // console.log(res);
                 if (res.length > 0) {
                     res.forEach(item => {
                         this.levelCollectiveOptions.push({
@@ -381,7 +378,6 @@ export default {
         this.$http
             .post('/gradingOrganization/all', { size: 1000, query: { del: false } }, { body: 'json' })
             .then(res => {
-                // console.log(res);
                 if (res.content.length > 0) {
                     res.content.forEach(item => {
                         this.gradingOrganizationIdOptions.push({
@@ -408,7 +404,6 @@ export default {
                 { body: 'json' }
             )
             .then(res => {
-                // console.log(res);
                 if (res.content.length > 0) {
                     // res.content.forEach(item => {
                     //     this.performances.push({
@@ -466,26 +461,26 @@ export default {
                     performanceId: Number(this.$route.query.pid)
                 }
             };
-            if (this.competitionGroup) {
-                data.query.competitionGroup = this.competitionGroup;
+            if (this.form.competitionGroup) {
+                data.query.competitionGroup = this.form.competitionGroup;
             }
-            if (this.levelSettingId) {
-                data.query.levelSettingId = this.levelSettingId;
+            if (this.form.levelSettingId) {
+                data.query.levelSettingId = this.form.levelSettingId;
             }
-            if (this.gradingOrganizationId) {
-                data.query.gradingOrganizationId = this.gradingOrganizationId;
+            if (this.form.gradingOrganizationId) {
+                data.query.gradingOrganizationId = this.form.gradingOrganizationId;
             }
             if (this.performanceId) {
                 data.query.performanceId = this.performanceId;
             }
-            if (this.specialtyId) {
-                data.query.code = this.getCode(this.specialtyId);
+            if (this.form.specialtyId) {
+                data.query.code = this.getCode(this.form.specialtyId);
             }
-            if (this.name) {
-                data.query.name = this.name;
+            if (this.form.name) {
+                data.query.name = this.form.name;
             }
-            if (this.instructor) {
-                data.query.instructor = this.instructor;
+            if (this.form.instructor) {
+                data.query.instructor = this.form.instructor;
             }
             return data;
         },
@@ -528,23 +523,23 @@ export default {
                     organizationId: this.organization.id
                 }
             };
-            if (this.competitionGroup) {
-                data.query.competitionGroup = this.competitionGroup;
+            if (this.form.competitionGroup) {
+                data.query.competitionGroup = this.form.competitionGroup;
             }
-            if (this.levelSettingId) {
-                data.query.levelSettingId = this.levelSettingId;
+            if (this.form.levelSettingId) {
+                data.query.levelSettingId = this.form.levelSettingId;
             }
-            if (this.gradingOrganizationId) {
-                data.query.gradingOrganizationId = this.gradingOrganizationId;
+            if (this.form.gradingOrganizationId) {
+                data.query.gradingOrganizationId = this.form.gradingOrganizationId;
             }
-            if (this.specialtyId) {
-                data.query.code = this.getCode(this.specialtyId);
+            if (this.form.specialtyId) {
+                data.query.code = this.getCode(this.form.specialtyId);
             }
-            if (this.name) {
-                data.query.name = this.name;
+            if (this.form.name) {
+                data.query.name = this.form.name;
             }
-            if (this.instructor) {
-                data.query.instructor = this.instructor;
+            if (this.form.instructor) {
+                data.query.instructor = this.form.instructor;
             }
             if (this.performanceId) {
                 data.query.performanceId = this.performanceId;
@@ -625,11 +620,7 @@ export default {
                 row.id;
         },
         clearSearch() {
-            this.competitionGroup = '';
-            this.levelSettingId = '';
-            this.gradingOrganizationId = '';
-            this.organizationId = '';
-            this.specialtyId = '';
+            this.form = {};
             this.getData();
         },
         getCode(value) {