瀏覽代碼

Merge branch 'Regulation' of http://git.izouma.com/licailing/wenlvju into Regulation

xuqiang 4 年之前
父節點
當前提交
61e9e2b972

+ 12 - 0
src/main/h5/src/views/expert/expertAdd.vue

@@ -182,6 +182,10 @@ export default {
       });
     });
 
+    this.$http.get("/rate/get/" + this.$route.query.rateId).then(res => {
+      this.form.remark = res.remark;
+    });
+
     this.$http
       .post(
         "/rateExpertAudit/all",
@@ -298,6 +302,14 @@ export default {
         })
         .then(() => {
           this.$toast.success("成功");
+          // return this.$http.post(
+          //   "/rate/save",
+          //   {
+          //     id: this.$route.query.rateId,
+          //     remark: form.remark
+          //   },
+          //   { body: "json" }
+          // );
         })
         .catch(e => {
           console.log(e);

+ 1 - 0
src/main/java/com/izouma/wenlvju/domain/Rate.java

@@ -146,6 +146,7 @@ public class Rate extends BaseEntity {
     @Convert(converter = ReviewTimeListConverter.class)
     private List<ReviewTime> reviewTimes = new ArrayList<>();
 
+    @Column(columnDefinition = "TEXT")
     private String remark;
 
     private boolean isRejected;

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

@@ -8,10 +8,9 @@ import com.izouma.wenlvju.domain.BaseEntity;
 import com.izouma.wenlvju.domain.VideoObject;
 import com.izouma.wenlvju.dto.ProgUploadDTO;
 import com.izouma.wenlvju.dto.ProgrammeDTO;
-import com.izouma.wenlvju.enums.ProgrammeProcess;
+import com.izouma.wenlvju.enums.CompetitionGroup;
 import com.izouma.wenlvju.enums.ProgrammeStatus;
 import com.izouma.wenlvju.enums.SignedIn;
-import com.izouma.wenlvju.enums.CompetitionGroup;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;

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

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

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

@@ -17,11 +17,12 @@ public interface ProgrammeRepo extends JpaRepository<Programme, Long>, JpaSpecif
     @Transactional
     void softDelete(Long id);
 
-    long countAllByPerformanceId(Long performanceId);
-
     List<Programme> findAllByPerformanceIdAndProgrammeStatus(Long performanceId, ProgrammeStatus status);
 
-    long countAllByArrangeIdAndProgrammeStatusIsNotNull(Long arrangeId);
+    @Query("select id from Programme where del = false and performanceId = ?1 and programmeStatus = ?2")
+    List<Long> findIdByPerformanceIdAndProgrammeStatus(Long performanceId, ProgrammeStatus status);
+
+    long countAllByArrangeIdAndSignedInIsNull(Long arrangeId);
 
     @Query("update Programme t set t.allSigned = true where t.arrangeId = ?1")
     @Modifying

+ 4 - 2
src/main/java/com/izouma/wenlvju/service/RateService.java

@@ -66,7 +66,7 @@ public class RateService {
             Rate orig = rateRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
             boolean examination = orig.isUndertakeExamination();
             ObjUtils.merge(orig, record);
-
+//            if (ObjectUtil.isNotNull(record.getStatus())) {
             switch (record.getStatus()) {
                 case FIRST_REVIEW_PENDING: // 初审中 1
                     orig.setApplyTime(now);
@@ -100,6 +100,7 @@ public class RateService {
                     break;
             }
             orig.setSort(orig.getStatus().getSort());
+//            }
             return rateRepo.save(orig);
 
         }
@@ -472,7 +473,8 @@ public class RateService {
                 .stream()
                 .collect(Collectors.toMap(User::getId, user -> user));
         if (!rate.isChange()) {
-            Organization organization = organizationRepo.findById(rate.getId()).orElseThrow(new BusinessException("无记录"));
+            Organization organization = organizationRepo.findById(rate.getId())
+                    .orElseThrow(new BusinessException("无记录"));
             rate.setAddress(organization.getAddress());
         }
 

+ 7 - 1
src/main/java/com/izouma/wenlvju/service/performance/ArrangeJudgeService.java

@@ -8,6 +8,7 @@ import com.izouma.wenlvju.domain.performance.Arrange;
 import com.izouma.wenlvju.domain.performance.ArrangeJudge;
 import com.izouma.wenlvju.dto.PageQuery;
 import com.izouma.wenlvju.exception.BusinessException;
+import com.izouma.wenlvju.repo.RateAuditRepo;
 import com.izouma.wenlvju.repo.UserRepo;
 import com.izouma.wenlvju.repo.performance.ArrangeJudgeRepo;
 import com.izouma.wenlvju.repo.performance.ArrangeRepo;
@@ -31,6 +32,7 @@ public class ArrangeJudgeService {
     private ArrangeRepo      arrangeRepo;
     private UserRepo         userRepo;
     private NjwlSmsService   njwlSmsService;
+    private RateAuditRepo    rateAuditRepo;
 
     public Page<ArrangeJudge> all(PageQuery pageQuery) {
         return arrangeJudgeRepo.findAll(JpaUtils.toSpecification(pageQuery, ArrangeJudge.class), JpaUtils.toPageRequest(pageQuery));
@@ -41,6 +43,7 @@ public class ArrangeJudgeService {
         List<Long> expertIds = converter.convertToEntityAttribute(experts);
         List<Long> arrangeIds = converter.convertToEntityAttribute(arranges);
         Arrange arrange = arrangeRepo.findById(arrangeIds.get(0)).orElseThrow(new BusinessException("无分组"));
+
         LocalDate date = arrange.getDate();
         Boolean morning = arrange.getMorning();
         if (ObjectUtil.isNotNull(date)) {
@@ -85,6 +88,9 @@ public class ArrangeJudgeService {
                 .stream()
                 .map(User::getPhone)
                 .collect(Collectors.joining(","));
-        njwlSmsService.sendSms(phones,"已分配您评审节目,链接为http://yskj.njlyw.cn:8081/h5/login");
+        njwlSmsService.sendSms(phones, "已分配您评审节目,链接为http://yskj.njlyw.cn:8081/h5/login");
+
+        //记录
+
     }
 }

+ 28 - 6
src/main/java/com/izouma/wenlvju/service/performance/ArrangeService.java

@@ -1,9 +1,9 @@
 package com.izouma.wenlvju.service.performance;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.izouma.wenlvju.domain.ArtType;
+import com.izouma.wenlvju.domain.RateAudit;
 import com.izouma.wenlvju.domain.User;
 import com.izouma.wenlvju.domain.performance.Arrange;
 import com.izouma.wenlvju.domain.performance.ArrangeJudge;
@@ -12,10 +12,10 @@ import com.izouma.wenlvju.domain.performance.Programme;
 import com.izouma.wenlvju.dto.ArrangeDTO;
 import com.izouma.wenlvju.dto.PageQuery;
 import com.izouma.wenlvju.enums.PerformanceStatus;
-import com.izouma.wenlvju.enums.ProgrammeProcess;
 import com.izouma.wenlvju.enums.ProgrammeStatus;
 import com.izouma.wenlvju.exception.BusinessException;
 import com.izouma.wenlvju.repo.ArtTypeRepo;
+import com.izouma.wenlvju.repo.RateAuditRepo;
 import com.izouma.wenlvju.repo.UserRepo;
 import com.izouma.wenlvju.repo.performance.ArrangeJudgeRepo;
 import com.izouma.wenlvju.repo.performance.ArrangeRepo;
@@ -47,6 +47,7 @@ public class ArrangeService {
     private ArrangeJudgeRepo arrangeJudgeRepo;
     private UserRepo         userRepo;
     private PerformanceRepo  performanceRepo;
+    private RateAuditRepo    rateAuditRepo;
 
     public Page<Arrange> all(PageQuery pageQuery) {
         Map<Long, String> artMap = artTypeRepo.findAll()
@@ -288,12 +289,13 @@ public class ArrangeService {
         List<Programme> byPerformanceId = programmeRepo.findAllByPerformanceIdAndProgrammeStatus(dto.getPerformanceId(), ProgrammeStatus.SUBMIT);
         int group = (int) Math.ceil((double) byPerformanceId.size() / dto.getQuantity());
 
-        for (int i = 1; i <= group; i++) {
+        long count = arrangeRepo.countArrangeByPerformanceId(dto.getPerformanceId());
+        for (int i = 0; i < group; i++) {
             Arrange arrange = Arrange.builder()
                     .performanceId(dto.getPerformanceId())
                     .quantity(dto.getQuantity())
                     .specialtyId(dto.getSpecialtyId())
-                    .name("第" + i + "场")
+                    .name("第" + count + "场")
                     .auditTimes(times)
                     .build();
 
@@ -315,6 +317,7 @@ public class ArrangeService {
                 //不需要这么多分组
                 break;
             }
+            count++;
         }
     }
 
@@ -324,12 +327,24 @@ public class ArrangeService {
         if (performance.getAuditTimes() > 1) {
             online = performance.getReviewOnline();
         }
-        // 改为分配评委
+        // 改为分配评委
         performance.setStatus(PerformanceStatus.ARRANGE_JUDGE);
         performanceRepo.save(performance);
         if (!online) {
             this.publishOffline(performanceId);
         }
+
+        //记录状态
+//        List<Long> pids = programmeRepo.findIdByPerformanceIdAndProgrammeStatus(performanceId, ProgrammeStatus.SUBMIT);
+//        List<RateAudit> rateAudits = new ArrayList<>();
+//        pids.forEach(id -> rateAudits.add(RateAudit.builder()
+//                .status(PerformanceStatus.ARRANGE.toString())
+//                .userId(userId)
+//                .programmeAudit(true)
+//                .rateId(id)
+//                .remark("分组安排已发布")
+//                .build()));
+//        rateAuditRepo.saveAll(rateAudits);
     }
 
     public void publishOffline(Long performanceId) {
@@ -368,12 +383,19 @@ public class ArrangeService {
         if (CollUtil.isEmpty(arrangeId)) {
             return new PageImpl<>(new ArrayList<>(), JpaUtils.toPageRequest(pageQuery), 0);
         }
+        Map<Long, String> artTypeMap = artTypeRepo.findAllByParentIsNull()
+                .stream()
+                .collect(Collectors.toMap(ArtType::getId, ArtType::getName));
         pageQuery.setSort("date,asc;startTime,asc;");
         return arrangeRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
             List<Predicate> and = JpaUtils.toPredicates(pageQuery, Arrange.class, root, criteriaQuery, criteriaBuilder);
             and.add(root.get("id").in(arrangeId));
             return criteriaBuilder.and(and.toArray(new Predicate[0]));
-        }), JpaUtils.toPageRequest(pageQuery));
+        }), JpaUtils.toPageRequest(pageQuery)).map(arrange -> {
+            List<String> names = arrange.getSpecialtyId().stream().map(artTypeMap::get).collect(Collectors.toList());
+            arrange.setSpecialtyName(names);
+            return arrange;
+        });
     }
 
 }

+ 47 - 5
src/main/java/com/izouma/wenlvju/service/performance/ProgrammeService.java

@@ -20,6 +20,7 @@ import com.izouma.wenlvju.service.UserService;
 import com.izouma.wenlvju.service.storage.StorageService;
 import com.izouma.wenlvju.utils.FileUtils;
 import com.izouma.wenlvju.utils.JpaUtils;
+import com.izouma.wenlvju.utils.ObjUtils;
 import com.izouma.wenlvju.utils.excel.UploadDataListener;
 import lombok.AllArgsConstructor;
 import org.apache.commons.io.FilenameUtils;
@@ -29,6 +30,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.stereotype.Service;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.persistence.criteria.Predicate;
@@ -68,6 +70,41 @@ public class ProgrammeService {
         return programmeRepo.findAll(JpaUtils.toSpecification(pageQuery, Programme.class), JpaUtils.toPageRequest(pageQuery));
     }
 
+    public Programme save(Programme record, Long userId) {
+        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("无展演活动"));
+                if (LocalDate.now().isAfter(performance.getEndDate())) {
+                    throw new BusinessException("活动已报名结束!");
+                }
+            }
+            ObjUtils.merge(orig, record);
+            orig.setParentSpecialtyId(artTypeService.getParent(orig.getSpecialtyId()));
+            record = programmeRepo.save(orig);
+        } else {
+            Performance performance = performanceRepo.findById(record.getPerformanceId())
+                    .orElseThrow(new BusinessException("无展演活动"));
+            if (LocalDate.now().isAfter(performance.getEndDate())) {
+                throw new BusinessException("活动已报名结束!");
+            }
+            record.setParentSpecialtyId(artTypeService.getParent(record.getSpecialtyId()));
+            record = programmeRepo.save(record);
+        }
+        if (ProgrammeStatus.SUBMIT.equals(record.getProgrammeStatus())) {
+            rateAuditRepo.save(RateAudit.builder()
+                    .rateId(record.getId())
+                    .programmeAudit(true)
+                    .userId(userId)
+                    .remark("已上报节目信息")
+                    .status(ProgrammeStatus.SUBMIT.toString())
+                    .build());
+        }
+        return record;
+    }
+
+
     public Page<ProgrammeDTO> backAll(PageQuery pageQuery) {
         Map<String, Object> query = pageQuery.getQuery();
         Object code = query.get("code");
@@ -569,11 +606,16 @@ public class ProgrammeService {
     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());
         programmeRepo.save(programme);
 
-        long unSigned = programmeRepo.countAllByArrangeIdAndProgrammeStatusIsNotNull(programme.getArrangeId());
+        //该状态
+        Performance performance = performanceRepo.findById(programme.getId()).orElseThrow(new BusinessException("无活动"));
+        if (PerformanceStatus.ARRANGE_JUDGE.equals(performance.getStatus())) {
+            performance.setStatus(PerformanceStatus.SIGN_IN);
+            performanceRepo.save(performance);
+        }
+
+        long unSigned = programmeRepo.countAllByArrangeIdAndSignedInIsNull(programme.getArrangeId());
         if (unSigned == 0) {
             programmeRepo.allSigned(programme.getArrangeId());
         }
@@ -670,13 +712,13 @@ public class ProgrammeService {
         Programme programme = programmeRepo.findById(id).orElseThrow(new BusinessException("无节目"));
         programme.setProgrammeStatus(status);
         programmeRepo.save(programme);
-        RateAudit.builder()
+        rateAuditRepo.save(RateAudit.builder()
                 .status(status.toString())
                 .rateId(id)
                 .programmeAudit(true)
                 .remark(remark)
                 .userId(userId)
-                .build();
+                .build());
     }
 
     /*

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

@@ -1,21 +1,14 @@
 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;
 import com.izouma.wenlvju.dto.*;
 import com.izouma.wenlvju.enums.ProgrammeStatus;
 import com.izouma.wenlvju.enums.SignedIn;
 import com.izouma.wenlvju.exception.BusinessException;
-import com.izouma.wenlvju.repo.ArtTypeRepo;
 import com.izouma.wenlvju.repo.performance.PerformanceRepo;
 import com.izouma.wenlvju.repo.performance.ProgrammeRepo;
-import com.izouma.wenlvju.service.ArtTypeService;
 import com.izouma.wenlvju.service.UserService;
 import com.izouma.wenlvju.service.performance.ProgrammeService;
-import com.izouma.wenlvju.utils.ObjUtils;
 import com.izouma.wenlvju.utils.SecurityUtils;
 import com.izouma.wenlvju.utils.excel.ExcelUtils;
 import com.izouma.wenlvju.web.BaseController;
@@ -28,7 +21,6 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
 
@@ -39,34 +31,13 @@ import java.util.Map;
 public class ProgrammeController extends BaseController {
     private ProgrammeService programmeService;
     private ProgrammeRepo    programmeRepo;
-    private ArtTypeRepo      artTypeRepo;
-    private ArtTypeService   artTypeService;
     private UserService      userService;
     private PerformanceRepo  performanceRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     public Programme save(@RequestBody Programme record) {
-        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("无展演活动"));
-                if (LocalDate.now().isAfter(performance.getEndDate())) {
-                    throw new BusinessException("活动已报名结束!");
-                }
-            }
-            ObjUtils.merge(orig, record);
-            orig.setParentSpecialtyId(artTypeService.getParent(orig.getSpecialtyId()));
-            return programmeRepo.save(orig);
-        }
-        Performance performance = performanceRepo.findById(record.getPerformanceId())
-                .orElseThrow(new BusinessException("无展演活动"));
-        if (LocalDate.now().isAfter(performance.getEndDate())) {
-            throw new BusinessException("活动已报名结束!");
-        }
-        record.setParentSpecialtyId(artTypeService.getParent(record.getSpecialtyId()));
-        return programmeRepo.save(record);
+        return programmeService.save(record, SecurityUtils.getAuthenticatedUser().getId());
     }
 
 

+ 1 - 1
src/main/vue/src/views/performance/PerformanceList.vue

@@ -28,7 +28,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 label="活动状态" width="80">
+            <el-table-column label="活动状态" width="100">
                 <template slot-scope="{ row }">
                     <el-link style="font-size: 13px" :underline="false" type="info" v-if="currentTime < row.startDate"
                         >未开始</el-link

+ 432 - 0
src/main/vue/src/views/performance/ProgrammeScoreList copy.vue

@@ -0,0 +1,432 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-form :model="form" size="mini" inline>
+                <el-row>
+                    <el-col :span="24">
+                        <el-form-item label="活动名称">
+                            <el-select
+                                v-model="performanceId"
+                                clearable
+                                filterable
+                                placeholder="活动名称"
+                                style="width: 300px"
+                                @change="changeAddress"
+                            >
+                                <el-option
+                                    v-for="item in performances"
+                                    :key="item.value"
+                                    :label="item.label"
+                                    :value="item.value"
+                                >
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item>
+                            <el-button @click="getData" type="primary" icon="el-icon-search">查询 </el-button>
+                        </el-form-item>
+                    </el-col>
+                    <el-form-item label="活动日期">
+                        <el-date-picker v-model="date" type="date" placeholder="选择日期" class="filter-item">
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item label="时间">
+                        <el-radio-group v-model="morning" @change="getData" class="filter-item">
+                            <el-radio-button :label="true">上午</el-radio-button>
+                            <el-radio-button :label="false">下午</el-radio-button>
+                        </el-radio-group>
+                    </el-form-item>
+                    <el-form-item label="活动地点">
+                        <el-select v-model="form.address" class="filter-item">
+                            <el-option
+                                v-for="(item, index) in addresses"
+                                :key="index"
+                                :value="item.value"
+                                :label="item.value"
+                            ></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="评审专家"></el-form-item>
+                </el-row>
+            </el-form>
+        </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"
+            :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="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>
+            </el-table-column>
+            <el-table-column prop="quantity" label="表演人数" min-width="70"> </el-table-column>
+            <el-table-column prop="signedIn" label="状态" :formatter="signedInFormatter"> </el-table-column>
+            <el-table-column prop="score" label="成绩"> </el-table-column>
+            <el-table-column prop="myScore" label="评分" align="center" min-width="120">
+                <template slot-scope="{ row }">
+                    <span v-if="row.second">{{ row.myScore }}</span>
+                    <el-input-number
+                        v-else
+                        v-model="row.myScore"
+                        size="mini"
+                        label=""
+                        :min="0"
+                        :max="100"
+                        :step="1"
+                        :controls="true"
+                        controls-position="both"
+                        @change="saveScore(row)"
+                    >
+                    </el-input-number>
+                </template>
+            </el-table-column>
+            <el-table-column prop="remark" label="备注" align="center" min-width="120">
+                <template slot-scope="{ row }">
+                    <span v-if="row.second">{{ row.myScore }}</span>
+                    <el-input
+                        v-else
+                        size="mini"
+                        @change="saveScore(row)"
+                        v-model="row.remark"
+                        placeholder="请输入备注"
+                        clearable
+                    ></el-input>
+                </template>
+            </el-table-column>
+            <!-- <el-table-column label="操作" align="left" fixed="right" min-width="100">
+                <template slot-scope="{ row }">
+                    <el-button @click="showSign(row)" size="mini" plain type="primary">签到处理</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>
+    </div>
+</template>
+<script>
+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';
+
+export default {
+    name: 'ProgrammeScoreList',
+    mixins: [pageableTable, delChild],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/programme/byScore',
+            downloading: false,
+            form: {},
+            dialogSign: false,
+            performanceId: '',
+            performances: [],
+            signedInOptions: [
+                { label: '已签到', value: 'SIGNED_IN' },
+                { label: '未签到', value: 'UNSIGNED' },
+                { label: '已调整', value: 'ADJUSTED' }
+            ],
+            signForm: {},
+            addresses: [],
+            morning: true,
+            date: new Date(),
+            columnKeys: ['arrangeName'],
+            addressList: []
+        };
+    },
+    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.$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() {
+            return this.$refs.table.selection.map(i => i.id);
+        },
+        showTable() {
+            return this.backMap(this.tableData);
+        }
+    },
+    methods: {
+        signedInFormatter(row, column, cellValue, index) {
+            let selectedOption = this.signedInOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            let data = {
+                query: {}
+            };
+            if (this.performanceId) {
+                data.query.performanceId = this.performanceId;
+            }
+            if (this.date) {
+                if (this.morning) {
+                    data.query.showBegin = [
+                        format(startOfDay(this.date), 'yyyy-MM-dd HH:mm:ss'),
+                        format(this.date, 'yyyy-MM-dd') + ' 12:00:00'
+                    ].join(',');
+                } else {
+                    data.query.showBegin = [
+                        format(this.date, 'yyyy-MM-dd') + ' 12:00:00',
+                        format(endOfDay(this.date), 'yyyy-MM-dd HH:mm:ss')
+                    ].join(',');
+                }
+            }
+
+            return data;
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        showSign(row) {
+            this.dialogSign = true;
+            this.signForm.id = row.id;
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        signIn() {
+            this.$alert('确认签到?', '提示', { type: 'primary' })
+                .then(() => {
+                    return this.$http.post('/programme/signIn', {
+                        id: this.signForm.id,
+                        signedIn: this.signForm.signedIn,
+                        description: this.signForm.description
+                    });
+                })
+                .then(() => {
+                    this.$message.success('签到成功');
+                    this.dialogSign = false;
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        },
+        saveScore(row) {
+            if (!row.myScore) {
+                this.$message.warning('请输入评分');
+                return;
+            }
+            this.$http
+                .post('/programmeScore/saveScore?programmeId=' + row.id, {
+                    score: row.myScore,
+                    remark: row.remark
+                })
+                .then(res => {
+                    this.$message.success('评分成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    this.$message.error(e.error);
+                });
+        },
+        backMap(list, key = 'arrangeName', preActive = 0) {
+            let _map = new Map();
+            list.forEach((item, index) => {
+                let info = {
+                    active: index + preActive,
+                    childNum: 1,
+                    list: []
+                };
+                if (_map.has(item[key])) {
+                    info = _map.get(item[key]);
+                    info.list.push(item);
+                    info.childNum = info.list.length;
+                } else {
+                    info.list.push(item);
+                }
+
+                _map.set(item[key], info);
+            });
+
+            let keyIndex = this.columnKeys.indexOf(key);
+            if (keyIndex !== this.columnKeys.length - 1) {
+                [..._map.keys()].forEach(item => {
+                    let info = _map.get(item);
+                    let childMap = this.backMap(info.list, this.columnKeys[keyIndex + 1], info.active);
+                    _map.set(item, {
+                        ...info,
+                        childMap: childMap
+                    });
+                });
+            }
+
+            return _map;
+        },
+        getInfo(mapInfo = new Map(), keys = ['date']) {
+            let info = {};
+            keys.forEach(item => {
+                if (mapInfo.has(item)) {
+                    info = mapInfo.get(item);
+                    mapInfo = mapInfo.get(item).childMap;
+                }
+            });
+            return info;
+        },
+        objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+            let keyIndex = columnIndex;
+            // if (column.label === '操作') {
+            //     keyIndex = 2;
+            // }
+
+            if (keyIndex < this.columnKeys.length) {
+                let keys = [...this.columnKeys].slice(0, keyIndex + 1).map(item => {
+                    return row[item];
+                });
+                let info = this.getInfo(this.showTable, keys);
+                if (rowIndex === info.active) {
+                    return {
+                        rowspan: info.childNum,
+                        colspan: 1
+                    };
+                } else {
+                    return {
+                        rowspan: 0,
+                        colspan: 0
+                    };
+                }
+            }
+        }
+    }
+};
+</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>

+ 43 - 38
src/main/vue/src/views/performance/ProgrammeScoreList.vue

@@ -3,35 +3,41 @@
         <div class="filters-container">
             <el-form :model="form" size="mini" inline>
                 <el-row>
-                    <el-form-item label="活动名称">
-                        <el-select
-                            v-model="performanceId"
-                            clearable
-                            filterable
-                            placeholder="活动名称"
-                            style="width: 300px"
-                            @change="changeAddress"
-                        >
-                            <el-option
-                                v-for="item in performances"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value"
+                    <el-col :span="24">
+                        <el-form-item label="活动名称">
+                            <el-select
+                                v-model="performanceId"
+                                clearable
+                                filterable
+                                placeholder="活动名称"
+                                style="width: 300px"
+                                @change="changeAddress"
                             >
-                            </el-option>
-                        </el-select>
-                    </el-form-item>
-                    <el-form-item label="活动日期">
-                        <el-date-picker v-model="date" type="date" placeholder="选择日期"> </el-date-picker>
+                                <el-option
+                                    v-for="item in performances"
+                                    :key="item.value"
+                                    :label="item.label"
+                                    :value="item.value"
+                                >
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item>
+                            <el-button @click="getData" type="primary" icon="el-icon-search">查询 </el-button>
+                        </el-form-item>
+                    </el-col>
+                    <!-- <el-form-item label="活动日期">
+                        <el-date-picker v-model="date" type="date" placeholder="选择日期" class="filter-item">
+                        </el-date-picker>
                     </el-form-item>
                     <el-form-item label="时间">
-                        <el-radio-group v-model="morning" @change="getData">
+                        <el-radio-group v-model="morning" @change="getData" class="filter-item">
                             <el-radio-button :label="true">上午</el-radio-button>
                             <el-radio-button :label="false">下午</el-radio-button>
                         </el-radio-group>
                     </el-form-item>
                     <el-form-item label="活动地点">
-                        <el-select v-model="form.address">
+                        <el-select v-model="form.address" class="filter-item">
                             <el-option
                                 v-for="(item, index) in addresses"
                                 :key="index"
@@ -39,12 +45,9 @@
                                 :label="item.value"
                             ></el-option>
                         </el-select>
-                    </el-form-item>
+                    </el-form-item> -->
                     <el-form-item label="评审专家"></el-form-item>
                 </el-row>
-                <el-form-item>
-                    <el-button @click="getData" type="primary" icon="el-icon-search">查询 </el-button>
-                </el-form-item>
             </el-form>
         </div>
         <el-table
@@ -187,6 +190,8 @@ export default {
                             value: item.id
                         });
                     });
+                    this.performanceId = res.content[0].id;
+                    this.getData();
                     this.$http
                         .post('/performanceSchedule/all', { size: 100 }, { body: 'json' })
                         .then(res => {
@@ -233,19 +238,19 @@ export default {
             if (this.performanceId) {
                 data.query.performanceId = this.performanceId;
             }
-            if (this.date) {
-                if (this.morning) {
-                    data.query.showBegin = [
-                        format(startOfDay(this.date), 'yyyy-MM-dd HH:mm:ss'),
-                        format(this.date, 'yyyy-MM-dd') + ' 12:00:00'
-                    ].join(',');
-                } else {
-                    data.query.showBegin = [
-                        format(this.date, 'yyyy-MM-dd') + ' 12:00:00',
-                        format(endOfDay(this.date), 'yyyy-MM-dd HH:mm:ss')
-                    ].join(',');
-                }
-            }
+            // if (this.date) {
+            //     if (this.morning) {
+            //         data.query.showBegin = [
+            //             format(startOfDay(this.date), 'yyyy-MM-dd HH:mm:ss'),
+            //             format(this.date, 'yyyy-MM-dd') + ' 12:00:00'
+            //         ].join(',');
+            //     } else {
+            //         data.query.showBegin = [
+            //             format(this.date, 'yyyy-MM-dd') + ' 12:00:00',
+            //             format(endOfDay(this.date), 'yyyy-MM-dd HH:mm:ss')
+            //         ].join(',');
+            //     }
+            // }
 
             return data;
         },

+ 14 - 4
src/main/vue/src/views/performance/ProgrammeSignList.vue

@@ -69,14 +69,15 @@
             </el-table-column>
             <el-table-column prop="organization" label="承办单位" min-width="160"> </el-table-column>
             <el-table-column prop="name" label="节目名称" min-width="70"> </el-table-column>
-            <el-table-column label="表演时间" min-width="70"> </el-table-column>
+            <el-table-column label="表演时间" min-width="70" v-if="!performance.online"> </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="writerDirector" label="编导姓名"> </el-table-column>
             <el-table-column prop="writerPhone" label="联系电话"> </el-table-column>
-            <el-table-column prop="signedIn" label="状态" :formatter="signedInFormatter"> </el-table-column>
-            <el-table-column label="操作" align="left" fixed="right" min-width="100">
+            <el-table-column prop="signedIn" label="状态" :formatter="signedInFormatter" v-if="!performance.online">
+            </el-table-column>
+            <el-table-column label="操作" align="left" fixed="right" min-width="100" v-if="!performance.online">
                 <template slot-scope="{ row }">
                     <el-button @click="showSign(row)" size="mini" plain type="primary">签到处理</el-button>
                 </template>
@@ -146,10 +147,11 @@ export default {
             url: '/programme/byArrange',
             downloading: false,
             form: {
-                date: new Date()
+                // date: new Date()
             },
             dialogSign: false,
             performances: [],
+            performance: {},
             signedInOptions: [
                 { label: '已签到', value: 'SIGNED_IN' },
                 { label: '未签到', value: 'UNSIGNED' },
@@ -184,6 +186,9 @@ export default {
                         });
                     });
                     // this.form.performanceId = res.content[0].id;
+                    this.form.performanceId = res.content[0].id;
+                    this.performance = res.content[0];
+                    this.getData();
                     this.$http
                         .post('/performanceSchedule/all', { size: 100 }, { body: 'json' })
                         .then(res => {
@@ -346,6 +351,11 @@ export default {
                     };
                 }
             }
+        },
+        getPerformance() {
+            this.performance = this.performances.find(item => {
+                return item.id == this.form.performanceId;
+            });
         }
     }
 };

+ 15 - 19
src/main/vue/src/views/rate/AssignExpert.vue

@@ -17,7 +17,7 @@
                 <el-input
                     readonly
                     type="textarea"
-                    :autosize="{ minRows: 3, maxRows: 6 }"
+                    :autosize="{ minRows: 5, maxRows: 8 }"
                     placeholder="请输入单位概况"
                     v-model="formData.introduction"
                 ></el-input>
@@ -131,15 +131,21 @@
                     :readonly="formData.status != 'ASSIGN_EXPERT'"
                 ></el-input>
             </el-form-item>
+
+            <el-form-item class="btn">
+                <el-button @click="onSave" :loading="saving" type="primary" v-if="formData.status == 'ASSIGN_EXPERT'"
+                    >保存</el-button
+                >
+                <el-button
+                    type="danger"
+                    v-if="formData.status == 'REVIEW_PENDING'"
+                    @click="saveDismiss"
+                    :loading="loading"
+                >
+                    退回
+                </el-button>
+            </el-form-item>
         </el-form>
-        <el-form-item class="btn">
-            <el-button @click="onSave" :loading="saving" type="primary" v-if="formData.status == 'ASSIGN_EXPERT'"
-                >保存</el-button
-            >
-            <el-button type="danger" v-if="formData.status == 'REVIEW_PENDING'" @click="saveDismiss" :loading="loading">
-                退回
-            </el-button>
-        </el-form-item>
         <div class="btn">
             <el-button @click="$router.go(-1)">返回</el-button>
         </div>
@@ -174,15 +180,6 @@ export default {
                             });
                             this.getEmp(res);
                         });
-                    this.$http
-                        .post(
-                            '/rateExpertAudit/all',
-                            { size: 1000, query: { rateId: this.$route.query.id } },
-                            { body: 'json' }
-                        )
-                        .then(item => {
-                            this.audits = item.content;
-                        });
                     this.$http
                         .post(
                             '/collaborate/all',
@@ -233,7 +230,6 @@ export default {
             employeeId: '',
             employeeIds: [],
             dateRange: [],
-            audits: [],
             grading: [],
             artTypes: [],
             optionProps: {

+ 24 - 5
src/main/vue/src/views/rate/GradeList.vue

@@ -60,6 +60,11 @@
                 </template>
             </el-table-column>
         </el-table>
+        <div style="margin: 15px 12px 0 0; font-size: 14px">
+            <el-card shadow="never">
+                {{ remark }}
+            </el-card>
+        </div>
         <div style="padding:20px 50px;display:flex" class="fixed-btn">
             <el-button @click="$router.go(-1)">返回</el-button>
             <div style="flex-grow:1"></div>
@@ -89,7 +94,8 @@ export default {
             tableHeight1: 730,
             rateList: [],
             info: {},
-            form: {}
+            form: {},
+            remark: ''
         };
     },
     computed: {
@@ -119,6 +125,7 @@ export default {
     },
     mounted() {
         this.getGride();
+        this.getRemark();
     },
     methods: {
         saveExpertScore() {
@@ -166,6 +173,16 @@ export default {
                     }
                 });
         },
+        getRemark() {
+            this.$http
+                .get('rate/get/' + this.$route.query.id)
+                .then(res => {
+                    this.remark = res.remark;
+                })
+                .catch(e => {
+                    console.log(e);
+                });
+        },
         beforeGetData() {
             return { search: this.search };
         },
@@ -361,10 +378,12 @@ export default {
         },
         saveDismiss() {
             this.loading = true;
-            this.$http
-                .post('/rate/offline', {
-                    id: this.$route.query.id,
-                    status: 'REVIEW_PENDING'
+            this.$alert('退回后需要专家组长重新提交,确认退回吗?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post('/rate/offline', {
+                        id: this.$route.query.id,
+                        status: 'REVIEW_PENDING'
+                    });
                 })
                 .then(res => {
                     this.loading = false;

+ 1 - 1
src/test/java/com/izouma/wenlvju/repo/UserRepoTest.java

@@ -74,7 +74,7 @@ public class UserRepoTest {
 
     @Test
     public void test3() {
-        System.out.println(jwtTokenUtil.generateToken(JwtUserFactory.create(userRepo.findById(25L)
+        System.out.println(jwtTokenUtil.generateToken(JwtUserFactory.create(userRepo.findById(348L)
                 .orElseThrow(new BusinessException("用户不存在")))));
     }