Explorar o código

管理后台显示总结信息

licailing %!s(int64=4) %!d(string=hai) anos
pai
achega
168dbab1a6

+ 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">
         <div class="filters-container">
             <el-form :model="form" size="mini" inline>
             <el-form :model="form" size="mini" inline>
                 <el-row>
                 <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>
                     <el-form-item label="时间">
                     <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="true">上午</el-radio-button>
                             <el-radio-button :label="false">下午</el-radio-button>
                             <el-radio-button :label="false">下午</el-radio-button>
                         </el-radio-group>
                         </el-radio-group>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item label="活动地点">
                     <el-form-item label="活动地点">
-                        <el-select v-model="form.address">
+                        <el-select v-model="form.address" class="filter-item">
                             <el-option
                             <el-option
                                 v-for="(item, index) in addresses"
                                 v-for="(item, index) in addresses"
                                 :key="index"
                                 :key="index"
@@ -39,12 +45,9 @@
                                 :label="item.value"
                                 :label="item.value"
                             ></el-option>
                             ></el-option>
                         </el-select>
                         </el-select>
-                    </el-form-item>
+                    </el-form-item> -->
                     <el-form-item label="评审专家"></el-form-item>
                     <el-form-item label="评审专家"></el-form-item>
                 </el-row>
                 </el-row>
-                <el-form-item>
-                    <el-button @click="getData" type="primary" icon="el-icon-search">查询 </el-button>
-                </el-form-item>
             </el-form>
             </el-form>
         </div>
         </div>
         <el-table
         <el-table
@@ -187,6 +190,8 @@ export default {
                             value: item.id
                             value: item.id
                         });
                         });
                     });
                     });
+                    this.performanceId = res.content[0].id;
+                    this.getData();
                     this.$http
                     this.$http
                         .post('/performanceSchedule/all', { size: 100 }, { body: 'json' })
                         .post('/performanceSchedule/all', { size: 100 }, { body: 'json' })
                         .then(res => {
                         .then(res => {
@@ -233,19 +238,19 @@ export default {
             if (this.performanceId) {
             if (this.performanceId) {
                 data.query.performanceId = 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;
             return data;
         },
         },

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

@@ -17,7 +17,7 @@
                 <el-input
                 <el-input
                     readonly
                     readonly
                     type="textarea"
                     type="textarea"
-                    :autosize="{ minRows: 3, maxRows: 6 }"
+                    :autosize="{ minRows: 5, maxRows: 8 }"
                     placeholder="请输入单位概况"
                     placeholder="请输入单位概况"
                     v-model="formData.introduction"
                     v-model="formData.introduction"
                 ></el-input>
                 ></el-input>
@@ -131,15 +131,21 @@
                     :readonly="formData.status != 'ASSIGN_EXPERT'"
                     :readonly="formData.status != 'ASSIGN_EXPERT'"
                 ></el-input>
                 ></el-input>
             </el-form-item>
             </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>
-        <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">
         <div class="btn">
             <el-button @click="$router.go(-1)">返回</el-button>
             <el-button @click="$router.go(-1)">返回</el-button>
         </div>
         </div>
@@ -174,15 +180,6 @@ export default {
                             });
                             });
                             this.getEmp(res);
                             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
                     this.$http
                         .post(
                         .post(
                             '/collaborate/all',
                             '/collaborate/all',
@@ -233,7 +230,6 @@ export default {
             employeeId: '',
             employeeId: '',
             employeeIds: [],
             employeeIds: [],
             dateRange: [],
             dateRange: [],
-            audits: [],
             grading: [],
             grading: [],
             artTypes: [],
             artTypes: [],
             optionProps: {
             optionProps: {

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

@@ -60,6 +60,11 @@
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
         </el-table>
         </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">
         <div style="padding:20px 50px;display:flex" class="fixed-btn">
             <el-button @click="$router.go(-1)">返回</el-button>
             <el-button @click="$router.go(-1)">返回</el-button>
             <div style="flex-grow:1"></div>
             <div style="flex-grow:1"></div>
@@ -89,7 +94,8 @@ export default {
             tableHeight1: 730,
             tableHeight1: 730,
             rateList: [],
             rateList: [],
             info: {},
             info: {},
-            form: {}
+            form: {},
+            remark: ''
         };
         };
     },
     },
     computed: {
     computed: {
@@ -119,6 +125,7 @@ export default {
     },
     },
     mounted() {
     mounted() {
         this.getGride();
         this.getGride();
+        this.getRemark();
     },
     },
     methods: {
     methods: {
         saveExpertScore() {
         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() {
         beforeGetData() {
             return { search: this.search };
             return { search: this.search };
         },
         },
@@ -361,10 +378,12 @@ export default {
         },
         },
         saveDismiss() {
         saveDismiss() {
             this.loading = true;
             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 => {
                 .then(res => {
                     this.loading = false;
                     this.loading = false;