licailing 4 ani în urmă
părinte
comite
6f7183ef70

+ 3 - 0
src/main/java/com/izouma/wenlvju/domain/performance/Performance.java

@@ -72,7 +72,10 @@ public class Performance extends BaseEntity {
     @ApiModelProperty(value = "复审比例")
     private BigDecimal reviewRatio;
 
+    @ApiModelProperty(value = "开启报名")
     private boolean close;
+
+    @ApiModelProperty(value = "开启评分")
     private boolean rate;
 
     @Transient

+ 2 - 1
src/main/java/com/izouma/wenlvju/dto/ProgrammeAwardDTO.java

@@ -17,6 +17,7 @@ import java.util.List;
 @NoArgsConstructor
 @AllArgsConstructor
 public class ProgrammeAwardDTO {
+    private Long id;
 
     private Long performanceId;
 
@@ -40,6 +41,6 @@ public class ProgrammeAwardDTO {
     private List<AwardDTO> awardDTOS;
 
     public ProgrammeAwardDTO(ProgrammeAward programmeAward) {
-        BeanUtil.copyProperties(this, programmeAward);
+        BeanUtil.copyProperties(programmeAward, this);
     }
 }

+ 40 - 0
src/main/java/com/izouma/wenlvju/dto/ProgrammeResultDTO.java

@@ -0,0 +1,40 @@
+package com.izouma.wenlvju.dto;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.wenlvju.domain.performance.Programme;
+import lombok.Data;
+
+@Data
+public class ProgrammeResultDTO {
+    @ExcelProperty(value = "节目名称")
+    private String name;
+
+    @ExcelProperty(value = "参赛专业")
+    private String specialty;
+
+    @ExcelProperty(value = "参赛组别")
+    private String competitionGroup;
+
+    @ExcelProperty(value = "参赛级别")
+    private String level;
+
+    @ExcelProperty(value = "考级机构")
+    private String gradingOrganization;
+
+    @ExcelProperty(value = "承办单位")
+    private String organization;
+
+    @ExcelProperty(value = "考级点")
+    private String examPoint;
+
+    @ExcelProperty(value = "参演人数")
+    private int quantity;
+
+    @ExcelProperty(value = "奖项")
+    private String award;
+
+    public ProgrammeResultDTO(Programme programme) {
+        BeanUtil.copyProperties(programme, this);
+    }
+}

+ 6 - 0
src/main/java/com/izouma/wenlvju/dto/ProgrammeScoreDTO.java

@@ -3,6 +3,7 @@ package com.izouma.wenlvju.dto;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.izouma.wenlvju.domain.performance.Programme;
+import com.izouma.wenlvju.enums.CompetitionGroup;
 import com.izouma.wenlvju.enums.SignedIn;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -45,6 +46,11 @@ public class ProgrammeScoreDTO {
     @ApiModelProperty(value = "节目文件附件")
     private String annex;
 
+    @ApiModelProperty(value = "参赛组别")
+    private CompetitionGroup competitionGroup;
+
+    @ApiModelProperty(value = "参赛级别")
+    private String levelSetting;
 
     private SignedIn signedIn;
 

+ 3 - 1
src/main/java/com/izouma/wenlvju/security/WebSecurityConfig.java

@@ -66,8 +66,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .antMatchers("/gradingOrganization/all").permitAll()
                 .antMatchers("/district").permitAll()
                 .antMatchers("/rate/export/**").permitAll()
-                .antMatchers("/pdf/web/**").permitAll()
                 .antMatchers("/rate/test").permitAll()
+                .antMatchers("/pdf/web/**").permitAll()
                 .antMatchers("/district/NJ").permitAll()
                 .antMatchers("/setting/byFlag").permitAll()
                 .antMatchers("/programme/getShow/**").permitAll()
@@ -75,8 +75,10 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .antMatchers("/programme/showAll").permitAll()
                 .antMatchers("/programme/getAuth").permitAll()
                 .antMatchers("/programme/getScore/**").permitAll()
+                .antMatchers("/programme/byScore").permitAll()
                 .antMatchers("/organization/byName").permitAll()
                 .antMatchers("/programmeScore/breakdown").permitAll()
+                .antMatchers("/programmeScore/mark").permitAll()
                 .antMatchers("/participant/byProgramme").permitAll()
                 .antMatchers("/upload/**").permitAll()
                 .antMatchers("/files/**").permitAll()

+ 21 - 2
src/main/java/com/izouma/wenlvju/service/performance/ProgrammeAwardService.java

@@ -15,6 +15,7 @@ import com.izouma.wenlvju.repo.AwardRepo;
 import com.izouma.wenlvju.repo.performance.ProgrammeAwardRepo;
 import com.izouma.wenlvju.repo.performance.ProgrammeRepo;
 import com.izouma.wenlvju.utils.JpaUtils;
+import com.izouma.wenlvju.utils.ObjUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
@@ -127,7 +128,7 @@ public class ProgrammeAwardService {
         }
 
         //总节目
-        List<Programme> programmeList =  programmeRepo.findAllByPerformanceIdAndProgrammeStatus(performanceId, ProgrammeStatus.AWARD);
+        List<Programme> programmeList = programmeRepo.findAllByPerformanceIdAndProgrammeStatus(performanceId, ProgrammeStatus.SUBMIT);
         List<ArtType> artTypes = all.stream()
                 .filter(artType -> ObjectUtil.isNull(artType.getParent()))
                 .collect(Collectors.toList());
@@ -272,7 +273,7 @@ public class ProgrammeAwardService {
     }
 
     public void saveProgramme1(List<ProgrammeAwardDTO> dtos) {
-        List<Programme> programmeList =  programmeRepo.findAllByPerformanceIdAndProgrammeStatus(dtos.get(0)
+        List<Programme> programmeList = programmeRepo.findAllByPerformanceIdAndProgrammeStatus(dtos.get(0)
                 .getPerformanceId(), ProgrammeStatus.AWARD);
 
         Map<Long, List<Programme>> programmeMap = programmeList.stream()
@@ -304,4 +305,22 @@ public class ProgrammeAwardService {
             }
         });
     }
+
+    public void batchSave(List<ProgrammeAwardDTO> dtos) {
+        List<Long> ids = dtos.stream().map(ProgrammeAwardDTO::getId).collect(Collectors.toList());
+        Map<Long, ProgrammeAward> proAwardMap = programmeAwardRepo.findAllById(ids)
+                .stream()
+                .collect(Collectors.toMap(ProgrammeAward::getId, programmeAward -> programmeAward));
+        List<ProgrammeAward> programmeAwards = dtos.stream().map(ProgrammeAward::new).collect(Collectors.toList());
+        programmeAwards.forEach(programmeAward -> {
+            if (ObjectUtil.isNotNull(programmeAward.getId())) {
+                ProgrammeAward orig = proAwardMap.get(programmeAward.getId());
+                ObjUtils.merge(orig, programmeAward);
+                programmeAwardRepo.save(orig);
+            } else {
+                programmeAwardRepo.save(programmeAward);
+            }
+        });
+//        programmeAwardRepo.saveAll(programmeAwards);
+    }
 }

+ 61 - 11
src/main/java/com/izouma/wenlvju/service/performance/ProgrammeService.java

@@ -67,6 +67,7 @@ public class ProgrammeService {
     private StorageService          storageService;
     private RateAuditRepo           rateAuditRepo;
     private UserService             userService;
+    private AwardRepo               awardRepo;
 
 
     public Page<Programme> all(PageQuery pageQuery) {
@@ -97,8 +98,8 @@ public class ProgrammeService {
         if (record.getId() != null) {
             Programme orig = programmeRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
             if (ProgrammeStatus.INITIAL.equals(orig.getProgrammeStatus())) {
-                Performance performance = performanceRepo.findById(orig.getPerformanceId())
-                        .orElseThrow(new BusinessException("无展演活动"));
+//                Performance performance = performanceRepo.findById(orig.getPerformanceId())
+//                        .orElseThrow(new BusinessException("无展演活动"));
 //                if (LocalDate.now().isAfter(performance.getEndDate())) {
 //                    throw new BusinessException("活动已报名结束!");
 //                }
@@ -107,8 +108,8 @@ public class ProgrammeService {
             orig.setParentSpecialtyId(artTypeService.getParent(orig.getSpecialtyId()));
             record = programmeRepo.save(orig);
         } else {
-            Performance performance = performanceRepo.findById(record.getPerformanceId())
-                    .orElseThrow(new BusinessException("无展演活动"));
+//            Performance performance = performanceRepo.findById(record.getPerformanceId())
+//                    .orElseThrow(new BusinessException("无展演活动"));
 //            if (LocalDate.now().isAfter(performance.getEndDate())) {
 //                throw new BusinessException("活动已报名结束!");
 //            }
@@ -776,12 +777,15 @@ public class ProgrammeService {
     /*
     专家查看并打分
      */
-    public Page<ProgrammeScoreDTO> byScore(PageQuery pageQuery, Long userId) {
+    public Page<ProgrammeScoreDTO> byScore(PageQuery pageQuery) {
         // 是否复审
         Map<String, Object> query = pageQuery.getQuery();
         Integer auditTimes = Convert.convert(Integer.class, query.get("auditTimes"));
         query.remove("auditTimes");
 
+        Long userId = Convert.convert(Long.class, query.get("userId"));
+        query.remove("userId");
+
         List<Long> arrangeId = arrangeJudgeRepo.findArrangeIdByExpertIdAndAuditTimes(userId, auditTimes);
         if (CollUtil.isEmpty(arrangeId)) {
             return new PageImpl<>(new ArrayList<>(), JpaUtils.toPageRequest(pageQuery), 0);
@@ -824,11 +828,14 @@ public class ProgrammeService {
             dto.setSpecialty(artTypeMap.get(programme.getSpecialtyId()));
             dto.setArrangeName(arrangeMap.get(programme.getArrangeId()));
             dto.setMyScore(scoreMap.get(programme.getId()));
-            List<String> participants = participantMap.get(programme.getId())
-                    .stream()
-                    .map(Participant::getName)
-                    .collect(Collectors.toList());
-            dto.setParticipant(participants);
+            if (CollUtil.isNotEmpty(participantMap.get(programme.getId()))) {
+                List<String> participants = participantMap.get(programme.getId())
+                        .stream()
+                        .map(Participant::getName)
+                        .collect(Collectors.toList());
+                dto.setParticipant(participants);
+            }
+
             return dto;
         });
     }
@@ -851,9 +858,14 @@ public class ProgrammeService {
                 .stream()
                 .collect(Collectors.toMap(ProgrammeScore::getProgrammeId, programmeScore -> programmeScore));
 
+        Map<Long, String> settingMap = settingRepo.findAllByFlagIn(CollUtil.newArrayList(3, 4))
+                .stream()
+                .collect(Collectors.toMap(Setting::getId, Setting::getName));
+
         return all.map(programme -> {
             ProgrammeScoreDTO dto = new ProgrammeScoreDTO(programme);
             dto.setSpecialty(artTypeMap.get(programme.getSpecialtyId()));
+            dto.setLevelSetting(settingMap.get(programme.getLevelSettingId()));
             // 初审/复审
             Arrange arrange = arranges.get(0);
             dto.setArrangeName(arrangeMap.get(arrange.getAuditTimes() > 1 ? programme.getReviewArrangeId() : programme.getArrangeId())
@@ -865,7 +877,7 @@ public class ProgrammeService {
                 dto.setRemark(programmeScore.getRemark());
                 dto.setSecond(programmeScore.isSecond());
             }
-            if (CollUtil.isNotEmpty(participantMap)){
+            if (CollUtil.isNotEmpty(participantMap)) {
                 List<String> participants = participantMap.get(programme.getId())
                         .stream()
                         .map(Participant::getName)
@@ -943,4 +955,42 @@ public class ProgrammeService {
         programmeRepo.saveAll(eliminate);
         rateAuditRepo.saveAll(rateAudits);
     }
+
+    public Page<ProgrammeResultDTO> result(PageQuery pageQuery) {
+        pageQuery.setSort("awardId,desc");
+        Page<Programme> all = this.all2(pageQuery);
+        List<Programme> programmes = all.getContent();
+        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));
+
+        Map<Long, String> awardMap = awardRepo.findAll()
+                .stream()
+                .collect(Collectors.toMap(Award::getId, Award::getName));
+
+        return all.map(programme -> {
+            ProgrammeResultDTO dto = new ProgrammeResultDTO(programme);
+            dto.setAward(awardMap.get(programme.getAwardId()));
+            dto.setOrganization(organizationMap.get(programme.getOrganizationId()));
+            dto.setGradingOrganization(organizationMap.get(programme.getGradingOrganizationId()));
+            dto.setSpecialty(artTypeMap.get(programme.getSpecialtyId()));
+            dto.setGradingOrganization(gradeMap.get(programme.getGradingOrganizationId()));
+            dto.setLevel(settingMap.get(programme.getLevelSettingId()));
+            dto.setCompetitionGroup(programme.getCompetitionGroup().equals(CompetitionGroup.SINGLE) ? "个人" : "集体");
+            return dto;
+        });
+    }
 }

+ 6 - 2
src/main/java/com/izouma/wenlvju/web/performance/ProgrammeAwardController.java

@@ -74,8 +74,12 @@ public class ProgrammeAwardController extends BaseController {
 
     @PostMapping("/batchSave")
     public void batchSave(@RequestBody List<ProgrammeAwardDTO> dtos) {
-        List<ProgrammeAward> programmeAwards = dtos.stream().map(ProgrammeAward::new).collect(Collectors.toList());
-        programmeAwardRepo.saveAll(programmeAwards);
+        programmeAwardService.batchSave(dtos);
+    }
+
+    @PostMapping("/saveProgramme")
+    public void saveProgramme(@RequestBody List<ProgrammeAwardDTO> dtos) {
+        programmeAwardService.saveProgramme1(dtos);
     }
 }
 

+ 12 - 1
src/main/java/com/izouma/wenlvju/web/performance/ProgrammeController.java

@@ -171,7 +171,7 @@ public class ProgrammeController extends BaseController {
     @PostMapping("/byScore")
     @ApiOperation("专家电脑端查看")
     public Page<ProgrammeScoreDTO> byScore(@RequestBody PageQuery pageQuery) {
-        return programmeService.byScore(pageQuery, SecurityUtils.getAuthenticatedUser().getId());
+        return programmeService.byScore(pageQuery);
     }
 
     @PreAuthorize("hasRole('ADMIN')")
@@ -227,5 +227,16 @@ public class ProgrammeController extends BaseController {
     public void review(@RequestParam Long performanceId, int pass) {
         programmeService.review(performanceId, pass, SecurityUtils.getAuthenticatedUser().getId());
     }
+
+    @PostMapping("/result")
+    public Page<ProgrammeResultDTO> result(PageQuery pageQuery) {
+        return programmeService.result(pageQuery);
+    }
+
+    @PostMapping("/excelResult")
+    public void excelResult(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<ProgrammeResultDTO> data = this.result(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
 }
 

+ 16 - 12
src/main/vue/src/router.js

@@ -672,17 +672,6 @@ const router = new Router({
                         title: '节目签到'
                     }
                 },
-                {
-                    path: '/programmeScoreList',
-                    name: 'ProgrammeScoreList',
-                    component: () =>
-                        import(
-                            /* webpackChunkName: "programmeScoreList" */ '@/views/performance/ProgrammeScoreList.vue'
-                        ),
-                    meta: {
-                        title: '节目评审'
-                    }
-                },
                 {
                     path: '/progScoreAdminList',
                     name: 'ProgScoreAdminList',
@@ -868,6 +857,16 @@ const router = new Router({
             meta: {
                 title: '节目列表'
             }
+        },
+        /**节目评审 */
+        {
+            path: '/programmeScoreList',
+            name: 'ProgrammeScoreList',
+            component: () =>
+                import(/* webpackChunkName: "programmeScoreList" */ '@/views/performance/ProgrammeScoreList.vue'),
+            meta: {
+                title: '节目评审'
+            }
         }
     ]
 });
@@ -891,7 +890,12 @@ router.beforeEach((to, from, next) => {
         return;
     }
     // console.log(store.state.isORGANIZER);
-    if (!store.state.userInfo && to.path !== '/login' && to.path !== '/programmeGOList') {
+    if (
+        !store.state.userInfo &&
+        to.path !== '/login' &&
+        to.path !== '/programmeGOList' &&
+        to.path !== '/programmeScoreList'
+    ) {
         store
             .dispatch('getUserInfo')
             .then(() => {

+ 4 - 1
src/main/vue/src/views/performance/PerformanceEdit.vue

@@ -120,7 +120,10 @@
             <el-form-item prop="codeImg" label="活动工作群">
                 <single-upload v-model="formData.codeImg"></single-upload>
             </el-form-item>
-            <el-form-item prop="close" label="开启">
+            <el-form-item prop="rate" label="开启评分">
+                <el-switch v-model="formData.rate"></el-switch>
+            </el-form-item>
+            <el-form-item prop="close" label="开启报名">
                 <el-switch v-model="formData.close"></el-switch>
             </el-form-item>
         </el-form>

+ 12 - 2
src/main/vue/src/views/performance/PerformanceList.vue

@@ -71,7 +71,7 @@
                     <el-button @click="showRow(row)" size="mini" plain>
                         查看
                     </el-button>
-                    <el-button @click="editRow(row)" type="success" size="mini" plain>
+                    <el-button @click="editRow(row)" type="success" size="mini" plain v-if="display">
                         编辑
                     </el-button>
                     <el-button
@@ -138,12 +138,14 @@ export default {
                 { label: '分组中', value: 'ARRANGE' },
                 { label: '分配评委中', value: 'ARRANGE_JUDGE' },
                 { label: '待签到', value: 'SIGN_IN' }
-            ]
+            ],
+            display: false
         };
     },
     created() {
         this.currentTime = format(new Date(), 'yyyy-MM-dd');
         // console.log(this.currentTime);
+        this.getAdmin();
     },
     computed: {
         selection() {
@@ -263,6 +265,14 @@ export default {
                         this.$message.error(e.error);
                     }
                 });
+        },
+        getAdmin() {
+            let data = this.userInfo.authorities;
+            data.forEach(element => {
+                if (element.name === 'ROLE_ADMIN') {
+                    this.display = true;
+                }
+            });
         }
     }
 };

+ 23 - 7
src/main/vue/src/views/performance/ProgScoreAdminList.vue

@@ -71,7 +71,9 @@
             <el-table-column prop="name" label="节目名称" min-width="70"> </el-table-column>
             <el-table-column prop="specialty" label="参赛专业"> </el-table-column>
             <el-table-column prop="participant" label="参赛人员" show-overflow-tooltip>
-                <template slot-scope="{ row }">{{ row.participant.join(',') }}</template>
+                <template slot-scope="{ row }">{{
+                    row.participant ? row.participant.join(',') : row.participant
+                }}</template>
             </el-table-column>
             <el-table-column prop="quantity" label="表演人数" min-width="70"> </el-table-column>
             <el-table-column prop="signedIn" label="状态" :formatter="signedInFormatter" v-if="!performance.online">
@@ -130,19 +132,30 @@
             </el-pagination>
         </div>
 
-        <el-dialog class="videoDialog" destroy-on-close center append-to-body :visible.sync="showViedo" width="60%">
+        <el-dialog
+            :title="programme.name"
+            class="videoDialog"
+            destroy-on-close
+            center
+            append-to-body
+            :visible.sync="showViedo"
+            width="auto"
+        >
             <video
                 :src="programme.video"
                 controls
-                style="height: 600px; width: 85%; margin: 0 auto"
+                style="max-height: 600px; max-width: 100%; margin: 0 auto"
                 v-if="programme.video"
             >
                 您的浏览器不支持 video 标签。
             </video>
-            <div style="height: 85%; width: 85%;margin: 0 auto">
-                <img style="height: 100%; width: 100%; " :src="programme.annex" alt="" v-if="programme.annex" />
-            </div>
-            <el-card shadow="never" style="width: 85%; margin: 10px auto">
+            <img
+                style="max-height: 600px; max-width: 100%; display: block; margin: auto"
+                :src="programme.annex"
+                alt=""
+                v-if="programme.annex"
+            />
+            <el-card shadow="never" style="width: 100%; margin: 10px auto">
                 <el-form :form="programme">
                     <el-form-item label="分数">
                         <span v-if="!programme.second">{{ programme.score }}</span>
@@ -388,6 +401,9 @@ export default {
                     this.saving = false;
                     this.$message.success('成功');
                     this.getData();
+                    if (showViedo) {
+                        this.programme = JSON.parse(res);
+                    }
                 })
                 .catch(e => {
                     console.log(e);

+ 16 - 1
src/main/vue/src/views/performance/ProgrammeAwardList.vue

@@ -374,6 +374,7 @@ export default {
                     this.saving = false;
                     this.$message.success('成功');
                     this.getData();
+                    this.canEdit = false;
                 })
                 .catch(e => {
                     console.log(e);
@@ -381,7 +382,21 @@ export default {
                     this.$message.error(e.error);
                 });
         },
-        saveProgramme() {}
+        saveProgramme() {
+            let data = this.tableData;
+            this.$http
+                .post('/programmeAward/saveProgramme', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('奖项生成成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        }
     }
 };
 </script>

+ 111 - 215
src/main/vue/src/views/performance/ProgrammeResultList.vue

@@ -4,35 +4,15 @@
             <el-form :model="form" inline size="mini" label-width="100px">
                 <el-row>
                     <el-col :span="8">
-                        <el-form-item label="活动名称">
+                        <el-form-item label="展演活动名称">
                             <el-select
                                 v-model="performanceId"
-                                clearable
                                 filterable
-                                placeholder="活动名称"
+                                placeholder="展演活动名称"
                                 style="width: 100%"
                             >
                                 <el-option
                                     v-for="item in performances"
-                                    :key="item.id"
-                                    :label="item.name"
-                                    :value="item.id"
-                                >
-                                </el-option>
-                            </el-select>
-                        </el-form-item>
-                    </el-col>
-                    <el-col :span="8">
-                        <el-form-item label="考级机构名称">
-                            <el-select
-                                v-model="gradingOrganizationId"
-                                clearable
-                                filterable
-                                placeholder="考级机构"
-                                style="width: 100%"
-                            >
-                                <el-option
-                                    v-for="item in gradingOrganizationIdOptions"
                                     :key="item.value"
                                     :label="item.label"
                                     :value="item.value"
@@ -41,18 +21,12 @@
                             </el-select>
                         </el-form-item>
                     </el-col>
-                    <el-col :span="8"
-                        ><el-form-item label="考级点名称">
-                            <el-input placeholder="考级点名称" v-model="search" clearable></el-input> </el-form-item
-                    ></el-col>
-                </el-row>
-                <el-row>
                     <el-col :span="8">
                         <el-form-item label="参赛专业">
                             <el-cascader
                                 ref="artCascader"
                                 style="width: 100%"
-                                v-model="specialtyId"
+                                v-model="form.specialtyId"
                                 :props="optionProps"
                                 :options="artTypes"
                                 :show-all-levels="false"
@@ -62,93 +36,86 @@
                             </el-cascader>
                         </el-form-item>
                     </el-col>
-                    <el-col :span="8"
-                        ><el-form-item label="参赛组别">
-                            <el-select v-model="competitionGroup" clearable filterable placeholder="参赛组别">
-                                <el-option
-                                    v-for="item in competitionGroupOptions"
-                                    :key="item.value"
-                                    :label="item.label"
-                                    :value="item.value"
-                                >
-                                </el-option>
-                            </el-select> </el-form-item
-                    ></el-col>
-                    <el-col :span="8"
-                        ><el-form-item label="参赛级别" v-if="competitionGroup">
-                            <el-select
-                                v-model="levelSettingId"
-                                clearable
-                                filterable
-                                placeholder="参赛级别"
-                                style="width: 100%"
-                                v-if="competitionGroup == 'SINGLE'"
-                            >
-                                <el-option
-                                    v-for="item in levelSingleOptions"
-                                    :key="item.value"
-                                    :label="item.label"
-                                    :value="item.value"
-                                >
-                                    <span style="float: left">{{ item.label }}</span>
-                                    <span style="float: right; color: #8492a6; font-size: 13px">{{ item.desc }}</span>
-                                </el-option>
-                            </el-select>
-                            <el-select
-                                v-model="levelSettingId"
-                                clearable
-                                filterable
-                                placeholder="请选择"
-                                style="width: 100%"
-                                v-else
-                            >
-                                <el-option
-                                    v-for="item in levelCollectiveOptions"
-                                    :key="item.value"
-                                    :label="item.label"
-                                    :value="item.value"
-                                >
-                                    <span style="float: left">{{ item.label }}</span>
-                                    <span style="float: right; color: #8492a6; font-size: 13px">{{ item.desc }}</span>
-                                </el-option>
-                            </el-select>
-                        </el-form-item>
-                    </el-col>
-                </el-row>
-                <el-row>
                     <el-col :span="8">
                         <el-form-item label="节目名称">
-                            <el-input placeholder="节目名称" v-model="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.name" clearable></el-input>
                         </el-form-item>
                     </el-col>
                 </el-row>
-                <el-form-item>
-                    <el-button @click="canAdd" type="primary" icon="el-icon-search">查询 </el-button>
-                    <el-button @click="addRow" type="primary" icon="el-icon-plus" v-if="add">添加 </el-button>
-                    <el-upload
-                        :action="uploadUrl"
-                        :before-upload="beforeUpload"
-                        :headers="headers"
-                        :show-file-list="false"
-                        ref="upload"
-                        :on-success="onSuccess"
-                        class="uploader"
-                        :on-error="onfail"
+                <el-collapse-transition>
+                    <div v-show="showMore">
+                        <el-row>
+                            <el-col :span="8">
+                                <el-form-item label="考级机构名称">
+                                    <el-select
+                                        v-model="form.gradingOrganizationId"
+                                        clearable
+                                        filterable
+                                        placeholder="考级机构"
+                                        style="width: 100%"
+                                    >
+                                        <el-option
+                                            v-for="item in gradingOrganizationIdOptions"
+                                            :key="item.value"
+                                            :label="item.label"
+                                            :value="item.value"
+                                        >
+                                        </el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="承办单位名称">
+                                    <el-select
+                                        v-model="form.organizationId"
+                                        clearable
+                                        filterable
+                                        placeholder="承办单位"
+                                        style="width: 100%"
+                                    >
+                                        <el-option
+                                            v-for="item in organizationIdOptions"
+                                            :key="item.value"
+                                            :label="item.label"
+                                            :value="item.value"
+                                        >
+                                        </el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+
+                            <el-col :span="8"
+                                ><el-form-item label="考级点名称">
+                                    <el-input
+                                        placeholder="考级点名称"
+                                        v-model="search"
+                                        clearable
+                                    ></el-input> </el-form-item
+                            ></el-col>
+                        </el-row>
+                    </div>
+                </el-collapse-transition>
+                <div style="width:100%;textAlign:center;margin-bottom:10px;">
+                    <el-button
+                        class="more"
+                        round
+                        type="primary"
+                        :plain="!showMore"
+                        :icon="showMore ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"
+                        @click="showMore = !showMore"
+                        size="mini"
+                        >{{ showMore ? '隐藏查询区域' : '显示查询区域' }}</el-button
                     >
-                        <el-button slot="trigger" type="primary" icon="el-icon-upload2" v-if="add">批量上传</el-button>
-                    </el-upload>
+                </div>
+                <el-form-item>
+                    <el-button @click="getData" type="primary" icon="el-icon-search">查询 </el-button>
                     <el-button
-                        @click="download"
+                        @click="downloadProgramme"
                         type="primary"
                         icon="el-icon-download"
                         :loading="downloading"
                         :disabled="totalElements < 1"
-                        >导出
+                        >导出节目
                     </el-button>
                 </el-form-item>
             </el-form>
@@ -167,32 +134,16 @@
             <!-- <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="competitionGroup" label="参赛组别" min-width="70"> </el-table-column>
             <el-table-column prop="level" 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 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="award" label="获奖情况" min-width="95"> </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"
@@ -211,8 +162,6 @@
 import delChild from '@/mixins/delChild';
 import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
-import QrcodeVue from 'qrcode.vue';
-import resolveUrl from 'resolve-url';
 import { format } from 'date-fns';
 
 export default {
@@ -222,7 +171,7 @@ export default {
         return {
             multipleMode: false,
             search: '',
-            url: '/programme/backAll',
+            url: '/programme/result',
             downloading: false,
             competitionGroupOptions: [
                 { label: '个人', value: 'SINGLE' },
@@ -234,7 +183,6 @@ export default {
             levelCollectiveOptions: [],
             levelSettingId: '',
             dialogUrl: '',
-            dialogCode: false,
             gradingOrganizationIdOptions: [],
             gradingOrganizationId: '',
             performanceId: '',
@@ -254,14 +202,12 @@ export default {
             videoUrl: '',
             name: '',
             instructor: '',
-            uploadUrl: '',
-            currentTime: '',
-            add: false
+            showMore: false,
+            downloadProgramme: false,
+            organizationIdOptions: []
         };
     },
     created() {
-        this.uploadUrl = resolveUrl(this.$baseUrl, 'programme/upload');
-        this.currentTime = format(new Date(), 'yyyy-MM-dd');
         this.$http
             .post('/setting/byFlag', { flag: 3 })
             .then(res => {
@@ -315,6 +261,22 @@ export default {
                 console.log(e);
                 this.$message.error(e.error);
             });
+        this.$http
+            .post('/organization/all', { size: 1000, query: { del: false } }, { body: 'json' })
+            .then(res => {
+                if (res.content.length > 0) {
+                    res.content.forEach(item => {
+                        this.organizationIdOptions.push({
+                            label: item.name,
+                            value: item.id
+                        });
+                    });
+                }
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
         this.$http
             .post(
                 '/performance/all',
@@ -329,16 +291,14 @@ export default {
             )
             .then(res => {
                 if (res.content.length > 0) {
-                    // res.content.forEach(item => {
-                    //     this.performances.push({
-                    //         label: item.name,
-                    //         value: item.id
-                    //     });
-                    // });
-                    this.performances = res.content;
+                    res.content.forEach(item => {
+                        this.performances.push({
+                            label: item.name,
+                            value: item.id
+                        });
+                    });
                     if (!this.$route.query.pid) {
                         this.performanceId = res.content[0].id;
-                        this.canAdd();
                     }
                 }
             })
@@ -376,29 +336,24 @@ export default {
         },
         beforeGetData() {
             let data = {
-                sort: 'createdAt,desc',
-                query: {}
+                query: {
+                    programmeStatus: 'SUBMIT'
+                }
             };
-            if (this.competitionGroup) {
-                data.query.competitionGroup = this.competitionGroup;
+            if (this.form.gradingOrganizationId) {
+                data.query.gradingOrganizationId = this.form.gradingOrganizationId;
             }
-            if (this.levelSettingId) {
-                data.query.levelSettingId = this.levelSettingId;
+            if (this.form.organizationId) {
+                data.query.organizationId = this.form.organizationId;
             }
-            if (this.gradingOrganizationId) {
-                data.query.gradingOrganizationId = this.gradingOrganizationId;
+            if (this.form.specialtyId) {
+                data.query.code = this.getCode(this.form.specialtyId);
             }
             if (this.performanceId) {
                 data.query.performanceId = this.performanceId;
             }
-            if (this.specialtyId) {
-                data.query.code = this.getCode(this.specialtyId);
-            }
-            if (this.name) {
-                data.query.name = this.name;
-            }
-            if (this.instructor) {
-                data.query.instructor = this.instructor;
+            if (this.form.name) {
+                data.query.name = this.form.name;
             }
             return data;
         },
@@ -447,7 +402,7 @@ export default {
                 data.query.performanceId = this.performanceId;
             }
             this.$axios
-                .get('/programme/excel', {
+                .get('/programme/excelResult', {
                     responseType: 'blob',
                     params: data
                 })
@@ -468,27 +423,6 @@ export default {
                     this.$message.error(e.error);
                 });
         },
-        downloadTemp() {
-            this.$axios
-                .get('/programme/excelTemp', {
-                    responseType: 'blob'
-                })
-                .then(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: '提示',
@@ -513,17 +447,6 @@ export default {
                     }
                 });
         },
-        clearSearch() {
-            this.competitionGroup = '';
-            this.levelSettingId = '';
-            this.gradingOrganizationId = '';
-            this.organizationId = '';
-            this.specialtyId = '';
-            this.getData();
-        },
-        getCode(value) {
-            return this.forTree(this.artTypes, value).code;
-        },
         forTree(list, value) {
             var result = null;
             if (!list) {
@@ -542,33 +465,6 @@ export default {
                 }
             }
             return result;
-        },
-        onfail(e) {
-            console.log(e);
-            this.$message.error('失败');
-            this.getData();
-        },
-        onSuccess() {
-            this.$message.success('上传成功');
-            this.getData();
-        },
-        beforeUpload() {
-            return this.$confirm('确认要上传文件吗?', '提示', {
-                confirmButtonText: '确定',
-                cancelButtonText: '取消',
-                type: 'warning'
-            });
-        },
-        canAdd() {
-            let data = this.performances.find(item => {
-                return item.id == this.performanceId;
-            });
-            if (data.endDate >= this.currentTime) {
-                this.add = true;
-            } else {
-                this.add = false;
-            }
-            this.getData();
         }
     }
 };

+ 99 - 66
src/main/vue/src/views/performance/ProgrammeScoreList.vue

@@ -3,7 +3,7 @@
         <div class="filters-container">
             <el-form :model="form" size="mini" inline>
                 <el-row>
-                    <el-col :span="24">
+                    <!-- <el-col :span="24">
                         <el-form-item label="活动名称">
                             <el-select
                                 v-model="performanceId"
@@ -25,7 +25,7 @@
                         <el-form-item>
                             <el-button @click="getData" type="primary" icon="el-icon-search">查询 </el-button>
                         </el-form-item>
-                    </el-col>
+                    </el-col> -->
                     <div v-if="!online">
                         <el-form-item label="活动日期">
                             <el-date-picker v-model="date" type="date" placeholder="选择日期" class="filter-item">
@@ -48,7 +48,6 @@
                             </el-select>
                         </el-form-item>
                     </div>
-                    <!-- <el-form-item label="评审专家"></el-form-item> -->
                 </el-row>
             </el-form>
         </div>
@@ -61,13 +60,20 @@
             row-class-name="table-row"
             cell-class-name="table-cell"
             :height="tableHeight"
-            :span-method="objectSpanMethod"
         >
             <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="arrangeName" label="分组" min-width="160"> </el-table-column>
+            <el-table-column prop="id" label="节目编号" width="100"> </el-table-column>
+            <!-- <el-table-column prop="arrangeName" label="分组" min-width="160"> </el-table-column> -->
             <el-table-column prop="name" label="节目名称" min-width="70"> </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="levelSetting" label="参赛级别" min-width="70"> </el-table-column>
             <el-table-column prop="participant" label="参赛人员" show-overflow-tooltip>
                 <template slot-scope="{ row }">{{
                     row.participant ? row.participant.join(',') : row.participant
@@ -76,10 +82,11 @@
             <el-table-column prop="quantity" label="表演人数" min-width="70"> </el-table-column>
             <el-table-column prop="signedIn" label="状态" :formatter="signedInFormatter" v-if="!online">
             </el-table-column>
-            <el-table-column prop="score" label="成绩"> </el-table-column>
-            <el-table-column prop="myScore" label="评分" align="center" min-width="120">
+            <!-- <el-table-column prop="score" label="成绩"> </el-table-column> -->
+            <el-table-column prop="myScore" label="评分" align="center" min-width="80">
                 <template slot-scope="{ row }">
-                    <span>{{ row.myScore }}</span>
+                    <span v-if="!row.myScore">暂无</span>
+                    <span v-else>{{ row.myScore }}</span>
                     <!-- <el-input-number
                         v-else
                         v-model="row.myScore"
@@ -95,9 +102,10 @@
                     </el-input-number> -->
                 </template>
             </el-table-column>
-            <el-table-column prop="remark" label="备注" align="center" min-width="120">
+            <el-table-column prop="remark" label="备注" align="center" min-width="80">
                 <template slot-scope="{ row }">
-                    <span>{{ row.remark }}</span>
+                    <span v-if="!row.remark">暂无</span>
+                    <span v-else>{{ row.remark }}</span>
                     <!-- <el-input
                         v-else
                         size="mini"
@@ -136,19 +144,30 @@
             </el-pagination>
         </div>
 
-        <el-dialog class="videoDialog" destroy-on-close center append-to-body :visible.sync="showViedo" width="60%">
+        <el-dialog
+            :title="programme.name"
+            class="videoDialog"
+            destroy-on-close
+            center
+            append-to-body
+            :visible.sync="showViedo"
+            width="auto"
+        >
             <video
                 :src="programme.video"
                 controls
-                style="height: 600px; width: 85%; margin: 0 auto"
+                style="max-height: 600px; max-width: 100%; margin: 0 auto"
                 v-if="programme.video"
             >
                 您的浏览器不支持 video 标签。
             </video>
-            <div style="height: 85%; width: 85%;margin: 0 auto">
-                <img style="height: 100%; width: 100%; " :src="programme.annex" alt="" v-if="programme.annex" />
-            </div>
-            <el-card shadow="never" style="width: 85%; margin: 10px auto">
+            <img
+                style="max-height: 600px; max-width: 100%; display: block; margin: auto"
+                :src="programme.annex"
+                alt=""
+                v-if="programme.annex"
+            />
+            <el-card shadow="never" style="width: 100%; margin: 10px auto">
                 <el-form :form="programme">
                     <el-form-item label="分数">
                         <!-- <span v-if="programme.second">{{ programme.myScore }}</span> -->
@@ -205,7 +224,6 @@
 import delChild from '@/mixins/delChild';
 import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
-import QrcodeVue from 'qrcode.vue';
 import { format, isSameDay, startOfDay } from 'date-fns';
 import endOfDay from 'date-fns/endOfDay';
 import addHours from 'date-fns/addHours';
@@ -239,56 +257,60 @@ export default {
             showViedo: false,
             programme: {},
             index: 0,
-            online: true
+            online: true,
+            competitionGroupOptions: [
+                { label: '个人', value: 'SINGLE' },
+                { label: '集体', value: 'COLLECTIVE' }
+            ]
         };
     },
     created() {
         this.morning = isSameDay(addHours(new Date(), 12), new Date());
 
-        this.$http
-            .post(
-                '/performance/all',
-                {
-                    size: 1000,
-                    sort: 'year,desc',
-                    query: {
-                        publish: true
-                    }
-                },
-                { body: 'json' }
-            )
-            .then(res => {
-                if (res.content.length > 0) {
-                    res.content.forEach(item => {
-                        this.performances.push({
-                            label: item.name,
-                            value: item.id
-                        });
-                    });
-                    this.setPerformance(res.content[0]);
-                    this.getData();
-                    this.$http
-                        .post('/performanceSchedule/all', { size: 100 }, { body: 'json' })
-                        .then(res => {
-                            if (res.content.length > 0) {
-                                res.content.forEach(item => {
-                                    this.addressList.push({
-                                        value: item.address,
-                                        pid: item.performanceId
-                                    });
-                                });
-                            }
-                        })
-                        .catch(e => {
-                            console.log(e);
-                            this.$message.error(e.error);
-                        });
-                }
-            })
-            .catch(e => {
-                console.log(e);
-                this.$message.error(e.error);
-            });
+        // this.$http
+        //     .post(
+        //         '/performance/all',
+        //         {
+        //             size: 1000,
+        //             sort: 'year,desc',
+        //             query: {
+        //                 publish: true
+        //             }
+        //         },
+        //         { body: 'json' }
+        //     )
+        //     .then(res => {
+        //         if (res.content.length > 0) {
+        //             res.content.forEach(item => {
+        //                 this.performances.push({
+        //                     label: item.name,
+        //                     value: item.id
+        //                 });
+        //             });
+        //             this.setPerformance(res.content[0]);
+        //             this.getData();
+        //             this.$http
+        //                 .post('/performanceSchedule/all', { size: 100 }, { body: 'json' })
+        //                 .then(res => {
+        //                     if (res.content.length > 0) {
+        //                         res.content.forEach(item => {
+        //                             this.addressList.push({
+        //                                 value: item.address,
+        //                                 pid: item.performanceId
+        //                             });
+        //                         });
+        //                     }
+        //                 })
+        //                 .catch(e => {
+        //                     console.log(e);
+        //                     this.$message.error(e.error);
+        //                 });
+        //         }
+        //     })
+        //     .catch(e => {
+        //         console.log(e);
+        //         this.$message.error(e.error);
+        //     });
     },
     computed: {
         selection() {
@@ -299,6 +321,13 @@ export default {
         }
     },
     methods: {
+        competitionGroupFormatter(row, column, cellValue, index) {
+            let selectedOption = this.competitionGroupOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
         signedInFormatter(row, column, cellValue, index) {
             let selectedOption = this.signedInOptions.find(i => i.value === cellValue);
             if (selectedOption) {
@@ -318,6 +347,9 @@ export default {
             if (this.review) {
                 data.query.auditTimes = this.performance.auditTimes || 1;
             }
+            if (this.$route.query.eid) {
+                data.query.userId = this.$route.query.eid;
+            }
             // if (this.date) {
             //     if (this.morning) {
             //         data.query.showBegin = [
@@ -382,14 +414,15 @@ export default {
                 programmeId: row.id,
                 score: row.myScore,
                 remark: row.remark,
-                performanceId: row.performanceId
+                performanceId: row.performanceId,
+                expertId: this.$route.query.eid
             };
             this.$http
-                .post('/programmeScore/saveScore', record, { body: 'json' })
+                .post('/programmeScore/mark', record, { body: 'json' })
                 .then(res => {
                     this.$message.success('评分成功');
                     this.getData();
-                    this.programme = res;
+                    this.programme = JSON.parse(res);
                 })
                 .catch(e => {
                     this.$message.error(e.error);