zs 3 months ago
parent
commit
48814f5655

+ 14 - 1
src/components/custom/custom-upload.vue

@@ -1,6 +1,19 @@
 <template>
   <div id="c-upload">
-    <el-upload v-if="url" ref="upload" :action="url" :limit="limit" :accept="accept" :file-list="list" :list-type="listType" :on-exceed="outLimit" :on-preview="filePreview" :on-success="onSuccess" :before-remove="onRemove" :show-file-list="showList">
+    <el-upload
+      v-if="url"
+      ref="upload"
+      :action="url"
+      :limit="limit"
+      :accept="accept"
+      :file-list="list"
+      :list-type="listType"
+      :on-exceed="outLimit"
+      :on-preview="filePreview"
+      :on-success="onSuccess"
+      :on-remove="onRemove"
+      :show-file-list="showList"
+    >
       <el-button type="primary">{{ $t('common.upload_btn') }}</el-button>
       <template #tip v-if="tip">
         <p style="color: #ff0000">{{ tip }}</p>

+ 8 - 1
src/components/index.js

@@ -1,7 +1,14 @@
 export default function globalComponents(app) {
   const components = import.meta.glob('./**/**.{vue,tsx}', { eager: true }) //获取文件夹及其嵌套的多级子文件夹
   for (let [key, value] of Object.entries(components)) {
-    const name = key.replace('./', '').split('/')[0]
+    let name = key.replace('./', '').split('/')[0]
+    if (name == 'custom') {
+      name = key
+        .replace('./custom/', '')
+        .split('/')[0]
+        .replace(/\.vue$/, '')
+    }
     app.component(value.default.name || name, value.default)
   }
 }
+

+ 1 - 1
src/lang/package/zh-cn/common.js

@@ -10,7 +10,7 @@ export default {
   detail: '详情',
   exam: '审核',
   dict: '字典数据',
-  preliminary: '初赛信息',
+  preliminary: '初赛报名名单',
   sign: '报名',
   score: '分数',
   process: '流程',

+ 1 - 1
src/lang/package/zh-cn/pages.js

@@ -215,7 +215,7 @@ export default {
     scoreDialogTitle: '分数管理',
     upDialogTitle: '修改赛事',
     examDialogTitle: '审核赛事',
-    limiDialogTitle: '初赛信息',
+    limiDialogTitle: '初赛报名名单',
     name: '赛事名称',
     tags: '标签',
     type: '类型',

+ 69 - 19
src/views/information/parts/match/preliminary/index.vue

@@ -1,43 +1,50 @@
 <template>
   <div class="main" v-loading="loading">
     <el-col :span="24" class="one">
-      <el-table :data="list" style="width: 100%" size="large" :header-cell-style="{ backgroundColor: '#edf3ff' }">
+      <div class="one_left" @click="toExport">导出</div>
+    </el-col>
+    <el-col :span="24" class="two">
+      <el-table :data="list" style="width: 100%" size="large" :header-cell-style="{ backgroundColor: '#edf3ff' }" @selection-change="handleSelectionChange">
         <template #empty>
           <el-empty description="暂无数据" />
         </template>
+        <el-table-column type="selection" :selectable="handleRowSelectable" width="55"> </el-table-column>
         <el-table-column prop="no" align="center" label="编号" width="100"> </el-table-column>
         <el-table-column prop="user_name" align="center" label="用户"> </el-table-column>
         <el-table-column prop="time" align="center" label="报名时间" />
         <el-table-column prop="status" align="center" label="状态" width="100">
           <template #default="scope">
-            <el-tag v-if="scope.row.status == '0'" type="success">符合要求</el-tag>
+            <el-tag v-if="scope.row.status == '0'" type="primary">待审核</el-tag>
+            <el-tag v-else-if="scope.row.status == '1'" type="success">已通过</el-tag>
             <el-tag v-else type="info">已退回</el-tag>
           </template>
         </el-table-column>
         <el-table-column align="center" label="操作" width="180">
           <template #default="{ row }">
-            <el-link v-if="row.status == '0'" :underline="false" type="warning" size="mini" @click="toView(row)" style="margin-right: 10px">审核</el-link>
+            <el-link :underline="false" type="primary" size="mini" @click="toView(row, true)" style="margin-right: 10px">查看</el-link>
+            <el-link v-if="row.status == '0'" :underline="false" type="warning" size="mini" @click="toView(row, false)" style="margin-right: 10px">报名审核</el-link>
           </template>
         </el-table-column>
       </el-table>
     </el-col>
-    <el-col :span="24" class="two">
+    <el-col :span="24" class="thr">
       <el-pagination background layout="prev, pager, next" :total="total" :page-size="limit" v-model:current-page="currentPage" @current-change="changePage" @size-change="sizeChange" />
     </el-col>
     <el-dialog v-model="dialog.show" :title="dialog.title" :destroy-on-close="false" @close="toClose">
-      <el-descriptions title="报名信息" :column="1" border>
-        <template #extra>
-          <el-button type="danger" @click="toExam">退回报名申请</el-button>
+      <el-descriptions title="" :column="1" border>
+        <template #extra v-if="!is_look">
+          <el-button type="primary" @click="toExam('1')">通过申请</el-button>
+          <el-button type="danger" @click="toExam('2')">退回申请</el-button>
         </template>
         <el-descriptions-item v-for="(item, index) in info" :key="index" :label="item.problem">
-          <div class="type" v-if="item.type == '0' || item.type == '2' || item.type == '3' || item.type == '4'">{{ item.reply || '暂无内容' }}</div>
-          <div class="type" v-if="item.type == '1'">{{ item.reply.join(',') }}</div>
-          <div class="type" v-if="item.type == '5'">
+          <div class="type" v-if="item.type == '0' || item.type == '2' || item.type == '3' || item.type == '4' || item.type == '5'">{{ item.reply || '暂无内容' }}</div>
+          <div class="type" v-if="item.type == '1' && item.reply">{{ item.reply.join(',') }}</div>
+          <div class="type" v-if="item.type == '6'">
             <div v-for="(as, img) in item.reply" :key="img">
               <el-link :href="getUrl(as)" target="_blank">{{ as.name }}</el-link>
             </div>
           </div>
-          <div class="type" v-if="item.type == '6'">
+          <div class="type" v-if="item.type == '7'">
             <div class="list">
               <div v-for="(aa, ina) in item.answer" :key="ina" class="name">{{ aa.text }}</div>
             </div>
@@ -47,7 +54,7 @@
               </div>
             </div>
           </div>
-          <div class="type" v-if="item.type == '7'">
+          <div class="type" v-if="item.type == '8'">
             <div v-for="(as, img) in item.answer" :key="img">
               <el-link :href="getUrl(as)" target="_blank">{{ as.name }}</el-link>
             </div>
@@ -85,8 +92,11 @@ const currentPage = ref(1)
 const info = ref([])
 
 const form = ref({})
-const dialog = ref({ type: '1', show: false, title: '审核报名信息' })
+const dialog = ref({ type: '1', show: false, title: '报名信息' })
 
+// 批量导出
+const selectionList = ref([])
+const is_look = ref(false)
 const search = async (query = { skip, limit }) => {
   skip = query.skip
   limit = query.limit
@@ -101,26 +111,33 @@ const search = async (query = { skip, limit }) => {
     total.value = res.total
   }
 }
+const handleSelectionChange = (val) => {
+  selectionList.value = val
+}
 // 审核
-const toView = (data) => {
+const toView = (data, is_no) => {
+  is_look.value = is_no
   form.value = data
   info.value = data.info
-  dialog.value = { type: '1', show: true, title: '审核报名信息' }
+  dialog.value = { type: '1', show: true, title: '报名信息' }
 }
 // 图片处理
 const getUrl = (e) => {
   if (e) return `${import.meta.env.VITE_APP_HOST}${get(e, 'uri')}`
 }
 // 审核
-const toExam = () => {
-  ElMessageBox.confirm('确定将该报名信息退回?', '审核信息', {
+const toExam = (status) => {
+  let title
+  if (status == '1') title = '确定将该通过该申请的报名信息?'
+  else title = '确定将退回该申请的报名信息?'
+  ElMessageBox.confirm(title, '审核信息', {
     confirmButtonText: '确认',
     cancelButtonText: '取消',
     type: 'warning'
   })
     .then(async () => {
       const data = form.value
-      const res = await store.update({ id: data.id, status: '-1' })
+      const res = await store.update({ id: data.id, status })
       if ($checkRes(res, true)) {
         toClose()
       }
@@ -136,7 +153,23 @@ const sizeChange = (limits) => {
   currentPage.value = 1
   search({ skip: 0, limit: limit })
 }
+// 根据数据项中的canSelect字段判断是否可选
+const handleRowSelectable = (row) => {
+  return row.status == '0'
+}
+// 导出
+const toExport = () => {
+  if (selectionList.value && selectionList.value.length > 0) {
+    console.log('导出')
+  } else {
+    ElMessage({
+      message: '请选择要导出的数据!',
+      type: 'warning'
+    })
+  }
+}
 const toClose = async () => {
+  is_look.value = false
   form.value = {}
   dialog.value = { show: false }
   await search({ skip, limit })
@@ -156,7 +189,24 @@ watch(
 </script>
 <style scoped lang="scss">
 .main {
-  .two {
+  .one {
+    height: 50px;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin: 0 0 10px 0;
+    .one_left {
+      background: #1875df;
+      padding: 0 10px;
+      height: 30px;
+      color: #fff;
+      line-height: 30px;
+      text-align: center;
+      font-size: 16px;
+      cursor: default;
+    }
+  }
+  .thr {
     display: flex;
     justify-content: center;
     margin: 20px 0 0 0;

+ 195 - 159
src/views/information/parts/platform/match.vue

@@ -7,24 +7,12 @@
       <template #industry>
         <el-option v-for="i in industryList" :key="i.id" :label="i.label" :value="i.value"></el-option>
       </template>
+      <template #form>
+        <el-option v-for="i in formList" :key="i.id" :label="i.label" :value="i.value"></el-option>
+      </template>
     </custom-search-bar>
     <custom-button-bar :fields="buttonFields" @add="toAdd" @select="toMoreDelect"></custom-button-bar>
-    <custom-table
-      :data="data"
-      :fields="fields"
-      @query="search"
-      :total="total"
-      :opera="opera"
-      @score="toScore"
-      @preliminary="toPreliminary"
-      @process="toProcess"
-      @sign="toSign"
-      @exam="toExam"
-      @edit="toEdit"
-      @delete="toDelete"
-      @toSelect="toSelect"
-      :select="false"
-    >
+    <custom-table :data="data" :fields="fields" @query="search" :total="total" :opera="opera" @score="toScore" @preliminary="toPreliminary" @process="toProcess" @sign="toSign" @exam="toExam" @edit="toEdit" @delete="toDelete" @toSelect="toSelect" :select="false">
       <template #is_use="{ row }">
         <el-tag v-if="row.is_use == '0'" type="success" @click="toUse(row, '1')">启用</el-tag>
         <el-tag v-else type="info" @click="toUse(row, '0')">禁用</el-tag>
@@ -34,49 +22,79 @@
   <el-dialog v-model="dialog.show" :title="dialog.title" :destroy-on-close="false" @close="toClose">
     <el-row>
       <el-col :span="24" v-if="dialog.type == '1'">
-        <el-tabs v-model="activeName" type="card">
-          <el-tab-pane label="基本信息" name="first">
-            <custom-form v-model="form" :fields="oneformFields" :rules="rules" @save="toSave">
-              <template #video>
-                <custom-upload model="video" :list="form.video" :limit="1" url="/files/web/cxyy_match/upload" @change="onUpload"></custom-upload>
-              </template>
-              <template #file>
+        <el-form ref="formRef" :model="form" :rules="rules" label-width="auto">
+          <el-tabs v-model="activeName" type="card">
+            <el-tab-pane label="基本信息" name="first">
+              <el-form-item label="封面" prop="file">
                 <custom-upload model="file" :list="form.file" :limit="1" listType="picture-card" url="/files/web/cxyy_match/upload" @change="onUpload"></custom-upload>
-              </template>
-              <template #is_use>
-                <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
-              </template>
-              <template #is_show>
-                <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
-              </template>
-              <template #industry>
-                <el-option v-for="i in industryList" :key="i.id" :label="i.label" :value="i.value"></el-option>
-              </template>
-              <template #match_status>
-                <el-option v-for="i in matchList" :key="i.id" :label="i.label" :value="i.value"></el-option>
-              </template>
-              <template #scale>
-                <el-radio v-for="i in scaleList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
-              </template>
-              <template #match_type>
-                <el-radio v-for="i in matchTypeList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
-              </template>
-              <template #type>
-                <el-option v-for="i in typeList" :key="i.id" :label="i.label" :value="i.value"></el-option>
-              </template>
-              <template #form>
-                <el-option v-for="i in formList" :key="i.id" :label="i.label" :value="i.value"></el-option>
-              </template>
-              <template #tags>
-                <el-select v-model="form.tags" multiple filterable allow-create default-first-option :reserve-keyword="false" placeholder="请选择标签" style="width: 100%">
+              </el-form-item>
+              <el-form-item label="赛事名称" prop="name">
+                <el-input size="large" v-model="form.name" placeholder="请输入赛事名称" />
+              </el-form-item>
+              <el-form-item label="类别" prop="form">
+                <el-select v-model="form.form" placeholder="请选择类别" size="large" style="width: 100%">
+                  <el-option v-for="item in formList" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="标签" prop="tags">
+                <el-select size="large" v-model="form.tags" multiple filterable allow-create default-first-option :reserve-keyword="false" placeholder="请选择标签" style="width: 100%">
                   <el-option v-for="item in tagsList" :key="item.id" :label="item.title" :value="item.title" />
                 </el-select>
-              </template>
-            </custom-form>
-          </el-tab-pane>
-          <el-tab-pane label="拓展信息" name="second">
-            <custom-form v-model="form" :fields="twoformFields" :rules="{}" @save="toSave">
-              <template #rules>
+              </el-form-item>
+              <el-form-item label="类型" prop="type">
+                <el-select v-model="form.type" placeholder="请选择类型" size="large" style="width: 100%">
+                  <el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="赛事规模" prop="scale">
+                <el-radio-group v-model="form.scale">
+                  <el-radio v-for="item in scaleList" :key="item.value" :value="item.value" size="large">{{ item.label }}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item label="赛事类型" prop="match_type">
+                <el-radio-group v-model="form.match_type">
+                  <el-radio v-for="item in matchTypeList" :key="item.value" :value="item.value" size="large">{{ item.label }}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item label="路由" prop="href" v-if="form.match_type == '1'">
+                <el-input size="large" v-model="form.href" placeholder="请输入路由" />
+              </el-form-item>
+              <el-form-item label="组织单位" prop="work">
+                <el-input size="large" v-model="form.work" placeholder="请输入组织单位" />
+              </el-form-item>
+              <el-form-item label="行业" prop="industry">
+                <el-select v-model="form.type" placeholder="请选择行业" size="large" style="width: 100%">
+                  <el-option v-for="item in industryList" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="奖金(万元)" prop="money">
+                <el-input size="large" v-model="form.money" placeholder="请输入奖金(万元)" />
+              </el-form-item>
+              <el-form-item label="有效期" prop="time">
+                <el-date-picker v-model="form.time" type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"> </el-date-picker>
+              </el-form-item>
+              <el-form-item label="是否启用" prop="is_use">
+                <el-radio-group v-model="form.is_use">
+                  <el-radio v-for="item in isUseList" :key="item.value" :value="item.value" size="large">{{ item.label }}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item label="是否公开路演人信息" prop="is_show" v-if="form.form == '3'">
+                <el-radio-group v-model="form.is_show">
+                  <el-radio v-for="item in isUseList" :key="item.value" :value="item.value" size="large">{{ item.label }}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item label="视频" prop="vide">
+                <custom-upload model="video" :list="form.video" :limit="1" url="/files/web/cxyy_match/upload" @change="onUpload"></custom-upload>
+              </el-form-item>
+              <el-form-item label="地址" prop="address">
+                <el-input size="large" v-model="form.address" type="textarea" placeholder="请输入地址" />
+              </el-form-item>
+              <el-form-item label="备注" prop="remark">
+                <el-input size="large" v-model="form.remark" type="textarea" placeholder="请输入备注" />
+              </el-form-item>
+            </el-tab-pane>
+            <el-tab-pane label="拓展信息" name="second">
+              <el-form-item label="" prop="file">
                 <div class="rules">
                   <custom-form v-model="form.rules" :fields="rulesFields" :useSave="false">
                     <template #rules1>
@@ -117,15 +135,13 @@
                     </template>
                   </custom-form>
                 </div>
-              </template>
-              <template #brief>
+              </el-form-item>
+              <el-form-item label="简介" prop="brief">
                 <WangEditor v-model="form.brief" />
-              </template>
-            </custom-form>
-          </el-tab-pane>
-          <el-tab-pane label="流程信息" name="third">
-            <custom-form v-model="form" :fields="thrformFields" :rules="{}" @save="toSave" x>
-              <template #process>
+              </el-form-item>
+            </el-tab-pane>
+            <el-tab-pane label="流程信息" name="third">
+              <el-form-item label="" prop="process">
                 <el-col :span="24" class="tables">
                   <el-col :span="24" class="tables_1">
                     <el-button type="primary" @click="addProcess()">添加</el-button>
@@ -158,29 +174,55 @@
                     </el-table>
                   </el-col>
                 </el-col>
-              </template>
-            </custom-form>
-          </el-tab-pane>
-          <el-tab-pane label="调查问卷" name="fourth" v-if="form.form == '4'">
-            <el-col :span="24" class="add">
-              <el-button type="primary" @click="addInvest()">添加</el-button>
-            </el-col>
-            <el-table :data="investigateList" border>
-              <el-table-column type="index" label="序号" width="80" align="center"> </el-table-column>
-              <el-table-column prop="problem" label="问题" align="center"> </el-table-column>
-              <el-table-column label="操作" align="center" width="200">
-                <template #default="scope">
-                  <el-button size="mini" type="primary" @click="updateInvest(scope.row)">修改</el-button>
-                  <el-button size="mini" type="danger" @click="delInvest(scope.row)">删除</el-button>
-                </template>
-              </el-table-column>
-            </el-table>
-            <div class="button">
-              <el-button type="warning" @click="InvestSave('-2')">保存草稿</el-button>
-              <el-button type="primary" @click="InvestSave('0')">保存并提交审核</el-button>
-            </div>
-          </el-tab-pane>
-        </el-tabs>
+              </el-form-item>
+            </el-tab-pane>
+            <el-tab-pane label="报名信息设置" name="fourth" v-if="form.form == '4'">
+              <el-form-item label="" prop="ext_info">
+                <el-col :span="24" class="add">
+                  <el-button type="primary" @click="addInvest()">添加</el-button>
+                </el-col>
+                <el-table :data="investigateList" border>
+                  <el-table-column type="index" label="序号" width="80" align="center"> </el-table-column>
+                  <el-table-column prop="problem" label="字段名称" align="center"> </el-table-column>
+                  <el-table-column label="操作" align="center" width="200">
+                    <template #default="scope">
+                      <el-button type="primary" @click="updateInvest(scope.row)">修改</el-button>
+                      <el-button size="mini" type="danger" @click="delInvest(scope.row)">删除</el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </el-form-item>
+            </el-tab-pane>
+            <el-tab-pane label="分数纬度设置" name="fifth" v-if="form.form == '4'">
+              <el-form-item label="" prop="ext_finals">
+                <el-col :span="24" class="tables">
+                  <el-col :span="24" class="tables_1">
+                    <el-button type="primary" @click="addFinals()">添加</el-button>
+                  </el-col>
+                  <el-col :span="24">
+                    <el-table :data="finalsList" border>
+                      <el-table-column type="index" label="序号" width="80" align="center"> </el-table-column>
+                      <el-table-column prop="name" label="纬度名称" align="center">
+                        <template #default="scope">
+                          <el-input v-model="scope.row.name" placeholder="请输入纬度名称" />
+                        </template>
+                      </el-table-column>
+                      <el-table-column label="操作" align="center" width="100">
+                        <template #default="scope">
+                          <el-button type="danger" @click="delFinals(scope.row)">删除</el-button>
+                        </template>
+                      </el-table-column>
+                    </el-table>
+                  </el-col>
+                </el-col>
+              </el-form-item>
+            </el-tab-pane>
+          </el-tabs>
+          <el-col :span="24" class="button">
+            <el-button type="warning" size="large" @click="toDraftSave(formRef)">保存草稿</el-button>
+            <el-button type="primary" size="large" @click="toSave(formRef)">保存并提交审核</el-button>
+          </el-col>
+        </el-form>
       </el-col>
       <el-col :span="24" v-if="dialog.type == '2'">
         <custom-form v-model="examForm" :fields="examFormFields" :rules="examRules" @save="toExamSave">
@@ -201,13 +243,13 @@
       </el-col>
     </el-row>
   </el-dialog>
-  <el-dialog v-model="dialogVisible" title="调查问卷填写" width="800" :destroy-on-close="false" @close="toInvestClose">
+  <el-dialog v-model="dialogVisible" title="报名信息填写" width="800" :destroy-on-close="false" @close="toInvestClose">
     <custom-form v-model="investigateForm" :fields="fourformFields" :rules="fourRules" @save="toInvestigateSave" submitText="保存" :DraftSave="false">
       <template #type>
         <el-option v-for="i in proTypeList" :key="i.value" :label="i.label" :value="i.value"></el-option>
       </template>
       <template #answer>
-        <div class="answer" v-if="investigateForm.type == '0' || investigateForm.type == '1' || investigateForm.type == '2' || investigateForm.type == '6'">
+        <div class="answer" v-if="investigateForm.type == '0' || investigateForm.type == '1' || investigateForm.type == '2' || investigateForm.type == '7'">
           <el-col :span="24" class="add">
             <el-button type="primary" @click="addAnswer()">添加</el-button>
           </el-col>
@@ -225,8 +267,8 @@
             </el-table-column>
           </el-table>
         </div>
-        <div class="answer" v-if="investigateForm.type == '7'">
-          <custom-upload model="file" :list="answerFile" :limit="1" url="/files/web/cxyy_match/upload" @change="onaUpload"></custom-upload>
+        <div class="answer" v-if="investigateForm.type == '8'">
+          <custom-upload model="file" :list="answerFile" accept="*" :limit="10" url="/files/web/cxyy_match/upload" @change="onaUpload"></custom-upload>
         </div>
       </template>
       <template #is_must>
@@ -242,7 +284,6 @@ import moment from 'moment'
 import { cloneDeep, get } from 'lodash-es'
 const $checkRes = inject('$checkRes')
 const { t } = useI18n()
-const router = useRouter()
 // 组件
 import table1 from '../match/sign/table-1.vue'
 import table2 from '../match/sign/table-2.vue'
@@ -265,6 +306,7 @@ const fields = [
   { label: t('pages.match.industry'), model: 'industry', type: 'select', isSearch: true, format: (i) => getDict(i, 'industry') },
   { label: t('pages.match.tags'), model: 'tags', isSearch: true, format: (i) => getDict(i, 'tags') },
   { label: t('pages.match.type'), model: 'type', isSearch: true, type: 'select', format: (i) => getDict(i, 'type') },
+  { label: t('pages.match.form'), model: 'form', isSearch: true, type: 'select', format: (i) => getDict(i, 'form') },
   // { label: t('pages.match.money'), model: 'money' },
   { label: t('pages.match.is_use'), model: 'is_use', custom: true, format: (i) => getDict(i, 'is_use') },
   { label: t('pages.match.match_status'), model: 'match_status', format: (i) => getDict(i, 'match') },
@@ -272,8 +314,8 @@ const fields = [
 ]
 const opera = [
   { label: t('common.preliminary'), method: 'preliminary', display: (i) => i.form === '4' },
-  { label: t('common.score'), method: 'score', display: (i) => i.match_status == '2' && i.form != '3' },
-  { label: t('common.sign'), method: 'sign', type: 'warning' },
+  { label: t('common.score'), method: 'score', display: (i) => i.match_status == '2' && i.form != '3' && i.form != '4' },
+  { label: t('common.sign'), method: 'sign', type: 'warning', display: (i) => i.form != '4' },
   {
     label: t('common.update'),
     method: 'edit'
@@ -312,32 +354,11 @@ const selectList = ref([])
 // 加载中
 const loading = ref(false)
 const activeName = ref('first')
-const oneformFields = ref([
-  { label: t('pages.match.file'), model: 'file', custom: true },
-  { label: t('pages.match.name'), model: 'name' },
-  { label: t('pages.match.tags'), model: 'tags', custom: true },
-  { label: t('pages.match.type'), model: 'type', type: 'select' },
-  { label: t('pages.match.match_type'), model: 'match_type', type: 'radio' },
-  { label: t('pages.match.scale'), model: 'scale', type: 'radio' },
-  { label: t('pages.match.href'), model: 'href', display: () => form.value.match_type == '1' },
-  { label: t('pages.match.work'), model: 'work' },
-  { label: t('pages.match.industry'), model: 'industry', type: 'select' },
-  { label: t('pages.match.form'), model: 'form', type: 'select' },
-  { label: t('pages.match.money'), model: 'money' },
-  { label: t('pages.match.time'), model: 'time', type: 'datetimerange' },
-  { label: t('pages.match.is_use'), model: 'is_use', type: 'radio' },
-  { label: t('pages.match.is_show'), model: 'is_show', type: 'radio' },
-  { label: t('pages.match.order_num'), model: 'order_num', type: 'number' },
-  { label: t('pages.match.video'), model: 'video', custom: true },
-  { label: t('pages.match.address'), model: 'address', type: 'textarea' },
-  { label: t('pages.match.remark'), model: 'remark', type: 'textarea', display: () => form.value.form == '3' },
-  { label: t('pages.match.match_status'), model: 'match_status', type: 'select' }
-])
-const twoformFields = ref([
-  { label: t('pages.match.rules'), model: 'rules', custom: true },
-  { label: t('pages.match.brief'), model: 'brief', custom: true }
-])
-const thrformFields = ref([{ label: t('pages.match.process'), model: 'process', custom: true }])
+// 表单
+const formRef = ref()
+const form = ref({ video: [], time: [], rules: {} })
+// 分数纬度列表
+const finalsList = ref([])
 const rules = reactive({
   name: [{ required: true, message: t('pages.match.titleMessage'), trigger: 'blur' }],
   form: [{ required: true, message: t('pages.match.formMessage'), trigger: 'blur' }],
@@ -346,7 +367,6 @@ const rules = reactive({
   work: [{ required: true, message: t('pages.match.workMessage'), trigger: 'blur' }]
 })
 const dialog = ref({ type: '1', show: false, title: t('pages.match.addDialogTitle') })
-const form = ref({ rules: {}, video: [], file: [] })
 // 审核
 const examFormFields = [{ label: t('pages.match.status'), model: 'status', type: 'select' }]
 const examRules = reactive({
@@ -372,30 +392,31 @@ const rulesFields = ref([
 const investigateList = ref([])
 const investigateForm = ref({})
 const fourformFields = ref([
-  { label: '问题', model: 'problem' },
+  { label: '字段名称', model: 'problem' },
   { label: '类型', model: 'type', type: 'select' },
   {
     label: '答案',
     model: 'answer',
     custom: true,
-    display: () => investigateForm.value.type == '0' || investigateForm.value.type == '1' || investigateForm.value.type == '2' || investigateForm.value.type == '6' || investigateForm.value.type == '7'
+    display: () => investigateForm.value.type == '0' || investigateForm.value.type == '1' || investigateForm.value.type == '2' || investigateForm.value.type == '7' || investigateForm.value.type == '8'
   },
-  { label: '是否必填', model: 'is_must', type: 'radio' },
+  { label: '是否必填', model: 'is_must', type: 'radio', display: () => investigateForm.value.type != '8' },
   { label: '备注', model: 'remark', type: 'textarea' }
 ])
 const fourRules = reactive({
-  problem: [{ required: true, message: '请输入问题', trigger: 'blur' }]
+  problem: [{ required: true, message: '请输入字段名称', trigger: 'blur' }]
 })
 const dialogVisible = ref(false)
 const proTypeList = ref([
   { value: '0', label: '单选' },
   { value: '1', label: '多选' },
   { value: '2', label: '下拉' },
-  { value: '3', label: '单行文本' },
-  { value: '4', label: '多行文本' },
-  { value: '5', label: '图片/文件' },
-  { value: '6', label: '数组' },
-  { value: '7', label: '附件模板' }
+  { value: '3', label: '数值类型' },
+  { value: '4', label: '单行文本' },
+  { value: '5', label: '多行文本' },
+  { value: '6', label: '图片/文件' },
+  { value: '7', label: '数组' },
+  { value: '8', label: '附件模板' }
 ])
 // 答案
 const answerList = ref([])
@@ -460,6 +481,7 @@ const getDict = (data, model) => {
     if (model == 'is_use') res = isUseList.value.find((f) => f.value == data)
     else if (model == 'status') res = statusList.value.find((f) => f.value == data)
     else if (model == 'type') res = typeList.value.find((f) => f.value == data)
+    else if (model == 'form') res = formList.value.find((f) => f.value == data)
     else if (model == 'match') res = matchList.value.find((f) => f.value == data)
     else if (model == 'industry') res = industryList.value.find((f) => f.value == data)
     else if (model == 'tags') return data.join(',')
@@ -499,6 +521,7 @@ const toEdit = async (data) => {
     if (!res.data.video) res.data.video = []
     form.value = res.data
     if (res.data.ext_info && res.data.ext_info.length > 0) investigateList.value = res.data.ext_info
+    if (res.data.ext_finals && res.data.ext_finals.length > 0) finalsList.value = res.data.ext_finals
     await searchProcess()
     dialog.value = { type: '1', show: true, title: t('pages.match.upDialogTitle') }
   }
@@ -525,22 +548,32 @@ const toDelete = async (data) => {
     search({ skip, limit })
   }
 }
-const toSave = async () => {
-  const data = cloneDeep(form.value)
-  if (data.time && data.time.length > 1) {
-    data.start_time = data.time[0]
-    data.end_time = data.time[1]
-  }
-  const other = { status: '0' }
-  let res
-  if (get(data, 'id')) res = await store.update({ ...data, ...other })
-  else res = await store.create({ ...data, ...other })
-  if ($checkRes(res, true)) {
-    if (res.data && res.data.id) match_id.value = res.data.id
-    await toProcessSave()
-    await search({ skip, limit })
-    await toClose()
-  }
+const toSave = async (formEl) => {
+  if (!formEl) return
+  await formEl.validate(async (valid) => {
+    if (valid) {
+      const data = cloneDeep(form.value)
+      if (data.time && data.time.length > 1) {
+        data.start_time = data.time[0]
+        data.end_time = data.time[1]
+      }
+      const other = { status: '0' }
+      let res
+      if (get(data, 'id')) res = await store.update({ ...data, ...other })
+      else res = await store.create({ ...data, ...other })
+      if ($checkRes(res, true)) {
+        if (res.data && res.data.id) match_id.value = res.data.id
+        await toProcessSave()
+        await search({ skip, limit })
+        await toClose()
+      }
+    } else {
+      ElMessage({
+        message: '有相关必填项没有填写',
+        type: 'warning'
+      })
+    }
+  })
 }
 // 审核
 const toExam = (data) => {
@@ -607,6 +640,8 @@ const toClose = () => {
   form.value = { rules: {}, video: [], file: [] }
   dialog.value = { show: false }
   investigateList.value = []
+  finalsList.value = []
+  processList.value = []
   activeName.value = 'first'
 }
 // 上传图片
@@ -622,7 +657,10 @@ const addInvest = () => {
 // 调查问卷修改
 const updateInvest = (e) => {
   dialogVisible.value = true
-  if (e.answer && e.answer.length > 0) answerList.value = e.answer
+  if (e.answer && e.answer.length > 0) {
+    if (e.type == '8') answerFile.value = e.answer
+    else answerList.value = e.answer
+  }
   investigateForm.value = e
 }
 // 删除调查问卷
@@ -659,18 +697,16 @@ const delAnswer = async (e) => {
   let list = answerList.value.filter((i) => i.sid != e.sid)
   answerList.value = list
 }
-//  保存并提交审核
-const InvestSave = async (status) => {
-  const data = cloneDeep(form.value)
-  const other = { status }
-  let res
-  if (get(data, 'id')) res = await store.update({ id: data.id, ext_info: investigateList.value, ...other, ...data })
-  else res = await store.create({ ext_info: investigateList.value, ...other, ...data })
-  if (res.errcode == 0) {
-    ElMessage({ message: `发布成功可以上历史发布查看`, type: 'success' })
-    await search({ skip, limit })
-    await toClose()
-  }
+// 维度添加
+const addFinals = () => {
+  let list = finalsList.value || []
+  list.push({ sid: moment().valueOf(), name: '' })
+  finalsList.value = list
+}
+// 维度删除
+const delFinals = async (e) => {
+  let list = finalsList.value.filter((i) => i.sid != e.sid)
+  finalsList.value = list
 }
 // 上传图片
 const onaUpload = (e) => {