|
@@ -1,11 +1,11 @@
|
|
|
<template>
|
|
|
- <div>
|
|
|
- <basic-container class="cardTitle">
|
|
|
+ <div class="quicl-review" @scroll="handleScroll">
|
|
|
+ <div class="card-container">
|
|
|
<p>
|
|
|
<el-button type="primary" @click="backPage" style="width: 80px">返回</el-button>
|
|
|
</p>
|
|
|
- </basic-container>
|
|
|
- <basic-container>
|
|
|
+ </div>
|
|
|
+ <div class="card-container">
|
|
|
<div class="search-content">
|
|
|
<el-form :model="searchFrom" label-width="140px">
|
|
|
<el-row>
|
|
@@ -85,115 +85,149 @@
|
|
|
</el-row>
|
|
|
</el-form>
|
|
|
</div>
|
|
|
- </basic-container>
|
|
|
- <basic-container>
|
|
|
- <div class="card-list">
|
|
|
- <div v-infinite-scroll="getList" style="overflow: auto">
|
|
|
- <div class="cards" v-masonry :gutter="20">
|
|
|
- <div v-for="curr in list" class="card" v-masonry-tile :key="curr.info.taskId">
|
|
|
- <div class="task-info">
|
|
|
- <div class="task-type-info">服务类型: {{ getName(curr?.info.taskTypeId) }}</div>
|
|
|
- <div class="info">
|
|
|
- <p>任务ID:{{ curr?.info.taskId }}</p>
|
|
|
- <p>任务编号:{{ curr?.info.taskNumber }}</p>
|
|
|
- </div>
|
|
|
- <div class="info">
|
|
|
- <p>服务积分:{{ curr?.info.taskScore }}</p>
|
|
|
- <p>代表姓名:{{ curr?.info.salesName }}</p>
|
|
|
- </div>
|
|
|
- <div class="info">
|
|
|
- <p>产品名称:{{ curr?.info.skuName }}</p>
|
|
|
- <p>生产企业:{{ curr?.info.mahName }}</p>
|
|
|
- </div>
|
|
|
- <div class="info">
|
|
|
- <p>执行包名称:{{ curr?.info.pkgName }}</p>
|
|
|
- <p>起止时间:{{ curr?.info.pkgStartTime }} ~ {{ curr?.info.pkgEndTime }}</p>
|
|
|
- </div>
|
|
|
+ </div>
|
|
|
+ <div class="card-container">
|
|
|
+ <div class="card-all-review">
|
|
|
+ <div class="btns">
|
|
|
+ <el-button type="primary" @click="allClick">批量审核</el-button>
|
|
|
+ </div>
|
|
|
+ <div class="check-info">
|
|
|
+ <el-checkbox v-model="allCheck" @change="allClick">全选</el-checkbox>
|
|
|
+ <p>当前已选择{{ checkAllLength }}项,总积分:{{ checkAllTaskScore }}</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="card-list card-container" v-loading="getPageLoading">
|
|
|
+ <template v-if="list.length === 0">
|
|
|
+ <div class="no-data">
|
|
|
+ <el-empty description="暂无数据"></el-empty>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div class="cards" v-masonry :cols="2" :gutter="20" style="width: 100%">
|
|
|
+ <template v-for="curr in list">
|
|
|
+ <div class="card" v-masonry-tile :key="curr.info.taskId" v-if="curr.reviewInfo.show">
|
|
|
+ <div class="task-info">
|
|
|
+ <div class="task-type-info">
|
|
|
+ <el-checkbox
|
|
|
+ v-model="curr.reviewInfo.checked"
|
|
|
+ @change="
|
|
|
+ (val) => {
|
|
|
+ itemChecked(val, curr);
|
|
|
+ }
|
|
|
+ "
|
|
|
+ ></el-checkbox>
|
|
|
+ 服务类型: {{ getName(curr?.info.taskTypeId) }}
|
|
|
</div>
|
|
|
- <div class="detail">服务详情</div>
|
|
|
- <template v-if="curr?.info?.configs">
|
|
|
- <div v-for="(item, index) in curr?.info?.configs" :key="index" class="field-box">
|
|
|
- <template v-if="item.taskFiledType == 'domain' || item.taskFiledType == 'select'">
|
|
|
- <div class="title-value">{{ item.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value" v-show="!(item.taskTypeId == '19' && item.taskFiledKey == 'temp3')">
|
|
|
- {{ getDesc(curr.info, item) }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 城市选择 -->
|
|
|
- <template v-if="item.taskFiledType === 'area'">
|
|
|
- <div class="title-value">{{ item.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value">
|
|
|
- {{ curr.info.taskContent[item.taskFiledKey] || '--' }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 文字输入 -->
|
|
|
- <template v-if="item.taskFiledType == 'text' || item.taskFiledType == 'inputautoselect' || item.taskFiledType == 'map' || item.taskFiledType == 'mapwithimg'">
|
|
|
- <div class="title-value">{{ item.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value">
|
|
|
- {{ curr.info.taskContent[item.taskFiledKey] || '--' }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 时间 -->
|
|
|
- <template v-if="item.taskFiledType == 'datetime'">
|
|
|
- <div class="title-value">{{ item.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value">
|
|
|
- {{ curr.info.taskContent[item.taskFiledKey] || '--' }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 日期范围 -->
|
|
|
- <template v-if="item.taskFiledType == 'datatimerange'">
|
|
|
- <div class="title-value">{{ item.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value">
|
|
|
- {{ curr.info.taskContent[item.taskFiledKey] || '--' }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 图片上传 -->
|
|
|
- <div v-if="item.taskFiledType == 'img'" class="divline" style="width: 100%; height: 15px; background-color: #e9e9e9; margin-bottom: 5px"></div>
|
|
|
- <template v-if="item.taskFiledType == 'img'">
|
|
|
- <div class="upload-field">
|
|
|
- <div class="field-text" :class="{ required: item.isMustfill == '1' }">{{ item.taskFiledValue }}:</div>
|
|
|
- <!-- 上传组件 -->
|
|
|
- <div class="img-box" v-if="item.imgList">
|
|
|
- <div v-for="(iItem, index) in item.imgList" :key="index" class="img-box-content">
|
|
|
- <span class="type">{{ iItem.type }}</span>
|
|
|
- <el-image class="img-item" lazy :src="iItem.url" :preview-src-list="getPreviewList(item.previewList, index)" />
|
|
|
- </div>
|
|
|
+ <div class="info">
|
|
|
+ <p>任务ID:{{ curr?.info.taskId }}</p>
|
|
|
+ <p>任务编号:{{ curr?.info.taskNumber }}</p>
|
|
|
+ </div>
|
|
|
+ <div class="info">
|
|
|
+ <p>服务积分:{{ curr?.info.taskScore }}</p>
|
|
|
+ <p>代表姓名:{{ curr?.info.salesName }}</p>
|
|
|
+ </div>
|
|
|
+ <div class="info">
|
|
|
+ <p>产品名称:{{ curr?.info.skuName }}</p>
|
|
|
+ <p>生产企业:{{ curr?.info.mahName }}</p>
|
|
|
+ </div>
|
|
|
+ <div class="info">
|
|
|
+ <p>执行包名称:{{ curr?.info.pkgName }}</p>
|
|
|
+ <p>起止时间:{{ curr?.info.pkgStartTime }} ~ {{ curr?.info.pkgEndTime }}</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="detail">服务详情</div>
|
|
|
+ <template v-if="curr?.info?.configs">
|
|
|
+ <div v-for="(item, index) in curr?.info?.configs" :key="index" class="field-box">
|
|
|
+ <template v-if="item.taskFiledType == 'domain' || item.taskFiledType == 'select'">
|
|
|
+ <div class="title-value">{{ item.taskFiledValue }}:</div>
|
|
|
+ <div class="desc-value" v-show="!(item.taskTypeId == '19' && item.taskFiledKey == 'temp3')">
|
|
|
+ {{ getDesc(curr.info, item) }}
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <!-- * 文本类型 -->
|
|
|
+ <template v-if="typeArr.includes(item.taskFiledType)">
|
|
|
+ <div class="title-value">{{ item.taskFiledValue }}:</div>
|
|
|
+ <div class="desc-value">
|
|
|
+ {{ curr.info.taskContent[item.taskFiledKey] || '--' }}
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <!-- 图片上传 -->
|
|
|
+ <div v-if="item.taskFiledType == 'img'" class="divline" style="width: 100%; height: 15px; background-color: #e9e9e9; margin-bottom: 5px"></div>
|
|
|
+ <template v-if="item.taskFiledType == 'img'">
|
|
|
+ <div class="upload-field">
|
|
|
+ <div class="field-text" :class="{ required: item.isMustfill == '1' }">{{ item.taskFiledValue }}:</div>
|
|
|
+ <!-- 上传组件 -->
|
|
|
+ <div class="img-box" v-if="item.imgList">
|
|
|
+ <div v-for="(iItem, index) in item.imgList" :key="index" class="img-box-content">
|
|
|
+ <span class="type">{{ iItem.type }}</span>
|
|
|
+ <el-image class="img-item" lazy :src="iItem.url" :preview-src-list="getPreviewList(item.previewList, index)" />
|
|
|
</div>
|
|
|
</div>
|
|
|
- </template>
|
|
|
- <!-- 金额 -->
|
|
|
- <template v-if="item.taskFiledType == 'money'">
|
|
|
- <div class="title-value">{{ item.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value">
|
|
|
- {{ curr.info.taskContent[item.taskFiledKey] || '--' }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 数字 -->
|
|
|
- <template v-if="item.taskFiledType == 'number'">
|
|
|
- <div class="title-value">{{ item.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value">
|
|
|
- {{ curr.info.taskContent[item.taskFiledKey] || '--' }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 长文本 -->
|
|
|
- <template v-if="item.taskFiledType == 'longtext'">
|
|
|
- <div class="longtext-box">
|
|
|
- <div class="field-text" :class="{ required: item.isMustfill == '1' }">{{ item.taskFiledValue }}:</div>
|
|
|
- <textarea class="textarea-box" :disabled="true" :value="curr.info.taskContent[item.taskFiledKey] || '--'" :maxlength="item.taskFiledMaxsize" />
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
-
|
|
|
- <div class="btns">
|
|
|
- <el-button class="btn" type="danger" @click="passClick(curr, true)">不通过</el-button>
|
|
|
- <el-button class="btn" type="primary" @click="passClick(curr, true)">通过</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <!-- 长文本 -->
|
|
|
+ <template v-if="item.taskFiledType == 'longtext'">
|
|
|
+ <div class="longtext-box">
|
|
|
+ <div class="field-text" :class="{ required: item.isMustfill == '1' }">{{ item.taskFiledValue }}:</div>
|
|
|
+ <textarea class="textarea-box" :disabled="true" :value="curr.info.taskContent[item.taskFiledKey] || '--'" :maxlength="item.taskFiledMaxsize" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
</div>
|
|
|
+ </template>
|
|
|
+ <div class="divline" style="width: 100%; height: 15px; background-color: #e9e9e9; margin-bottom: 5px"></div>
|
|
|
+ <div class="longtext-box review-textarea">
|
|
|
+ <div class="field-text">意见说明</div>
|
|
|
+ <el-input type="textarea" class="textarea-box" resize="none" v-model="curr.reviewInfo.checkMessage" />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="btns">
|
|
|
+ <el-button class="btn" type="danger" @click="passClick(curr, false)">不通过</el-button>
|
|
|
+ <el-button class="btn" type="primary" @click="passClick(curr, true)">通过</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 审核弹窗 -->
|
|
|
+ <el-dialog title="审核" :close-on-click-modal="false" :visible.sync="reviewDialog" top="12vh" width="50%" :before-close="handleClose" center>
|
|
|
+ <div class="reviewContent" v-loading="loading">
|
|
|
+ <div class="check-tips">审核令牌有效期为3分钟,请在【{{ expireTime }}】前完成审核操作,如果失效,请重新打开弹窗。</div>
|
|
|
+
|
|
|
+ <div class="teskDetailsty">审批意见</div>
|
|
|
+ <el-form :model="taskForm" :rules="rules" ref="taskForm" label-width="100px">
|
|
|
+ <el-form-item label="审批意见:" prop="checkResult" class="formitem-box">
|
|
|
+ <el-radio-group v-model="taskForm.checkResult">
|
|
|
+ <el-radio :label="true">通过</el-radio>
|
|
|
+ <el-radio :label="false">拒绝</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item
|
|
|
+ label="意见说明:"
|
|
|
+ prop="checkMessage"
|
|
|
+ class="formitem-box"
|
|
|
+ :rules="[
|
|
|
+ {
|
|
|
+ required: !taskForm.checkResult,
|
|
|
+ message: '请输入审批说明',
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ]"
|
|
|
+ >
|
|
|
+ <el-input type="textarea" v-model="taskForm.checkMessage"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <refuseReason @selectRefuseReason="selectRefuseReason" />
|
|
|
+ </el-form>
|
|
|
</div>
|
|
|
- </basic-container>
|
|
|
+ <span slot="footer" class="dialog-footer">
|
|
|
+ <el-button @click="handleClose">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="checkForm" v-loading="loading">确 定</el-button>
|
|
|
+ </span>
|
|
|
+ </el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -209,14 +243,17 @@ import {
|
|
|
checkSingleApi,
|
|
|
getTaskV2PageTileApi
|
|
|
} from '@/api/serviceManagement/servicesToBeReviewed/index.js';
|
|
|
+import refuseReason from '@/components/refuseReason';
|
|
|
import { getDictType } from '@/api/common';
|
|
|
import abbreviationsProvinces from '@/const/abbreviationsProvinces.js';
|
|
|
import dayjs from 'dayjs';
|
|
|
import { mapGetters } from 'vuex';
|
|
|
|
|
|
export default {
|
|
|
+ components: { refuseReason },
|
|
|
data() {
|
|
|
return {
|
|
|
+ typeArr: ['area', 'text', 'inputautoselect', 'map', 'mapwithimg', 'datetime', 'datatimerange', 'money', 'number', ''],
|
|
|
taskStatusArr: [],
|
|
|
taskTypeAvailArr: [],
|
|
|
mahNameArr: [],
|
|
@@ -227,6 +264,7 @@ export default {
|
|
|
drugDisabled: true,
|
|
|
abbreviationsProvincesList: abbreviationsProvinces,
|
|
|
nodeId: '',
|
|
|
+ getPageLoading: false,
|
|
|
searchFrom: {
|
|
|
year: '',
|
|
|
taskTypeId: '',
|
|
@@ -240,21 +278,38 @@ export default {
|
|
|
taskStatus: 3
|
|
|
},
|
|
|
page: {
|
|
|
- current: 1,
|
|
|
- size: 50
|
|
|
+ total: 0,
|
|
|
+ currentPage: 1,
|
|
|
+ pageSize: 6
|
|
|
},
|
|
|
nodeId: '',
|
|
|
- list: []
|
|
|
+ list: [],
|
|
|
+ allCheck: false,
|
|
|
+ checkAllLength: 0,
|
|
|
+ checkAllTaskScore: 0,
|
|
|
+ checkIds: [],
|
|
|
+ reviewToken: '',
|
|
|
+ expireTime: '',
|
|
|
+ reviewDialog: false,
|
|
|
+ taskForm: {
|
|
|
+ checkResult: '',
|
|
|
+ checkMessage: ''
|
|
|
+ },
|
|
|
+ rules: {
|
|
|
+ checkResult: [{ required: true, message: '请选择审批意见', trigger: 'change' }]
|
|
|
+ },
|
|
|
+ loading: false
|
|
|
};
|
|
|
},
|
|
|
async created() {
|
|
|
await this.getDict();
|
|
|
- this.getList();
|
|
|
},
|
|
|
computed: {
|
|
|
...mapGetters(['userInfo'])
|
|
|
},
|
|
|
mounted() {
|
|
|
+ window.addEventListener('scroll', this.handleScroll);
|
|
|
+
|
|
|
const roles = this.userInfo.roles;
|
|
|
|
|
|
let nodeId = '';
|
|
@@ -293,8 +348,22 @@ export default {
|
|
|
this.searchFrom.nodeId = nodeId;
|
|
|
this.getList();
|
|
|
},
|
|
|
-
|
|
|
+ beforeDestroy() {
|
|
|
+ window.removeEventListener('scroll', this.handleScroll);
|
|
|
+ },
|
|
|
methods: {
|
|
|
+ handleScroll(event) {
|
|
|
+ const scrollHeight = event.target.scrollHeight; // 获取滚动元素的总高度
|
|
|
+ const scrollTop = event.target.scrollTop; // 获取滚动元素的当前滚动高度
|
|
|
+ const windowHeight = event.target.clientHeight; // 获取滚动元素的可视区域高度
|
|
|
+ if (scrollTop + windowHeight >= scrollHeight - 10) {
|
|
|
+ if (!this.getPageLoading && this.page.total > this.page.currentPage * this.page.pageSize) {
|
|
|
+ this.page.currentPage += 1;
|
|
|
+ this.getList();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
getDict() {
|
|
|
getDictType({ type: 'task_status' }).then((res) => {
|
|
|
this.taskStatusArr = res.data.data;
|
|
@@ -329,6 +398,7 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
async getList() {
|
|
|
+ this.getPageLoading = true;
|
|
|
const obj = Object.assign(
|
|
|
{
|
|
|
current: this.page.currentPage,
|
|
@@ -336,12 +406,90 @@ export default {
|
|
|
},
|
|
|
this.searchFrom
|
|
|
);
|
|
|
- const res = await getTaskV2PageTileApi(obj);
|
|
|
- if (res.data.code === 0) {
|
|
|
- this.list = res.data.data.records;
|
|
|
+
|
|
|
+ try {
|
|
|
+ const res = await getTaskV2PageTileApi(obj);
|
|
|
+ if (res.data.code === 0) {
|
|
|
+ let list = res.data.data.records;
|
|
|
+ // this.list.push(...res.data.data.records);
|
|
|
+ this.page.total = res.data.data.total;
|
|
|
+ list.forEach((item) => {
|
|
|
+ let reviewInfo = {
|
|
|
+ checked: false,
|
|
|
+ checkMessage: '',
|
|
|
+ show: true
|
|
|
+ };
|
|
|
+ item.reviewInfo = reviewInfo;
|
|
|
+ });
|
|
|
+ this.list.push(...list);
|
|
|
+ this.$forceUpdate();
|
|
|
+ this.getPageLoading = false;
|
|
|
+ }
|
|
|
+ } catch (err) {
|
|
|
+ console.log('err', err);
|
|
|
+
|
|
|
+ this.getPageLoading = false;
|
|
|
}
|
|
|
},
|
|
|
|
|
|
+ allClick(val) {
|
|
|
+ if (val) {
|
|
|
+ this.list.forEach((item) => (item.reviewInfo.checked = true));
|
|
|
+ this.$forceUpdate();
|
|
|
+ this.calcInfo();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ calcInfo() {
|
|
|
+ let checkAllLength = 0;
|
|
|
+ let checkAllTaskScore = 0;
|
|
|
+ let ids = [];
|
|
|
+ this.list.forEach((item) => {
|
|
|
+ if (item.reviewInfo.checked) {
|
|
|
+ checkAllLength++;
|
|
|
+ checkAllTaskScore += Number(item.info.taskScore);
|
|
|
+ ids.push(item.info.taskId);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.checkAllLength = checkAllLength;
|
|
|
+ this.checkAllTaskScore = checkAllTaskScore;
|
|
|
+ this.checkIds = ids;
|
|
|
+ },
|
|
|
+ itemChecked(val, item) {
|
|
|
+ this.$forceUpdate();
|
|
|
+
|
|
|
+ if (val) {
|
|
|
+ this.checkAllLength++;
|
|
|
+ this.checkIds.push(item.info.taskId);
|
|
|
+ this.checkAllTaskScore += Number(item.info.taskScore);
|
|
|
+ } else {
|
|
|
+ this.checkAllLength--;
|
|
|
+ let index = this.checkIds.findIndex((curr) => curr === item.info.taskId);
|
|
|
+ this.checkIds.splice(index, 1);
|
|
|
+ this.checkAllTaskScore -= Number(item.info.taskScore);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ async allClick() {
|
|
|
+ if (!this.checkIds.length) {
|
|
|
+ return this.$message.error('请选择待审核数据');
|
|
|
+ }
|
|
|
+ await this.getToken(this.checkIds);
|
|
|
+ this.reviewDialog = true;
|
|
|
+ },
|
|
|
+ async getToken(taskIds) {
|
|
|
+ const tokenRes = await getTaskV2TokenApi({ taskIds: taskIds });
|
|
|
+ if (tokenRes.data.code !== 0 || !tokenRes.data.data?.token) {
|
|
|
+ return this.$message.error('获取token失败');
|
|
|
+ }
|
|
|
+ this.reviewToken = tokenRes.data.data.token;
|
|
|
+ this.expireTime = tokenRes.data.data.expireTime;
|
|
|
+ },
|
|
|
+ handleClose() {
|
|
|
+ this.reviewDialog = false;
|
|
|
+ this.taskForm = {
|
|
|
+ checkResult: '',
|
|
|
+ checkMessage: ''
|
|
|
+ };
|
|
|
+ },
|
|
|
clickBtn() {
|
|
|
this.tableData = [];
|
|
|
this.page.currentPage = 1;
|
|
@@ -392,6 +540,11 @@ export default {
|
|
|
return result.join(',');
|
|
|
},
|
|
|
async passClick(item, flag) {
|
|
|
+ if (!flag && !item.reviewInfo.checkMessage) {
|
|
|
+ return this.$message.error('请填写审核意见');
|
|
|
+ }
|
|
|
+
|
|
|
+ //
|
|
|
let nodeId = '';
|
|
|
const roles = this.userInfo.roles;
|
|
|
switch (true) {
|
|
@@ -422,22 +575,95 @@ export default {
|
|
|
default:
|
|
|
nodeId = 1;
|
|
|
}
|
|
|
- console.log('item', item);
|
|
|
let obj = {
|
|
|
token: item.token.token,
|
|
|
taskId: item.token.value,
|
|
|
checkResult: flag,
|
|
|
- checkMessage: '',
|
|
|
+ checkMessage: item.reviewInfo.checkMessage,
|
|
|
nodeId: nodeId
|
|
|
};
|
|
|
try {
|
|
|
- res = await checkSingleApi(obj);
|
|
|
- console.log('res', res);
|
|
|
+ const res = await checkSingleApi(obj);
|
|
|
+ if (res.data.code === 0 && res.data.data) {
|
|
|
+ item.reviewInfo.show = false;
|
|
|
+ this.$forceUpdate();
|
|
|
+ }
|
|
|
} catch (err) {
|
|
|
console.log('err', err);
|
|
|
}
|
|
|
},
|
|
|
|
|
|
+ checkForm() {
|
|
|
+ let nodeId = '';
|
|
|
+ const roles = this.userInfo.roles;
|
|
|
+ switch (true) {
|
|
|
+ // 43 地市管理员
|
|
|
+ case roles.includes(43):
|
|
|
+ nodeId = 2;
|
|
|
+ break;
|
|
|
+ // 4 区域管理员
|
|
|
+ case roles.includes(4):
|
|
|
+ nodeId = 3;
|
|
|
+ break;
|
|
|
+ // 42 市场管理员
|
|
|
+ case roles.includes(42):
|
|
|
+ nodeId = 8;
|
|
|
+ break;
|
|
|
+ // 40 商务管理员
|
|
|
+ case roles.includes(40):
|
|
|
+ nodeId = 9;
|
|
|
+ break;
|
|
|
+ // 39 事业部总经理
|
|
|
+ case roles.includes(39):
|
|
|
+ nodeId = 6;
|
|
|
+ break;
|
|
|
+ // 41 事业部分管领导
|
|
|
+ case roles.includes(41):
|
|
|
+ nodeId = 5;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ nodeId = 1;
|
|
|
+ }
|
|
|
+ this.$refs.taskForm.validate(async (valid) => {
|
|
|
+ if (valid) {
|
|
|
+ let obj = {
|
|
|
+ token: this.reviewToken,
|
|
|
+ taskIds: this.checkIds,
|
|
|
+ checkResult: this.taskForm.checkResult,
|
|
|
+ checkMessage: this.taskForm.checkMessage,
|
|
|
+ nodeId: nodeId
|
|
|
+ };
|
|
|
+ try {
|
|
|
+ const res = await taskV2CheckBatchApi(obj);
|
|
|
+ if (res.data.code === 0 && res.data.data) {
|
|
|
+ this.$message.success('审核成功!');
|
|
|
+ this.handleClose();
|
|
|
+ this.list.forEach((item) => {
|
|
|
+ if (item.reviewInfo.checked) {
|
|
|
+ console.log('item', item);
|
|
|
+
|
|
|
+ item.reviewInfo.show = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ this.loading = false;
|
|
|
+ } catch (err) {
|
|
|
+ this.loading = false;
|
|
|
+ console.log('err', err);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ selectRefuseReason(refuseReason) {
|
|
|
+ let info;
|
|
|
+ if (this.taskForm.checkMessage) {
|
|
|
+ info = this.taskForm.checkMessage + refuseReason + ';';
|
|
|
+ } else {
|
|
|
+ info = refuseReason + ';';
|
|
|
+ }
|
|
|
+
|
|
|
+ this.$set(this.taskForm, 'checkMessage', info);
|
|
|
+ },
|
|
|
backPage() {
|
|
|
this.$router.$avueRouter.closeTag();
|
|
|
this.$router.back();
|
|
@@ -447,6 +673,20 @@ export default {
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
+.quicl-review {
|
|
|
+ overflow: auto;
|
|
|
+ height: 100%;
|
|
|
+ padding-bottom: 30px;
|
|
|
+ .card-container {
|
|
|
+ margin: 0 10px;
|
|
|
+ margin-bottom: 10px;
|
|
|
+ padding: 20px;
|
|
|
+ border-radius: 10px;
|
|
|
+ background: #fff;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
.search-btns {
|
|
|
margin-left: 50px;
|
|
|
display: flex;
|
|
@@ -454,13 +694,17 @@ export default {
|
|
|
}
|
|
|
|
|
|
.card-list {
|
|
|
- height: calc(100vh - 550px);
|
|
|
+ overflow: auto;
|
|
|
+ min-height: 200px;
|
|
|
+ box-sizing: border-box;
|
|
|
.cards {
|
|
|
+ box-sizing: border-box;
|
|
|
width: 100%;
|
|
|
padding: 10px;
|
|
|
}
|
|
|
|
|
|
.card {
|
|
|
+ box-sizing: border-box;
|
|
|
border-radius: 4px;
|
|
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.2);
|
|
|
border: 1px solid #ebeef5;
|
|
@@ -468,10 +712,9 @@ export default {
|
|
|
color: #303133;
|
|
|
transition: 0.3s;
|
|
|
min-height: 300px;
|
|
|
- width: 49%;
|
|
|
- min-width: 500px;
|
|
|
+ width: 48%;
|
|
|
+ // min-width: 500px;
|
|
|
margin-bottom: 10px;
|
|
|
-
|
|
|
padding: 10px;
|
|
|
}
|
|
|
|
|
@@ -543,13 +786,7 @@ export default {
|
|
|
height: 100px;
|
|
|
margin-right: 5px;
|
|
|
}
|
|
|
- .longtext-box {
|
|
|
- .textarea-box {
|
|
|
- margin-top: 5px !important;
|
|
|
- width: 100%;
|
|
|
- padding: 3px;
|
|
|
- }
|
|
|
- }
|
|
|
+
|
|
|
.divline {
|
|
|
width: 100%;
|
|
|
height: 5px;
|
|
@@ -563,6 +800,19 @@ export default {
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+.longtext-box {
|
|
|
+ .textarea-box {
|
|
|
+ margin-top: 5px !important;
|
|
|
+ width: 100%;
|
|
|
+ padding: 3px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.no-data {
|
|
|
+ margin: 0 auto;
|
|
|
+}
|
|
|
+
|
|
|
.btns {
|
|
|
padding: 0 20px;
|
|
|
padding-top: 5px;
|
|
@@ -572,4 +822,45 @@ export default {
|
|
|
width: 48%;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+.card-all-review {
|
|
|
+ width: 350px;
|
|
|
+}
|
|
|
+.check-info {
|
|
|
+ padding-left: 20px;
|
|
|
+ margin-top: 10px;
|
|
|
+ display: flex;
|
|
|
+ height: 30px;
|
|
|
+ align-items: center;
|
|
|
+ p {
|
|
|
+ color: #85ce61;
|
|
|
+ border-radius: 3px;
|
|
|
+ line-height: 14px;
|
|
|
+ font-size: 14px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.teskDetailsty {
|
|
|
+ width: 100%;
|
|
|
+ height: 30px;
|
|
|
+ line-height: 30px;
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #333333;
|
|
|
+ border-bottom: 1px solid #d7d6d5;
|
|
|
+ margin: 0 0 10px 0;
|
|
|
+}
|
|
|
+.check-btns {
|
|
|
+ width: 150px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+}
|
|
|
+
|
|
|
+.check-tips {
|
|
|
+ margin-bottom: 5px;
|
|
|
+ font-size: 16px;
|
|
|
+ color: rgb(233 77 77);
|
|
|
+ text-align: center;
|
|
|
+ font-weight: 600;
|
|
|
+}
|
|
|
</style>
|