Browse Source

补全资料

licailing 5 years ago
parent
commit
7122e4a76e

+ 4 - 0
src/main/java/com/izouma/wenlvju/domain/Rate.java

@@ -18,6 +18,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 @Data
 @AllArgsConstructor
@@ -108,6 +109,9 @@ public class Rate extends BaseEntity {
     @ApiModelProperty(value = "专家组长")
     private Long expertUserId;
 
+    @Transient
+    private Map<String, String> expertUser;
+
     @Convert(converter = LongArrayConverter.class)
     @ApiModelProperty(value = "专家组员")
     private List<Long> expertMemberUserId;

+ 17 - 0
src/main/java/com/izouma/wenlvju/repo/CollaborateRepo.java

@@ -0,0 +1,17 @@
+package com.izouma.wenlvju.repo;
+
+import com.izouma.wenlvju.domain.Collaborate;
+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 CollaborateRepo extends JpaRepository<Collaborate, Long>, JpaSpecificationExecutor<Collaborate> {
+    @Query("update Collaborate t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 37 - 0
src/main/java/com/izouma/wenlvju/service/CollaborateService.java

@@ -0,0 +1,37 @@
+package com.izouma.wenlvju.service;
+
+import com.izouma.wenlvju.domain.Collaborate;
+import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.exception.BusinessException;
+import com.izouma.wenlvju.repo.CollaborateRepo;
+import com.izouma.wenlvju.utils.JpaUtils;
+import com.izouma.wenlvju.utils.ObjUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class CollaborateService {
+
+    private CollaborateRepo collaborateRepo;
+
+    public Page<Collaborate> all(PageQuery pageQuery) {
+        return collaborateRepo.findAll(JpaUtils.toSpecification(pageQuery, Collaborate.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    public void batchSave(List<Collaborate> collaborateList) {
+        collaborateList.forEach(collaborate -> {
+            if (collaborate.getId() != null) {
+                Collaborate orig = collaborateRepo.findById(collaborate.getId())
+                        .orElseThrow(new BusinessException("无记录"));
+                ObjUtils.merge(orig, collaborate);
+                collaborateRepo.save(orig);
+            } else {
+                collaborateRepo.save(collaborate);
+            }
+        });
+    }
+}

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

@@ -83,7 +83,7 @@ public class RateService {
             dataMap.put("undertake", rate.isUndertakeExamination() ? "是" : "否");
             //考级机构名称
 //            if (rate.isUndertakeExamination()) {
-            dataMap.put("examination", String.join(",", rate.getExamination()));
+//            dataMap.put("examination", String.join(",", rate.getExamination()));
 //            }
             //单位概况
             dataMap.put("introduction", rate.getIntroduction());

+ 67 - 0
src/main/java/com/izouma/wenlvju/web/CollaborateController.java

@@ -0,0 +1,67 @@
+package com.izouma.wenlvju.web;
+
+import com.alibaba.fastjson.JSONObject;
+import com.izouma.wenlvju.domain.Collaborate;
+import com.izouma.wenlvju.service.CollaborateService;
+import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.exception.BusinessException;
+import com.izouma.wenlvju.repo.CollaborateRepo;
+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("/collaborate")
+@AllArgsConstructor
+public class CollaborateController extends BaseController {
+    private CollaborateService collaborateService;
+    private CollaborateRepo    collaborateRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Collaborate save(@RequestBody Collaborate record) {
+        if (record.getId() != null) {
+            Collaborate orig = collaborateRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return collaborateRepo.save(orig);
+        }
+        return collaborateRepo.save(record);
+    }
+
+    @PostMapping("/batchSave")
+    public void batchSave(String collaborates) {
+        List<Collaborate> collaborateList = JSONObject.parseArray(collaborates, Collaborate.class);
+        collaborateService.batchSave(collaborateList);
+    }
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<Collaborate> all(@RequestBody PageQuery pageQuery) {
+        return collaborateService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public Collaborate get(@PathVariable Long id) {
+        return collaborateRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        collaborateRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Collaborate> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 15 - 0
src/main/java/com/izouma/wenlvju/web/RateController.java

@@ -5,11 +5,13 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.izouma.wenlvju.domain.Organization;
 import com.izouma.wenlvju.domain.Rate;
+import com.izouma.wenlvju.domain.User;
 import com.izouma.wenlvju.dto.PageQuery;
 import com.izouma.wenlvju.enums.RateStatus;
 import com.izouma.wenlvju.exception.BusinessException;
 import com.izouma.wenlvju.repo.OrganizationRepo;
 import com.izouma.wenlvju.repo.RateRepo;
+import com.izouma.wenlvju.repo.UserRepo;
 import com.izouma.wenlvju.service.OrganizationService;
 import com.izouma.wenlvju.service.RateService;
 import com.izouma.wenlvju.utils.ObjUtils;
@@ -35,6 +37,7 @@ public class RateController extends BaseController {
     private RateRepo            rateRepo;
     private OrganizationRepo    organizationRepo;
     private OrganizationService organizationService;
+    private UserRepo            userRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -93,6 +96,18 @@ public class RateController extends BaseController {
         return rateRepo.findById(id).orElseThrow(new BusinessException("无记录"));
     }
 
+    @GetMapping("/get1/{id}")
+    public Rate get1(@PathVariable Long id) {
+        Rate rate = rateRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        if (CollUtil.isNotEmpty(rate.getExpertMemberUserId())) {
+            rate.setExpertUser(userRepo.findAllById(rate.getExpertMemberUserId())
+                    .stream()
+                    .collect(Collectors.toMap(User::getPhone, User::getNickname)));
+        }
+
+        return rate;
+    }
+
     @PostMapping("/del/{id}")
     public void del(@PathVariable Long id) {
         rateRepo.softDelete(id);

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

@@ -0,0 +1 @@
+{"tableName":"Collaborate","className":"Collaborate","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":"rateId","modelName":"rateId","remark":"等级评定","showInList":true,"showInForm":true,"formType":"number"},{"name":"gradingOrganizationId","modelName":"gradingOrganizationId","remark":"考级机构","showInList":true,"showInForm":true,"formType":"number"},{"name":"consent","modelName":"consent","remark":"合作协议","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"artTypeId","modelName":"artTypeId","remark":"专业","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.wenlvju","tablePackage":"com.izouma.wenlvju.domain.Collaborate"}

+ 2 - 1
src/main/vue/src/mixins/rateStatus.js

@@ -10,7 +10,8 @@ export default {
                 { label: '待专家组考察', value: 'REVIEW_PENDING' },
                 { label: '最终评审', value: 'SUBMIT_GRADE' },
                 { label: '待提交纸质材料', value: 'SUBMIT_PAPER_MATERIALS' },
-                { label: '完成', value: 'COMPLETE' }
+                { label: '完成', value: 'COMPLETE' },
+                { label: '撤回', value: 'CANCEL' }
             ]
         };
     },

+ 1 - 1
src/main/vue/src/plugins/http.js

@@ -5,7 +5,7 @@ import qs from 'qs';
 let baseUrl = 'http://localhost:8080';
 switch (process.env.NODE_ENV) {
     case 'development':
-        baseUrl = 'http://localhost:8080';
+        baseUrl = 'http://192.168.50.190:8080';
         // baseUrl = 'http://wlj.izouma.com';
         break;
     case 'test':

+ 14 - 8
src/main/vue/src/views/ExpertEdit.vue

@@ -29,18 +29,18 @@
             <el-form-item prop="phone" label="手机">
                 <el-input v-model="formData.phone"></el-input>
             </el-form-item>
-            <el-form-item prop="expert" label="单位">
-                <!-- <el-input v-model="formData.expert.work"></el-input> -->
-                <el-select v-model="expert.work" style="width: 100%" placeholder="请选择单位" filterable>
+            <el-form-item label="单位">
+                <el-input v-model="expert.work"></el-input>
+                <!-- <el-select v-model="expert.work" style="width: 100%" placeholder="请选择单位" filterable>
                     <el-option
                         v-for="item in settings"
                         :key="item.id"
                         :label="item.name"
                         :value="item.name"
                     ></el-option>
-                </el-select>
+                </el-select> -->
             </el-form-item>
-            <el-form-item prop="expert" label="职称">
+            <el-form-item label="职称">
                 <el-input v-model="expert.position"></el-input>
             </el-form-item>
             <el-form-item prop="artTypeId" label="专业">
@@ -85,7 +85,9 @@ export default {
                 .get(`/user/get/${this.$route.query.id}`)
                 .then(res => {
                     this.formData = res;
-                    this.expert = res.expert;
+                    if (typeof res.expert != 'undefined') {
+                        this.expert = res.expert;
+                    }
                 })
                 .catch(e => {
                     console.log(e);
@@ -123,7 +125,11 @@ export default {
             saving: false,
             formData: {
                 avatar: 'https://zhumj.oss-cn-hangzhou.aliyuncs.com/image/user.jpg',
-                authorities: [{ name: 'ROLE_EXPERT' }]
+                authorities: [{ name: 'ROLE_EXPERT' }],
+                expert: {
+                    work: '',
+                    position: ''
+                }
             },
             expert: {
                 work: '',
@@ -181,7 +187,7 @@ export default {
             this.formData.username = this.formData.phone;
             this.formData.expert = this.expert;
             this.$http
-                .post(this.formData.id ? '/user/save' : '/user/create', this.formData, { body: 'json' })
+                .post('/user/save', this.formData, { body: 'json' })
                 .then(res => {
                     this.$message.success('成功');
                     this.formData = res;

+ 364 - 109
src/main/vue/src/views/RateAudit.vue

@@ -2,147 +2,172 @@
     <div class="edit-view">
         <el-form
             :model="formData"
+            :rules="rules"
             ref="form"
-            label-width="50px"
+            label-width="110px"
             label-position="right"
             size="small"
-            style="max-width: 620px;"
+            style="max-width: 680px;"
         >
+            <el-divider direction="horizontal" content-position="left">基本信息</el-divider>
             <div class="info-content">
-                <div class="tag" v-if="grade">{{ grade }}</div>
                 <div class="info-item">
-                    <div class="name">承办单位名称</div>
-                    <div class="val">
+                    <el-form-item prop="name" label="承办单位名称">
                         <el-input v-model="formData.name" placeholder="请输入承办单位名称" readonly></el-input>
-                    </div>
+                    </el-form-item>
                 </div>
                 <div class="info-item">
-                    <div class="name">负责人邮箱</div>
-                    <div class="val">
+                    <el-form-item prop="name" label="负责人邮箱">
                         <el-input v-model="formData.ownerEmail" placeholder="请输入负责人邮箱" readonly></el-input>
-                    </div>
+                    </el-form-item>
                 </div>
                 <div class="info-item">
-                    <div class="name">负责人</div>
-                    <div class="val">
+                    <el-form-item prop="owner" label="负责人">
                         <el-input v-model="formData.owner" placeholder="请输入负责人" readonly></el-input>
-                    </div>
+                    </el-form-item>
                 </div>
                 <div class="info-item">
-                    <div class="name">负责人电话</div>
-                    <div class="val">
+                    <el-form-item prop="ownerPhone" label="负责人电话">
                         <el-input v-model="formData.ownerPhone" placeholder="请输入负责人电话" readonly></el-input>
-                    </div>
+                    </el-form-item>
                 </div>
                 <div class="info-item">
-                    <div class="name">地址</div>
-                    <div class="val">
+                    <el-form-item prop="district" label="地址">
                         <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
+                                :disabled="readonly"
                             ></el-option>
                         </el-select>
-                    </div>
+                    </el-form-item>
                 </div>
 
                 <div class="info-item address">
-                    <div class="name">单位概况</div>
                     <div class="val">
-                        <el-input
-                            readonly
-                            type="textarea"
-                            :autosize="{ minRows: 4, maxRows: 6 }"
-                            placeholder="请输入单位概况"
-                            v-model="formData.introduction"
-                        ></el-input>
+                        <el-form-item prop="introduction" label="单位概况">
+                            <el-input
+                                readonly
+                                type="textarea"
+                                :autosize="{ minRows: 4, maxRows: 6 }"
+                                placeholder="请输入单位概况"
+                                v-model="formData.introduction"
+                            ></el-input>
+                        </el-form-item>
                     </div>
                 </div>
                 <div class="info-item address">
-                    <div class="name">考级活动</div>
-                    <div class="val">
+                    <el-form-item prop="undertakeExamination" label="考级活动">
                         <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>
-                    </div>
+                    </el-form-item>
                 </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"
-                            :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
-                            > -->
+                <!-- <el-form-item>
+                    <el-button type="primary" size="small" @click="onAddOtherForm()"
+                        >新增承办过的艺术考级活动</el-button
+                    >
+                </el-form-item> -->
+                <div class="add-con" v-for="(item, index) in collaborates" :key="index">
+                    <div v-if="!item.del">
+                        <div class="parameters1">
+                            <el-form-item prop="gradingOrganizationId" label="考级机构">
+                                <el-select v-model="item.gradingOrganizationId" placeholder="所属考级机构">
+                                    <el-option
+                                        v-for="item in grading"
+                                        :key="item.value"
+                                        :value="item.value"
+                                        :label="item.label"
+                                        :disabled="readonly"
+                                    ></el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item prop="artTypeId" label="代理专业">
+                                <el-cascader
+                                    style="width: 100%"
+                                    v-model="item.artTypeId"
+                                    :props="optionProps"
+                                    :options="artTypes"
+                                    :show-all-levels="false"
+                                    placeholder="请选择专业"
+                                >
+                                </el-cascader>
+                            </el-form-item>
+                        </div>
+                        <div class="info-item address">
+                            <el-form-item prop="consent" label="合作协议">
+                                <file-upload v-model="item.consent" :readonly="readonly"></file-upload>
+                            </el-form-item>
                         </div>
+                        <!-- <el-form-item>
+                            <el-button
+                                class="del"
+                                type="danger"
+                                v-if="!hasChild(item)"
+                                size="small"
+                                icon="el-icon-delete"
+                                @click="onDeleteOtherForm(item, index)"
+                            ></el-button>
+                        </el-form-item> -->
                     </div>
                 </div>
             </div>
+            <el-divider direction="horizontal" content-position="left">企业资质</el-divider>
             <div class="info-content">
                 <div class="info-item address">
-                    <div class="name">法人资格</div>
                     <div class="val">
-                        <file-upload v-model="formData.privacyPolicy" readonly></file-upload>
-                        <!-- <single-upload v-model="formData.privacyPolicy"></single-upload> -->
+                        <el-form-item prop="privacyPolicy" label="法人资格">
+                            <file-upload v-model="formData.privacyPolicy" :readonly="readonly"></file-upload>
+                            <!-- <single-upload v-model="formData.privacyPolicy"></single-upload> -->
+                        </el-form-item>
                     </div>
                 </div>
                 <div class="info-item address">
-                    <div class="name">业务内容</div>
                     <div class="val">
-                        <file-upload v-model="formData.business" readonly></file-upload>
+                        <el-form-item prop="business" label="业务内容">
+                            <file-upload v-model="formData.business" :readonly="readonly"></file-upload>
+                        </el-form-item>
                     </div>
                 </div>
                 <div class="info-item address">
-                    <div class="name">社会信誉</div>
                     <div class="val">
-                        <file-upload v-model="formData.credits" readonly></file-upload>
+                        <el-form-item prop="credits" label="社会信誉">
+                            <file-upload v-model="formData.credits" :readonly="readonly"></file-upload>
+                        </el-form-item>
                     </div>
                 </div>
             </div>
+            <el-divider direction="horizontal" content-position="left">物质条件</el-divider>
             <div class="info-content">
                 <div class="info-item address">
-                    <div class="name">消防卫生</div>
                     <div class="val">
-                        <file-upload v-model="formData.fire" readonly></file-upload>
+                        <el-form-item prop="fire" label="消防安全">
+                            <file-upload v-model="formData.fire" :readonly="readonly"></file-upload>
+                        </el-form-item>
+                    </div>
+                </div>
+                <div class="info-item address">
+                    <div class="val">
+                        <el-form-item prop="hygiene" label="卫生防疫">
+                            <file-upload v-model="formData.hygiene" :readonly="readonly"></file-upload>
+                        </el-form-item>
                     </div>
                 </div>
                 <div class="info-item address">
-                    <div class="name">财务报表</div>
                     <div class="val">
-                        <file-upload v-model="formData.finance" readonly></file-upload>
+                        <el-form-item prop="finance" label="财务报表">
+                            <file-upload v-model="formData.finance" :readonly="readonly"></file-upload>
+                        </el-form-item>
                     </div>
                 </div>
                 <div class="info-item address">
-                    <div class="name">房产证明</div>
                     <div class="val">
-                        <file-upload v-model="formData.property" readonly></file-upload>
+                        <el-form-item prop="property" label="房产证明">
+                            <file-upload v-model="formData.property" :readonly="readonly"></file-upload>
+                        </el-form-item>
                     </div>
                 </div>
             </div>
@@ -176,30 +201,44 @@
 <script>
 import { mapState } from 'vuex';
 export default {
-    name: 'RateAudit',
+    name: 'RateEdit',
     computed: {
-        ...mapState(['organization'])
+        ...mapState(['organization']),
+        saveOtherJson() {
+            const collaborates = [...this.collaborates]
+                .filter(item => {
+                    return !!item.gradingOrganizationId || !!item.consent || !!item.artTypeId;
+                })
+                .map(item => {
+                    return {
+                        ...item,
+                        rateId: this.rateId
+                    };
+                });
+            return JSON.stringify(collaborates);
+        }
     },
     created() {
         if (this.$route.query.id) {
+            this.rateId = this.$route.query.id;
             this.$http
                 .get('rate/get/' + this.$route.query.id)
                 .then(res => {
                     this.formData = res;
-                    if (res.grade == 'EXCELLENT') {
-                        this.grade = '优秀';
-                    } else if (res.grade == 'ELIGIBLE') {
-                        this.grade = '合格';
-                    } else if (res.grade == 'NOT_ELIGIBLE') {
-                        this.grade = '不合格';
-                    } else {
-                        this.grade = '';
-                    }
                     let data = res.rateAudits;
                     if (typeof data != 'undefined') {
                         this.showAudit = true;
                         this.rateAudits = data;
                     }
+                    this.$http
+                        .post(
+                            '/collaborate/all',
+                            { size: 100, query: { rateId: this.$route.query.id } },
+                            { body: 'json' }
+                        )
+                        .then(res => {
+                            this.collaborates = res.content;
+                        });
                 })
                 .catch(e => {
                     console.log(e);
@@ -216,6 +255,30 @@ export default {
                 console.log(e);
                 this.$message.error(e.error);
             });
+        this.$http
+            .post('/gradingOrganization/all', { size: 1000 }, { body: 'json' })
+            .then(res => {
+                if (res.content.length > 0) {
+                    res.content.forEach(item => {
+                        this.grading.push({
+                            label: item.name,
+                            value: item.id
+                        });
+                    });
+                }
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+        this.$http
+            .post('/artType/allList')
+            .then(res => {
+                this.artTypes = this.delChild(res);
+            })
+            .catch(e => {
+                console.log(e);
+            });
     },
     data() {
         return {
@@ -227,16 +290,131 @@ export default {
                 ownerPhone: '',
                 district: ''
             },
+            rateId: '',
             rateAudits: {},
             showAudit: false,
             inputVisible: false,
             inputValue: '',
             saving: false,
             districts: [],
-            grade: ''
+            readonly: true,
+            grade: '',
+            grading: [],
+            rules: {
+                name: [{ required: true, message: '请输入机构名称', trigger: 'blur' }],
+                owner: [{ required: true, message: '请输入负责人', trigger: 'blur' }],
+                ownerEmail: [
+                    {
+                        required: true,
+                        pattern: /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,
+                        message: '请输入邮箱',
+                        trigger: 'blur'
+                    }
+                ],
+                ownerPhone: [
+                    {
+                        required: true,
+                        pattern: /^1[3-9]\d{9}$/,
+                        message: '请输入手机号',
+                        trigger: 'blur'
+                    }
+                ],
+                district: [{ required: true, message: '请选择注册地址', trigger: 'blur' }],
+                introduction: [{ required: true, message: '请输入单位概况', trigger: 'blur' }],
+                undertakeExamination: [{ required: true, message: '请选择是否承办过考级活动', trigger: 'blur' }],
+                privacyPolicy: [
+                    {
+                        required: true,
+                        message: '请上传法人资格',
+                        trigger: 'blur'
+                    }
+                ],
+                business: [
+                    {
+                        required: true,
+                        message: '请上传业务内容',
+                        trigger: 'blur'
+                    }
+                ],
+                credits: [
+                    {
+                        required: true,
+                        message: '请上传社会信誉',
+                        trigger: 'blur'
+                    }
+                ],
+                fire: [
+                    {
+                        required: true,
+                        message: '请上传消防安全',
+                        trigger: 'blur'
+                    }
+                ],
+                hygiene: [
+                    {
+                        required: true,
+                        message: '请上传卫生防疫',
+                        trigger: 'blur'
+                    }
+                ],
+                finance: [
+                    {
+                        required: true,
+                        message: '请上传财务报表',
+                        trigger: 'blur'
+                    }
+                ],
+                property: [
+                    {
+                        required: true,
+                        message: '请上传房产证明',
+                        trigger: 'blur'
+                    }
+                ]
+            },
+            collaborates: [],
+            artTypes: [],
+            optionProps: {
+                value: 'id',
+                label: 'name',
+                children: 'children',
+                multiple: true,
+                emitPath: false,
+                checkStrictly: true,
+                expandTrigger: 'hover'
+            }
         };
     },
     methods: {
+        onAddOtherForm() {
+            this.collaborates.push({
+                gradingOrganizationId: '',
+                consent: '',
+                artTypeId: ''
+            });
+        },
+        onDeleteOtherForm(info, index) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'warning' })
+                .then(() => {
+                    const collaborates = [...this.collaborates];
+                    if (info.id) {
+                        info.del = true;
+                        collaborates[index] = info;
+                    } else {
+                        collaborates.splice(index, 1);
+                    }
+                    this.collaborates = collaborates;
+                    this.$message.success('删除成功');
+                })
+                .catch(e => {});
+        },
+        hasChild(info) {
+            info.children = info.children || [];
+            const childNum = [...info.children].filter(item => {
+                return !item.del;
+            }).length;
+            return !!childNum;
+        },
         handleClose(tag) {
             this.formData.examination.splice(this.formData.examination.indexOf(tag), 1);
         },
@@ -253,50 +431,126 @@ 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';
+            if (this.formData.status == 'EXPERT_DENY') {
+                data.status = 'SUBMIT_GRADE';
+            }
+            if (!isSubmit) {
+                data.status = 'DRAFT';
+            }
+            data.submit = isSubmit;
+            this.saving = true;
+            this.$http
+                .post('/rate/save', data, { body: 'json' })
+                .then(res => {
+                    this.rateId = res.id;
+                    this.saving = false;
+                    this.$nextTick(() => {
+                        this.$http.post('/collaborate/batchSave', {
+                            collaborates: this.saveOtherJson
+                        });
+                    });
+                    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 || '取消失败');
+                    }
+                });
+        },
+        delChild(list) {
+            return list.map(item => {
+                const info = {
+                    ...item,
+                    ['children']:
+                        item['children'] && item['children'].length > 0 ? this.delChild(item['children']) : null
+                };
+                return info;
+            });
         }
     }
 };
 </script>
 <style lang="less" scoped>
+.edit-view {
+    // padding-left: 20%;
+    .add-con {
+        background-color: #f7f7f7;
+        width: 100%;
+        margin-bottom: 10px;
+    }
+}
+/deep/ .el-divider {
+    margin-top: 30px;
+}
+/deep/ .el-divider__text {
+    left: 0;
+    // margin-top: 10px;
+}
+.el-divider__text {
+    font-size: 20px;
+    font-weight: 500;
+}
+
+.parameters1 {
+    display: flex;
+    align-items: center;
+    margin-top: 23px;
+}
 .info-content {
-    background: #f5f7fa;
-    padding: 30px 25px 25px;
+    // background: #f5f7fa;
+    padding: 20px 10px 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;
-
+        // margin-bottom: 10px;
         &.address {
             width: 100%;
             align-items: flex-start;
             .val {
-                width: 465px;
+                width: 600px;
             }
         }
-
-        .name {
-            font-size: 13px;
-            font-family: PingFangSC-Regular, PingFang SC;
-            font-weight: 400;
-            color: #565b66;
-            line-height: 22px;
-            min-width: 76px;
-            margin-right: 10px;
-            text-align: right;
-        }
-
-        .val {
-            width: 190px;
-        }
     }
     .tag {
-        margin: 20px 20px;
+        margin: 98px 240px;
         width: 50px;
         height: 22px;
         background: rgba(255, 165, 38, 0.3);
@@ -310,13 +564,14 @@ export default {
     }
 }
 .el-tag + .el-tag {
-    margin-left: 10px;
+    margin-left: 30px;
     // margin-bottom: 10px;
 }
 .el-tag-height {
     line-height: 30px;
     height: 32px !important;
     margin-bottom: 10px;
+    margin-left: 30px;
 }
 .button-new-tag {
     // margin-left: 10px;

+ 37 - 14
src/main/vue/src/views/RateList.vue

@@ -152,6 +152,25 @@
                 <el-form-item><el-button type="primary" size="mini" @click="saveScore()">提交</el-button></el-form-item>
             </el-form>
         </el-dialog>
+        <el-dialog title="退回缘由" :visible.sync="dialogDismiss" width="500px" center>
+            <div style="height: 150px;width:330px;margin:2px auto">
+                <label style="margin-right: 10px">退回缘由</label>
+                <el-select
+                    v-model="reason"
+                    filterable
+                    allow-create
+                    default-first-option
+                    clearable
+                    placeholder="请选择缘由"
+                    style="width: 70%"
+                >
+                    <el-option v-for="item in dismissReason" :key="item" :label="item" :value="item"> </el-option>
+                </el-select>
+                <div>
+                    <el-button type="primary">确认</el-button>
+                </div>
+            </div>
+        </el-dialog>
     </div>
 </template>
 <script>
@@ -181,7 +200,10 @@ export default {
             scoreInfo: {
                 score: 0,
                 grade: ''
-            }
+            },
+            dialogDismiss: false,
+            reason: '',
+            dismissReason: ['资料不全', '缺少附件', '无资格']
         };
     },
     created() {
@@ -324,19 +346,20 @@ export default {
                 });
         },
         dismiss(row) {
-            this.$prompt('请输入驳回缘由', '提示', {
-                confirmButtonText: '确定',
-                cancelButtonText: '取消'
-            })
-                .then(({ value }) => {
-                    this.audit(row, 'FIRST_REVIEW_DENY', value);
-                })
-                .catch(() => {
-                    this.$message({
-                        type: 'info',
-                        message: '取消输入'
-                    });
-                });
+            // this.$prompt('请输入驳回缘由', '提示', {
+            //     confirmButtonText: '确定',
+            //     cancelButtonText: '取消'
+            // })
+            //     .then(({ value }) => {
+            //         this.audit(row, 'FIRST_REVIEW_DENY', value);
+            //     })
+            //     .catch(() => {
+            //         this.$message({
+            //             type: 'info',
+            //             message: '取消输入'
+            //         });
+            //     });
+            this.dialogDismiss = true;
         },
         supervision(id) {
             this.$router.push({

+ 179 - 191
src/main/vue/src/views/organization/RateEdit.vue

@@ -7,62 +7,45 @@
             label-width="110px"
             label-position="right"
             size="small"
-            style="max-width: 640px;"
+            style="max-width: 680px;"
         >
             <el-divider direction="horizontal" content-position="left">基本信息</el-divider>
             <div class="info-content">
-                <!-- <div class="tag" v-if="grade">{{ grade }}</div> -->
                 <div class="info-item">
-                    <!-- <div class="name">机构名称</div> -->
-                    <div class="val">
-                        <el-form-item prop="name" label="承办单位名称">
-                            <el-input v-model="formData.name" placeholder="请输入承办单位名称" readonly></el-input>
-                        </el-form-item>
-                    </div>
+                    <el-form-item prop="name" label="承办单位名称">
+                        <el-input v-model="formData.name" placeholder="请输入承办单位名称" readonly></el-input>
+                    </el-form-item>
                 </div>
                 <div class="info-item">
-                    <!-- <div class="name">负责人邮箱</div> -->
-                    <div class="val">
-                        <el-form-item prop="name" label="负责人邮箱">
-                            <el-input v-model="formData.ownerEmail" placeholder="请输入负责人邮箱" readonly></el-input>
-                        </el-form-item>
-                    </div>
+                    <el-form-item prop="name" label="负责人邮箱">
+                        <el-input v-model="formData.ownerEmail" placeholder="请输入负责人邮箱" readonly></el-input>
+                    </el-form-item>
                 </div>
                 <div class="info-item">
-                    <!-- <div class="name">负责人</div> -->
-                    <div class="val">
-                        <el-form-item prop="owner" label="负责人">
-                            <el-input v-model="formData.owner" placeholder="请输入负责人" readonly></el-input>
-                        </el-form-item>
-                    </div>
+                    <el-form-item prop="owner" label="负责人">
+                        <el-input v-model="formData.owner" placeholder="请输入负责人" readonly></el-input>
+                    </el-form-item>
                 </div>
                 <div class="info-item">
-                    <!-- <div class="name">负责人电话</div> -->
-                    <div class="val">
-                        <el-form-item prop="ownerPhone" label="负责人电话">
-                            <el-input v-model="formData.ownerPhone" placeholder="请输入负责人电话" readonly></el-input>
-                        </el-form-item>
-                    </div>
+                    <el-form-item prop="ownerPhone" label="负责人电话">
+                        <el-input v-model="formData.ownerPhone" placeholder="请输入负责人电话" readonly></el-input>
+                    </el-form-item>
                 </div>
                 <div class="info-item">
-                    <!-- <div class="name">地址</div> -->
-                    <div class="val">
-                        <el-form-item prop="district" label="地址">
-                            <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>
-                        </el-form-item>
-                    </div>
+                    <el-form-item prop="district" label="地址">
+                        <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>
+                    </el-form-item>
                 </div>
 
                 <div class="info-item address">
-                    <!-- <div class="name">单位概况</div> -->
                     <div class="val">
                         <el-form-item prop="introduction" label="单位概况">
                             <el-input
@@ -76,99 +59,86 @@
                     </div>
                 </div>
                 <div class="info-item address">
-                    <!-- <div class="name">考级活动</div> -->
-                    <div class="val">
-                        <el-form-item prop="undertakeExamination" label="考级活动">
-                            <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>
-                        </el-form-item>
-                    </div>
+                    <el-form-item prop="undertakeExamination" label="考级活动">
+                        <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>
+                    </el-form-item>
                 </div>
-                <div class="info-item">
-                    <div class="val">
-                        <el-form-item prop="district" label="考级机构">
-                            <el-select v-model="formData.district" style="width:190px">
-                                <el-option
-                                    v-for="item in districts"
-                                    :key="item.id"
-                                    :value="item.name"
-                                    :label="item.name"
-                                    :disabled="readonly"
-                                ></el-option>
-                            </el-select>
-                        </el-form-item>
-                    </div>
-                    <div class="val">
-                        <el-form-item prop="district" label="代理专业">
-                            <el-select v-model="formData.district" style="width:190px">
-                                <el-option
-                                    v-for="item in districts"
-                                    :key="item.id"
-                                    :value="item.name"
-                                    :label="item.name"
-                                    :disabled="readonly"
-                                ></el-option>
-                            </el-select>
-                        </el-form-item>
-                    </div>
+                <!-- <div class="info-item">
+                    <el-form-item prop="district" label="考级机构">
+                        <el-select v-model="formData.district" style="width:190px">
+                            <el-option
+                                v-for="item in grading"
+                                :key="item.value"
+                                :value="item.value"
+                                :label="item.label"
+                                :disabled="readonly"
+                            ></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item prop="district" label="代理专业">
+                        <el-select v-model="formData.district" style="width:190px">
+                            <el-option
+                                v-for="item in districts"
+                                :key="item.id"
+                                :value="item.name"
+                                :label="item.name"
+                                :disabled="readonly"
+                            ></el-option>
+                        </el-select>
+                    </el-form-item>
                 </div>
                 <div class="info-item address">
-                    <div class="val">
-                        <el-form-item prop="privacyPolicy" label="合作协议">
-                            <file-upload v-model="formData.privacyPolicy" :readonly="readonly"></file-upload>
-                        </el-form-item>
-                    </div>
-                </div>
+                    <el-form-item prop="privacyPolicy" label="合作协议">
+                        <file-upload v-model="formData.privacyPolicy" :readonly="readonly"></file-upload>
+                    </el-form-item>
+                </div> -->
                 <el-form-item>
-                    <el-button type="primary" size="small" @click="addParamater()">新增</el-button>
+                    <el-button type="primary" size="small" @click="onAddOtherForm()"
+                        >新增承办过的艺术考级活动</el-button
+                    >
                 </el-form-item>
-                <div class="add-con" v-for="(item, index) in productParameters" :key="index">
+                <div class="add-con" v-for="(item, index) in collaborates" :key="index">
                     <div v-if="!item.del">
                         <div class="parameters1">
-                            <div class="val">
-                                <el-form-item prop="district" label="考级机构">
-                                    <el-select v-model="formData.district" style="width:190px">
-                                        <el-option
-                                            v-for="item in districts"
-                                            :key="item.id"
-                                            :value="item.name"
-                                            :label="item.name"
-                                            :disabled="readonly"
-                                        ></el-option>
-                                    </el-select>
-                                </el-form-item>
-                            </div>
-                            <div class="val">
-                                <el-form-item prop="district" label="代理专业">
-                                    <el-select v-model="formData.district" style="width:190px">
-                                        <el-option
-                                            v-for="item in districts"
-                                            :key="item.id"
-                                            :value="item.name"
-                                            :label="item.name"
-                                            :disabled="readonly"
-                                        ></el-option>
-                                    </el-select>
-                                </el-form-item>
-                            </div>
+                            <el-form-item prop="gradingOrganizationId" label="考级机构">
+                                <el-select v-model="item.gradingOrganizationId" placeholder="所属考级机构">
+                                    <el-option
+                                        v-for="item in grading"
+                                        :key="item.value"
+                                        :value="item.value"
+                                        :label="item.label"
+                                        :disabled="readonly"
+                                    ></el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item prop="artTypeId" label="代理专业">
+                                <el-cascader
+                                    style="width: 100%"
+                                    v-model="item.artTypeId"
+                                    :props="optionProps"
+                                    :options="artTypes"
+                                    :show-all-levels="false"
+                                    placeholder="请选择专业"
+                                >
+                                </el-cascader>
+                            </el-form-item>
                         </div>
                         <div class="info-item address">
-                            <div class="val">
-                                <el-form-item prop="privacyPolicy" label="合作协议">
-                                    <file-upload v-model="formData.privacyPolicy" :readonly="readonly"></file-upload>
-                                </el-form-item>
-                            </div>
+                            <el-form-item prop="consent" label="合作协议">
+                                <file-upload v-model="item.consent" :readonly="readonly"></file-upload>
+                            </el-form-item>
                         </div>
-                        <el-form-item>
+                        <el-form-item v-if="!readonly">
                             <el-button
                                 class="del"
                                 type="danger"
                                 v-if="!hasChild(item)"
                                 size="small"
                                 icon="el-icon-delete"
-                                @click="del(item, index)"
+                                @click="onDeleteOtherForm(item, index)"
                             ></el-button>
                         </el-form-item>
                     </div>
@@ -212,7 +182,6 @@
             <el-divider direction="horizontal" content-position="left">企业资质</el-divider>
             <div class="info-content">
                 <div class="info-item address">
-                    <!-- <div class="name">法人资格</div> -->
                     <div class="val">
                         <el-form-item prop="privacyPolicy" label="法人资格">
                             <file-upload v-model="formData.privacyPolicy" :readonly="readonly"></file-upload>
@@ -221,7 +190,6 @@
                     </div>
                 </div>
                 <div class="info-item address">
-                    <!-- <div class="name">业务内容</div> -->
                     <div class="val">
                         <el-form-item prop="business" label="业务内容">
                             <file-upload v-model="formData.business" :readonly="readonly"></file-upload>
@@ -229,7 +197,6 @@
                     </div>
                 </div>
                 <div class="info-item address">
-                    <!-- <div class="name">社会信誉</div> -->
                     <div class="val">
                         <el-form-item prop="credits" label="社会信誉">
                             <file-upload v-model="formData.credits" :readonly="readonly"></file-upload>
@@ -240,7 +207,6 @@
             <el-divider direction="horizontal" content-position="left">物质条件</el-divider>
             <div class="info-content">
                 <div class="info-item address">
-                    <!-- <div class="name">消防卫生</div> -->
                     <div class="val">
                         <el-form-item prop="fire" label="消防安全">
                             <file-upload v-model="formData.fire" :readonly="readonly"></file-upload>
@@ -248,7 +214,6 @@
                     </div>
                 </div>
                 <div class="info-item address">
-                    <!-- <div class="name">消防卫生</div> -->
                     <div class="val">
                         <el-form-item prop="hygiene" label="卫生防疫">
                             <file-upload v-model="formData.hygiene" :readonly="readonly"></file-upload>
@@ -256,7 +221,6 @@
                     </div>
                 </div>
                 <div class="info-item address">
-                    <!-- <div class="name">财务报表</div> -->
                     <div class="val">
                         <el-form-item prop="finance" label="财务报表">
                             <file-upload v-model="formData.finance" :readonly="readonly"></file-upload>
@@ -264,7 +228,6 @@
                     </div>
                 </div>
                 <div class="info-item address">
-                    <!-- <div class="name">房产证明</div> -->
                     <div class="val">
                         <el-form-item prop="property" label="房产证明">
                             <file-upload v-model="formData.property" :readonly="readonly"></file-upload>
@@ -331,10 +294,24 @@ import { mapState } from 'vuex';
 export default {
     name: 'RateEdit',
     computed: {
-        ...mapState(['organization'])
+        ...mapState(['organization']),
+        saveOtherJson() {
+            const collaborates = [...this.collaborates]
+                .filter(item => {
+                    return !!item.gradingOrganizationId || !!item.consent || !!item.artTypeId;
+                })
+                .map(item => {
+                    return {
+                        ...item,
+                        rateId: this.rateId
+                    };
+                });
+            return JSON.stringify(collaborates);
+        }
     },
     created() {
         if (this.$route.query.rateId) {
+            this.rateId = this.$route.query.rateId;
             this.$http
                 .get('rate/get/' + this.$route.query.rateId)
                 .then(res => {
@@ -342,20 +319,23 @@ export default {
                     if (res.status != 'FIRST_REVIEW_PENDING' || res.submit) {
                         this.readonly = true;
                     }
-                    if (res.grade == 'EXCELLENT') {
-                        this.grade = '优秀';
-                    } else if (res.grade == 'ELIGIBLE') {
-                        this.grade = '合格';
-                    } else if (res.grade == 'NOT_ELIGIBLE') {
-                        this.grade = '不合格';
-                    } else {
-                        this.grade = '';
+                    if (res.status == 'CANCEL') {
+                        this.readonly = false;
                     }
                     let data = res.rateAudits;
                     if (typeof data != 'undefined') {
                         this.showAudit = true;
                         this.rateAudits = data;
                     }
+                    this.$http
+                        .post(
+                            '/collaborate/all',
+                            { size: 100, query: { rateId: this.$route.query.rateId } },
+                            { body: 'json' }
+                        )
+                        .then(res => {
+                            this.collaborates = res.content;
+                        });
                 })
                 .catch(e => {
                     console.log(e);
@@ -381,6 +361,30 @@ export default {
                 console.log(e);
                 this.$message.error(e.error);
             });
+        this.$http
+            .post('/gradingOrganization/all', { size: 1000 }, { body: 'json' })
+            .then(res => {
+                if (res.content.length > 0) {
+                    res.content.forEach(item => {
+                        this.grading.push({
+                            label: item.name,
+                            value: item.id
+                        });
+                    });
+                }
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+        this.$http
+            .post('/artType/allList')
+            .then(res => {
+                this.artTypes = this.delChild(res);
+            })
+            .catch(e => {
+                console.log(e);
+            });
     },
     data() {
         return {
@@ -391,8 +395,8 @@ export default {
                 ownerEmail: '',
                 ownerPhone: '',
                 district: ''
-                // district1: []
             },
+            rateId: '',
             rateAudits: {},
             showAudit: false,
             inputVisible: false,
@@ -401,6 +405,7 @@ export default {
             districts: [],
             readonly: false,
             grade: '',
+            grading: [],
             rules: {
                 name: [{ required: true, message: '请输入机构名称', trigger: 'blur' }],
                 owner: [{ required: true, message: '请输入负责人', trigger: 'blur' }],
@@ -473,51 +478,38 @@ export default {
                     }
                 ]
             },
-            productParameters: [],
-            collaborates: []
+            collaborates: [],
+            artTypes: [],
+            optionProps: {
+                value: 'id',
+                label: 'name',
+                children: 'children',
+                multiple: true,
+                emitPath: false,
+                checkStrictly: true,
+                expandTrigger: 'hover'
+            }
         };
     },
     methods: {
-        addParamater(info, index) {
-            const productParameters = [...this.productParameters];
-            if (info) {
-                info.value = '';
-                info.children.push({
-                    chName: '',
-                    enName: '',
-                    value: ''
-                });
-                productParameters[index] = info;
-            } else {
-                productParameters.push({
-                    chName: '',
-                    enName: '',
-                    value: '',
-                    children: []
-                });
-            }
-            this.productParameters = productParameters;
+        onAddOtherForm() {
+            this.collaborates.push({
+                gradingOrganizationId: '',
+                consent: '',
+                artTypeId: ''
+            });
         },
-        del(info, index, list, listIndex) {
+        onDeleteOtherForm(info, index) {
             this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'warning' })
                 .then(() => {
-                    const productParameters = [...this.productParameters];
+                    const collaborates = [...this.collaborates];
                     if (info.id) {
                         info.del = true;
-                        if (list) {
-                            list[index] = info;
-                        } else {
-                            productParameters[index] = info;
-                        }
-                    } else if (list) {
-                        list.splice(index, 1);
+                        collaborates[index] = info;
                     } else {
-                        productParameters.splice(index, 1);
-                    }
-                    if (list) {
-                        productParameters.children[listIndex] = list;
+                        collaborates.splice(index, 1);
                     }
-                    this.productParameters = productParameters;
+                    this.collaborates = collaborates;
                     this.$message.success('删除成功');
                 })
                 .catch(e => {});
@@ -569,7 +561,13 @@ export default {
             this.$http
                 .post('/rate/save', data, { body: 'json' })
                 .then(res => {
+                    this.rateId = res.id;
                     this.saving = false;
+                    this.$nextTick(() => {
+                        this.$http.post('/collaborate/batchSave', {
+                            collaborates: this.saveOtherJson
+                        });
+                    });
                     this.$message.success('成功');
                     this.$router.go(-1);
                 })
@@ -597,13 +595,23 @@ export default {
                         this.$message.error((e || {}).error || '取消失败');
                     }
                 });
+        },
+        delChild(list) {
+            return list.map(item => {
+                const info = {
+                    ...item,
+                    ['children']:
+                        item['children'] && item['children'].length > 0 ? this.delChild(item['children']) : null
+                };
+                return info;
+            });
         }
     }
 };
 </script>
 <style lang="less" scoped>
 .edit-view {
-    padding-left: 25%;
+    padding-left: 20%;
     .add-con {
         background-color: #f7f7f7;
         width: 100%;
@@ -646,26 +654,6 @@ export default {
                 width: 600px;
             }
         }
-
-        .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;
-            // width: 300px;
-        }
-
-        .input {
-            margin-top: 10px;
-        }
     }
     .tag {
         margin: 98px 240px;

+ 1 - 1
src/main/vue/src/views/organization/RateOrganizerList.vue

@@ -30,7 +30,7 @@
             <el-table-column prop="submit" label="提交">
                 <template slot-scope="{ row }">
                     <span v-if="row.submit">已提交</span>
-                    <span v-else>草稿</span>
+                    <span v-else>未提交</span>
                 </template>
             </el-table-column>
             <el-table-column prop="score" label="分数">

+ 23 - 0
src/test/java/com/izouma/wenlvju/service/RateExpertAuditServiceTest.java

@@ -0,0 +1,23 @@
+package com.izouma.wenlvju.service;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.izouma.wenlvju.ApplicationTests;
+import com.izouma.wenlvju.domain.RateExpertAudit;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+public class RateExpertAuditServiceTest extends ApplicationTests {
+    @Autowired
+    private RateExpertAuditService rateExpertAuditService;
+
+    @Test
+    public void test(){
+        String str = "[{\"rateId\":\"162\",\"type\":\"examOrganization\",\"score\":2,\"img\":[\"https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com/image/2021-04-21-18-08-22sHaeBMxp.png\",\"https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com/image/2021-04-21-18-08-26FnGfZASi.png\"]},{\"rateId\":\"162\",\"type\":\"examSite\",\"score\":4,\"img\":[]},{\"rateId\":\"162\",\"type\":\"examRoom\",\"score\":2,\"img\":[]},{\"rateId\":\"162\",\"type\":\"environment\",\"score\":4,\"img\":[]},{\"rateId\":\"162\",\"type\":\"safety\",\"score\":4,\"img\":[]},{\"rateId\":\"162\",\"type\":\"promote\",\"score\":2,\"img\":[]},{\"rateId\":\"162\",\"type\":\"signUp\",\"score\":2,\"img\":[]},{\"rateId\":\"162\",\"type\":\"examPreparation\",\"score\":3,\"img\":[]},{\"rateId\":\"162\",\"type\":\"examService\",\"score\":5,\"img\":[]},{\"rateId\":\"162\",\"type\":\"examiner\",\"score\":5,\"img\":[]},{\"rateId\":\"162\",\"type\":\"specification\",\"score\":5,\"img\":[]},{\"rateId\":\"162\",\"type\":\"video\",\"score\":5,\"img\":[]},{\"rateId\":\"162\",\"type\":\"score\",\"score\":3,\"img\":[]},{\"rateId\":\"162\",\"type\":\"artTrain\",\"score\":4,\"img\":[]},{\"rateId\":\"162\",\"type\":\"artResult\",\"score\":5,\"img\":[]}]";
+        List<RateExpertAudit> audits = JSONObject.parseArray(str, RateExpertAudit.class);
+        rateExpertAuditService.batchSave(audits);
+    }
+
+}

+ 17 - 0
src/test/java/com/izouma/wenlvju/web/RateControllerTest.java

@@ -0,0 +1,17 @@
+package com.izouma.wenlvju.web;
+
+
+import com.izouma.wenlvju.ApplicationTests;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class RateControllerTest extends ApplicationTests {
+    @Autowired
+    private RateController rateController;
+
+    @Test
+    public void test(){
+        System.out.println(rateController.get1(162L));
+    }
+
+}