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

+ 25 - 0
src/main/java/com/izouma/wenlvju/converter/RateAuditListConverter.java

@@ -0,0 +1,25 @@
+package com.izouma.wenlvju.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.izouma.wenlvju.dto.RateAudit;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.List;
+
+public class RateAuditListConverter implements AttributeConverter<List<RateAudit>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<RateAudit> list) {
+        if (list != null)
+            return JSON.toJSONString(list);
+        return null;
+    }
+
+    @Override
+    public List<RateAudit> convertToEntityAttribute(String s) {
+        if (StringUtils.isNotEmpty(s)) {
+            return JSON.parseArray(s, RateAudit.class);
+        }
+        return null;
+    }
+}

+ 19 - 2
src/main/java/com/izouma/wenlvju/domain/Rate.java

@@ -1,7 +1,9 @@
 package com.izouma.wenlvju.domain;
 
 import com.izouma.wenlvju.converter.LongArrayConverter;
+import com.izouma.wenlvju.converter.RateAuditListConverter;
 import com.izouma.wenlvju.converter.StringArrayConverter;
+import com.izouma.wenlvju.dto.RateAudit;
 import com.izouma.wenlvju.enums.RateStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -10,6 +12,8 @@ import org.hibernate.annotations.Where;
 
 import javax.persistence.*;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 
 @Data
@@ -33,9 +37,14 @@ public class Rate extends BaseEntity {
     @NonNull
     private String ownerEmail;
 
+    private String district;
+
     @Convert(converter = StringArrayConverter.class)
     private List<String> district1;
 
+    @Enumerated(EnumType.STRING)
+    private RateStatus status;
+
     @NonNull
     @ApiModelProperty(value = "是否承办考级活动")
     private boolean undertakeExamination;
@@ -48,6 +57,9 @@ public class Rate extends BaseEntity {
     @ApiModelProperty(value = "单位概况")
     private String introduction;
 
+    @ApiModelProperty(value = "是否提交")
+    private boolean submit;
+
 //    @Convert(converter = StringArrayConverter.class)
 //    private List<String> img;
 
@@ -58,8 +70,6 @@ public class Rate extends BaseEntity {
     @ApiModelProperty(value = "年度")
     private String year;
 
-    private RateStatus status;
-
     @Column(columnDefinition = "TEXT")
     @Convert(converter = StringArrayConverter.class)
     @ApiModelProperty(value = "法人资格")
@@ -97,6 +107,9 @@ public class Rate extends BaseEntity {
     @ApiModelProperty(value = "专家组员")
     private List<Long> expertMemberUserId;
 
+    @ApiModelProperty(value = "申请时间")
+    private LocalDateTime applyTime;
+
     @ApiModelProperty(value = "审核开始时间")
     private LocalDate reviewStartTime;
 
@@ -112,4 +125,8 @@ public class Rate extends BaseEntity {
 
     @Transient
     private String organizer;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = RateAuditListConverter.class)
+    private List<RateAudit> rateAudits = new ArrayList<>();
 }

+ 2 - 4
src/main/java/com/izouma/wenlvju/dto/OrganizationRegDTO.java

@@ -6,9 +6,6 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import java.util.List;
-
-
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
@@ -30,6 +27,7 @@ public class OrganizationRegDTO {
 
     private String businessLicense;
 
-    private List<String> district1;
+    private String district;
+//    private List<String> district1;
 
 }

+ 23 - 0
src/main/java/com/izouma/wenlvju/dto/RateAudit.java

@@ -0,0 +1,23 @@
+package com.izouma.wenlvju.dto;
+
+import com.izouma.wenlvju.enums.RateStatus;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class RateAudit {
+    private LocalDateTime auditTime;
+
+    private Long userId;
+
+    private RateStatus status;
+
+    private String remark;
+}

+ 17 - 10
src/main/java/com/izouma/wenlvju/enums/RateStatus.java

@@ -2,25 +2,32 @@ package com.izouma.wenlvju.enums;
 
 public enum RateStatus {
     /*
-    初审
+    等待初审
      */
     FIRST_REVIEW_PENDING,
     /*
-    初审通过
+    初审通过
      */
-    FIRST_REVIEW_PASS,
     FIRST_REVIEW_DENY,
     /*
-    专家通过
+    待复审(分配专家组)
      */
-    EXPERT_PASS,
+    REVIEW_PENDING,
+    /*
+    待提交成绩
+     */
+    SUBMIT_GRADE,
     EXPERT_DENY,
     /*
-    待提交
-    */
-    SUBMIT_PENDING,
+    待提交纸质材料
+     */
+    SUBMIT_PAPER_MATERIALS,
+    /*
+    取消
+     */
+    CANCEL,
     /*
-    提交纸质材料
+    完成
      */
-    SUBMIT_PAPER_MATERIALS
+    COMPLETE
 }

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

@@ -1,16 +1,21 @@
 package com.izouma.wenlvju.repo;
 
 import com.izouma.wenlvju.domain.Rate;
+import com.izouma.wenlvju.enums.RateStatus;
+import lombok.NonNull;
 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;
+import java.util.List;
 
 public interface RateRepo extends JpaRepository<Rate, Long>, JpaSpecificationExecutor<Rate> {
     @Query("update Rate t set t.del = true where t.id = ?1")
     @Modifying
     @Transactional
     void softDelete(Long id);
+
+    List<Rate> findAllByOrganizationIdAndYearAndStatusNot(@NonNull Long organizationId, String year, RateStatus status);
 }

+ 20 - 3
src/main/java/com/izouma/wenlvju/service/RateService.java

@@ -2,6 +2,7 @@ package com.izouma.wenlvju.service;
 
 import com.izouma.wenlvju.domain.Rate;
 import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.dto.RateAudit;
 import com.izouma.wenlvju.enums.RateStatus;
 import com.izouma.wenlvju.exception.BusinessException;
 import com.izouma.wenlvju.repo.RateRepo;
@@ -10,6 +11,10 @@ import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
 @Service
 @AllArgsConstructor
 public class RateService {
@@ -20,12 +25,24 @@ public class RateService {
         return rateRepo.findAll(JpaUtils.toSpecification(pageQuery, Rate.class), JpaUtils.toPageRequest(pageQuery));
     }
 
-    public void audit(Long id, RateStatus status,int score) {
+    public void audit(Long id, RateStatus status, String remark, int score, Long userId) {
         Rate rate = rateRepo.findById(id).orElseThrow(new BusinessException("无记录"));
         rate.setStatus(status);
-        if (RateStatus.EXPERT_PASS.equals(status)){
-            rate.setScore(score);
+        RateAudit rateAudit = RateAudit.builder()
+                .auditTime(LocalDateTime.now())
+                .userId(userId)
+                .remark(remark)
+                .status(status)
+                .build();
+        List<RateAudit> rateAudits = rate.getRateAudits();
+        if (rateAudits == null) {
+            rateAudits = new ArrayList<>();
         }
+        rateAudits.add(rateAudit);
+//        if (RateStatus.EXPERT_PASS.equals(status)){
+//            rate.setScore(score);
+//        }
+        rate.setRateAudits(rateAudits);
         rateRepo.save(rate);
     }
 

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

@@ -227,7 +227,8 @@ public class UserService {
                         .businessLicense(dto.getBusinessLicense())
                         .userId(save.getId())
                         .name(dto.getOrganizationName())
-                        .district1(dto.getDistrict1())
+//                        .district1(dto.getDistrict1())
+                        .district(dto.getDistrict())
                         .build());
 
         return user;

+ 14 - 3
src/main/java/com/izouma/wenlvju/web/RateController.java

@@ -1,5 +1,6 @@
 package com.izouma.wenlvju.web;
 
+import cn.hutool.core.collection.CollUtil;
 import com.izouma.wenlvju.domain.Organization;
 import com.izouma.wenlvju.domain.Rate;
 import com.izouma.wenlvju.dto.PageQuery;
@@ -10,6 +11,7 @@ import com.izouma.wenlvju.repo.RateRepo;
 import com.izouma.wenlvju.service.OrganizationService;
 import com.izouma.wenlvju.service.RateService;
 import com.izouma.wenlvju.utils.ObjUtils;
+import com.izouma.wenlvju.utils.SecurityUtils;
 import com.izouma.wenlvju.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
@@ -18,6 +20,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -39,8 +42,16 @@ public class RateController extends BaseController {
             ObjUtils.merge(orig, record);
             return rateRepo.save(orig);
         }
-        record.setYear(String.valueOf(LocalDate.now().getYear()));
+        String year = String.valueOf(LocalDate.now().getYear());
+        List<Rate> rate = rateRepo.findAllByOrganizationIdAndYearAndStatusNot(record.getOrganizationId(), year, RateStatus.CANCEL);
+        if (CollUtil.isNotEmpty(rate)) {
+            throw new BusinessException("已申请");
+        }
+        record.setYear(year);
         organizationService.saveRate(record);
+        if (record.isSubmit() && RateStatus.FIRST_REVIEW_PENDING.equals(record.getStatus())) {
+            record.setApplyTime(LocalDateTime.now());
+        }
         return rateRepo.save(record);
     }
 
@@ -80,8 +91,8 @@ public class RateController extends BaseController {
     }
 
     @PostMapping("/audit")
-    public void audit(@RequestParam Long id, @RequestParam RateStatus status, int score) {
-        rateService.audit(id, status, score);
+    public void audit(@RequestParam Long id, @RequestParam RateStatus status, String remark, int score) {
+        rateService.audit(id, status, remark, score, SecurityUtils.getAuthenticatedUser().getId());
     }
 
     @PostMapping("/addExpert")

+ 22 - 1
src/main/vue/src/components/DistrictChoose copy.vue

@@ -20,7 +20,10 @@ export default {
             type: Boolean,
             default: false
         },
-        maxLevel: {}
+        maxLevel: {},
+        province: {},
+        city: {},
+        district: {}
     },
     data() {
         return {
@@ -63,6 +66,24 @@ export default {
             this.chooseValue = this.value;
         }
     },
+    computed: {
+        backValue() {
+            const values = [...this.area1];
+            var province = '',
+                city = '';
+            if (values.length > 2) {
+                province = values[2];
+            }
+            if (values.length > 3) {
+                city = values[3];
+            }
+
+            return {
+                province,
+                city
+            };
+        }
+    },
     methods: {
         onChange(e) {
             this.emiting = true;

+ 49 - 0
src/main/vue/src/components/DistrictSelect.vue

@@ -0,0 +1,49 @@
+<template>
+    <div style="display:inline-block">
+        <el-select v-model="district" style="width:100%">
+            <el-option v-for="item in districts" :key="item.id" :value="item.name" :label="item.name"></el-option>
+        </el-select>
+    </div>
+</template>
+<script>
+export default {
+    props: {
+        value: {
+            type: String
+        }
+    },
+    data() {
+        return {
+            districts: [],
+            district: ''
+        };
+    },
+
+    mounted() {
+        this.district = this.value;
+    },
+    created() {
+        this.$http
+            .get('/district/NJ')
+            .then(res => {
+                this.districts = res;
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+    },
+    // methods: {
+    //     onChange(e) {
+    //         this.$nextTick(() => {
+    //             this.$emit('input', this.district);
+    //         });
+    //     }
+    // },
+    watch: {
+        district(val) {
+            this.district = this.value;
+        }
+    }
+};
+</script>

+ 7 - 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">
+        <el-button type="primary" size="mini" slot="trigger" v-if="!readonly">
             点击上传
         </el-button>
         <div class="file-list-item" slot="file" slot-scope="{ file }">
@@ -54,6 +54,12 @@ export default {
                 return false;
             }
         },
+        readonly: {
+            type: Boolean,
+            default() {
+                return false;
+            }
+        },
         limit: {
             type: Number,
             default() {

+ 2 - 0
src/main/vue/src/main.js

@@ -13,6 +13,7 @@ import VideoUpload from '@/components/VideoUpload';
 import RichText from '@/components/RichText';
 import CropUpload from '@/components/CropUpload';
 import DistrictChoose from '@/components/DistrictChoose';
+import DistrictSelect from '@/components/DistrictSelect';
 import Formatters from '@/mixins/formatters';
 import 'normalize.css/normalize.css';
 import 'element-ui/lib/theme-chalk/index.css';
@@ -50,6 +51,7 @@ Vue.component('video-upload', VideoUpload);
 Vue.component('rich-text', RichText);
 Vue.component('crop-upload', CropUpload);
 Vue.component('district-choose', DistrictChoose);
+Vue.component('district-select', DistrictSelect);
 Vue.mixin(Formatters);
 
 new Vue({

+ 2 - 2
src/main/vue/src/router.js

@@ -253,7 +253,8 @@ const router = new Router({
                 {
                     path: '/rateOrganizerList',
                     name: 'RateOrganizerList',
-                    component: () => import(/* webpackChunkName: "rateList" */ '@/views/RateOrganizerList.vue'),
+                    component: () =>
+                        import(/* webpackChunkName: "rateList" */ '@/views/organization/RateOrganizerList.vue'),
                     meta: {
                         title: '评星定级'
                     }
@@ -372,7 +373,6 @@ router.beforeEach((to, from, next) => {
                 let flag = res.data.authorities.find(item => {
                     return item.name == 'ROLE_ORGANIZER';
                 });
-                console.log(flag);
                 if (flag) {
                     http.axios
                         .get('/organization/getByUserId/' + res.data.id)

+ 9 - 1
src/main/vue/src/views/Login.vue

@@ -33,7 +33,15 @@
                         prop="district"
                         :rules="{ required: true, message: '请选择注册地址', trigger: 'blur' }"
                     >
-                        <district-choose v-model="registerInfo.district"></district-choose>
+                        <!-- <district-choose v-model="registerInfo.district"></district-choose> -->
+                        <el-select v-model="formData.district">
+                            <el-option
+                                v-for="item in district"
+                                :key="item.id"
+                                :value="item.name"
+                                :label="item.name"
+                            ></el-option>
+                        </el-select>
                     </el-form-item>
                     <!-- <el-form-item
                         prop="businessLicense"

+ 125 - 27
src/main/vue/src/views/Organization.vue

@@ -13,31 +13,47 @@
                 <div class="info-item">
                     <div class="name">机构名称</div>
                     <div class="val">
-                        <el-input v-model="formData.name" placeholder="请输入机构名称"></el-input>
+                        <el-input v-model="formData.name" placeholder="请输入机构名称" :readonly="readonly"></el-input>
                     </div>
                 </div>
                 <div class="info-item">
-                    <div class="name">负责人</div>
+                    <div class="name">负责人邮箱</div>
                     <div class="val">
-                        <el-input v-model="formData.owner" placeholder="请输入负责人"></el-input>
+                        <el-input
+                            v-model="formData.ownerEmail"
+                            placeholder="请输入负责人邮箱"
+                            :readonly="readonly"
+                        ></el-input>
                     </div>
                 </div>
                 <div class="info-item">
-                    <div class="name">负责人邮箱</div>
+                    <div class="name">负责人</div>
                     <div class="val">
-                        <el-input v-model="formData.ownerEmail" placeholder="请输入负责人邮箱"></el-input>
+                        <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="请输入负责人电话"></el-input>
+                        <el-input
+                            v-model="formData.ownerPhone"
+                            placeholder="请输入负责人电话"
+                            :readonly="readonly"
+                        ></el-input>
                     </div>
                 </div>
                 <div class="info-item">
                     <div class="name">地址</div>
                     <div class="val">
-                        <district-choose v-model="formData.district1"></district-choose>
+                        <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>
 
@@ -45,6 +61,7 @@
                     <div class="name">单位概况</div>
                     <div class="val">
                         <el-input
+                            :readonly="readonly"
                             type="textarea"
                             :autosize="{ minRows: 4, maxRows: 6 }"
                             placeholder="请输入单位概况"
@@ -55,7 +72,7 @@
                 <div class="info-item address">
                     <div class="name">考级活动</div>
                     <div class="val">
-                        <el-radio-group v-model="formData.undertakeExamination" size="small">
+                        <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>
@@ -67,7 +84,7 @@
                         <el-tag
                             :key="tag"
                             v-for="tag in formData.examination"
-                            closable
+                            :closable="!readonly"
                             :disable-transitions="false"
                             @close="handleClose(tag)"
                             size="medium"
@@ -86,7 +103,11 @@
                                 @blur="handleInputConfirm"
                             >
                             </el-input>
-                            <el-button v-else class="button-new-tag" size="small" @click="showInput"
+                            <el-button
+                                v-if="!inputVisible && !readonly"
+                                class="button-new-tag"
+                                size="small"
+                                @click="showInput"
                                 >添加考级活动名称</el-button
                             >
                         </div>
@@ -97,20 +118,20 @@
                 <div class="info-item address">
                     <div class="name">法人资格</div>
                     <div class="val">
-                        <file-upload v-model="formData.privacyPolicy"></file-upload>
+                        <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"></file-upload>
+                        <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"></file-upload>
+                        <file-upload v-model="formData.credits" :readonly="readonly"></file-upload>
                     </div>
                 </div>
             </div>
@@ -118,27 +139,49 @@
                 <div class="info-item address">
                     <div class="name">消防卫生</div>
                     <div class="val">
-                        <file-upload v-model="formData.fire"></file-upload>
+                        <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"></file-upload>
+                        <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"></file-upload>
+                        <file-upload v-model="formData.property" :readonly="readonly"></file-upload>
+                    </div>
+                </div>
+            </div>
+            <div class="info-content">
+                <div class="info-item">
+                    <div class="name">驳回时间</div>
+                    <div class="val">
+                        <el-input></el-input>
+                    </div>
+                </div>
+                <div class="info-item address">
+                    <div class="name">驳回缘由</div>
+                    <div class="val">
+                        <el-input></el-input>
                     </div>
                 </div>
             </div>
             <el-form-item>
                 <div style="margin-top: 10px">
-                    <el-button @click="readonly = false" :loading="saving" type="success">提交</el-button>
-                    <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
-                    <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id"
+                    <el-button @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>
@@ -160,29 +203,51 @@ 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;
+                    }
                 })
                 .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.district1 = this.organization.district1;
-            this.formData.privacyPolicy.push(this.organization.businessLicense);
+            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')
+            .then(res => {
+                this.districts = res;
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
     },
     data() {
         return {
             formData: {
-                examination: []
+                examination: [],
+                name: '',
+                owner: '',
+                ownerEmail: '',
+                ownerPhone: '',
+                district: ''
+                // district1: []
             },
             inputVisible: false,
             inputValue: '',
             saving: false,
+            districts: [],
+            readonly: false,
             rules: {
                 name: [{ required: true, message: '请输入机构名称', trigger: 'blur' }],
                 owner: [{ required: true, message: '请输入负责人', trigger: 'blur' }],
@@ -266,19 +331,19 @@ export default {
             this.inputVisible = false;
             this.inputValue = '';
         },
-        onSave(status) {
+        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.status = status;
-            data.organizationId = this.organizationId;
+            data.status = 'FIRST_REVIEW_PENDING';
+            data.submit = isSubmit;
             this.saving = true;
             this.$http
                 .post('/rate/save', data, { body: 'json' })
@@ -292,6 +357,25 @@ export default {
                     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 || '取消失败');
+                    }
+                });
         }
     }
 };
@@ -356,4 +440,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>

+ 2 - 1
src/main/vue/src/views/RateExpertList.vue

@@ -121,7 +121,8 @@ export default {
                 search: this.search,
                 query: {
                     expertUserId: this.userInfo.id,
-                    status: ['FIRST_REVIEW_PASS', 'EXPERT_PASS', 'EXPERT_DENY']
+                    status: ['FIRST_REVIEW_PASS', 'EXPERT_PASS', 'EXPERT_DENY'],
+                    submit: true
                 }
             };
         },

+ 41 - 29
src/main/vue/src/views/RateList.vue

@@ -29,18 +29,12 @@
             <el-table-column prop="createdAt" label="申请时间"></el-table-column>
             <el-table-column prop="year" label="年度"> </el-table-column>
             <el-table-column prop="status" label="状态" :formatter="statusFormatter"> </el-table-column>
-            <!-- <el-table-column prop="privacyPolicy" label="法人资格"> </el-table-column>
-            <el-table-column prop="business" label="业务内容"> </el-table-column>
-            <el-table-column prop="credits" label="社会信誉"> </el-table-column>
-            <el-table-column prop="fire" label="消防卫生"> </el-table-column>
-            <el-table-column prop="finance" label="财务报表"> </el-table-column>
-            <el-table-column prop="property" label="房产证明"> </el-table-column> -->
-            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+            <el-table-column label="操作" align="right" fixed="right" min-width="150">
                 <template slot-scope="{ row }">
                     <el-button
                         v-if="row.status === 'FIRST_REVIEW_PENDING'"
                         :loading="row.loading"
-                        @click="audit(row, 'FIRST_REVIEW_PASS')"
+                        @click="audit(row, 'REVIEW_PENDING')"
                         type="success"
                         size="mini"
                         plain
@@ -50,12 +44,12 @@
                     <el-button
                         v-if="row.status === 'FIRST_REVIEW_PENDING'"
                         :loading="row.loading"
-                        @click="audit(row, 'FIRST_REVIEW_DENY')"
+                        @click="dismiss(row)"
                         type="warning"
                         size="mini"
                         plain
                     >
-                        拒绝
+                        驳回
                     </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'"
@@ -124,10 +118,10 @@ export default {
             url: '/rate/all2',
             downloading: false,
             statusOptions: [
-                { label: '初审', value: 'FIRST_REVIEW_PENDING' },
-                { label: '初审通过', value: 'FIRST_REVIEW_PASS' },
-                { label: '初审拒绝', value: 'FIRST_REVIEW_DENY' },
-                { label: '专家通过', value: 'EXPERT_PASS' },
+                { label: '等待初审', value: 'FIRST_REVIEW_PENDING' },
+                { label: '待复审', value: 'REVIEW_PENDING' },
+                { label: '初审驳回', value: 'FIRST_REVIEW_DENY' },
+                { label: '待提交成绩', value: 'SUBMIT_GRADE' },
                 { label: '专家拒绝', value: 'EXPERT_DENY' }
             ],
             supervisor: [],
@@ -173,19 +167,21 @@ export default {
             return '';
         },
         beforeGetData() {
-            return {
-                search: this.search,
-                sort: 'createdAt,desc',
-                query: {
-                    status: [
-                        'FIRST_REVIEW_PENDING',
-                        'FIRST_REVIEW_PASS',
-                        'FIRST_REVIEW_DENY',
-                        'EXPERT_PASS',
-                        'EXPERT_DENY'
-                    ]
-                }
-            };
+            // return {
+            //     search: this.search,
+            //     sort: 'createdAt,desc',
+            //     query: {
+            //         submit: true
+            //     }
+            // };
+            let data = { sort: 'createdAt,desc', query: { submit: true } };
+            if (this.search) {
+                data.search = this.search;
+            }
+            if (!this.display) {
+                data.query.district = this.userInfo.district;
+            }
+            return data;
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;
@@ -258,13 +254,14 @@ export default {
                     }
                 });
         },
-        audit(row, status) {
+        audit(row, status, remark) {
             this.$set(row, 'loading', true);
             this.$http
                 .post('/rate/audit', {
                     id: row.id,
                     status: status,
-                    score: 0
+                    score: 0,
+                    remark: remark
                 })
                 .then(res => {
                     this.$set(row, 'loading', false);
@@ -277,6 +274,21 @@ export default {
                     this.$message.error(e.error);
                 });
         },
+        dismiss(row) {
+            this.$prompt('请输入驳回缘由', '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消'
+            })
+                .then(({ value }) => {
+                    this.audit(row, 'FIRST_REVIEW_DENY', value);
+                })
+                .catch(() => {
+                    this.$message({
+                        type: 'info',
+                        message: '取消输入'
+                    });
+                });
+        },
         supervision(id) {
             this.dialogVisible = true;
             this.rateId = id;

+ 2 - 5
src/main/vue/src/views/UserEdit.vue

@@ -67,6 +67,7 @@ export default {
                 .get(`/user/get/${this.$route.query.id}`)
                 .then(res => {
                     this.formData = res;
+                    this.getDistrct();
                 })
                 .catch(e => {
                     console.log(e);
@@ -120,8 +121,7 @@ export default {
             },
             authorities: [],
             districts: [],
-            districtDisplay: false,
-            artTypeDisplay: false
+            districtDisplay: false
         };
     },
     methods: {
@@ -193,12 +193,9 @@ export default {
         getDistrct() {
             let authorities = this.formData.authorities;
             this.districtDisplay = false;
-            this.artTypeDisplay = false;
             authorities.forEach(element => {
                 if ('ROLE_DISTRICT' === element.name) {
                     this.districtDisplay = true;
-                } else if ('ROLE_EXPERT' === element.name) {
-                    this.artTypeDisplay = true;
                 }
             });
         }

+ 3 - 3
src/main/vue/src/views/UserList.vue

@@ -25,9 +25,9 @@
         >
             <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="昵称" min-width="300"> </el-table-column>
-            <el-table-column label="头像" min-width="300">
+            <el-table-column prop="username" label="用户名" min-width="100"> </el-table-column>
+            <el-table-column prop="nickname" label="昵称" min-width="100"> </el-table-column>
+            <el-table-column label="头像" min-width="100">
                 <template slot-scope="{ row }">
                     <el-image
                         style="width: 30px; height: 30px;"

+ 9 - 1
src/main/vue/src/views/organization/OrganizationInfo.vue

@@ -83,7 +83,15 @@
                 <div class="info-item address">
                     <div class="name">地址</div>
                     <div class="val">
-                        <district-choose v-model="formData.district1"></district-choose>
+                        <!-- <district-choose v-model="formData.district1"></district-choose> -->
+                        <el-select v-model="formData.district" style="width:100%">
+                            <el-option
+                                v-for="(item, index) in districtOptions"
+                                :key="index"
+                                :value="item.value"
+                                :label="item.label"
+                            ></el-option>
+                        </el-select>
                         <el-input
                             type="textarea"
                             :autosize="{ minRows: 3, maxRows: 4 }"

+ 8 - 2
src/main/vue/src/views/RateOrganizerList.vue → src/main/vue/src/views/organization/RateOrganizerList.vue

@@ -27,6 +27,12 @@
             <el-table-column prop="createdAt" label="申请时间"></el-table-column>
             <el-table-column prop="year" label="年度"> </el-table-column>
             <el-table-column prop="status" label="状态" :formatter="statusFormatter"> </el-table-column>
+            <el-table-column prop="submit" label="提交">
+                <template slot-scope="{ row }">
+                    <span v-if="row.submit">已提交</span>
+                    <span v-else>未提交</span>
+                </template>
+            </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>
@@ -76,7 +82,7 @@ export default {
                 { label: '初审拒绝', value: 'FIRST_REVIEW_DENY' },
                 { label: '专家通过', value: 'EXPERT_PASS' },
                 { label: '专家拒绝', value: 'EXPERT_DENY' },
-                { label: '待提交', value: 'SUBMIT_PENDING' }
+                { label: '取消', value: 'CANCEL' }
             ]
         };
     },
@@ -99,7 +105,7 @@ export default {
                 search: this.search,
                 sort: 'createdAt,desc',
                 query: {
-                    // organizationId: this.organization.id
+                    organizationId: this.organization.id
                 }
             };
         },