licailing 4 lat temu
rodzic
commit
999fb5c073

+ 5 - 1
src/main/java/com/izouma/wenlvju/domain/performance/Performance.java

@@ -13,6 +13,7 @@ import lombok.NoArgsConstructor;
 import javax.persistence.Column;
 import javax.persistence.Convert;
 import javax.persistence.Entity;
+import javax.persistence.Transient;
 import java.time.LocalDate;
 import java.util.List;
 
@@ -50,10 +51,13 @@ public class Performance extends BaseEntity {
      * 附件
      */
     @ApiModelProperty(value = "活动方案")
-    private String programme;
+    private String annex;
 
     private String codeImg;
 
     @ApiModelProperty(value = "是否发布")
     private boolean publish;
+
+    @Transient
+    private long programmeNum;
 }

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

@@ -23,6 +23,8 @@ import javax.persistence.Transient;
 @Where(clause = "del = 0")
 @ApiModel(value = "节目安排")
 public class Programme extends BaseEntity {
+    private Long performanceId;
+
     @ApiModelProperty(value = "节目名称")
     private String name;
 

+ 5 - 0
src/main/java/com/izouma/wenlvju/repo/performance/PerformanceRepo.java

@@ -13,4 +13,9 @@ public interface PerformanceRepo extends JpaRepository<Performance, Long>, JpaSp
     @Modifying
     @Transactional
     void softDelete(Long id);
+
+    Performance findByYear(String year);
+
+    @Query(nativeQuery = true, value = "select * from Performance order by `year` desc limit 0,1")
+    Performance findLastYear();
 }

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

@@ -13,4 +13,6 @@ public interface ProgrammeRepo extends JpaRepository<Programme, Long>, JpaSpecif
     @Modifying
     @Transactional
     void softDelete(Long id);
+
+    long countAllByPerformanceId(Long performanceId);
 }

+ 47 - 0
src/main/java/com/izouma/wenlvju/web/performance/PerformanceController.java

@@ -1,7 +1,10 @@
 package com.izouma.wenlvju.web.performance;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.izouma.wenlvju.domain.performance.Performance;
+import com.izouma.wenlvju.domain.performance.Programme;
 import com.izouma.wenlvju.repo.PerformanceApplyRepo;
+import com.izouma.wenlvju.repo.performance.ProgrammeRepo;
 import com.izouma.wenlvju.service.performance.PerformanceService;
 import com.izouma.wenlvju.dto.PageQuery;
 import com.izouma.wenlvju.exception.BusinessException;
@@ -9,6 +12,7 @@ import com.izouma.wenlvju.repo.performance.PerformanceRepo;
 import com.izouma.wenlvju.utils.ObjUtils;
 import com.izouma.wenlvju.utils.excel.ExcelUtils;
 import com.izouma.wenlvju.web.BaseController;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -17,6 +21,8 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/performance")
@@ -25,6 +31,7 @@ public class PerformanceController extends BaseController {
     private final PerformanceService   performanceService;
     private final PerformanceRepo      performanceRepo;
     private final PerformanceApplyRepo performanceApplyRepo;
+    private final ProgrammeRepo        programmeRepo;
 
     @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -34,6 +41,10 @@ public class PerformanceController extends BaseController {
             ObjUtils.merge(orig, record);
             return performanceRepo.save(orig);
         }
+        Performance byYear = performanceRepo.findByYear(record.getYear());
+        if (ObjectUtil.isNotNull(byYear)) {
+            throw new BusinessException("每年度只能添加一次展演活动!");
+        }
         return performanceRepo.save(record);
     }
 
@@ -44,11 +55,33 @@ public class PerformanceController extends BaseController {
         return performanceService.all(pageQuery);
     }
 
+    @PostMapping("/backAll")
+    public Page<Performance> backAll(@RequestBody PageQuery pageQuery) {
+        Map<Long, Long> programme = programmeRepo.findAll()
+                .stream()
+                .collect(Collectors.groupingBy(Programme::getPerformanceId, Collectors.counting()));
+        return performanceService.all(pageQuery)
+                .map(performance -> {
+                    if (programme.containsKey(performance.getId())) {
+                        performance.setProgrammeNum(programme.get(performance.getId()));
+                    }
+                    return performance;
+                });
+    }
+
     @GetMapping("/get/{id}")
     public Performance get(@PathVariable Long id) {
         return performanceRepo.findById(id).orElseThrow(new BusinessException("无记录"));
     }
 
+    @GetMapping("/backGet/{id}")
+    public Performance backGet(@PathVariable Long id) {
+        Performance performance = performanceRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        performance.setProgrammeNum(programmeRepo.countAllByPerformanceId(id));
+        return performance;
+    }
+
+
     @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/del/{id}")
     public void del(@PathVariable Long id) {
@@ -62,5 +95,19 @@ public class PerformanceController extends BaseController {
         List<Performance> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
+
+    @ApiOperation("发布")
+    @PostMapping("/publish")
+    public void publish(Long id, boolean publish) {
+        Performance performance = performanceRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        performance.setPublish(publish);
+        performanceRepo.save(performance);
+    }
+
+    @ApiOperation("获取上一年度")
+    @PostMapping("/lastYear")
+    public Performance lastYear() {
+        return performanceRepo.findLastYear();
+    }
 }
 

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

@@ -9,6 +9,7 @@ import com.izouma.wenlvju.repo.performance.ProgrammeRepo;
 import com.izouma.wenlvju.utils.ObjUtils;
 import com.izouma.wenlvju.utils.excel.ExcelUtils;
 
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -59,5 +60,6 @@ public class ProgrammeController extends BaseController {
         List<Programme> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
+
 }
 

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

@@ -275,6 +275,15 @@ const router = new Router({
                         title: '展演管理'
                     }
                 },
+                {
+                    path: '/performanceShow',
+                    name: 'PerformanceShow',
+                    component: () =>
+                        import(/* webpackChunkName: "performanceShow" */ '@/views/performance/PerformanceShow.vue'),
+                    meta: {
+                        title: '展演详情'
+                    }
+                },
                 {
                     path: '/performanceApplyEdit',
                     name: 'PerformanceApplyEdit',

+ 1 - 1
src/main/vue/src/views/ExamRoomList.vue

@@ -28,7 +28,7 @@
             <el-table-column prop="validateCode" label="设备验证码"> </el-table-column>
             <el-table-column prop="status" label="状态"
                 ><template slot-scope="{ row }"
-                    ><span v-if="row.status == 1">正常</span><span v-else>异常</span></template
+                    ><span v-if="row.status == 1">在线</span><span v-else>离线</span></template
                 ></el-table-column
             >
             <el-table-column label="操作" align="center" fixed="right" min-width="150">

+ 23 - 12
src/main/vue/src/views/performance/PerformanceEdit.vue

@@ -9,14 +9,14 @@
             size="small"
             style="max-width: 700px;"
         >
-            <el-form-item prop="name" label="名称">
-                <el-input v-model="formData.name" :readonly="!display"></el-input>
-            </el-form-item>
             <el-form-item prop="year" label="年度">
-                <el-select v-model="formData.year">
+                <el-select v-model="formData.year" style="width: 300px" @change="getName" :disabled="edit">
                     <el-option v-for="item in years" :key="item" :label="item" :value="item"></el-option>
                 </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-form-item>
             <el-form-item label="报名起始时间">
                 <el-date-picker
                     v-model="dateRange"
@@ -25,8 +25,8 @@
                     start-placeholder="请选择开始时间"
                     end-placeholder="请选择结束时间"
                     range-separator="至"
-                    style="width: 100%"
-                    :readonly="!display"
+                    style="width: 300px"
+                    :readonly="!display || edit"
                 >
                 </el-date-picker>
             </el-form-item>
@@ -109,10 +109,10 @@
                 </div>
             </el-form-item>
             <el-form-item prop="email" label="活动邮箱">
-                <el-input v-model="formData.email"></el-input>
+                <el-input v-model="formData.email" style="width: 300px"></el-input>
             </el-form-item>
-            <el-form-item prop="programme" label="活动方案">
-                <file-upload v-model="formData.programme"></file-upload>
+            <el-form-item prop="annex" label="活动方案">
+                <file-upload v-model="formData.annex"></file-upload>
             </el-form-item>
             <el-form-item prop="codeImg" label="活动工作群">
                 <single-upload v-model="formData.codeImg"></single-upload>
@@ -134,9 +134,12 @@ export default {
     created() {
         if (this.$route.query.id) {
             this.$http
-                .get('performance/get/' + this.$route.query.id)
+                .get('performance/backGet/' + this.$route.query.id)
                 .then(res => {
                     this.formData = res;
+                    if (res.programmeNum > 0) {
+                        this.edit = true;
+                    }
                     if (typeof res.performanceEnquiries != 'undefined') {
                         this.phones = res.performanceEnquiries;
                     }
@@ -171,10 +174,11 @@ export default {
             dateRange: [],
             eventTimeRange: '',
             display: false,
-            years: ['2021', '2022', '2023', '2024', '2025'],
+            years: ['2020', '2021', '2022', '2023', '2024'],
             schedules: [],
             phones: [],
-            performanceId: ''
+            performanceId: '',
+            edit: false
         };
     },
     computed: {
@@ -290,6 +294,9 @@ export default {
                     this.$message.success('删除成功');
                 })
                 .catch(e => {});
+        },
+        getName(value) {
+            this.formData.name = value + '“宁艺之星”社会艺术水平考级展演';
         }
     }
 };
@@ -304,4 +311,8 @@ export default {
 .del {
     float: right;
 }
+/deep/.el-input.is-disabled .el-input__inner {
+    background-color: #ffffff;
+    color: #606266;
+}
 </style>

+ 54 - 19
src/main/vue/src/views/performance/PerformanceList.vue

@@ -3,9 +3,7 @@
         <div class="filters-container">
             <!-- <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
             <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button> -->
-            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item" v-if="display"
-                >添加
-            </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
             <!-- <el-button
                 @click="download"
                 type="primary"
@@ -27,7 +25,7 @@
         >
             <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
             <!-- <el-table-column prop="id" label="ID" width="100"> </el-table-column> -->
-            <el-table-column prop="name" label="活动名称"> </el-table-column>
+            <el-table-column prop="name" label="活动名称" min-width="190"> </el-table-column>
             <el-table-column prop="year" label="年度"> </el-table-column>
             <el-table-column prop="status" label="活动状态" width="80">
                 <template slot-scope="{ row }">
@@ -56,19 +54,35 @@
                     <span v-else>未发布</span>
                 </template>
             </el-table-column>
-            <el-table-column label="推送节目数量"></el-table-column>
-            <el-table-column label="操作" align="right" fixed="right" min-width="130">
+            <el-table-column label="推送节目数量" prop="programmeNum">
                 <template slot-scope="{ row }">
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain>
+                    <el-link @click="programmeRow(row)">{{ row.programmeNum }}</el-link>
+                </template>
+            </el-table-column>
+            <el-table-column label="操作" align="left" fixed="right" min-width="160">
+                <template slot-scope="{ row }">
+                    <el-button @click="showRow(row)" size="mini" plain>
                         查看
                     </el-button>
                     <el-button @click="editRow(row)" type="success" size="mini" plain>
                         编辑
                     </el-button>
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain v-if="!row.publish">
+                    <el-button
+                        @click="publish(row, true)"
+                        type="primary"
+                        size="mini"
+                        plain
+                        v-if="!row.publish && row.programmeNum == 0"
+                    >
                         发布
                     </el-button>
-                    <el-button @click="editRow(row)" type="warning" size="mini" plain v-if="row.publish">
+                    <el-button
+                        @click="publish(row, false)"
+                        type="warning"
+                        size="mini"
+                        plain
+                        v-if="row.publish && row.programmeNum == 0"
+                    >
                         撤销
                     </el-button>
                 </template>
@@ -109,18 +123,16 @@ export default {
         return {
             multipleMode: false,
             search: '',
-            url: '/performance/all',
+            url: '/performance/backAll',
             downloading: false,
             statusOptions: [
                 { label: '报名中', value: 'APPLY' },
                 { label: '已结束', value: 'END' }
             ],
-            display: false,
             currentTime: ''
         };
     },
     created() {
-        this.getAdmin();
         this.currentTime = format(new Date(), 'yyyy-MM-dd');
         console.log(this.currentTime);
     },
@@ -158,6 +170,14 @@ export default {
                 }
             });
         },
+        showRow(row) {
+            this.$router.push({
+                path: '/performanceShow',
+                query: {
+                    id: row.id
+                }
+            });
+        },
         editRow(row) {
             this.$router.push({
                 path: '/performanceEdit',
@@ -166,6 +186,14 @@ export default {
                 }
             });
         },
+        programmeRow(row) {
+            this.$router.push({
+                path: '/programmeList',
+                query: {
+                    pid: row.id
+                }
+            });
+        },
         download() {
             this.downloading = true;
             this.$axios
@@ -219,13 +247,20 @@ export default {
                 this.$router.push(command);
             }
         },
-        getAdmin() {
-            let data = this.userInfo.authorities;
-            data.forEach(element => {
-                if (element.name === 'ROLE_ADMIN') {
-                    this.display = true;
-                }
-            });
+        publish(row, publish) {
+            this.$confirm('确认发布此展演活动吗?', '发布提示', { type: 'primary' })
+                .then(() => {
+                    return this.$http.post('/performance/publish', { id: row.id, publish: publish });
+                })
+                .then(() => {
+                    this.$message.success('发布成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
         }
     }
 };

+ 340 - 0
src/main/vue/src/views/performance/PerformanceShow.vue

@@ -0,0 +1,340 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="100px"
+            label-position="right"
+            size="small"
+            style="max-width: 700px;"
+        >
+            <el-timeline>
+                <el-timeline-item placement="top" size="normal">
+                    <el-card shadow="hover" :body-style="{ padding: '20px' }">
+                        <div>
+                            <el-form-item prop="year" label="年度">
+                                <el-select
+                                    v-model="formData.year"
+                                    style="width: 300px"
+                                    @change="getName"
+                                    :disabled="edit"
+                                >
+                                    <el-option
+                                        v-for="item in years"
+                                        :key="item"
+                                        :label="item"
+                                        :value="item"
+                                    ></el-option>
+                                </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-form-item>
+                            <el-form-item label="报名起始时间">
+                                <el-date-picker
+                                    v-model="dateRange"
+                                    type="daterange"
+                                    value-format="yyyy-MM-dd"
+                                    start-placeholder="请选择开始时间"
+                                    end-placeholder="请选择结束时间"
+                                    range-separator="至"
+                                    style="width: 300px"
+                                    :readonly="!display || edit"
+                                >
+                                </el-date-picker>
+                            </el-form-item>
+                            <el-form-item prop="online" label="展演形式">
+                                <el-radio-group v-model="formData.online">
+                                    <el-radio :label="true">线上</el-radio>
+                                    <el-radio :label="false">线下</el-radio>
+                                </el-radio-group>
+                            </el-form-item>
+                        </div>
+                    </el-card>
+
+                    <!-- content -->
+                </el-timeline-item>
+
+                <el-timeline-item placement="top" size="normal">
+                    <el-card shadow="hover" :body-style="{ padding: '20px' }">
+                        <div v-for="(item, index) in schedules" :key="index">
+                            <div v-if="!item.del">
+                                <el-row>
+                                    <el-col :span="11">
+                                        <el-form-item prop="content" label="活动内容">
+                                            <el-input v-model="item.content"></el-input>
+                                        </el-form-item>
+                                    </el-col>
+                                    <el-col :span="11">
+                                        <el-form-item prop="date" label="活动时间">
+                                            <el-date-picker
+                                                v-model="item.date"
+                                                type="date"
+                                                value-format="yyyy-MM-dd"
+                                                placeholder="选择日期"
+                                            >
+                                            </el-date-picker>
+                                        </el-form-item>
+                                    </el-col>
+                                </el-row>
+                                <el-row>
+                                    <el-col :span="20">
+                                        <el-form-item label="活动地点">
+                                            <el-input v-model="item.address"></el-input>
+                                        </el-form-item>
+                                    </el-col>
+                                </el-row>
+                            </div>
+                        </div>
+                    </el-card>
+                </el-timeline-item>
+
+                <el-timeline-item placement="top" size="normal">
+                    <el-card shadow="hover" :body-style="{ padding: '20px' }">
+                        <div v-for="(item, index) in phones" :key="index">
+                            <el-row>
+                                <el-col :span="10">
+                                    <el-form-item label="联系人">
+                                        <el-input v-model="item.name"></el-input>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="10">
+                                    <el-form-item label="电话">
+                                        <el-input v-model="item.phone"></el-input>
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                        </div>
+                    </el-card>
+                </el-timeline-item>
+
+                <el-timeline-item placement="top" size="normal">
+                    <el-card shadow="hover" :body-style="{ padding: '20px' }">
+                        <div>
+                            <el-form-item prop="email" label="活动邮箱">
+                                <el-input v-model="formData.email" style="width: 300px"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="annex" label="活动方案">
+                                <file-upload v-model="formData.annex"></file-upload>
+                            </el-form-item>
+                            <el-form-item prop="codeImg" label="活动工作群">
+                                <el-image
+                                    style="width: 100px; height: 100px;"
+                                    :src="formData.codeImg"
+                                    fit="cover"
+                                    :preview-src-list="[formData.codeImg]"
+                                ></el-image>
+                            </el-form-item>
+                        </div>
+                    </el-card>
+                </el-timeline-item>
+            </el-timeline>
+
+            <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>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+export default {
+    name: 'PerformanceShow',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('performance/backGet/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                    if (res.programmeNum > 0) {
+                        this.edit = true;
+                    }
+                    if (typeof res.performanceEnquiries != 'undefined') {
+                        this.phones = res.performanceEnquiries;
+                    }
+                    this.dateRange = [res.startDate, res.endDate];
+
+                    this.$http
+                        .post(
+                            '/performanceSchedule/all',
+                            { size: 100, query: { performanceId: this.$route.query.id } },
+                            { body: 'json' }
+                        )
+                        .then(res => {
+                            this.schedules = res.content;
+                        });
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+        this.getAdmin();
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {},
+            statusOptions: [
+                { label: '报名中', value: 'APPLY' },
+                { label: '已结束', value: 'END' }
+            ],
+            dateRange: [],
+            eventTimeRange: '',
+            display: false,
+            years: ['2020', '2021', '2022', '2023', '2024'],
+            schedules: [],
+            phones: [],
+            performanceId: '',
+            edit: false
+        };
+    },
+    computed: {
+        ...mapState(['userInfo']),
+        saveOtherJson() {
+            const schedules = [...this.schedules]
+                .filter(item => {
+                    return !!item.content || !!item.date || !!item.address;
+                })
+                .map(item => {
+                    return {
+                        ...item,
+                        performanceId: this.performanceId
+                    };
+                });
+            return JSON.stringify(schedules);
+        }
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+            data.startDate = this.dateRange[0];
+            data.endDate = this.dateRange[1];
+            data.performanceEnquiries = this.phones;
+            this.saving = true;
+            this.$http
+                .post('/performance/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+
+                    this.performanceId = res.id;
+                    this.$nextTick(() => {
+                        this.$http.post('/performanceSchedule/batchSave', {
+                            schedules: this.saveOtherJson
+                        });
+                    });
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/performance/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error((e || {}).error || '删除失败');
+                    }
+                });
+        },
+        getAdmin() {
+            let data = this.userInfo.authorities;
+            data.forEach(element => {
+                if (element.name === 'ROLE_ADMIN') {
+                    this.display = true;
+                }
+            });
+        },
+        onAddOtherForm() {
+            this.schedules.push({
+                content: '',
+                date: '',
+                address: ''
+            });
+        },
+        onAddPhoneForm() {
+            this.phones.push({
+                name: '',
+                phone: ''
+            });
+        },
+        onDeleteOtherForm(info, index) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'warning' })
+                .then(() => {
+                    const schedules = [...this.schedules];
+                    if (info.id) {
+                        info.del = true;
+                        schedules[index] = info;
+                    } else {
+                        schedules.splice(index, 1);
+                    }
+                    this.schedules = schedules;
+                    this.$message.success('删除成功');
+                })
+                .catch(e => {});
+        },
+        onDeletePhoneForm(info, index) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'warning' })
+                .then(() => {
+                    const phones = [...this.phones];
+                    phones.splice(index, 1);
+                    this.phones = phones;
+                    this.$message.success('删除成功');
+                })
+                .catch(e => {});
+        },
+        getName(value) {
+            this.formData.name = value + '“宁艺之星”社会艺术水平考级展演';
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.add-con {
+    background-color: #f7f7f7;
+    width: 100%;
+    margin: 7px 0;
+    padding-top: 14px;
+}
+.del {
+    float: right;
+}
+/deep/.el-input.is-disabled .el-input__inner {
+    background-color: #ffffff;
+    color: #606266;
+}
+.edit-view {
+    padding: 0 0;
+    background-color: transparent;
+}
+</style>

+ 10 - 4
src/main/vue/src/views/record/RecordCheck.vue

@@ -9,11 +9,17 @@
             size="small"
             style="max-width: 600px;"
         >
-            <el-form-item label-width="0">
+            <!-- <el-form-item label-width="0">
                 <el-button type="primary" size="small" @click="onAddOtherForm()">添加检查记录</el-button>
-            </el-form-item>
+            </el-form-item> -->
             <el-timeline reverse>
-                <el-timeline-item v-for="(item, index) in checks" :key="index" placement="top" size="normal">
+                <el-timeline-item
+                    v-for="(item, index) in checks"
+                    :key="index"
+                    placement="top"
+                    size="normal"
+                    :timestamp="item.createdAt"
+                >
                     <el-card shadow="hover" :body-style="{ padding: '20px' }">
                         <div v-if="!item.del">
                             <el-form-item prop="content" label="检查情况">
@@ -47,8 +53,8 @@
                 </el-upload>
             </el-form-item> -->
             <el-form-item>
+                <el-button type="success" size="small" @click="onAddOtherForm()">添加检查记录</el-button>
                 <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
-                <!-- <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除</el-button> -->
                 <el-button @click="$router.go(-1)">取消</el-button>
             </el-form-item>
         </el-form>

+ 17 - 9
src/main/vue/src/views/record/RecordRegulationHistory.vue

@@ -81,7 +81,7 @@
                                         :src="img"
                                         fit="fill"
                                         :lazy="true"
-                                        style="width:100px;height:100px"
+                                        style="width:60px;height:60px"
                                         :preview-src-list="item.file"
                                     >
                                     </el-image>
@@ -89,11 +89,16 @@
                                 <!-- content -->
                             </el-timeline-item>
                         </el-timeline>
+                        <div style="margin-left: 26px">
+                            <el-button @click="saveRow(props.row)" size="mini" plain>
+                                <span v-if="checkMap.get(props.row.id).length === 0">增加</span>
+                                <span v-else>编辑</span>
+                            </el-button>
+                        </div>
                     </el-card>
                 </template>
             </el-table-column>
             <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="examinationName" label="考级活动名称" min-width="150"> </el-table-column>
             <el-table-column prop="examinationStartTime" label="考级活动时间" show-overflow-tooltip min-width="160">
                 <template slot-scope="{ row }">
@@ -104,11 +109,11 @@
             <el-table-column prop="organizer" label="承办单位名称" min-width="150" sortable> </el-table-column>
             <el-table-column prop="district" label="考级地点" min-width="70"> </el-table-column>
             <el-table-column prop="recordTime" label="备案时间" min-width="90"> </el-table-column>
-            <el-table-column label="操作" align="right" fixed="right" min-width="180">
+            <el-table-column label="操作" align="right" fixed="right" min-width="260">
                 <template slot-scope="{ row }">
                     <el-button @click="editRow(row)" size="mini" plain>查看</el-button>
                     <el-button @click="checkRow(row)" type="warning" size="mini" plain>检查记录</el-button>
-                    <el-button size="mini" type="success" plain>考场监控</el-button>
+                    <el-button size="mini" type="primary" plain>考场监控</el-button>
                 </template>
             </el-table-column>
         </el-table>
@@ -236,6 +241,14 @@ export default {
         checkRow(row) {
             this.$refs.table.toggleRowExpansion(row, true);
         },
+        saveRow(row) {
+            this.$router.push({
+                path: '/recordCheck',
+                query: {
+                    rid: row.id
+                }
+            });
+        },
         download() {
             this.downloading = true;
             this.$axios
@@ -289,11 +302,6 @@ export default {
                     }
                 });
         },
-        distribute() {
-            this.$alert('已分发到各区县!', '分发', {
-                confirmButtonText: '确定'
-            });
-        },
         update() {
             this.$http
                 .get('/record/update')

+ 74 - 8
src/main/vue/src/views/record/RecordRegulationList.vue

@@ -58,9 +58,47 @@
             row-class-name="table-row"
             cell-class-name="table-cell"
             :height="tableHeight"
+            @expand-change="expand"
         >
+            <el-table-column type="expand">
+                <template slot-scope="props">
+                    <el-card v-if="checkMap.has(props.row.id)">
+                        <div v-if="checkMap.get(props.row.id).length === 0">
+                            <div style="text-align:center">暂无数据</div>
+                        </div>
+                        <el-timeline reverse v-else>
+                            <el-timeline-item
+                                :timestamp="item.createdAt"
+                                placement="top"
+                                v-for="item in checkMap.get(props.row.id)"
+                                :key="item.id"
+                            >
+                                <div>
+                                    {{ item.content }}
+                                </div>
+
+                                <div style="margin-top:5px">
+                                    <el-image
+                                        v-for="(img, index) in item.file"
+                                        :key="index"
+                                        :src="img"
+                                        fit="fill"
+                                        :lazy="true"
+                                        style="width:60px;height:60px"
+                                        :preview-src-list="item.file"
+                                    >
+                                    </el-image>
+                                </div>
+                                <!-- content -->
+                            </el-timeline-item>
+                        </el-timeline>
+                        <div style="margin-left: 26px">
+                            <el-button @click="saveRow(props.row)" size="mini" plain>编辑</el-button>
+                        </div>
+                    </el-card>
+                </template>
+            </el-table-column>
             <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="examinationName" label="考级活动名称" min-width="150" sortable> </el-table-column>
             <el-table-column prop="examinationStartTime" label="考级活动时间" show-overflow-tooltip min-width="170">
                 <template slot-scope="{ row }">
@@ -74,8 +112,8 @@
             <el-table-column label="操作" align="right" fixed="right" min-width="260">
                 <template slot-scope="{ row }">
                     <el-button @click="editRow(row)" size="mini" plain>查看</el-button>
-                    <el-button @click="openRoom(row)" type="primary" size="mini" plain>考场监控</el-button>
                     <el-button @click="checkRow(row)" type="warning" size="mini" plain>检查记录</el-button>
+                    <el-button @click="openRoom(row)" type="primary" size="mini" plain>考场监控</el-button>
                     <!-- <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button> -->
                 </template>
             </el-table-column>
@@ -140,7 +178,8 @@ export default {
             agency: '',
             organizer: '',
             dateRange: '',
-            currentTime: ''
+            currentTime: '',
+            checkMap: new Map()
         };
     },
     computed: {
@@ -201,6 +240,9 @@ export default {
             });
         },
         checkRow(row) {
+            this.$refs.table.toggleRowExpansion(row, true);
+        },
+        saveRow(row) {
             this.$router.push({
                 path: '/recordCheck',
                 query: {
@@ -261,11 +303,6 @@ export default {
                     }
                 });
         },
-        distribute() {
-            this.$alert('已分发到各区县!', '分发', {
-                confirmButtonText: '确定'
-            });
-        },
         update() {
             this.$http
                 .get('/record/update')
@@ -289,6 +326,35 @@ export default {
             this.$router.push({
                 path: '/videoList'
             });
+        },
+        expand(row) {
+            let checks = new Map([...this.checkMap]);
+            if (checks.has(row.id)) {
+                return;
+            }
+            this.$http
+                .post(
+                    'recordCheck/all',
+                    {
+                        size: 20,
+                        sort: 'createdAt,asc',
+                        query: { recordId: row.id }
+                    },
+                    { body: 'json' }
+                )
+                .then(res => {
+                    if (!res.empty) {
+                        checks.set(row.id, res.content);
+                    } else {
+                        return Promise.reject();
+                    }
+                })
+                .catch(e => {
+                    checks.set(row.id, []);
+                })
+                .then(() => {
+                    this.checkMap = new Map(checks);
+                });
         }
     }
 };

+ 62 - 55
src/main/vue/src/views/record/VideoList.vue

@@ -1,61 +1,68 @@
 <template>
     <div class="edit-view">
         <el-form :model="form" inline size="small">
-            <el-col :span="8">
-                <el-form-item label="考级活动名称">
-                    <el-input placeholder="输入考级活动名称" v-model="search" clearable class="filter-item"></el-input>
-                </el-form-item>
-            </el-col>
-            <el-col :span="8">
-                <el-form-item label="考级机构名称">
-                    <el-input placeholder="输入考级机构名称" v-model="agency" clearable class="filter-item"></el-input>
-                </el-form-item>
-            </el-col>
-            <el-col :span="8">
-                <el-form-item label="考级地址">
-                    <el-select v-model="district" clearable placeholder="请选择区县">
-                        <el-option
-                            v-for="item in districts"
-                            :key="item.id"
-                            :value="item.name"
-                            :label="item.name"
-                        ></el-option>
-                    </el-select>
-                </el-form-item>
-            </el-col>
-            <el-col :span="8">
-                <el-form-item label="承办单位名称">
-                    <el-input
-                        placeholder="输入承办单位名称"
-                        v-model="organizer"
-                        clearable
-                        class="filter-item"
-                    ></el-input>
-                </el-form-item>
-            </el-col>
-            <el-col :span="8">
-                <el-form-item label="监控视频状态">
-                    <el-select v-model="status" clearable placeholder="请选择监控视频状态">
-                        <el-option label="在线" value="1"></el-option>
-                        <el-option label="离线" value="0"></el-option>
-                    </el-select>
-                </el-form-item>
-            </el-col>
-            <el-button @click="getVideo" type="primary" icon="el-icon-search" class="filter-item">查询 </el-button>
-            <!-- <el-col :span="14">
-                <el-form-item label="考级活动时间">
-                    <el-date-picker
-                        v-model="dateRange"
-                        type="daterange"
-                        value-format="yyyy-MM-dd"
-                        start-placeholder="请选择开始时间"
-                        end-placeholder="请选择结束时间"
-                        range-separator="至"
-                        class="filter-item"
-                    >
-                    </el-date-picker>
-                </el-form-item>
-            </el-col> -->
+            <el-row>
+                <el-col :span="8">
+                    <el-form-item label="考级活动名称">
+                        <el-input
+                            placeholder="输入考级活动名称"
+                            v-model="search"
+                            clearable
+                            class="filter-item"
+                        ></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                    <el-form-item label="考级机构名称">
+                        <el-input
+                            placeholder="输入考级机构名称"
+                            v-model="agency"
+                            clearable
+                            class="filter-item"
+                        ></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                    <el-form-item label="考级地址">
+                        <el-select v-model="district" clearable placeholder="请选择区县">
+                            <el-option
+                                v-for="item in districts"
+                                :key="item.id"
+                                :value="item.name"
+                                :label="item.name"
+                            ></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="organizer"
+                            clearable
+                            class="filter-item"
+                        ></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                    <el-form-item label="监控视频状态">
+                        <el-select v-model="status" clearable placeholder="请选择监控视频状态">
+                            <el-option label="在线" value="1"></el-option>
+                            <el-option label="离线" value="0"></el-option>
+                        </el-select>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                    <el-form-item label="详细地址">
+                        <el-input style="width: 195px" placeholder="输入考级详细地址" class="filter-item"></el-input>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+            <div style="margin-bottom: 15px">
+                <el-button @click="getVideo" type="primary" icon="el-icon-search" class="filter-item">查询 </el-button>
+            </div>
         </el-form>
 
         <el-col :span="24">

+ 1 - 1
src/main/vue/src/views/video/HistoryRoomList.vue

@@ -19,7 +19,7 @@
             <el-table-column prop="validateCode" label="设备验证码"> </el-table-column> -->
             <el-table-column prop="status" label="状态"
                 ><template slot-scope="{ row }"
-                    ><span v-if="row.status == 1">正常</span><span v-else>异常</span></template
+                    ><span v-if="row.status == 1">在线</span><span v-else>离线</span></template
                 ></el-table-column
             >
             <el-table-column label="操作" align="center" fixed="right" min-width="150">

+ 11 - 3
src/main/vue/src/views/video/ShowRoomList.vue

@@ -15,12 +15,13 @@
                     <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
                     <!-- <el-table-column prop="id" label="ID" width="100"> </el-table-column> -->
                     <el-table-column prop="name" label="考场名称"> </el-table-column>
-                    <el-table-column prop="address" label="考场详细地址"> </el-table-column>
+                    <el-table-column prop="address" label="考场详细地址" show-overflow-tooltip min-width="150">
+                    </el-table-column>
                     <el-table-column prop="deviceSerial" label="设备序列号"> </el-table-column>
                     <el-table-column prop="validateCode" label="设备验证码"> </el-table-column>
                     <el-table-column prop="status" label="状态"
                         ><template slot-scope="{ row }"
-                            ><span v-if="row.status == 1">正常</span><span v-else>异常</span></template
+                            ><span v-if="row.status == 1">在线</span><span v-else>离线</span></template
                         ></el-table-column
                     >
                     <el-table-column label="操作" align="center" fixed="right" min-width="150">
@@ -28,7 +29,14 @@
                             <el-button @click="editRow(row)" type="primary" size="mini" plain v-if="organization"
                                 >编辑</el-button
                             >
-                            <el-button @click="monitor(row)" type="success" size="mini" plain>查看视频</el-button>
+                            <el-button
+                                @click="monitor(row)"
+                                type="success"
+                                size="mini"
+                                plain
+                                :disabled="row.status != 1"
+                                >查看视频</el-button
+                            >
                         </template>
                     </el-table-column>
                 </el-table>

+ 17 - 0
src/test/java/com/izouma/wenlvju/repo/performance/PerformanceRepoTest.java

@@ -0,0 +1,17 @@
+package com.izouma.wenlvju.repo.performance;
+
+
+import com.izouma.wenlvju.ApplicationTests;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class PerformanceRepoTest extends ApplicationTests {
+    @Autowired
+    private PerformanceRepo performanceRepo;
+
+    @Test
+    public void test(){
+        System.out.println(performanceRepo.findLastYear());
+    }
+
+}

+ 18 - 0
src/test/java/com/izouma/wenlvju/service/UserServiceTest.java

@@ -0,0 +1,18 @@
+package com.izouma.wenlvju.service;
+
+
+import com.izouma.wenlvju.ApplicationTests;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class UserServiceTest extends ApplicationTests {
+
+    @Autowired
+    private UserService userService;
+
+    @Test
+     public void test() {
+        System.out.println(userService.all3(12506L).getContent());
+    }
+
+}