Browse Source

分配评委

licailing 4 years ago
parent
commit
d24406eb89

+ 7 - 2
src/main/java/com/izouma/wenlvju/domain/User.java

@@ -3,6 +3,7 @@ package com.izouma.wenlvju.domain;
 import com.alibaba.excel.annotation.ExcelIgnore;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.izouma.wenlvju.annotations.Searchable;
+import com.izouma.wenlvju.annotations.SearchableOne;
 import com.izouma.wenlvju.config.Constants;
 import com.izouma.wenlvju.converter.ExpertConverter;
 import com.izouma.wenlvju.dto.Expert;
@@ -36,6 +37,7 @@ public class User extends BaseEntity implements Serializable {
     @Searchable
     private String username;
 
+    @SearchableOne
     @Searchable
     private String nickname;
 
@@ -69,6 +71,7 @@ public class User extends BaseEntity implements Serializable {
 
     private String district;
 
+    @SearchableOne
     @Column(unique = true)
     @Searchable
     private String phone;
@@ -80,11 +83,13 @@ public class User extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "艺术分类id")
     private Long artTypeId;
 
-    @Convert(converter = ExpertConverter.class)
-    private Expert expert;
+//    @Convert(converter = ExpertConverter.class)
+//    private Expert expert;
 
+    @SearchableOne
     private String position;
 
+    @SearchableOne
     private String work;
 
     private String telephone;

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

@@ -64,5 +64,5 @@ public class Arrange extends BaseEntity {
     private List<String> specialtyName;
 
     @Transient
-    private List<String> experts;
+    private String experts;
 }

+ 1 - 2
src/main/java/com/izouma/wenlvju/service/UserService.java

@@ -249,8 +249,7 @@ public class UserService {
             SetJoin<User, Authority> join = root.join(root.getModel()
                     .getSet("authorities", Authority.class), JoinType.LEFT);
 
-            and.add(join.in(Authority.get(AuthorityName.ROLE_EXPERT), Authority.get(AuthorityName.ROLE_DISTRICT_STAFF),
-                    Authority.get(AuthorityName.ROLE_ADMIN)));
+            and.add(join.in(Authority.get(AuthorityName.ROLE_EXPERT), Authority.get(AuthorityName.ROLE_DISTRICT_STAFF)));
 
             criteriaQuery.distinct(true);
             names.forEach(name -> and.add(criteriaBuilder.notLike(root.get("work"), "%" + name + "%")));

+ 5 - 0
src/main/java/com/izouma/wenlvju/service/performance/ArrangeService.java

@@ -74,6 +74,11 @@ public class ArrangeService {
                             .stream()
                             .map(artMap::get)
                             .collect(Collectors.toList()));
+                    List<ArrangeJudge> arrangeJudges = judgeMap.get(arrange.getId());
+                    String experts = arrangeJudges.stream()
+                            .map(arrangeJudge -> userMap.get(arrangeJudge.getExpertId()))
+                            .collect(Collectors.joining(","));
+                    arrange.setExperts(experts);
                     return arrange;
                 });
     }

+ 5 - 0
src/main/java/com/izouma/wenlvju/web/performance/ArrangeController.java

@@ -46,6 +46,11 @@ public class ArrangeController extends BaseController {
         return arrangeService.all(pageQuery);
     }
 
+    @PostMapping("/all2")
+    public Page<Arrange> all2(@RequestBody PageQuery pageQuery) {
+        return arrangeService.all2(pageQuery);
+    }
+
     @GetMapping("/get/{id}")
     public Arrange get(@PathVariable Long id) {
         return arrangeRepo.findById(id).orElseThrow(new BusinessException("无记录"));

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

@@ -112,6 +112,17 @@ const router = new Router({
                         title: '分配专家组'
                     }
                 },
+                {
+                    path: '/arrangeAssignExpert',
+                    name: 'arrangeAssignExpert',
+                    component: () =>
+                        import(
+                            /* webpackChunkName: "arrangeAssignExpert" */ '@/views/performance/ArrangeAssignExpert.vue'
+                        ),
+                    meta: {
+                        title: '分配评委'
+                    }
+                },
                 {
                     path: '/gradeList',
                     name: 'gradeList',

+ 180 - 0
src/main/vue/src/views/performance/ArrangeAssignExpert.vue

@@ -0,0 +1,180 @@
+<template>
+    <div class="list-view">
+        <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-form :form="form" inline size="mini" label-width="60px">
+                <el-form-item label="姓名">
+                    <el-input v-model="form.nickname" placeholder="请输入姓名"></el-input>
+                </el-form-item>
+                <el-form-item label="单位">
+                    <el-input v-model="form.work" placeholder="请输入单位"></el-input>
+                </el-form-item>
+                <el-form-item label="职称">
+                    <el-input v-model="form.position" placeholder="请输入职称"></el-input>
+                </el-form-item>
+                <el-form-item label="专家">
+                    <el-cascader
+                        ref="artCascader"
+                        style="width: 100%"
+                        v-model="form.specialtyId"
+                        :props="optionProps"
+                        :options="artTypes"
+                        :show-all-levels="false"
+                        placeholder="请选择专业"
+                        clearable
+                    >
+                    </el-cascader>
+                </el-form-item>
+            </el-form>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            height="tableHeight"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+        >
+            <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="username" label="用户名" min-width="300"> </el-table-column> -->
+            <el-table-column prop="nickname" label="姓名"> </el-table-column>
+            <el-table-column prop="phone" label="手机号"></el-table-column>
+            <el-table-column prop="artType" label="专业"></el-table-column>
+            <el-table-column prop="work" label="单位"></el-table-column>
+            <el-table-column prop="position" label="职称"></el-table-column>
+            <!-- <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</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">选择</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 { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+import ClipboardJS from 'clipboard';
+import delChild from '@/mixins/delChild';
+const clickData = {};
+export default {
+    mixins: [pageableTable, delChild],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/user/all1',
+            downloading: false,
+            form: {},
+            optionProps: {
+                value: 'id',
+                label: 'name',
+                children: 'children',
+                multiple: false,
+                emitPath: false,
+                checkStrictly: true,
+                expandTrigger: 'hover'
+            },
+            artTypes: []
+        };
+    },
+    created() {
+        this.$http
+            .post('/artType/allList')
+            .then(res => {
+                this.artTypes = this.delChild(res);
+            })
+            .catch(e => {
+                console.log(e);
+            });
+    },
+    computed: {
+        ...mapState([]),
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            // if (this.search) {
+            //     return { search: this.search };
+            // }
+            let data = { query: {} };
+            if (this.form.nickname) {
+                data.query.nickname = this.form.nickname;
+            }
+            return data;
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/expertEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/expertEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        operation1() {
+            // this.$notify({
+            //     title: '提示',
+            //     message: this.selection
+            // });
+            this.$alert('确认分配评委吗?', '提示', { type: 'primary' })
+                .then(() => {
+                    // return this.$http.post(`/performance/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('分配成功');
+                    toggleMultipleMode(false);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        },
+        operation2() {
+            this.$message('操作2');
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

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

@@ -80,10 +80,10 @@
                 </template>
             </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="评审专家" min-width="130" prop="experts"> </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="assignExpert(row)" type="primary" size="mini" plain>分配评委</el-button>
                     <el-button @click="cancelAssign(row)" type="warning" size="mini" plain>取消分配</el-button>
                     <el-button @click="programme(row)" size="mini" plain>通知评委</el-button>
                 </template>
@@ -159,7 +159,7 @@ export default {
         return {
             multipleMode: false,
             search: '',
-            url: '/arrange/all',
+            url: '/arrange/all2',
             downloading: false,
             form: {},
             performances: [],
@@ -327,6 +327,14 @@ export default {
                 }
             });
         },
+        assignExpert(row) {
+            this.$router.push({
+                path: '/arrangeAssignExpert',
+                query: {
+                    aid: row.id
+                }
+            });
+        },
         programme(row) {
             this.$router.push({
                 path: '/programmeGroupList',

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

@@ -60,9 +60,9 @@ public class UserRepoTest {
     public void test1() {
         List<User> users = userRepo.findAllByAuthoritiesContainsAndDelFalse(Authority.get(AuthorityName.ROLE_EXPERT));
         users.forEach(user -> {
-            user.setPosition(user.getExpert().getPosition());
-            user.setWork(user.getExpert().getWork());
-            userRepo.save(user);
+//            user.setPosition(user.getExpert().getPosition());
+//            user.setWork(user.getExpert().getWork());
+//            userRepo.save(user);
         });
     }