licailing 5 лет назад
Родитель
Сommit
cb1eb463b2

+ 31 - 0
src/main/java/com/izouma/wenlvju/domain/RateExpertAudit.java

@@ -0,0 +1,31 @@
+package com.izouma.wenlvju.domain;
+
+import com.izouma.wenlvju.converter.StringArrayConverter;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.Column;
+import javax.persistence.Convert;
+import javax.persistence.Entity;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@Where(clause = "del = false")
+public class RateExpertAudit extends BaseEntity {
+    private Long userId;
+
+    private Long rateId;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = StringArrayConverter.class)
+    private List<String> img;
+
+    private String remark;
+}

+ 4 - 0
src/main/java/com/izouma/wenlvju/enums/RateStatus.java

@@ -10,6 +10,10 @@ public enum RateStatus {
      */
     FIRST_REVIEW_DENY,
     /*
+    待分配专家组
+     */
+    ASSIGN_EXPERT,
+    /*
     待复审(分配专家组)
      */
     REVIEW_PENDING,

+ 16 - 0
src/main/java/com/izouma/wenlvju/repo/RateExpertAuditRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.wenlvju.repo;
+
+import com.izouma.wenlvju.domain.RateExpertAudit;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface RateExpertAuditRepo extends JpaRepository<RateExpertAudit, Long>, JpaSpecificationExecutor<RateExpertAudit> {
+    @Query("update RateExpertAudit t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 20 - 0
src/main/java/com/izouma/wenlvju/service/RateExpertAuditService.java

@@ -0,0 +1,20 @@
+package com.izouma.wenlvju.service;
+
+import com.izouma.wenlvju.domain.RateExpertAudit;
+import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.repo.RateExpertAuditRepo;
+import com.izouma.wenlvju.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class RateExpertAuditService {
+
+    private RateExpertAuditRepo rateExpertAuditRepo;
+
+    public Page<RateExpertAudit> all(PageQuery pageQuery) {
+        return rateExpertAuditRepo.findAll(JpaUtils.toSpecification(pageQuery, RateExpertAudit.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 1 - 0
src/main/java/com/izouma/wenlvju/service/RateService.java

@@ -42,6 +42,7 @@ public class RateService {
 //        if (RateStatus.EXPERT_PASS.equals(status)){
 //            rate.setScore(score);
 //        }
+        rateAudits.sort((a, b) -> b.getAuditTime().compareTo(a.getAuditTime()));
         rate.setRateAudits(rateAudits);
         rateRepo.save(rate);
     }

+ 61 - 0
src/main/java/com/izouma/wenlvju/web/RateExpertAuditController.java

@@ -0,0 +1,61 @@
+package com.izouma.wenlvju.web;
+import com.izouma.wenlvju.domain.RateExpertAudit;
+import com.izouma.wenlvju.service.RateExpertAuditService;
+import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.exception.BusinessException;
+import com.izouma.wenlvju.repo.RateExpertAuditRepo;
+import com.izouma.wenlvju.utils.ObjUtils;
+import com.izouma.wenlvju.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/rateExpertAudit")
+@AllArgsConstructor
+public class RateExpertAuditController extends BaseController {
+    private RateExpertAuditService rateExpertAuditService;
+    private RateExpertAuditRepo rateExpertAuditRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public RateExpertAudit save(@RequestBody RateExpertAudit record) {
+        if (record.getId() != null) {
+            RateExpertAudit orig = rateExpertAuditRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return rateExpertAuditRepo.save(orig);
+        }
+        return rateExpertAuditRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<RateExpertAudit> all(@RequestBody PageQuery pageQuery) {
+        pageQuery.setSort("createdAt,desc");
+        return rateExpertAuditService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public RateExpertAudit get(@PathVariable Long id) {
+        return rateExpertAuditRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        rateExpertAuditRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<RateExpertAudit> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 1 - 0
src/main/resources/genjson/RateExpertAudit.json

@@ -0,0 +1 @@
+{"tableName":"RateExpertAudit","className":"RateExpertAudit","remark":"专家上传资料","genTable":true,"genClass":true,"genList":false,"genForm":false,"genRouter":false,"javaPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/java/com/izouma/wenlvju","viewPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"userId","modelName":"userId","remark":"userId","showInList":true,"showInForm":true,"formType":"number"},{"name":"rateId","modelName":"rateId","remark":"rateId","showInList":true,"showInForm":true,"formType":"number"},{"name":"img","modelName":"img","remark":"img","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"remark","modelName":"remark","remark":"remark","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.wenlvju","tablePackage":"com.izouma.wenlvju.domain.RateExpertAudit"}

+ 1 - 1
src/main/vue/src/components/FileUpload.vue

@@ -10,7 +10,7 @@
         :on-preview="onPreview"
         ref="upload"
     >
-        <el-button type="primary" size="mini" slot="trigger" v-if="!readonly">
+        <el-button type="primary" size="mini" slot="trigger" v-if="!readonly" plain>
             点击上传
         </el-button>
         <div class="file-list-item" slot="file" slot-scope="{ file }">

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

@@ -95,6 +95,22 @@ const router = new Router({
                         title: '监控平台'
                     }
                 },
+                {
+                    path: '/assignExpert',
+                    name: 'assignExpert',
+                    component: () => import(/* webpackChunkName: "userList" */ '@/views/AssignExpert.vue'),
+                    meta: {
+                        title: '分配专家组'
+                    }
+                },
+                {
+                    path: '/organization',
+                    name: 'organization',
+                    component: () => import(/* webpackChunkName: "userList" */ '@/views/organization/Organization.vue'),
+                    meta: {
+                        title: '评星定级'
+                    }
+                },
                 {
                     path: '/expertList',
                     name: 'expertList',
@@ -267,6 +283,14 @@ const router = new Router({
                         title: '评星定级'
                     }
                 },
+                {
+                    path: '/rateAudit',
+                    name: 'RateAudit',
+                    component: () => import(/* webpackChunkName: "rateAudit" */ '@/views/RateAudit.vue'),
+                    meta: {
+                        title: '评星定级详情'
+                    }
+                },
                 {
                     path: '/rateList',
                     name: 'RateList',
@@ -301,14 +325,6 @@ const router = new Router({
                         title: '承办单位'
                     }
                 },
-                {
-                    path: '/organization',
-                    name: 'Organization',
-                    component: () => import(/* webpackChunkName: "organization" */ '@/views/Organization.vue'),
-                    meta: {
-                        title: '承办单位'
-                    }
-                },
                 {
                     path: '/artTypes',
                     name: 'ArtTypes',
@@ -373,7 +389,7 @@ router.beforeEach((to, from, next) => {
                 let flag = res.data.authorities.find(item => {
                     return item.name == 'ROLE_ORGANIZER';
                 });
-                if (flag) {
+                if (typeof flag != 'undefined') {
                     http.axios
                         .get('/organization/getByUserId/' + res.data.id)
                         .then(index => {

+ 208 - 0
src/main/vue/src/views/AssignExpert.vue

@@ -0,0 +1,208 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="90px"
+            label-position="right"
+            size="small"
+            style="max-width: 600px;"
+        >
+            <el-form-item prop="reviewTime" label="审核时间">
+                <el-date-picker
+                    v-model="dateRange"
+                    type="daterange"
+                    value-format="yyyy-MM-dd"
+                    start-placeholder="请选择开始时间"
+                    end-placeholder="请选择结束时间"
+                    range-separator="至"
+                    style="margin-left: 10px"
+                >
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="expertUserId" label="专家组长">
+                <div>
+                    <el-select
+                        v-model="formData.expertUserId"
+                        style="width:350px;margin-left:10px"
+                        filterable
+                        clearable
+                        placeholder="请选择专家组长"
+                    >
+                        <el-option v-for="item in users" :key="item.id" :value="item.id" :label="item.nickname">
+                            <span style="float: left">{{ item.nickname }}</span>
+                            <span style="float: right; color: #8492a6; font-size: 13px">{{ item.phone }}</span>
+                        </el-option>
+                    </el-select>
+                </div>
+            </el-form-item>
+            <el-form-item prop="expertMemberUserId" label="专家组员">
+                <div class="subform">
+                    <div style="margin-bottom: 20px">
+                        <el-select
+                            v-model="employeeId"
+                            style="width: 82.5%; margin-right: 10px;"
+                            filterable
+                            clearable
+                            placeholder="请选择专家组员"
+                        >
+                            <el-option v-for="item in users" :key="item.id" :value="item.id" :label="item.nickname">
+                                <span style="float: left">{{ item.nickname }}</span>
+                                <span style="float: right; color: #8492a6; font-size: 13px">{{ item.phone }}</span>
+                            </el-option>
+                        </el-select>
+                        <el-button @click="chooseEmp">添加</el-button>
+                    </div>
+                    <el-table :data="emps">
+                        <el-table-column prop="nickname" label="用户名"></el-table-column>
+                        <el-table-column prop="phone" label="手机号"></el-table-column>
+                        <el-table-column label="操作">
+                            <template slot-scope="{ row }">
+                                <el-button @click="remove(row)" type="danger" size="mini" plain>移除</el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </div>
+            </el-form-item>
+            <el-form-item label="材料">
+                <div class="subform" v-for="(item, index) in audits" :key="index">
+                    <el-input style="margin-bottom: 10px" v-model="item.createdAt"></el-input>
+                    <el-input :rows="3" type="textarea" style="margin-bottom: 10px" v-model="item.remark"></el-input>
+                    <multi-upload v-model="item.img"></multi-upload>
+                </div>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary" v-if="formData.status == 'ASSIGN_EXPERT'"
+                    >保存</el-button
+                >
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'AssignExpert',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('rate/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                    if (typeof res.reviewStartTime != 'undefined') {
+                        this.dateRange.push(res.reviewStartTime);
+                        this.dateRange.push(res.reviewEndTime);
+                    }
+                    this.$http
+                        .post('/user/all1', { size: 1000, query: { del: false } }, { body: 'json' })
+                        .then(data => {
+                            this.users = data.content;
+                            this.getEmp(res);
+                        });
+                    this.$http
+                        .post(
+                            '/rateExpertAudit/all',
+                            { size: 1000, query: { rateId: this.$route.query.id } },
+                            { body: 'json' }
+                        )
+                        .then(item => {
+                            this.audits = item.content;
+                        });
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {
+                name: [{ required: true, message: '请输入公司名', trigger: 'blur' }],
+                userId: [{ required: true, message: '请选择管理员', trigger: 'blur' }]
+            },
+            users: [],
+            emps: [],
+            employeeId: '',
+            employeeIds: [],
+            userPackage: [],
+            dateRange: [],
+            audits: []
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+            data.expertMemberUserId = this.employeeIds;
+            if (this.dateRange && this.dateRange.length > 0) {
+                data.reviewStartTime = this.dateRange[0];
+                data.reviewEndTime = this.dateRange[1];
+            }
+            data.status = 'REVIEW_PENDING';
+
+            this.saving = true;
+            this.$http
+                .post('/rate/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        getEmp(res) {
+            let data = res.expertMemberUserId;
+            if (data != undefined && data.length > 0) {
+                for (let index in data) {
+                    this.emps.push(
+                        this.users.find(item => {
+                            return item.id === data[index];
+                        })
+                    );
+                }
+                this.employeeIds = data;
+            }
+        },
+        chooseEmp() {
+            if (this.employeeIds.indexOf(this.employeeId) < 0 && this.employeeId != '') {
+                this.emps.push(
+                    this.users.find(item => {
+                        return item.id === this.employeeId;
+                    })
+                );
+                this.employeeIds.push(this.employeeId);
+                this.employeeId = '';
+            }
+        },
+        remove(row) {
+            this.emps.pop(row);
+            this.employeeIds.pop(this.employeeId);
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.subform {
+    padding: 16px 16px 16px 16px;
+    background: #f2f3f5;
+    border-radius: 5px;
+    border: 1px solid #eee;
+    margin-bottom: 10px;
+}
+</style>

+ 16 - 0
src/main/vue/src/views/Login.vue

@@ -182,6 +182,14 @@ export default {
                         .then(res => {
                             this.loading = false;
                             this.$store.commit('updateUserInfo', res);
+                            let flag = res.authorities.find(item => {
+                                return item.name == 'ROLE_ORGANIZER';
+                            });
+                            if (typeof flag != 'undefined') {
+                                this.$http.get('/organization/getByUserId/' + res.id).then(index => {
+                                    this.$store.commit('updateOrganization', index);
+                                });
+                            }
                             this.$router.replace({
                                 name: this.$route.params.name || 'dashboard'
                             });
@@ -209,6 +217,14 @@ export default {
                         .then(res => {
                             this.loading = false;
                             this.$store.commit('updateUserInfo', res);
+                            let flag = res.authorities.find(item => {
+                                return item.name == 'ROLE_ORGANIZER';
+                            });
+                            if (typeof flag != 'undefined') {
+                                this.$http.get('/organization/getByUserId/' + res.id).then(index => {
+                                    this.$store.commit('updateOrganization', index);
+                                });
+                            }
                             this.$router.replace({
                                 name: this.$route.params.name || 'dashboard'
                             });

+ 33 - 167
src/main/vue/src/views/Organization.vue → src/main/vue/src/views/RateAudit.vue

@@ -2,7 +2,6 @@
     <div class="edit-view">
         <el-form
             :model="formData"
-            :rules="rules"
             ref="form"
             label-width="50px"
             label-position="right"
@@ -13,33 +12,25 @@
                 <div class="info-item">
                     <div class="name">机构名称</div>
                     <div class="val">
-                        <el-input v-model="formData.name" placeholder="请输入机构名称" :readonly="readonly"></el-input>
+                        <el-input v-model="formData.name" placeholder="请输入机构名称" readonly></el-input>
                     </div>
                 </div>
                 <div class="info-item">
                     <div class="name">负责人邮箱</div>
                     <div class="val">
-                        <el-input
-                            v-model="formData.ownerEmail"
-                            placeholder="请输入负责人邮箱"
-                            :readonly="readonly"
-                        ></el-input>
+                        <el-input v-model="formData.ownerEmail" placeholder="请输入负责人邮箱" readonly></el-input>
                     </div>
                 </div>
                 <div class="info-item">
                     <div class="name">负责人</div>
                     <div class="val">
-                        <el-input v-model="formData.owner" placeholder="请输入负责人" :readonly="readonly"></el-input>
+                        <el-input v-model="formData.owner" placeholder="请输入负责人" readonly></el-input>
                     </div>
                 </div>
                 <div class="info-item">
                     <div class="name">负责人电话</div>
                     <div class="val">
-                        <el-input
-                            v-model="formData.ownerPhone"
-                            placeholder="请输入负责人电话"
-                            :readonly="readonly"
-                        ></el-input>
+                        <el-input v-model="formData.ownerPhone" placeholder="请输入负责人电话" readonly></el-input>
                     </div>
                 </div>
                 <div class="info-item">
@@ -51,7 +42,7 @@
                                 :key="item.id"
                                 :value="item.name"
                                 :label="item.name"
-                                :disabled="readonly"
+                                disabled
                             ></el-option>
                         </el-select>
                     </div>
@@ -61,7 +52,7 @@
                     <div class="name">单位概况</div>
                     <div class="val">
                         <el-input
-                            :readonly="readonly"
+                            readonly
                             type="textarea"
                             :autosize="{ minRows: 4, maxRows: 6 }"
                             placeholder="请输入单位概况"
@@ -72,7 +63,7 @@
                 <div class="info-item address">
                     <div class="name">考级活动</div>
                     <div class="val">
-                        <el-radio-group v-model="formData.undertakeExamination" size="small" :disabled="readonly">
+                        <el-radio-group v-model="formData.undertakeExamination" size="small" disabled>
                             <el-radio class="name" :label="true">承办过</el-radio>
                             <el-radio class="name" :label="false">未承办过</el-radio>
                         </el-radio-group>
@@ -84,7 +75,6 @@
                         <el-tag
                             :key="tag"
                             v-for="tag in formData.examination"
-                            :closable="!readonly"
                             :disable-transitions="false"
                             @close="handleClose(tag)"
                             size="medium"
@@ -103,13 +93,13 @@
                                 @blur="handleInputConfirm"
                             >
                             </el-input>
-                            <el-button
+                            <!-- <el-button
                                 v-if="!inputVisible && !readonly"
                                 class="button-new-tag"
                                 size="small"
                                 @click="showInput"
                                 >添加考级活动名称</el-button
-                            >
+                            > -->
                         </div>
                     </div>
                 </div>
@@ -118,20 +108,20 @@
                 <div class="info-item address">
                     <div class="name">法人资格</div>
                     <div class="val">
-                        <file-upload v-model="formData.privacyPolicy" :readonly="readonly"></file-upload>
+                        <file-upload v-model="formData.privacyPolicy" readonly></file-upload>
                         <!-- <single-upload v-model="formData.privacyPolicy"></single-upload> -->
                     </div>
                 </div>
                 <div class="info-item address">
                     <div class="name">业务内容</div>
                     <div class="val">
-                        <file-upload v-model="formData.business" :readonly="readonly"></file-upload>
+                        <file-upload v-model="formData.business" readonly></file-upload>
                     </div>
                 </div>
                 <div class="info-item address">
                     <div class="name">社会信誉</div>
                     <div class="val">
-                        <file-upload v-model="formData.credits" :readonly="readonly"></file-upload>
+                        <file-upload v-model="formData.credits" readonly></file-upload>
                     </div>
                 </div>
             </div>
@@ -139,51 +129,43 @@
                 <div class="info-item address">
                     <div class="name">消防卫生</div>
                     <div class="val">
-                        <file-upload v-model="formData.fire" :readonly="readonly"></file-upload>
+                        <file-upload v-model="formData.fire" readonly></file-upload>
                     </div>
                 </div>
                 <div class="info-item address">
                     <div class="name">财务报表</div>
                     <div class="val">
-                        <file-upload v-model="formData.finance" :readonly="readonly"></file-upload>
+                        <file-upload v-model="formData.finance" readonly></file-upload>
                     </div>
                 </div>
                 <div class="info-item address">
                     <div class="name">房产证明</div>
                     <div class="val">
-                        <file-upload v-model="formData.property" :readonly="readonly"></file-upload>
+                        <file-upload v-model="formData.property" readonly></file-upload>
                     </div>
                 </div>
             </div>
-            <div class="info-content">
+            <div class="info-content" v-for="(item, index) in rateAudits" :key="index">
                 <div class="info-item">
-                    <div class="name">驳回时间</div>
+                    <div class="name">操作时间</div>
                     <div class="val">
-                        <el-input></el-input>
+                        <el-input readonly v-model="item.auditTime"></el-input>
                     </div>
                 </div>
                 <div class="info-item address">
-                    <div class="name">驳回缘由</div>
+                    <div class="name">备注</div>
                     <div class="val">
-                        <el-input></el-input>
+                        <el-input
+                            readonly
+                            type="textarea"
+                            :autosize="{ minRows: 2, maxRows: 3 }"
+                            v-model="item.remark"
+                        ></el-input>
                     </div>
                 </div>
             </div>
             <el-form-item>
                 <div style="margin-top: 10px">
-                    <el-button @click="onSave(true)" :loading="saving" type="success" v-if="!formData.submit"
-                        >提交</el-button
-                    >
-                    <el-button @click="onSave(false)" :loading="saving" type="primary" v-if="!formData.submit"
-                        >保存</el-button
-                    >
-                    <el-button
-                        @click="onCancel"
-                        :loading="saving"
-                        type="danger"
-                        v-if="formData.id && formData.status != 'CANCEL'"
-                        >取消申请
-                    </el-button>
                     <el-button @click="$router.go(-1)">返回</el-button>
                 </div>
             </el-form-item>
@@ -193,7 +175,7 @@
 <script>
 import { mapState } from 'vuex';
 export default {
-    name: 'Organization',
+    name: 'RateAudit',
     computed: {
         ...mapState(['organization'])
     },
@@ -203,8 +185,10 @@ export default {
                 .get('rate/get/' + this.$route.query.rateId)
                 .then(res => {
                     this.formData = res;
-                    if (res.status != 'FIRST_REVIEW_PENDING' || res.submit) {
-                        this.readonly = true;
+                    let data = res.rateAudits;
+                    if (typeof data != 'undefined') {
+                        this.showAudit = true;
+                        this.rateAudits = data;
                     }
                 })
                 .catch(e => {
@@ -212,15 +196,6 @@ export default {
                     this.$message.error(e.error);
                 });
             // }
-        } else if (this.organization != null) {
-            this.formData.name = this.organization.name;
-            this.formData.owner = this.organization.owner;
-            this.formData.ownerEmail = this.organization.ownerEmail;
-            this.formData.ownerPhone = this.organization.ownerPhone;
-            this.formData.district = this.organization.district;
-            // this.formData.district1 = this.organization.district1;
-            // this.formData.privacyPolicy.push(this.organization.businessLicense);
-            this.formData.organizationId = this.organization.id;
         }
         this.$http
             .get('/district/NJ')
@@ -241,76 +216,13 @@ export default {
                 ownerEmail: '',
                 ownerPhone: '',
                 district: ''
-                // district1: []
             },
+            rateAudits: {},
+            showAudit: false,
             inputVisible: false,
             inputValue: '',
             saving: false,
-            districts: [],
-            readonly: false,
-            rules: {
-                name: [{ required: true, message: '请输入机构名称', trigger: 'blur' }],
-                owner: [{ required: true, message: '请输入负责人', trigger: 'blur' }],
-                ownerEmail: [{ required: true, message: '请输入邮箱', trigger: 'blur' }],
-                ownerPhone: [
-                    {
-                        required: true,
-                        pattern: /^1[3-9]\d{9}$/,
-                        message: '请输入手机号',
-                        trigger: 'blur'
-                    }
-                ],
-                introduction: [{ required: true, message: '请输入单位概况', trigger: 'blur' }],
-                undertakeExamination: [{ required: true, message: '请选择是否承办过考级活动', trigger: 'blur' }],
-                privacyPolicy: [
-                    {
-                        required: true,
-                        regexp: /^[_.@A-Za-z0-9-]*$/,
-                        message: '请上传法人资格',
-                        trigger: 'blur'
-                    }
-                ],
-                business: [
-                    {
-                        required: true,
-                        regexp: /^[_.@A-Za-z0-9-]*$/,
-                        message: '请上传业务内容',
-                        trigger: 'blur'
-                    }
-                ],
-                credits: [
-                    {
-                        required: true,
-                        regexp: /^[_.@A-Za-z0-9-]*$/,
-                        message: '请上传社会信誉',
-                        trigger: 'blur'
-                    }
-                ],
-                fire: [
-                    {
-                        required: true,
-                        regexp: /^[_.@A-Za-z0-9-]*$/,
-                        message: '请上传消防卫生',
-                        trigger: 'blur'
-                    }
-                ],
-                finance: [
-                    {
-                        required: true,
-                        regexp: /^[_.@A-Za-z0-9-]*$/,
-                        message: '请上传财务报表',
-                        trigger: 'blur'
-                    }
-                ],
-                property: [
-                    {
-                        required: true,
-                        regexp: /^[_.@A-Za-z0-9-]*$/,
-                        message: '请上传房产证明',
-                        trigger: 'blur'
-                    }
-                ]
-            }
+            districts: []
         };
     },
     methods: {
@@ -330,52 +242,6 @@ export default {
             }
             this.inputVisible = false;
             this.inputValue = '';
-        },
-        onSave(isSubmit) {
-            this.$refs.form.validate(valid => {
-                if (valid) {
-                    this.submit(isSubmit);
-                } else {
-                    return false;
-                }
-            });
-        },
-        submit(isSubmit) {
-            let data = { ...this.formData };
-            data.status = 'FIRST_REVIEW_PENDING';
-            data.submit = isSubmit;
-            this.saving = true;
-            this.$http
-                .post('/rate/save', data, { body: 'json' })
-                .then(res => {
-                    this.saving = false;
-                    this.$message.success('成功');
-                    // this.$router.go(-1);
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.saving = false;
-                    this.$message.error(e.error);
-                });
-        },
-        onCancel() {
-            let data = { ...this.formData };
-            data.status = 'CANCEL';
-            data.submit = false;
-            this.$alert('取消将无法恢复,确认要取消么?', '警告', { type: 'error' })
-                .then(() => {
-                    return this.$http.post('/rate/save', data, { body: 'json' });
-                })
-                .then(() => {
-                    this.$message.success('取消成功');
-                    this.$router.go(-1);
-                })
-                .catch(e => {
-                    if (e !== 'cancel') {
-                        console.log(e);
-                        this.$message.error((e || {}).error || '取消失败');
-                    }
-                });
         }
     }
 };

+ 22 - 7
src/main/vue/src/views/RateList.vue

@@ -34,7 +34,7 @@
                     <el-button
                         v-if="row.status === 'FIRST_REVIEW_PENDING'"
                         :loading="row.loading"
-                        @click="audit(row, 'REVIEW_PENDING')"
+                        @click="audit(row, 'REVIEW_PENDING', '通过')"
                         type="success"
                         size="mini"
                         plain
@@ -51,18 +51,26 @@
                     >
                         驳回
                     </el-button>
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain>查看附件</el-button>
                     <el-button @click="sorce(row)" type="primary" size="mini" plain v-if="row.status === 'EXPERT_PASS'"
                         >查看分数</el-button
                     >
                     <el-button
                         @click="supervision(row.id)"
-                        type="primary"
+                        type="success"
                         size="mini"
                         plain
-                        v-if="(row.status === 'FIRST_REVIEW_PASS') & display"
+                        v-if="(row.status === 'ASSIGN_EXPERT') & display"
                         >分配专家组</el-button
                     >
+                    <el-button
+                        @click="supervision(row.id)"
+                        type="success"
+                        size="mini"
+                        plain
+                        v-if="(row.status === 'SUBMIT_GRADE' || row.status === 'REVIEW_PENDING') & display"
+                        >查看专家组</el-button
+                    >
+                    <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>
@@ -119,6 +127,7 @@ export default {
             downloading: false,
             statusOptions: [
                 { label: '等待初审', value: 'FIRST_REVIEW_PENDING' },
+                { label: '待分配专家组', value: 'ASSIGN_EXPERT' },
                 { label: '待复审', value: 'REVIEW_PENDING' },
                 { label: '初审驳回', value: 'FIRST_REVIEW_DENY' },
                 { label: '待提交成绩', value: 'SUBMIT_GRADE' },
@@ -199,7 +208,7 @@ export default {
         },
         editRow(row) {
             this.$router.push({
-                path: '/organization',
+                path: '/rateAudit',
                 query: {
                     organId: row.organizationId,
                     rateId: row.id
@@ -290,8 +299,14 @@ export default {
                 });
         },
         supervision(id) {
-            this.dialogVisible = true;
-            this.rateId = id;
+            this.$router.push({
+                path: '/assignExpert',
+                query: {
+                    id: id
+                }
+            });
+            // this.dialogVisible = true;
+            // this.rateId = id;
         },
         addRegulatory(id) {
             this.$http

+ 0 - 0
src/main/vue/src/views/organization/Organization copy.vue → src/main/vue/src/views/organization/Organization.vue


+ 382 - 130
src/main/vue/src/views/organization/RateEdit.vue

@@ -4,91 +4,203 @@
             :model="formData"
             :rules="rules"
             ref="form"
-            label-width="100px"
+            label-width="50px"
             label-position="right"
             size="small"
-            style="max-width: 500px;"
+            style="max-width: 600px;"
         >
-            <!-- <el-form-item prop="organizer" label="承办单位">
-                <el-input v-model="formData.organizer"></el-input>
-            </el-form-item> -->
-            <!-- <el-form-item prop="year" label="年度">
-                <el-input v-model="formData.year"></el-input>
-            </el-form-item> -->
-            <!-- <el-form-item prop="status" label="状态">
-                <el-select v-model="formData.status" clearable filterable placeholder="请选择">
-                    <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
-                    </el-option>
-                </el-select>
-            </el-form-item> -->
-            <el-form-item label="是否承办过">
-                <el-radio-group v-model="formData.undertakeExamination" size="small">
-                    <el-radio :label="true">承办过</el-radio>
-                    <el-radio :label="false">未承办过</el-radio>
-                </el-radio-group>
-            </el-form-item>
-            <el-form-item label="考级活动名称" v-if="formData.undertakeExamination">
-                <el-tag
-                    :key="tag"
-                    v-for="tag in formData.examination"
-                    closable
-                    :disable-transitions="false"
-                    @close="handleClose(tag)"
-                    size="medium"
-                    class="el-tag-height"
-                >
-                    {{ tag }}
-                </el-tag>
-                <div>
-                    <el-input
-                        class="input-new-tag"
-                        v-if="inputVisible"
-                        v-model="inputValue"
-                        ref="saveTagInput"
-                        size="small"
-                        @keyup.enter.native="handleInputConfirm"
-                        @blur="handleInputConfirm"
+            <div class="info-content">
+                <div class="info-item">
+                    <div class="name">机构名称</div>
+                    <div class="val">
+                        <el-input v-model="formData.name" placeholder="请输入机构名称" :readonly="readonly"></el-input>
+                    </div>
+                </div>
+                <div class="info-item">
+                    <div class="name">负责人邮箱</div>
+                    <div class="val">
+                        <el-input
+                            v-model="formData.ownerEmail"
+                            placeholder="请输入负责人邮箱"
+                            :readonly="readonly"
+                        ></el-input>
+                    </div>
+                </div>
+                <div class="info-item">
+                    <div class="name">负责人</div>
+                    <div class="val">
+                        <el-input v-model="formData.owner" placeholder="请输入负责人" :readonly="readonly"></el-input>
+                    </div>
+                </div>
+                <div class="info-item">
+                    <div class="name">负责人电话</div>
+                    <div class="val">
+                        <el-input
+                            v-model="formData.ownerPhone"
+                            placeholder="请输入负责人电话"
+                            :readonly="readonly"
+                        ></el-input>
+                    </div>
+                </div>
+                <div class="info-item">
+                    <div class="name">地址</div>
+                    <div class="val">
+                        <el-select v-model="formData.district" style="width:100%">
+                            <el-option
+                                v-for="item in districts"
+                                :key="item.id"
+                                :value="item.name"
+                                :label="item.name"
+                                :disabled="readonly"
+                            ></el-option>
+                        </el-select>
+                    </div>
+                </div>
+
+                <div class="info-item address">
+                    <div class="name">单位概况</div>
+                    <div class="val">
+                        <el-input
+                            :readonly="readonly"
+                            type="textarea"
+                            :autosize="{ minRows: 4, maxRows: 6 }"
+                            placeholder="请输入单位概况"
+                            v-model="formData.introduction"
+                        ></el-input>
+                    </div>
+                </div>
+                <div class="info-item address">
+                    <div class="name">考级活动</div>
+                    <div class="val">
+                        <el-radio-group v-model="formData.undertakeExamination" size="small" :disabled="readonly">
+                            <el-radio class="name" :label="true">承办过</el-radio>
+                            <el-radio class="name" :label="false">未承办过</el-radio>
+                        </el-radio-group>
+                    </div>
+                </div>
+                <div class="info-item address" v-if="formData.undertakeExamination">
+                    <div class="name"></div>
+                    <div class="val">
+                        <el-tag
+                            :key="tag"
+                            v-for="tag in formData.examination"
+                            :closable="!readonly"
+                            :disable-transitions="false"
+                            @close="handleClose(tag)"
+                            size="medium"
+                            class="el-tag-height"
+                        >
+                            {{ tag }}
+                        </el-tag>
+                        <div>
+                            <el-input
+                                class="input-new-tag"
+                                v-if="inputVisible"
+                                v-model="inputValue"
+                                ref="saveTagInput"
+                                size="small"
+                                @keyup.enter.native="handleInputConfirm"
+                                @blur="handleInputConfirm"
+                            >
+                            </el-input>
+                            <el-button
+                                v-if="!inputVisible && !readonly"
+                                class="button-new-tag"
+                                size="small"
+                                @click="showInput"
+                                >添加考级活动名称</el-button
+                            >
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="info-content">
+                <div class="info-item address">
+                    <div class="name">法人资格</div>
+                    <div class="val">
+                        <file-upload v-model="formData.privacyPolicy" :readonly="readonly"></file-upload>
+                        <!-- <single-upload v-model="formData.privacyPolicy"></single-upload> -->
+                    </div>
+                </div>
+                <div class="info-item address">
+                    <div class="name">业务内容</div>
+                    <div class="val">
+                        <file-upload v-model="formData.business" :readonly="readonly"></file-upload>
+                    </div>
+                </div>
+                <div class="info-item address">
+                    <div class="name">社会信誉</div>
+                    <div class="val">
+                        <file-upload v-model="formData.credits" :readonly="readonly"></file-upload>
+                    </div>
+                </div>
+            </div>
+            <div class="info-content">
+                <div class="info-item address">
+                    <div class="name">消防卫生</div>
+                    <div class="val">
+                        <file-upload v-model="formData.fire" :readonly="readonly"></file-upload>
+                    </div>
+                </div>
+                <div class="info-item address">
+                    <div class="name">财务报表</div>
+                    <div class="val">
+                        <file-upload v-model="formData.finance" :readonly="readonly"></file-upload>
+                    </div>
+                </div>
+                <div class="info-item address">
+                    <div class="name">房产证明</div>
+                    <div class="val">
+                        <file-upload v-model="formData.property" :readonly="readonly"></file-upload>
+                    </div>
+                </div>
+            </div>
+            <div class="info-content" v-for="(item, index) in rateAudits" :key="index">
+                <div class="info-item">
+                    <div class="name">操作时间</div>
+                    <div class="val">
+                        <el-input readonly v-model="item.auditTime"></el-input>
+                    </div>
+                </div>
+                <div class="info-item address">
+                    <div class="name">备注</div>
+                    <div class="val">
+                        <el-input
+                            readonly
+                            type="textarea"
+                            :autosize="{ minRows: 2, maxRows: 3 }"
+                            v-model="item.remark"
+                        ></el-input>
+                    </div>
+                </div>
+            </div>
+            <el-form-item>
+                <div style="margin-top: 10px">
+                    <el-button
+                        @click="
+                            readonly = false;
+                            formData.submit = false;
+                        "
+                        :loading="saving"
+                        type="warning"
+                        v-if="formData.status == 'FIRST_REVIEW_DENY'"
+                        >编辑</el-button
                     >
-                    </el-input>
-                    <el-button v-else class="button-new-tag" size="small" @click="showInput"
-                        >添加考级活动名称</el-button
+                    <el-button @click="onSave(true)" :loading="saving" type="primary" v-if="!formData.submit"
+                        >提交</el-button
                     >
-                </div>
-            </el-form-item>
-            <el-form-item prop="privacyPolicy" label="法人资格">
-                <!-- <el-upload class="upload-demo" action="../upload/file" :on-change="handleChange" :file-list="fileList3">
-                    <el-button size="small" type="primary">
-                        点击上传
+                    <el-button @click="onSave(false)" :loading="saving" type="success" v-if="!formData.submit"
+                        >保存</el-button
+                    >
+                    <el-button
+                        @click="onCancel"
+                        :loading="saving"
+                        type="danger"
+                        v-if="formData.id && formData.status != 'CANCEL' && readonly"
+                        >取消申请
                     </el-button>
-                </el-upload> -->
-                <file-upload v-model="formData.privacyPolicy"></file-upload>
-            </el-form-item>
-            <el-form-item prop="business" label="业务内容">
-                <file-upload v-model="formData.business"></file-upload>
-                <el-input style="display:none"></el-input>
-            </el-form-item>
-            <el-form-item prop="credits" label="社会信誉">
-                <file-upload v-model="formData.credits"></file-upload>
-            </el-form-item>
-            <el-form-item prop="fire" label="消防卫生">
-                <file-upload v-model="formData.fire"></file-upload>
-            </el-form-item>
-            <el-form-item prop="finance" label="财务报表">
-                <file-upload v-model="formData.finance"></file-upload>
-            </el-form-item>
-            <el-form-item prop="property" label="房产证明">
-                <file-upload v-model="formData.property"></file-upload>
-            </el-form-item>
-            <el-form-item prop="introduction" label="单位概况">
-                <el-input type="textarea" :autosize="{ minRows: 2 }" v-model="formData.introduction"></el-input>
-            </el-form-item>
-            <el-form-item>
-                <el-button @click="onSave('FIRST_REVIEW_PENDING')" :loading="saving" type="success"
-                    >提交申请信息</el-button
-                >
-                <el-button @click="onSave('SUBMIT_PENDING')" :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-button @click="$router.go(-1)">返回</el-button>
+                </div>
             </el-form-item>
         </el-form>
     </div>
@@ -97,71 +209,173 @@
 import { mapState } from 'vuex';
 export default {
     name: 'RateEdit',
+    computed: {
+        ...mapState(['organization'])
+    },
     created() {
         if (this.$route.query.rateId) {
             this.$http
                 .get('rate/get/' + this.$route.query.rateId)
                 .then(res => {
                     this.formData = res;
+                    if (res.status != 'FIRST_REVIEW_PENDING' || res.submit) {
+                        this.readonly = true;
+                    }
+                    let data = res.rateAudits;
+                    if (typeof data != 'undefined') {
+                        this.showAudit = true;
+                        this.rateAudits = data;
+                    }
                 })
                 .catch(e => {
                     console.log(e);
                     this.$message.error(e.error);
                 });
+            // }
+        } else if (this.organization != null) {
+            this.formData.name = this.organization.name;
+            this.formData.owner = this.organization.owner;
+            this.formData.ownerEmail = this.organization.ownerEmail;
+            this.formData.ownerPhone = this.organization.ownerPhone;
+            this.formData.district = this.organization.district;
+            // this.formData.district1 = this.organization.district1;
+            // this.formData.privacyPolicy.push(this.organization.businessLicense);
+            this.formData.organizationId = this.organization.id;
         }
-        if (this.$route.query.organId) {
-            this.organizationId = Number(this.$route.query.organId);
-        }
-        if (typeof this.organization !== undefined) {
-            this.formData = this.organization;
-        }
+        this.$http
+            .get('/district/NJ')
+            .then(res => {
+                this.districts = res;
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
     },
     data() {
         return {
-            saving: false,
             formData: {
-                examination: []
+                examination: [],
+                name: '',
+                owner: '',
+                ownerEmail: '',
+                ownerPhone: '',
+                district: ''
+                // district1: []
             },
-            rules: {},
-            statusOptions: [
-                { label: '待提交', value: 'SUBMIT_PENDING' },
-                { label: '初审中', value: 'FIRST_REVIEW_PENDING' },
-                { label: '初审通过', value: 'FIRST_REVIEW_PASS' },
-                { label: '专家通过', value: 'EXPERT_PASS' }
-            ],
+            rateAudits: {},
+            showAudit: false,
             inputVisible: false,
-            // dynamicTags: [],
             inputValue: '',
-            organizationId: ''
+            saving: false,
+            districts: [],
+            readonly: false,
+            rules: {
+                name: [{ required: true, message: '请输入机构名称', trigger: 'blur' }],
+                owner: [{ required: true, message: '请输入负责人', trigger: 'blur' }],
+                ownerEmail: [{ required: true, message: '请输入邮箱', trigger: 'blur' }],
+                ownerPhone: [
+                    {
+                        required: true,
+                        pattern: /^1[3-9]\d{9}$/,
+                        message: '请输入手机号',
+                        trigger: 'blur'
+                    }
+                ],
+                introduction: [{ required: true, message: '请输入单位概况', trigger: 'blur' }],
+                undertakeExamination: [{ required: true, message: '请选择是否承办过考级活动', trigger: 'blur' }],
+                privacyPolicy: [
+                    {
+                        required: true,
+                        regexp: /^[_.@A-Za-z0-9-]*$/,
+                        message: '请上传法人资格',
+                        trigger: 'blur'
+                    }
+                ],
+                business: [
+                    {
+                        required: true,
+                        regexp: /^[_.@A-Za-z0-9-]*$/,
+                        message: '请上传业务内容',
+                        trigger: 'blur'
+                    }
+                ],
+                credits: [
+                    {
+                        required: true,
+                        regexp: /^[_.@A-Za-z0-9-]*$/,
+                        message: '请上传社会信誉',
+                        trigger: 'blur'
+                    }
+                ],
+                fire: [
+                    {
+                        required: true,
+                        regexp: /^[_.@A-Za-z0-9-]*$/,
+                        message: '请上传消防卫生',
+                        trigger: 'blur'
+                    }
+                ],
+                finance: [
+                    {
+                        required: true,
+                        regexp: /^[_.@A-Za-z0-9-]*$/,
+                        message: '请上传财务报表',
+                        trigger: 'blur'
+                    }
+                ],
+                property: [
+                    {
+                        required: true,
+                        regexp: /^[_.@A-Za-z0-9-]*$/,
+                        message: '请上传房产证明',
+                        trigger: 'blur'
+                    }
+                ]
+            }
         };
     },
-    computed: {
-        ...mapState(['organization'])
-    },
     methods: {
-        onSave(status) {
+        handleClose(tag) {
+            this.formData.examination.splice(this.formData.examination.indexOf(tag), 1);
+        },
+        showInput() {
+            this.inputVisible = true;
+            this.$nextTick(_ => {
+                this.$refs.saveTagInput.$refs.input.focus();
+            });
+        },
+        handleInputConfirm() {
+            let inputValue = this.inputValue;
+            if (inputValue) {
+                this.formData.examination.push(inputValue);
+            }
+            this.inputVisible = false;
+            this.inputValue = '';
+        },
+        onSave(isSubmit) {
             this.$refs.form.validate(valid => {
                 if (valid) {
-                    this.submit(status);
+                    this.submit(isSubmit);
                 } else {
                     return false;
                 }
             });
         },
-        submit(status) {
+        submit(isSubmit) {
             let data = { ...this.formData };
-            // data.userId = this.userInfo.id;
-            // data.organizer = this.userInfo.nickname;
-            data.status = status;
-            console.log(status);
-            data.organizationId = this.organizationId;
+            data.status = 'FIRST_REVIEW_PENDING';
+            if (this.formData.status == 'EXPERT_DENY') {
+                data.status = 'SUBMIT_GRADE';
+            }
+            data.submit = isSubmit;
             this.saving = true;
             this.$http
                 .post('/rate/save', data, { body: 'json' })
                 .then(res => {
                     this.saving = false;
                     this.$message.success('成功');
-                    // this.$router.go(-1);
+                    this.$router.go(-1);
                 })
                 .catch(e => {
                     console.log(e);
@@ -169,43 +383,67 @@ export default {
                     this.$message.error(e.error);
                 });
         },
-        onDelete() {
-            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+        onCancel() {
+            let data = { ...this.formData };
+            data.status = 'CANCEL';
+            data.submit = false;
+            this.$alert('取消将无法恢复,确认要取消么?', '警告', { type: 'error' })
                 .then(() => {
-                    return this.$http.post(`/rate/del/${this.formData.id}`);
+                    return this.$http.post('/rate/save', data, { body: 'json' });
                 })
                 .then(() => {
-                    this.$message.success('删除成功');
+                    this.$message.success('取消成功');
                     this.$router.go(-1);
                 })
                 .catch(e => {
                     if (e !== 'cancel') {
                         console.log(e);
-                        this.$message.error((e || {}).error || '删除失败');
+                        this.$message.error((e || {}).error || '取消失败');
                     }
                 });
-        },
-        handleClose(tag) {
-            this.formData.examination.splice(this.formData.examination.indexOf(tag), 1);
-        },
-        showInput() {
-            this.inputVisible = true;
-            this.$nextTick(_ => {
-                this.$refs.saveTagInput.$refs.input.focus();
-            });
-        },
-        handleInputConfirm() {
-            let inputValue = this.inputValue;
-            if (inputValue) {
-                this.formData.examination.push(inputValue);
-            }
-            this.inputVisible = false;
-            this.inputValue = '';
         }
     }
 };
 </script>
 <style lang="less" scoped>
+.info-content {
+    background: #f5f7fa;
+    padding: 30px 25px 25px;
+    margin: 2px auto;
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+
+    .info-item {
+        width: 50%;
+        display: flex;
+        align-items: center;
+        margin-bottom: 10px;
+
+        &.address {
+            width: 100%;
+            align-items: flex-start;
+            .val {
+                width: 465px;
+            }
+        }
+
+        .name {
+            font-size: 13px;
+            font-family: PingFangSC-Regular, PingFang SC;
+            font-weight: 400;
+            color: #565b66;
+            line-height: 22px;
+            min-width: 65px;
+            margin-right: 10px;
+            text-align: right;
+        }
+
+        .val {
+            width: 190px;
+        }
+    }
+}
 .el-tag + .el-tag {
     margin-left: 10px;
     // margin-bottom: 10px;
@@ -227,4 +465,18 @@ export default {
     // margin-left: 10px;
     vertical-align: bottom;
 }
+.el-radio__input.is-checked .el-radio__inner {
+    border-block: #409eff;
+    background: #409eff;
+}
+.el-radio__inner {
+    border: 1px solid #dcdfe6;
+    border-radius: 100%;
+    width: 14px;
+    height: 14px;
+    background-color: #fff;
+    cursor: pointer;
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box;
+}
 </style>

+ 230 - 0
src/main/vue/src/views/organization/RateEdit1.vue

@@ -0,0 +1,230 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="100px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <!-- <el-form-item prop="organizer" label="承办单位">
+                <el-input v-model="formData.organizer"></el-input>
+            </el-form-item> -->
+            <!-- <el-form-item prop="year" label="年度">
+                <el-input v-model="formData.year"></el-input>
+            </el-form-item> -->
+            <!-- <el-form-item prop="status" label="状态">
+                <el-select v-model="formData.status" clearable filterable placeholder="请选择">
+                    <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item> -->
+            <el-form-item label="是否承办过">
+                <el-radio-group v-model="formData.undertakeExamination" size="small">
+                    <el-radio :label="true">承办过</el-radio>
+                    <el-radio :label="false">未承办过</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="考级活动名称" v-if="formData.undertakeExamination">
+                <el-tag
+                    :key="tag"
+                    v-for="tag in formData.examination"
+                    closable
+                    :disable-transitions="false"
+                    @close="handleClose(tag)"
+                    size="medium"
+                    class="el-tag-height"
+                >
+                    {{ tag }}
+                </el-tag>
+                <div>
+                    <el-input
+                        class="input-new-tag"
+                        v-if="inputVisible"
+                        v-model="inputValue"
+                        ref="saveTagInput"
+                        size="small"
+                        @keyup.enter.native="handleInputConfirm"
+                        @blur="handleInputConfirm"
+                    >
+                    </el-input>
+                    <el-button v-else class="button-new-tag" size="small" @click="showInput"
+                        >添加考级活动名称</el-button
+                    >
+                </div>
+            </el-form-item>
+            <el-form-item prop="privacyPolicy" label="法人资格">
+                <!-- <el-upload class="upload-demo" action="../upload/file" :on-change="handleChange" :file-list="fileList3">
+                    <el-button size="small" type="primary">
+                        点击上传
+                    </el-button>
+                </el-upload> -->
+                <file-upload v-model="formData.privacyPolicy"></file-upload>
+            </el-form-item>
+            <el-form-item prop="business" label="业务内容">
+                <file-upload v-model="formData.business"></file-upload>
+                <el-input style="display:none"></el-input>
+            </el-form-item>
+            <el-form-item prop="credits" label="社会信誉">
+                <file-upload v-model="formData.credits"></file-upload>
+            </el-form-item>
+            <el-form-item prop="fire" label="消防卫生">
+                <file-upload v-model="formData.fire"></file-upload>
+            </el-form-item>
+            <el-form-item prop="finance" label="财务报表">
+                <file-upload v-model="formData.finance"></file-upload>
+            </el-form-item>
+            <el-form-item prop="property" label="房产证明">
+                <file-upload v-model="formData.property"></file-upload>
+            </el-form-item>
+            <el-form-item prop="introduction" label="单位概况">
+                <el-input type="textarea" :autosize="{ minRows: 2 }" v-model="formData.introduction"></el-input>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave('FIRST_REVIEW_PENDING')" :loading="saving" type="success"
+                    >提交申请信息</el-button
+                >
+                <el-button @click="onSave('SUBMIT_PENDING')" :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>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+export default {
+    name: 'RateEdit1',
+    created() {
+        if (this.$route.query.rateId) {
+            this.$http
+                .get('rate/get/' + this.$route.query.rateId)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+        if (this.$route.query.organId) {
+            this.organizationId = Number(this.$route.query.organId);
+        }
+        if (typeof this.organization !== undefined) {
+            this.formData = this.organization;
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {
+                examination: []
+            },
+            rules: {},
+            statusOptions: [
+                { label: '待提交', value: 'SUBMIT_PENDING' },
+                { label: '初审中', value: 'FIRST_REVIEW_PENDING' },
+                { label: '初审通过', value: 'FIRST_REVIEW_PASS' },
+                { label: '专家通过', value: 'EXPERT_PASS' }
+            ],
+            inputVisible: false,
+            // dynamicTags: [],
+            inputValue: '',
+            organizationId: ''
+        };
+    },
+    computed: {
+        ...mapState(['organization'])
+    },
+    methods: {
+        onSave(status) {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit(status);
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit(status) {
+            let data = { ...this.formData };
+            // data.userId = this.userInfo.id;
+            // data.organizer = this.userInfo.nickname;
+            data.status = status;
+            console.log(status);
+            data.organizationId = this.organizationId;
+            this.saving = true;
+            this.$http
+                .post('/rate/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    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(`/rate/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 || '删除失败');
+                    }
+                });
+        },
+        handleClose(tag) {
+            this.formData.examination.splice(this.formData.examination.indexOf(tag), 1);
+        },
+        showInput() {
+            this.inputVisible = true;
+            this.$nextTick(_ => {
+                this.$refs.saveTagInput.$refs.input.focus();
+            });
+        },
+        handleInputConfirm() {
+            let inputValue = this.inputValue;
+            if (inputValue) {
+                this.formData.examination.push(inputValue);
+            }
+            this.inputVisible = false;
+            this.inputValue = '';
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.el-tag + .el-tag {
+    margin-left: 10px;
+    // margin-bottom: 10px;
+}
+.el-tag-height {
+    line-height: 30px;
+    height: 32px !important;
+    margin-bottom: 10px;
+}
+.button-new-tag {
+    // margin-left: 10px;
+    height: 32px;
+    line-height: 30px;
+    padding-top: 0;
+    padding-bottom: 0;
+}
+.input-new-tag {
+    width: 200px;
+    // margin-left: 10px;
+    vertical-align: bottom;
+}
+</style>

+ 6 - 7
src/main/vue/src/views/organization/RateOrganizerList.vue

@@ -78,11 +78,10 @@ export default {
             downloading: false,
             statusOptions: [
                 { label: '初审中', value: 'FIRST_REVIEW_PENDING' },
-                { label: '初审通过', value: 'FIRST_REVIEW_PASS' },
-                { label: '初审拒绝', value: 'FIRST_REVIEW_DENY' },
-                { label: '专家通过', value: 'EXPERT_PASS' },
-                { label: '专家拒绝', value: 'EXPERT_DENY' },
-                { label: '取消', value: 'CANCEL' }
+                { label: '待复审', value: 'REVIEW_PENDING' },
+                { label: '初审驳回', value: 'FIRST_REVIEW_DENY' },
+                { label: '待提交成绩', value: 'SUBMIT_GRADE' },
+                { label: '专家拒绝', value: 'EXPERT_DENY' }
             ]
         };
     },
@@ -117,7 +116,7 @@ export default {
         },
         addRow() {
             this.$router.push({
-                path: '/organization',
+                path: '/rateEdit',
                 query: {
                     ...this.$route.query
                 }
@@ -125,7 +124,7 @@ export default {
         },
         editRow(row) {
             this.$router.push({
-                path: '/organization',
+                path: '/rateEdit',
                 query: {
                     organId: row.organizationId,
                     rateId: row.id

+ 25 - 0
src/test/java/com/izouma/wenlvju/repo/RateExpertAuditRepoTest.java

@@ -0,0 +1,25 @@
+package com.izouma.wenlvju.repo;
+
+
+import cn.hutool.core.collection.CollUtil;
+import com.izouma.wenlvju.ApplicationTests;
+import com.izouma.wenlvju.domain.RateExpertAudit;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class RateExpertAuditRepoTest extends ApplicationTests {
+    @Autowired
+    private RateExpertAuditRepo rateExpertAuditRepo;
+
+    @Test
+    public void test() {
+        rateExpertAuditRepo.save(RateExpertAudit.builder()
+                .rateId(136L)
+                .userId(25L)
+                .remark("测试备注")
+                .img(CollUtil.newArrayList("https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com/image/2021-04-09-11-17-06YrVCsdEQ.png",
+                        "https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com/image/2021-04-08-14-45-42CvVMClla.jpg"))
+                .build());
+    }
+
+}