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

+ 97 - 8
src/main/java/com/izouma/wenlvju/service/performance/ArrangeService.java

@@ -1,9 +1,12 @@
 package com.izouma.wenlvju.service.performance;
 
+import com.alibaba.fastjson.JSONObject;
 import com.izouma.wenlvju.domain.ArtType;
 import com.izouma.wenlvju.domain.performance.Arrange;
+import com.izouma.wenlvju.domain.performance.Programme;
 import com.izouma.wenlvju.dto.ArrangeDTO;
 import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.exception.BusinessException;
 import com.izouma.wenlvju.repo.ArtTypeRepo;
 import com.izouma.wenlvju.repo.performance.ArrangeRepo;
 import com.izouma.wenlvju.utils.JpaUtils;
@@ -16,6 +19,7 @@ import java.time.LocalDate;
 import java.time.LocalTime;
 import java.time.Period;
 import java.time.format.DateTimeFormatter;
+import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
@@ -61,10 +65,83 @@ public class ArrangeService {
         int group = (int) Math.ceil((double) total / (time + 10));
 
         LocalDate date = dto.getStartDate();
-        LocalTime startTime = dto.getMorningStartTime();
         DateTimeFormatter format = DateTimeFormatter.ofPattern("MM月dd日");
         String[] arr = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
-        String amPm = "上午";
+        String format1 = format.format(date);
+
+        if (dto.isMorning() && dto.isAfternoon()) {
+            this.saveArrange(dto, group, time, format1, arr);
+        } else {
+            LocalTime startAt;
+            LocalTime endAt;
+            LocalTime startTime;
+            boolean morning = true;
+            String amPm = "上午";
+
+            if (dto.isMorning()) {
+                startTime = dto.getMorningStartTime();
+                startAt = dto.getMorningStartTime();
+                endAt = dto.getMorningEndTime();
+            } else if (dto.isAfternoon()) {
+                startTime = dto.getAfternoonStartTime();
+                morning = false;
+                startAt = dto.getAfternoonStartTime();
+                endAt = dto.getAfternoonEndTime();
+                amPm = "下午";
+            } else {
+                throw new BusinessException("时间安排不能为空");
+            }
+
+            for (int i = 0; i < group; i++) {
+                LocalTime endTime = startTime.plusMinutes(time);
+
+                String name = format1 + amPm + "第" + arr[i] + "场";
+                Arrange arrange = Arrange.builder()
+                        .address(dto.getAddress())
+                        .duration(dto.getDuration())
+                        .performanceId(dto.getPerformanceId())
+                        .quantity(dto.getQuantity())
+                        .date(date)
+                        .startTime(startTime)
+                        .endTime(endTime)
+                        .duration(dto.getDuration())
+                        .specialtyId(dto.getSpecialtyId())
+                        .name(name)
+                        .morning(morning)
+                        .build();
+
+                Map<String, String> programmes = programmeService.group(arrange);
+                List<Programme> programmeList = JSONObject.parseArray(programmes.get("programmes"), Programme.class);
+                List<Long> ids = programmeList.stream()
+                        .map(Programme::getSpecialtyId)
+                        .distinct()
+                        .collect(Collectors.toList());
+                arrange.setSpecialtyId(ids);
+                arrange.setQuantity(programmeList.size());
+                arrange = arrangeRepo.save(arrange);
+
+                programmeService.saveAll(programmeList, arrange.getId());
+
+                // 插入节目
+                if (!Boolean.parseBoolean(programmes.get("flag"))) {
+                    //不需要这么多分组
+                    break;
+                }
+                startTime = endTime.plusMinutes(10);
+                if (startTime.isAfter(endAt)) {
+                    date = date.plusDays(1);
+                    startTime = startAt;
+                }
+            }
+
+        }
+
+    }
+
+    public void saveArrange(ArrangeDTO dto, int group, int time, String format1, String[] arr) {
+        LocalDate date = dto.getStartDate();
+        LocalTime startTime = dto.getMorningStartTime();
+        boolean morning = true;
         int j = 0;
         for (int i = 0; i < group; i++) {
             LocalTime endTime = startTime.plusMinutes(time);
@@ -73,7 +150,8 @@ public class ArrangeService {
 //
 //                }
 //            }
-            String name = format.format(date) + amPm + "第" + arr[j] + "场";
+            String amPm = morning ? "上午" : "下午";
+            String name = format1 + amPm + "第" + arr[j] + "场";
             Arrange arrange = Arrange.builder()
                     .address(dto.getAddress())
                     .duration(dto.getDuration())
@@ -85,12 +163,24 @@ public class ArrangeService {
                     .duration(dto.getDuration())
                     .specialtyId(dto.getSpecialtyId())
                     .name(name)
+                    .morning(morning)
                     .build();
+
+            Map<String, String> programmes = programmeService.group(arrange);
+            List<Programme> programmeList = JSONObject.parseArray(programmes.get("programmes"), Programme.class);
+            List<Long> ids = programmeList.stream()
+                    .map(Programme::getSpecialtyId)
+                    .distinct()
+                    .collect(Collectors.toList());
+            arrange.setSpecialtyId(ids);
+            arrange.setQuantity(programmeList.size());
             arrange = arrangeRepo.save(arrange);
 
+            programmeService.saveAll(programmeList, arrange.getId());
+
             // 插入节目
-            if (!programmeService.group(arrange)) {
-                // 不需要这么多分组
+            if (!Boolean.parseBoolean(programmes.get("flag"))) {
+                //不需要这么多分组
                 break;
             }
 
@@ -98,15 +188,14 @@ public class ArrangeService {
             if (startTime.isAfter(dto.getMorningEndTime()) && startTime.isBefore(dto.getAfternoonStartTime())) {
                 startTime = dto.getAfternoonStartTime();
                 j = 0;
-                amPm = "下午";
+                morning = false;
             } else if (startTime.isAfter(dto.getAfternoonEndTime())) {
                 date = date.plusDays(1);
                 startTime = dto.getMorningStartTime();
                 j = 0;
-                amPm = "上午";
+                morning = true;
             }
             j++;
         }
     }
-
 }

+ 13 - 17
src/main/java/com/izouma/wenlvju/service/performance/ProgrammeService.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.izouma.wenlvju.domain.ArtType;
 import com.izouma.wenlvju.domain.GradingOrganization;
 import com.izouma.wenlvju.domain.Organization;
@@ -38,10 +39,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -238,7 +236,7 @@ public class ProgrammeService {
     }
 
     @Transactional(rollbackOn = Exception.class)
-    public boolean group(Arrange arrange) {
+    public Map<String, String> group(Arrange arrange) {
         boolean flag = true;
 
         List<Programme> byPerformanceId = programmeRepo.findAllByPerformanceIdAndStatus(arrange.getPerformanceId(), 0);
@@ -270,20 +268,18 @@ public class ProgrammeService {
             this.sort(byPerformanceId);
             result.addAll(byPerformanceId.stream().limit(quantity).collect(Collectors.toList()));
         }
-//        LocalDateTime showTime = LocalDateTime.of(arrange.getDate(), arrange.getStartTime());
+        Map<String, String> map = new HashMap<>();
+        map.put("flag", Boolean.toString(flag));
+        map.put("programmes", JSONObject.toJSONString(result));
+        return map;
+    }
 
-        for (Programme programme : result) {
-            programme.setArrangeId(arrange.getId());
-//            programme.setShowTime(showTime);
+    public void saveAll(List<Programme> programmes, Long arrangeId) {
+        programmes.forEach(programme -> {
+            programme.setArrangeId(arrangeId);
             programme.setStatus(1);
-//            showTime = showTime.plusMinutes(arrange.getDuration());
-        }
-        programmeRepo.saveAll(result);
-        if (result.size() < quantity) {
-            arrange.setQuantity(result.size());
-            arrangeRepo.save(arrange);
-        }
-        return flag;
+        });
+        programmeRepo.saveAll(programmes);
     }
 
     public void sort(List<Programme> programmes) {

+ 31 - 2
src/main/vue/src/views/performance/ArrangeEdit.vue

@@ -36,7 +36,16 @@
                 </el-time-picker>
             </el-form-item>
             <el-form-item prop="specialtyId" label="参赛专业">
-                <!-- <el-input v-model="formData.specialtyId" class="width"></el-input> -->
+                <el-cascader
+                    ref="artCascader"
+                    class="width"
+                    v-model="formData.specialtyId"
+                    :props="optionProps"
+                    :options="artTypes"
+                    :show-all-levels="false"
+                    placeholder="请选择专业"
+                >
+                </el-cascader>
             </el-form-item>
             <el-form-item prop="duration" label="节目时长">
                 <el-input-number type="number" v-model="formData.duration" class="input1" disabled></el-input-number>
@@ -69,8 +78,10 @@
     </div>
 </template>
 <script>
+import delChild from '@/mixins/delChild';
 export default {
     name: 'ArrangeEdit',
+    mixins: [delChild],
     created() {
         if (this.$route.query.id) {
             this.$http
@@ -84,13 +95,31 @@ export default {
                     this.$message.error(e.error);
                 });
         }
+        this.$http
+            .post('/artType/allList')
+            .then(res => {
+                this.artTypes = this.delChild(res);
+            })
+            .catch(e => {
+                console.log(e);
+            });
     },
     data() {
         return {
             saving: false,
             formData: {},
             rules: {},
-            timeRange: ''
+            timeRange: '',
+            optionProps: {
+                value: 'id',
+                label: 'name',
+                children: 'children',
+                multiple: true,
+                emitPath: false,
+                checkStrictly: true,
+                expandTrigger: 'hover'
+            },
+            artTypes: []
         };
     },
     methods: {

+ 10 - 10
src/main/vue/src/views/performance/ArrangeJudgeList.vue

@@ -67,24 +67,24 @@
             <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="date" label="活动日期"> </el-table-column>
-            <el-table-column prop="address" label="活动地点"> </el-table-column>
-            <el-table-column prop="name" label="分组名称" min-width="130"> </el-table-column>
-            <el-table-column label="时间安排" min-width="100">
-                <template slot-scope="{ row }"> {{ row.startTime }}-{{ row.endTime }} </template>
+            <el-table-column prop="morning" label="活动时间">
+                <template slot-scope="{ row }">
+                    {{ row.morning ? '上午' : '下午' }}
+                </template>
             </el-table-column>
-            <el-table-column prop="quantity" label="节目数量"> </el-table-column>
-            <!-- <el-table-column prop="duration" label="节目时长"> </el-table-column> -->
+            <el-table-column prop="address" label="活动地点"> </el-table-column>
             <el-table-column label="参赛专业">
                 <template slot-scope="{ row }">
                     {{ row.specialtyName.join(',') }}
                 </template>
             </el-table-column>
-            <el-table-column prop="writerDirector" label="编导姓名"> </el-table-column>
-            <el-table-column prop="phone" label="联系电话"> </el-table-column>
+            <el-table-column prop="name" label="分组名称" min-width="130"> </el-table-column>
+            <el-table-column label="评审专家" min-width="130"> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right" min-width="320">
                 <template slot-scope="{ row }">
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
-                    <el-button @click="programme(row)" size="mini" plain>查看节目</el-button>
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>分配评委</el-button>
+                    <el-button @click="programme(row)" type="warning" size="mini" plain>取消分配</el-button>
+                    <el-button @click="programme(row)" size="mini" plain>通知评委</el-button>
                 </template>
             </el-table-column>
         </el-table>

+ 11 - 3
src/main/vue/src/views/performance/ArrangeList.vue

@@ -76,10 +76,16 @@
                     </el-time-picker>
                 </el-form-item>
                 <el-form-item label="分组节目数量">
-                    <el-input-number type="number" v-model="form.quantity"></el-input-number>
+                    <!-- <el-input-number type="number" v-model="form.quantity"></el-input-number> -->
+                    <el-select v-model="form.quantity" clearable>
+                        <el-option v-for="item in nums" :key="item" :label="item" :value="item"></el-option>
+                    </el-select>
                 </el-form-item>
                 <el-form-item label="单个节目时长">
-                    <el-input-number type="number" v-model="form.duration"></el-input-number>
+                    <!-- <el-input-number type="number" v-model="form.duration"></el-input-number> -->
+                    <el-select v-model="form.duration" clearable>
+                        <el-option v-for="item in times" :key="item" :label="item" :value="item"></el-option>
+                    </el-select>
                 </el-form-item>
                 <el-form-item label="参赛专业">
                     <el-select v-model="form.specialtyId" multiple>
@@ -236,7 +242,9 @@ export default {
             competitionGroupOptions: [
                 { label: '个人', value: 'SINGLE' },
                 { label: '集体', value: 'COLLECTIVE' }
-            ]
+            ],
+            nums: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
+            times: [3, 5, 10, 15, 20]
         };
     },
     created() {

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

@@ -15,7 +15,7 @@
                 </el-select>
             </el-form-item>
             <el-form-item prop="name" label="名称" v-if="formData.year">
-                <el-input v-model="formData.name" :readonly="!display || edit" style="width: 300px"></el-input>
+                <el-input v-model="formData.name" :readonly="edit" style="width: 300px"></el-input>
             </el-form-item>
             <el-form-item label="报名起始时间">
                 <el-date-picker
@@ -26,7 +26,7 @@
                     end-placeholder="请选择结束时间"
                     range-separator="至"
                     style="width: 300px"
-                    :readonly="!display || edit"
+                    :readonly="edit"
                 >
                 </el-date-picker>
             </el-form-item>
@@ -118,8 +118,8 @@
                 <single-upload v-model="formData.codeImg"></single-upload>
             </el-form-item>
             <el-form-item>
-                <el-button @click="onSave" :loading="saving" type="primary" v-if="display">保存</el-button>
-                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id && display">
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id && !edit">
                     删除
                 </el-button>
                 <el-button @click="$router.go(-1)">取消</el-button>
@@ -173,7 +173,6 @@ export default {
             ],
             dateRange: [],
             eventTimeRange: '',
-            display: false,
             years: ['2020', '2021', '2022', '2023', '2024'],
             schedules: [],
             phones: [],