|
@@ -1,279 +1,134 @@
|
|
|
<template>
|
|
|
- <basic-container class="basic">
|
|
|
- <el-image-viewer v-if="showViewer" :on-close="closeViewer" :url-list="viewerList" />
|
|
|
- <Card 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>
|
|
|
- </Card>
|
|
|
- <div class="search">
|
|
|
- <el-form :model="form" label-width="100px" ref="formRef">
|
|
|
- <el-row>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="任务ID" prop="taskId">
|
|
|
- <el-input v-model="form.taskId" placeholder="执行任务" clearable></el-input>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="任务编号" prop="taskNumber">
|
|
|
- <el-input v-model="form.taskNumber" placeholder="任务编号" clearable></el-input>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="服务类型" prop="taskTypeId">
|
|
|
- <el-select v-model="form.taskTypeId" placeholder="服务类型" class="w100" clearable>
|
|
|
- <el-option :label="item.taskTypeName" :value="item.id" v-for="item in taskList" :key="item.id"></el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="起止时间">
|
|
|
- <ElQuarterPicker placeholder="请选择" v-model="monthrange" @change="monthrangeChange" class="w100" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="执行包名称" prop="pkgName">
|
|
|
- <el-input v-model="form.pkgName" placeholder="执行包名称" clearable></el-input>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="生产企业" prop="mahName">
|
|
|
- <el-select v-model="form.mahName" placeholder="生产企业" clearable class="w100">
|
|
|
- <el-option :label="item.label" :value="item.value" v-for="item in mahNameList" :key="item.value"></el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="代表名字" prop="memberName">
|
|
|
- <el-input v-model="form.memberName" placeholder="代表名字" clearable></el-input>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="3">
|
|
|
- <div class="search-btns">
|
|
|
- <el-form-item>
|
|
|
- <el-button type="primary" @click="onSubmit">查询</el-button>
|
|
|
+ </div>
|
|
|
+ <div class="card-container">
|
|
|
+ <div class="search-content">
|
|
|
+ <el-form :model="form" label-width="100px" ref="formRef">
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="任务ID" prop="taskId">
|
|
|
+ <el-input v-model="form.taskId" placeholder="执行任务" clearable></el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button type="primary" @click="restFn">重置</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="任务编号" prop="taskNumber">
|
|
|
+ <el-input v-model="form.taskNumber" placeholder="任务编号" clearable></el-input>
|
|
|
</el-form-item>
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- </el-form>
|
|
|
- <div class="content" v-if="!IS_FWS && type">
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="服务类型" prop="taskTypeId">
|
|
|
+ <el-select v-model="form.taskTypeId" placeholder="服务类型" class="w100" clearable>
|
|
|
+ <el-option :label="item.taskTypeName" :value="item.id" v-for="item in taskList" :key="item.id"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="起止时间">
|
|
|
+ <ElQuarterPicker placeholder="请选择" v-model="monthrange" @change="monthrangeChange" class="w100" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="执行包名称" prop="pkgName">
|
|
|
+ <el-input v-model="form.pkgName" placeholder="执行包名称" clearable></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="生产企业" prop="mahName">
|
|
|
+ <el-select v-model="form.mahName" placeholder="生产企业" clearable class="w100">
|
|
|
+ <el-option :label="item.label" :value="item.value" v-for="item in mahNameList" :key="item.value"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="代表名字" prop="memberName">
|
|
|
+ <el-input v-model="form.memberName" placeholder="代表名字" clearable></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <div class="search-btns">
|
|
|
+ <el-button type="primary" @click="onSubmit">查询</el-button>
|
|
|
+ <el-button type="primary" @click="restFn">重置</el-button>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="card-container" v-if="!IS_FWS && type">
|
|
|
+ <div class="btns">
|
|
|
<el-button type="primary" class="all-btn" @click="allPassClick">批量审核</el-button>
|
|
|
<el-checkbox v-model="allCheck" @change="allClick">全选</el-checkbox>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="content">
|
|
|
- <div class="list" v-if="list.length">
|
|
|
- <el-card
|
|
|
- shadow="always"
|
|
|
- class="item"
|
|
|
- v-for="(item, index) in list"
|
|
|
- :key="index"
|
|
|
- v-show="item.show"
|
|
|
- :class="'cls' + item.id"
|
|
|
- :style="{
|
|
|
- left: item.left,
|
|
|
- top: item.top
|
|
|
- }"
|
|
|
- >
|
|
|
- <div class="task-type-name">
|
|
|
- <el-checkbox
|
|
|
- v-if="!IS_FWS && type"
|
|
|
- v-model="item.checked"
|
|
|
- @change="
|
|
|
- val => {
|
|
|
- itemChecked(val, item.id, item.score);
|
|
|
- }
|
|
|
- "
|
|
|
- ></el-checkbox>
|
|
|
- 服务类型: {{ getName(item.taskType) }}
|
|
|
- </div>
|
|
|
- <div class="info">
|
|
|
- <p>任务ID:{{ item.id }}</p>
|
|
|
- <p>任务编号:{{ item.taskInfo.taskNumber }}</p>
|
|
|
- </div>
|
|
|
- <div class="info">
|
|
|
- <p>服务积分:{{ item.score }}</p>
|
|
|
- <p>代表姓名:{{ item.taskUserName }}</p>
|
|
|
- </div>
|
|
|
- <div class="info">
|
|
|
- <p>产品名称:{{ item.drugName }}</p>
|
|
|
- <p>生产企业:{{ item.mah }}</p>
|
|
|
- </div>
|
|
|
- <div class="info">
|
|
|
- <p>执行包名称:{{ item.pkgName }}</p>
|
|
|
- <p>起止时间:{{ item.period }}</p>
|
|
|
- </div>
|
|
|
- <div class="detail">
|
|
|
- 服务详情
|
|
|
- </div>
|
|
|
- <el-image v-if="item.taskInfo.shareImgUrl" :src="item.taskInfo.shareImgUrl" :preview-src-list="[item.taskInfo.shareImgUrl]"> </el-image>
|
|
|
- <template v-if="['8', '9', '10', '11'].includes(item.taskType)">
|
|
|
- <div v-if="item.taskInfo">
|
|
|
- <div>转发时间: {{ item.taskInfo.createTime || '' }}</div>
|
|
|
- <div>文章标题:{{ item.title }}</div>
|
|
|
- <div>获得积分:+{{ item.score }}</div>
|
|
|
- <div>备注:{{ item.remark }}</div>
|
|
|
- <div class="tc" v-if="item.ercodeUrl" :style="{height: '150px'}">
|
|
|
- <img class="ercode-icon" :src="item.ercodeUrl" />
|
|
|
+
|
|
|
+ <div class="card-list card-container" v-loading="getPageLoading">
|
|
|
+ <template v-if="noData">
|
|
|
+ <div class="no-data">
|
|
|
+ <el-empty description="暂无数据"></el-empty>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div class="cards" v-masonry :cols="2" :gutter="20" style="width: 100%" v-else>
|
|
|
+ <template v-for="(item, index) in list">
|
|
|
+ <div class="card" v-masonry-tile :key="index" v-if="item.show">
|
|
|
+ <div class="task-info">
|
|
|
+ <div class="task-type-info">
|
|
|
+ <el-checkbox
|
|
|
+ v-if="!IS_FWS && type"
|
|
|
+ v-model="item.checked"
|
|
|
+ @change="
|
|
|
+ (val) => {
|
|
|
+ itemChecked(val, item.id, item.score);
|
|
|
+ }
|
|
|
+ "
|
|
|
+ ></el-checkbox>
|
|
|
+ 服务类型: {{ getName(item.taskType) }}
|
|
|
</div>
|
|
|
</div>
|
|
|
- </template>
|
|
|
- <template v-if="['5', '6', '33'].includes(item.taskType)">
|
|
|
- <div v-for="(iten, index) in item.wmUserSignList" :key="index" class="visit-list">
|
|
|
- <div class="visit-title">
|
|
|
- 拜访记录:
|
|
|
- </div>
|
|
|
- <div>{{ iten.signEntName }} {{ iten.signDate }} 打卡</div>
|
|
|
- <template v-if="iten.userSignDetail">
|
|
|
- <div class="visit-title">
|
|
|
- 拜访明细:
|
|
|
- </div>
|
|
|
- <div class="detail-info">
|
|
|
- <ul>
|
|
|
- <li v-if="iten.userSignDetail.drug.length > 0">
|
|
|
- <span>推广产品:</span>
|
|
|
- <p>
|
|
|
- {{ iten.userSignDetail.drug && iten.userSignDetail.drug.join(',') }}
|
|
|
- </p>
|
|
|
- </li>
|
|
|
- <li
|
|
|
- v-if="
|
|
|
- iten.signEntType == '1' &&
|
|
|
- iten.userSignDetail &&
|
|
|
- iten.userSignDetail.templateType !== 'TEMPLATE2' &&
|
|
|
- iten.userSignDetail.detail &&
|
|
|
- iten.userSignDetail.detail.length > 0
|
|
|
- "
|
|
|
- >
|
|
|
- <span>拜访科室:</span>
|
|
|
- <div>
|
|
|
- <div v-for="(iteo, indey) in iten.userSignDetail.detail" :key="indey">
|
|
|
- <div>{{ iteo.departmentName }}</div>
|
|
|
- <el-image v-if="iteo.fileUrl.length" :preview-src-list="iteo.fileUrl" style="width: 100px; height: 100px" :src="getUrl(iteo.fileUrl[0])"></el-image>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </li>
|
|
|
- <li v-if="iten.signEntType == '1' && iten.userSignDetail && iten.userSignDetail.department">
|
|
|
- <span>拜访科室:</span>
|
|
|
- <p>{{ iten.userSignDetail.department }}</p>
|
|
|
- </li>
|
|
|
- <li v-if="iten.userSignDetail && iten.userSignDetail.visitor">
|
|
|
- <span>拜访人员:</span>
|
|
|
- <p>{{ iten.userSignDetail.visitor }}</p>
|
|
|
- </li>
|
|
|
- <li>
|
|
|
- <span>拜访目的:</span>
|
|
|
- <p>
|
|
|
- {{ iten.userSignDetail.purposeName && iten.userSignDetail.purposeName.join(',') }}
|
|
|
- </p>
|
|
|
- </li>
|
|
|
- <li>
|
|
|
- <span>拜访结果:</span>
|
|
|
- <p>{{ iten.userSignDetail.resultName }}</p>
|
|
|
- </li>
|
|
|
- <template v-if="iten.userSignDetail.templateType === 'TEMPLATE2'">
|
|
|
- <li>
|
|
|
- <span>是否针对了正确的HCP:</span>
|
|
|
- <p>
|
|
|
- {{ iten.userSignDetail.detail[0].rightHcp ? '是' : '否' }}
|
|
|
- </p>
|
|
|
- </li>
|
|
|
- <li>
|
|
|
- <span>是否传递了正确的信息:</span>
|
|
|
- <p>
|
|
|
- {{ iten.userSignDetail.detail[0].rightInfo ? '是' : '否' }}
|
|
|
- </p>
|
|
|
- </li>
|
|
|
- <li>
|
|
|
- <span>是否采取了正确的活动形式和频率:</span>
|
|
|
- <p>
|
|
|
- {{ iten.userSignDetail.detail[0].rightActivity ? '是' : '否' }}
|
|
|
- </p>
|
|
|
- </li>
|
|
|
- </template>
|
|
|
- <li>
|
|
|
- <span>备注:</span>
|
|
|
- <p>{{ iten.userSignDetail.remark }}</p>
|
|
|
- </li>
|
|
|
- </ul>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
+ <div class="info">
|
|
|
+ <p>任务ID:{{ item.id }}</p>
|
|
|
+ <p>任务编号:{{ item.taskInfo.taskNumber }}</p>
|
|
|
+ </div>
|
|
|
+ <div class="info">
|
|
|
+ <p>服务积分:{{ item.score }}</p>
|
|
|
+ <p>代表姓名:{{ item.taskUserName }}</p>
|
|
|
+ </div>
|
|
|
+ <div class="info">
|
|
|
+ <p>产品名称:{{ item.drugName }}</p>
|
|
|
+ <p>生产企业:{{ item.mah }}</p>
|
|
|
+ </div>
|
|
|
+ <div class="info">
|
|
|
+ <p>执行包名称:{{ item.pkgName }}</p>
|
|
|
+ <p>起止时间:{{ item.period }}</p>
|
|
|
</div>
|
|
|
- </template>
|
|
|
- <template v-if="item.config && item.config.length != 0">
|
|
|
- <div>
|
|
|
- <div v-for="iten in item.config" :key="iten.id" class="field-box">
|
|
|
+ <div class="detail">服务详情</div>
|
|
|
+ <template v-if="item.config && item.config.length != 0">
|
|
|
+ <div class="field-box" v-for="iten in item.config" :key="iten.id">
|
|
|
<template v-if="iten.taskFiledType == 'domain' || iten.taskFiledType == 'select'">
|
|
|
<div class="title-value">{{ iten.taskFiledValue }}:</div>
|
|
|
<div class="desc-value" v-show="!(iten.taskTypeId == '19' && iten.taskFiledKey == 'temp3')">
|
|
|
{{ getDesc(iten, item) }}
|
|
|
</div>
|
|
|
</template>
|
|
|
- <!-- 城市选择 -->
|
|
|
- <template v-if="iten.taskFiledType === 'area'">
|
|
|
+ <!-- * 文本类型 -->
|
|
|
+ <template v-if="typeArr.includes(iten.taskFiledType)">
|
|
|
+ {{ item.taskFiledType }}
|
|
|
<div class="title-value">{{ iten.taskFiledValue }}:</div>
|
|
|
<div class="desc-value">
|
|
|
- {{ getAddress(iten, item) }}
|
|
|
+ {{ item?.wmTaskContent[iten?.taskFiledKey] || '--' }}
|
|
|
</div>
|
|
|
</template>
|
|
|
- <!-- 文字输入 -->
|
|
|
- <template v-if="iten.taskFiledType == 'text' || iten.taskFiledType == 'inputautoselect' || iten.taskFiledType == 'map'">
|
|
|
- <div class="title-value">{{ iten.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value">
|
|
|
- {{ item.wmTaskContent[iten.taskFiledKey] || '--' }}
|
|
|
- </div>
|
|
|
- <!-- 地图 -->
|
|
|
- <template v-if="getMapShow(iten) && mapShow">
|
|
|
- <div :id="item.id" style="width:100%; height:300px">
|
|
|
- <!-- {{ iten.id && initMap(iten.id, item)}} -->
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- <!-- 时间 -->
|
|
|
- <template v-if="iten.taskFiledType == 'datetime'">
|
|
|
- <div class="title-value">{{ iten.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value">
|
|
|
- {{ item.wmTaskContent[iten.taskFiledKey] || '--' }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 日期范围 -->
|
|
|
- <template v-if="iten.taskFiledType == 'datatimerange'">
|
|
|
- <div class="title-value">{{ iten.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value">
|
|
|
- {{ item.wmTaskContent[iten.taskFiledKey] }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 签名 -->
|
|
|
- <div v-if="item.taskFiledType == 'sign'" class="divline" />
|
|
|
- <template v-if="iten.taskFiledType == 'sign'">
|
|
|
- <div class="upload-field">
|
|
|
- <div class="field-text" :class="{required: iten.isMustfill == '1'}">{{ iten.taskFiledValue }}:</div>
|
|
|
- <!-- 上传组件 -->
|
|
|
- <div class="img-box">
|
|
|
- <el-image
|
|
|
- :key="index"
|
|
|
- class="img-iten"
|
|
|
- fit="fill"
|
|
|
- :src="baseUrl + item.wmTaskContent[iten.taskFiledKey]"
|
|
|
- :preview-src-list="getPreviewList([baseUrl + item.wmTaskContent[iten.taskFiledKey]], 0)"
|
|
|
- >
|
|
|
- </el-image>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 图片上传 -->
|
|
|
<div v-if="iten.taskFiledType == 'img'" class="divline"></div>
|
|
|
+ <!-- 图片上传 -->
|
|
|
<template v-if="iten.taskFiledType == 'img'">
|
|
|
<div class="upload-field">
|
|
|
- <div class="field-text" :class="{required: iten.isMustfill == '1'}">
|
|
|
+ <div class="field-text" :class="{ required: iten.isMustfill == '1' }">
|
|
|
{{ iten.taskFiledValue }}:
|
|
|
<!-- {{ getImgList(item.wmTaskContent[iten.taskFiledKey], iten) }} -->
|
|
|
</div>
|
|
@@ -286,97 +141,44 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
- <!-- 文件类型 -->
|
|
|
- <template v-if="iten.taskFiledType === 'fileurl'">
|
|
|
- <div class="upload-field">
|
|
|
- <div class="field-text" :class="{required: iten.isMustfill == '1'}">
|
|
|
- {{ iten.taskFiledValue }}:
|
|
|
- {{ getFileList(item.wmTaskContent[iten.taskFiledKey], iten) }}
|
|
|
- </div>
|
|
|
- <div v-if="iten.fileList" class="pl60 pr60">
|
|
|
- <!-- 图片文件 -->
|
|
|
- <div class="img-box">
|
|
|
- <template v-for="(iItem, index) in iten.fileList">
|
|
|
- <el-image
|
|
|
- v-if="imgTypeList.includes(iItem.url.split('.')[1])"
|
|
|
- :key="index"
|
|
|
- class="img-item"
|
|
|
- :src="iItem.url"
|
|
|
- :preview-src-list="getPreviewList(iten.fileList.map(ele => ele.url), index)"
|
|
|
- >
|
|
|
- </el-image>
|
|
|
- </template>
|
|
|
- </div>
|
|
|
- <!-- 其他文件 -->
|
|
|
- <div class="file-box">
|
|
|
- <template v-for="(iItem, index) in iten.fileList">
|
|
|
- <div v-if="!imgTypeList.includes(iItem.url.split('.')[1])" :key="index" class="df_sb file-item">
|
|
|
- <span>{{ iItem.fileName }}</span>
|
|
|
- <span @click="downloadFn(iItem)">下载</span>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 金额 -->
|
|
|
- <template v-if="iten.taskFiledType == 'money'">
|
|
|
- <div class="title-value">{{ iten.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value">
|
|
|
- {{ item.wmTaskContent[iten.taskFiledKey] || '--' }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <!-- 数字 -->
|
|
|
- <template v-if="iten.taskFiledType == 'number'">
|
|
|
- <div class="title-value">{{ iten.taskFiledValue }}:</div>
|
|
|
- <div class="desc-value">
|
|
|
- {{ item.wmTaskContent[iten.taskFiledKey] || '--' }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
<!-- 长文本 -->
|
|
|
<template v-if="iten.taskFiledType == 'longtext'">
|
|
|
<div class="longtext-box">
|
|
|
- <div class="field-text" :class="{required: iten.isMustfill == '1'}">{{ iten.taskFiledValue }}:</div>
|
|
|
+ <div class="field-text" :class="{ required: iten.isMustfill == '1' }">{{ iten.taskFiledValue }}:</div>
|
|
|
<textarea class="textarea-box" :disabled="true" :value="item.wmTaskContent[iten.taskFiledKey] || '--'" :maxlength="iten.taskFiledMaxsize" />
|
|
|
</div>
|
|
|
</template>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <template>
|
|
|
- <div class="reason" v-if="item.supervisionMessage">
|
|
|
- <div class="reason-list">
|
|
|
- <span>监督员监督结果</span>
|
|
|
- <div class="text">{{ item.supervisionMessage }}</div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template>
|
|
|
+ <div class="reason" v-if="item.supervisionMessage">
|
|
|
+ <div class="reason-list">
|
|
|
+ <span>监督员监督结果</span>
|
|
|
+ <div class="text">{{ item.supervisionMessage }}</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <template>
|
|
|
- <div class="reason" v-if="item.adviceMessages && item.adviceMessages.length">
|
|
|
- <div class="reason-list" v-for="(iten, indey) in item.adviceMessages" :key="indey">
|
|
|
- <div class="text">{{ iten }}</div>
|
|
|
+ </template>
|
|
|
+ <template>
|
|
|
+ <div class="reason" v-if="item.adviceMessages && item.adviceMessages.length">
|
|
|
+ <div class="reason-list" v-for="(iten, indey) in item.adviceMessages" :key="indey">
|
|
|
+ <div class="text">{{ iten }}</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
+ </template>
|
|
|
+ <template v-if="!IS_FWS && type">
|
|
|
+ <div class="reason">
|
|
|
+ <div class="field-text">监督结果</div>
|
|
|
+ <el-input type="textarea" v-model="item.submitRemark"></el-input>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div class="btns" v-if="!IS_FWS && type">
|
|
|
+ <el-button class="btn" type="danger" @click="passClick(index, false, item.id, item)">不通过</el-button>
|
|
|
+ <el-button class="btn" type="primary" @click="passClick(index, true, item.id, item)">通过</el-button>
|
|
|
</div>
|
|
|
- </template>
|
|
|
-
|
|
|
- <template v-if="!IS_FWS && type">
|
|
|
- <div class="reason">
|
|
|
- <div class="field-text">监督结果</div>
|
|
|
- <el-input type="textarea" v-model="item.submitRemark"></el-input>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
-
|
|
|
- <div class="btns" v-if="!IS_FWS && type">
|
|
|
- <el-button class="btn" type="danger" @click="passClick(index, false, item.id, item)">不通过</el-button>
|
|
|
- <el-button class="btn" type="primary" @click="passClick(index, true, item.id, item)">通过</el-button>
|
|
|
</div>
|
|
|
- </el-card>
|
|
|
+ </template>
|
|
|
</div>
|
|
|
- <template v-else>
|
|
|
- <div class="empty">
|
|
|
- <el-empty description="无查找结果数据"></el-empty>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
</div>
|
|
|
<!-- 批量审核弹窗 -->
|
|
|
<el-dialog title="批量审核" :visible.sync="dialogVisible" width="45%" center :before-close="handleClose">
|
|
@@ -407,25 +209,21 @@
|
|
|
<el-button type="primary" @click="sureBtn">确 定</el-button>
|
|
|
</span>
|
|
|
</el-dialog>
|
|
|
- </basic-container>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-import {supervisionTaskListApi, supervisionTaskCreateApi, supervisionCreateBatchApi} from '@/api/monitor.js';
|
|
|
-import {getTaskList} from '@/api/assignPoints/currency/taskAudit';
|
|
|
-import provinces from '@/util/lib/province';
|
|
|
-import citys from '@/util/lib/city';
|
|
|
-import areas from '@/util/lib/area';
|
|
|
-import QRCode from 'qrcode';
|
|
|
-import request from '@/router/axios';
|
|
|
+import { supervisionTaskListApi, supervisionTaskCreateApi, supervisionCreateBatchApi } from '@/api/monitor.js';
|
|
|
+import { getTaskList } from '@/api/assignPoints/currency/taskAudit';
|
|
|
import ElImageViewer from 'element-ui/packages/image/src/image-viewer';
|
|
|
-import {mapGetters} from 'vuex';
|
|
|
+import { mapGetters } from 'vuex';
|
|
|
import ElQuarterPicker from '@/components/ElQuarterPicker/index';
|
|
|
-import {getDictType} from '@/api/common';
|
|
|
+import { getDictType } from '@/api/common';
|
|
|
export default {
|
|
|
- components: {ElImageViewer, ElQuarterPicker},
|
|
|
+ components: { ElImageViewer, ElQuarterPicker },
|
|
|
data() {
|
|
|
return {
|
|
|
+ typeArr: ['area', 'text', 'inputautoselect', 'map', 'mapwithimg', 'datetime', 'datatimerange', 'money', 'number', ''],
|
|
|
type: 0,
|
|
|
hasMap: false,
|
|
|
mapShow: true,
|
|
@@ -465,8 +263,10 @@ export default {
|
|
|
remarks: ''
|
|
|
},
|
|
|
rules: {
|
|
|
- supervision: [{required: true, message: '请选择审批意见', trigger: 'change'}]
|
|
|
- }
|
|
|
+ supervision: [{ required: true, message: '请选择审批意见', trigger: 'change' }]
|
|
|
+ },
|
|
|
+ getPageLoading: false,
|
|
|
+ noData: false
|
|
|
};
|
|
|
},
|
|
|
computed: {
|
|
@@ -485,55 +285,32 @@ export default {
|
|
|
if (this.userInfo.roles.includes(37)) {
|
|
|
this.IS_FWS = true;
|
|
|
}
|
|
|
- document.querySelector('.basic').addEventListener('scroll', this.handleScroll);
|
|
|
- document.addEventListener('click', this.imgClose);
|
|
|
- let timer = setInterval(() => {
|
|
|
- if (this.mapIds.length) {
|
|
|
- clearInterval(timer);
|
|
|
- const maps = {};
|
|
|
- this.mapIds.forEach(info => {
|
|
|
- const observer = new IntersectionObserver(entries => {
|
|
|
- entries.forEach(entry => {
|
|
|
- const containerId = entry.target.id;
|
|
|
- if (entry.isIntersecting) {
|
|
|
- if (!maps[containerId]) {
|
|
|
- maps[containerId] = this.init(info.id, info.item);
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (maps[containerId]) {
|
|
|
- maps[containerId].destroy && maps[containerId].destroy();
|
|
|
- maps[containerId].setMap && maps[containerId].setMap(null);
|
|
|
- delete maps[containerId];
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
- });
|
|
|
- observer.observe(document.getElementById(info.id));
|
|
|
- });
|
|
|
- }
|
|
|
- }, 400);
|
|
|
- setTimeout(() => {
|
|
|
- if (timer && !this.mapIds.length) clearInterval(timer);
|
|
|
- }, 10000);
|
|
|
- },
|
|
|
- destroyed() {
|
|
|
- document.removeEventListener('click', this.imgClose);
|
|
|
- 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();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
allClick(val) {
|
|
|
this.checkedIds = [];
|
|
|
if (val) {
|
|
|
this.checkedIds = [];
|
|
|
- this.list.forEach(item => {
|
|
|
+ this.list.forEach((item) => {
|
|
|
item.checked = true;
|
|
|
this.checkedIds.push(item.id);
|
|
|
});
|
|
|
} else {
|
|
|
this.checkedIds = [];
|
|
|
this.allCheck = false;
|
|
|
- this.list.forEach(item => {
|
|
|
+ this.list.forEach((item) => {
|
|
|
item.checked = false;
|
|
|
});
|
|
|
}
|
|
@@ -548,7 +325,7 @@ export default {
|
|
|
if (val) {
|
|
|
this.checkedIds.push(id);
|
|
|
} else {
|
|
|
- let index = this.checkedIds.findIndex(item => item === id);
|
|
|
+ let index = this.checkedIds.findIndex((item) => item === id);
|
|
|
this.checkedIds.splice(index, 1);
|
|
|
}
|
|
|
},
|
|
@@ -560,7 +337,7 @@ export default {
|
|
|
this.dialogVisible = false;
|
|
|
},
|
|
|
sureBtn() {
|
|
|
- this.$refs.allFormRef.validate(valid => {
|
|
|
+ this.$refs.allFormRef.validate((valid) => {
|
|
|
if (valid) {
|
|
|
let args = {
|
|
|
supervisionIds: this.checkedIds,
|
|
@@ -568,27 +345,22 @@ export default {
|
|
|
remarks: this.taskForm.remarks
|
|
|
};
|
|
|
supervisionCreateBatchApi(args)
|
|
|
- .then(res => {
|
|
|
- console.log('res', res);
|
|
|
+ .then((res) => {
|
|
|
if (res.data.code === 0) {
|
|
|
+ this.handleClose();
|
|
|
this.$message.success('批量审核成功');
|
|
|
- this.list.forEach(item => {
|
|
|
+ this.list.forEach((item) => {
|
|
|
if (item.checked) {
|
|
|
+ item.checked = false;
|
|
|
+ item.allCheck = false;
|
|
|
item.show = false;
|
|
|
- this.column1Height = 400;
|
|
|
- this.column2Height = 400;
|
|
|
- this.calculateItemHeights();
|
|
|
}
|
|
|
});
|
|
|
- this.handleClose();
|
|
|
}
|
|
|
})
|
|
|
.catch(() => {
|
|
|
this.tableLoading = false;
|
|
|
});
|
|
|
- } else {
|
|
|
- console.log('error submit!!');
|
|
|
- return false;
|
|
|
}
|
|
|
});
|
|
|
},
|
|
@@ -648,95 +420,33 @@ export default {
|
|
|
this.viewerList = [url];
|
|
|
this.showViewer = true;
|
|
|
},
|
|
|
- getUrl(url) {
|
|
|
- return `${process.env.VUE_APP_URL}${url}`;
|
|
|
- },
|
|
|
- imgClose(e) {
|
|
|
- if (e.target.className == 'el-image-viewer__mask') {
|
|
|
- let close = document.querySelector('.el-icon-circle-close');
|
|
|
- close.click();
|
|
|
- }
|
|
|
- },
|
|
|
+
|
|
|
backPage() {
|
|
|
this.$router.$avueRouter.closeTag();
|
|
|
this.$router.back();
|
|
|
},
|
|
|
- calculateItemHeights() {
|
|
|
- this.list.forEach(item => {
|
|
|
- if (item.show) {
|
|
|
- let className = '.cls' + item.id + ' .el-card__body';
|
|
|
- let element = document.querySelector(className);
|
|
|
- let top = 0;
|
|
|
- let left = 0;
|
|
|
- item.height = element.clientHeight;
|
|
|
-
|
|
|
- if (this.column1Height <= this.column2Height) {
|
|
|
- top = this.column1Height;
|
|
|
- this.column1Height += element.clientHeight + 20;
|
|
|
- left = '3%';
|
|
|
- } else {
|
|
|
- top = this.column2Height;
|
|
|
- this.column2Height += element.clientHeight + 20;
|
|
|
- left = '51%';
|
|
|
- }
|
|
|
- item.top = top + 'px';
|
|
|
- item.left = left;
|
|
|
- }
|
|
|
- });
|
|
|
- this.$forceUpdate();
|
|
|
- },
|
|
|
- async search() {
|
|
|
- await this.getList();
|
|
|
- if (this.list.length) {
|
|
|
- this.column1Height = 400;
|
|
|
- this.column2Height = 400;
|
|
|
- this.calculateItemHeights();
|
|
|
- }
|
|
|
- },
|
|
|
- resetClick() {
|
|
|
- this.form.taskTypeId = '';
|
|
|
- },
|
|
|
|
|
|
async getTaskList() {
|
|
|
let res;
|
|
|
res = await getTaskList(this.$route.query.deptId, this.$route.query.taskStatus == '2' ? '2' : '');
|
|
|
this.taskList = res.data.data;
|
|
|
- getDictType({type: 'mah_name'}).then(res => {
|
|
|
+ getDictType({ type: 'mah_name' }).then((res) => {
|
|
|
this.mahNameList = res.data.data;
|
|
|
- console.log('res', res);
|
|
|
});
|
|
|
},
|
|
|
|
|
|
getName(taskType) {
|
|
|
- let curr = this.taskList.find(item => item.id == taskType);
|
|
|
+ let curr = this.taskList.find((item) => item.id == taskType);
|
|
|
return curr.taskTypeName;
|
|
|
},
|
|
|
- handleScroll() {
|
|
|
- const basicElement = document.querySelector('.basic');
|
|
|
- const scrollTop = basicElement.scrollTop; // 获取滚动条高度(对于 .basic 元素)
|
|
|
- const clientHeight = basicElement.clientHeight; // 可视区域高度
|
|
|
- const scrollHeight = basicElement.scrollHeight; // 文档总高度
|
|
|
- // 判断是否滚动到底部
|
|
|
- if (scrollTop + clientHeight >= scrollHeight - 1) {
|
|
|
- this.onScrollToBottom(); // 调用滚动到底部的处理逻辑
|
|
|
- }
|
|
|
- },
|
|
|
- onScrollToBottom() {
|
|
|
- // 处理滚动到底部的业务逻辑
|
|
|
- if (this.list.length < this.page.total) {
|
|
|
- this.page.currentPage += 1;
|
|
|
- this.getList(); // 示例:加载更多数据
|
|
|
- }
|
|
|
- },
|
|
|
+
|
|
|
restFn() {
|
|
|
this.$refs.formRef.resetFields();
|
|
|
this.monthrange = '';
|
|
|
this.form.pkgPeriod = [];
|
|
|
},
|
|
|
async getList() {
|
|
|
- console.log(' this.from', this.form);
|
|
|
-
|
|
|
- let res;
|
|
|
+ this.getPageLoading = true;
|
|
|
let obj = Object.assign(
|
|
|
{
|
|
|
deptId: this.$route.query.deptId,
|
|
@@ -747,532 +457,311 @@ export default {
|
|
|
this.form
|
|
|
);
|
|
|
|
|
|
- res = await supervisionTaskListApi(obj);
|
|
|
-
|
|
|
- this.page.total = res.data.data.total;
|
|
|
- let list = this.list.concat(res.data.data.records);
|
|
|
- await list.forEach(async item => {
|
|
|
- if (item.config && item.config.length != 0) {
|
|
|
- item.config.forEach(iten => {
|
|
|
+ let res = await supervisionTaskListApi(obj);
|
|
|
+ if (res.data.code == 0) {
|
|
|
+ this.page.total = res.data.data.total;
|
|
|
+ let list = res.data.data.records;
|
|
|
+ list.forEach((item) => {
|
|
|
+ item.show = true;
|
|
|
+ item.submitRemark = '';
|
|
|
+ item.checked = false;
|
|
|
+ item?.config?.forEach((iten) => {
|
|
|
iten.taskFiledType = iten.taskFiledType.trim();
|
|
|
if (iten.taskFiledType == 'img') {
|
|
|
this.getImgList(item.wmTaskContent[iten.taskFiledKey], iten);
|
|
|
}
|
|
|
});
|
|
|
- }
|
|
|
- item.submitRemark = '';
|
|
|
- item.checked = false;
|
|
|
- item.show = true;
|
|
|
- if (['7', '8', '9', '10', '11'].includes(item.taskType)) {
|
|
|
- let type = null;
|
|
|
- if (item.taskType == '9' || item.taskType == '10') {
|
|
|
- type = 'article';
|
|
|
- }
|
|
|
- let shareUrl = `${process.env.VUE_APP_URL}/h5/#/pages/artile/detail?type=${type}&id=${item.shareId}`;
|
|
|
- const canvas = document.createElement('canvas');
|
|
|
- QRCode.toDataURL(canvas, shareUrl, {
|
|
|
- width: 400, // 二维码宽度
|
|
|
- height: 400 // 二维码高度
|
|
|
- }).then(url => {
|
|
|
- item.ercodeUrl = url;
|
|
|
- });
|
|
|
-
|
|
|
- this.$forceUpdate();
|
|
|
- }
|
|
|
- });
|
|
|
- this.list = list;
|
|
|
- if (this.list.length) {
|
|
|
- this.column1Height = 400;
|
|
|
- this.column2Height = 400;
|
|
|
- this.$nextTick(() => {
|
|
|
- this.calculateItemHeights();
|
|
|
});
|
|
|
- }
|
|
|
- this.checkedIds = [];
|
|
|
- this.allPoints = 0;
|
|
|
- this.allCheck = false;
|
|
|
-
|
|
|
- for (let val of this.list) {
|
|
|
- if (!val.config) continue;
|
|
|
- for (let item of val.config) {
|
|
|
- if (this.getMapShow(item)) {
|
|
|
- let obj = {
|
|
|
- id: val.id,
|
|
|
- item: val
|
|
|
- };
|
|
|
- this.mapIds.push(obj);
|
|
|
- }
|
|
|
- }
|
|
|
+ this.list.push(...list);
|
|
|
+ this.$forceUpdate();
|
|
|
+ this.getPageLoading = false;
|
|
|
}
|
|
|
},
|
|
|
- getDesc(item, data) {
|
|
|
+ getDesc(item, curr) {
|
|
|
+ // 拜访类任务
|
|
|
const arr = ['51', '52', '53'];
|
|
|
- // 拜访类服务
|
|
|
if (arr.includes(item.taskTypeId) && item.taskFiledKey === 'temp24') {
|
|
|
- return data.wmTaskContent['temp24label'];
|
|
|
- }
|
|
|
- let value = data.wmTaskContent[item.taskFiledKey];
|
|
|
- if (item.taskFiledKey === 'temp12') {
|
|
|
- // 推广产品
|
|
|
- return value;
|
|
|
- }
|
|
|
- if (item.taskFiledKey == 'temp32') {
|
|
|
- return value;
|
|
|
- }
|
|
|
- let itemList = data.dict[item.dictGroupName] || [];
|
|
|
- let resItem = {};
|
|
|
- // 如果是库存调查 && 调查类型字段
|
|
|
- if (data.taskType == 14 && item.taskFiledKey == 'temp3') {
|
|
|
- let resStr = '';
|
|
|
- if (!value) return '--';
|
|
|
- let dArr = value.split(',');
|
|
|
- let descName = '';
|
|
|
- let descObj = {};
|
|
|
- dArr.forEach(dItem => {
|
|
|
- // 查找对应医院
|
|
|
- if (data.dict.hospital_service && data.dict.hospital_service.length > 0) {
|
|
|
- descObj = data.dict.hospital_service.find(hItem => {
|
|
|
- return dItem == hItem.value;
|
|
|
- });
|
|
|
- }
|
|
|
- if (!descObj) {
|
|
|
- // 查找对应公司
|
|
|
- descObj = data.dict.distribution_service.find(hItem => {
|
|
|
- return dItem == hItem.value;
|
|
|
- });
|
|
|
- }
|
|
|
- if (descName) {
|
|
|
- descName += ',' + descObj.label;
|
|
|
- } else {
|
|
|
- descName = descObj.label;
|
|
|
- }
|
|
|
- });
|
|
|
- return descName;
|
|
|
- }
|
|
|
- if (item.taskFiledKey == 'temp1') {
|
|
|
- return this.getTemp1Desc(item);
|
|
|
- }
|
|
|
- // 并且不是药店调查
|
|
|
- if (item.dictGroupName && item.dictGroupName != 'ent_pharmacy1') {
|
|
|
- let resStr = '';
|
|
|
- if (!value) return '--';
|
|
|
- let vArr = value.split(',');
|
|
|
- vArr.forEach(vItem => {
|
|
|
- resItem = itemList.find(lItem => {
|
|
|
- return lItem.value == value;
|
|
|
- });
|
|
|
- if (resItem) {
|
|
|
- if (resStr) {
|
|
|
- resStr += ',' + resItem.label;
|
|
|
- } else {
|
|
|
- resStr = resItem.label;
|
|
|
- }
|
|
|
- } else {
|
|
|
- resStr = '--';
|
|
|
- }
|
|
|
- });
|
|
|
- return resStr;
|
|
|
- } else {
|
|
|
- // 如果是药店调查 并 为 药店的名字 的 key
|
|
|
- if (item.taskTypeId == 18 && item.taskFiledKey == 'temp3') {
|
|
|
- return data.wmTaskContent[item.taskFiledKey];
|
|
|
- } else {
|
|
|
- return item;
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- getAddress(item, data) {
|
|
|
- if (item.taskFiledType == 'area') {
|
|
|
- let e = data.wmTaskContent[item.taskFiledKey];
|
|
|
- if (!e) return '--';
|
|
|
- let arr = e.split(',');
|
|
|
- let provincesName = '';
|
|
|
- let provincesIndex = '';
|
|
|
- let cityName = '';
|
|
|
- let cityIndex = '';
|
|
|
- let areasName = '';
|
|
|
- // 如果为数字,方形,不为数组则展示
|
|
|
- var n = parseInt(arr[0]);
|
|
|
- // 如果不为数字,则返回
|
|
|
- if (isNaN(n)) {
|
|
|
- return arr[0];
|
|
|
- }
|
|
|
- if (arr[0]) {
|
|
|
- provinces.map((v, k) => {
|
|
|
- if (v.value + '0000' == arr[0]) {
|
|
|
- provincesName = v.label;
|
|
|
- provincesIndex = k;
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- if (arr[1]) {
|
|
|
- citys[provincesIndex].map((v, k) => {
|
|
|
- if (v.value + '00' == arr[1]) {
|
|
|
- cityName = v.label;
|
|
|
- cityIndex = k;
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- if (arr[2]) {
|
|
|
- areas[provincesIndex][cityIndex].map((v, k) => {
|
|
|
- if (v.value == arr[2]) {
|
|
|
- areasName = v.label;
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- return `${provincesName}-${cityName}-${areasName}`;
|
|
|
- }
|
|
|
- },
|
|
|
- getMapShow(item) {
|
|
|
- if (item.taskTypeId == '16' && item.taskFiledKey == 'temp4') {
|
|
|
- return true;
|
|
|
- }
|
|
|
- if (item.taskTypeId == '18' && item.taskFiledKey == 'temp4') {
|
|
|
- return true;
|
|
|
- }
|
|
|
- if ((item.taskTypeId == '30' || item.taskTypeId == '15') && item.taskFiledKey == 'temp16') {
|
|
|
- return true;
|
|
|
+ return curr.wmTaskContent['temp24label'];
|
|
|
+ }
|
|
|
+ // 获取需要转换的字符串(例如 '1,2,3')
|
|
|
+ const contentValue = curr.wmTaskContent[item.taskFiledKey];
|
|
|
+ if (!contentValue) return '--';
|
|
|
+ // 获取字典表对应数组
|
|
|
+ const itemList = curr.dict[item.dictGroupName] || [];
|
|
|
+ // 按逗号拆分成数组
|
|
|
+ const valueArray = contentValue.split(',');
|
|
|
+ // 将每个拆分值找到对应的 label
|
|
|
+ const result = valueArray.map((val) => {
|
|
|
+ const foundItem = itemList.find((dictItem) => dictItem.value === val);
|
|
|
+ return foundItem ? foundItem.label : null;
|
|
|
+ });
|
|
|
+ // 如果有任意一个值无法找到对应的 label,则直接返回 '--'
|
|
|
+ if (result.some((label) => label === null)) {
|
|
|
+ return '--';
|
|
|
}
|
|
|
- return false;
|
|
|
- },
|
|
|
- getPreviewList(imgList, index) {
|
|
|
- // 解决el-image大图预览定位图片不准确的问题
|
|
|
- return imgList.slice(index).concat(imgList.slice(0, index));
|
|
|
+ // 否则,使用逗号拼接并返回
|
|
|
+ return result.join(',');
|
|
|
},
|
|
|
+
|
|
|
getImgList(urlStr, item) {
|
|
|
- if (item.taskFiledType != 'img') return '';
|
|
|
- if (!urlStr) return '';
|
|
|
- let uArr = urlStr.split(',');
|
|
|
- if (!uArr) return '';
|
|
|
- let imgList = [];
|
|
|
- let previewList = [];
|
|
|
- uArr.forEach(uItem => {
|
|
|
- let type = '无 ';
|
|
|
- if (uItem.includes(';1')) {
|
|
|
+ // 如果类型不匹配或者 urlStr 为空,直接返回
|
|
|
+ if (item.taskFiledType !== 'img' || !urlStr) return '';
|
|
|
+
|
|
|
+ // 缓存环境变量中的基础 URL
|
|
|
+ const { VUE_APP_URL } = process.env;
|
|
|
+
|
|
|
+ // 以逗号分割,并过滤掉空字符串
|
|
|
+ const imgArray = urlStr.split(',').filter(Boolean);
|
|
|
+ if (!imgArray.length) return '';
|
|
|
+
|
|
|
+ // 生成包含 type 和 url 的数组
|
|
|
+ const imgList = imgArray.map((originalUrl) => {
|
|
|
+ let type = '无';
|
|
|
+ let url = originalUrl;
|
|
|
+
|
|
|
+ if (url.includes(';1')) {
|
|
|
type = '拍照';
|
|
|
- uItem = uItem.replace(';1', '');
|
|
|
- }
|
|
|
- if (uItem.includes(';2')) {
|
|
|
+ url = url.replace(';1', '');
|
|
|
+ } else if (url.includes(';2')) {
|
|
|
type = '相册';
|
|
|
- uItem = uItem.replace(';2', '');
|
|
|
+ url = url.replace(';2', '');
|
|
|
}
|
|
|
- imgList.push({
|
|
|
+
|
|
|
+ return {
|
|
|
type,
|
|
|
- url: process.env.VUE_APP_URL + uItem
|
|
|
- });
|
|
|
- previewList.push(process.env.VUE_APP_URL + uItem);
|
|
|
+ url: VUE_APP_URL + url
|
|
|
+ };
|
|
|
});
|
|
|
+
|
|
|
+ // 提取预览图片的 URL 列表
|
|
|
+ const previewList = imgList.map((item) => item.url);
|
|
|
+
|
|
|
+ // 将处理结果赋值给对应字段
|
|
|
item.imgList = imgList;
|
|
|
+
|
|
|
item.previewList = previewList;
|
|
|
+
|
|
|
+ // 函数约定返回空字符串
|
|
|
return '';
|
|
|
},
|
|
|
- // 得出文件 jsonStr: temp字符串
|
|
|
- getFileList(jsonStr, item) {
|
|
|
- if (item.taskFiledType !== 'fileurl') return '';
|
|
|
- if (!jsonStr) return '';
|
|
|
- const parseFileList = JSON.parse(jsonStr);
|
|
|
- if (!parseFileList) return '';
|
|
|
- let fileList = [];
|
|
|
- parseFileList.forEach(fileItem => {
|
|
|
- fileList.push({
|
|
|
- fileName: fileItem.fileName,
|
|
|
- url: process.env.VUE_APP_URL + fileItem.url
|
|
|
- });
|
|
|
- });
|
|
|
- item.fileList = parseFileList;
|
|
|
- return '';
|
|
|
- },
|
|
|
- // 下载文件
|
|
|
- downloadFn(item) {
|
|
|
- request({
|
|
|
- url: item.url,
|
|
|
- method: 'get',
|
|
|
- responseType: 'blob'
|
|
|
- }).then(response => {
|
|
|
- // 处理返回的文件流
|
|
|
- const blob = response.data;
|
|
|
- const link = document.createElement('a');
|
|
|
- link.href = URL.createObjectURL(blob);
|
|
|
- link.download = item.fileName;
|
|
|
- document.body.appendChild(link);
|
|
|
- link.click();
|
|
|
- window.setTimeout(function() {
|
|
|
- URL.revokeObjectURL(blob);
|
|
|
- document.body.removeChild(link);
|
|
|
- }, 0);
|
|
|
- });
|
|
|
- },
|
|
|
- init(id, item) {
|
|
|
- if (!document.getElementById(id)) return;
|
|
|
- //定义地图中心点坐标
|
|
|
- var center = new TMap.LatLng(22.547931568083015, 114.1306221485138);
|
|
|
- //定义map变量,调用 TMap.Map() 构造函数创建地图
|
|
|
- const map = new TMap.Map(document.getElementById(id), {
|
|
|
- center: center, //设置地图中心点坐标
|
|
|
- zoom: 16, //设置地图缩放级别
|
|
|
- viewMode: '2D' // 可选 2D 3D
|
|
|
- });
|
|
|
- // this.mapInstance.push(map)
|
|
|
- // 新建一个正逆地址解析类
|
|
|
- const geocoder = new TMap.service.Geocoder();
|
|
|
- //初始化marker图层
|
|
|
- const markerLayer = new TMap.MultiMarker({
|
|
|
- id: 'marker-layer',
|
|
|
- map: map
|
|
|
- });
|
|
|
- // this.map.on("click",this.clickHandler)
|
|
|
- this.getAddressKeyword(item, map, geocoder, markerLayer);
|
|
|
- this.maps[id] = map;
|
|
|
- return map;
|
|
|
- },
|
|
|
- removeMarker(markerLayer) {
|
|
|
- const markList = markerLayer.getGeometries();
|
|
|
- if (markerLayer && markList.length > 0) {
|
|
|
- markerLayer.remove(markList[0].id);
|
|
|
- }
|
|
|
- },
|
|
|
- getAddressKeyword(item, map, geocoder, markerLayer) {
|
|
|
- let address = this.getMapAddress(item);
|
|
|
- const convert = () => {
|
|
|
- // 将给定的地址转换为坐标位置
|
|
|
- geocoder.getLocation({address}).then(result => {
|
|
|
- this.removeMarker(markerLayer);
|
|
|
- this.$nextTick(() => {
|
|
|
- markerLayer.updateGeometries([
|
|
|
- {
|
|
|
- position: result.result.location // 将得到的坐标位置用点标记标注在地图上
|
|
|
- }
|
|
|
- ]);
|
|
|
- });
|
|
|
- map.setCenter(result.result.location);
|
|
|
- });
|
|
|
- };
|
|
|
- convert();
|
|
|
- },
|
|
|
- getMapAddress(item) {
|
|
|
- let address;
|
|
|
- // 商业公司信息收集
|
|
|
- if (item.taskType == '16') {
|
|
|
- address = item.wmTaskContent['temp4'] + item.wmTaskContent['temp3'];
|
|
|
- }
|
|
|
- // 药店调查
|
|
|
- if (item.taskType == '18') {
|
|
|
- let str = item.wmTaskContent['temp7'].replaceAll('-', '');
|
|
|
- address = str + item.wmTaskContent['temp4'] + item.wmTaskContent['temp3'];
|
|
|
- }
|
|
|
- // 医院信息收集
|
|
|
- if (item.taskType == '30' || item.taskType == '15') {
|
|
|
- let str = item.wmTaskContent['temp4'].replaceAll('-', '');
|
|
|
- address = str + item.wmTaskContent['temp16'] + item.wmTaskContent['temp3'];
|
|
|
- }
|
|
|
- return address;
|
|
|
- },
|
|
|
+
|
|
|
async passClick(index, type, id, item) {
|
|
|
- let remarks;
|
|
|
if (!type && !item.submitRemark) {
|
|
|
return this.$message.info('请填写异常原因');
|
|
|
}
|
|
|
- if (item.submitRemark) {
|
|
|
- remarks = item.submitRemark;
|
|
|
- }
|
|
|
-
|
|
|
- remarks = item.submitRemark ? item.submitRemark : '监督无异常';
|
|
|
-
|
|
|
+ let remarks = item.submitRemark ? item.submitRemark : '监督无异常';
|
|
|
let obj = {
|
|
|
taskId: id,
|
|
|
pkgId: item.taskInfo.scorePackageId,
|
|
|
supervision: type,
|
|
|
remarks: remarks
|
|
|
};
|
|
|
- const res = await supervisionTaskCreateApi(obj);
|
|
|
- this.list[index].show = false;
|
|
|
- this.column1Height = 400;
|
|
|
- this.column2Height = 400;
|
|
|
- this.calculateItemHeights();
|
|
|
- if (this.maps[id]) {
|
|
|
- this.maps[id].destroy && this.maps[id].destroy();
|
|
|
- this.maps[id].setMap && this.maps[id].setMap(null);
|
|
|
+ try {
|
|
|
+ const res = await supervisionTaskCreateApi(obj);
|
|
|
+ this.list[index].show = false;
|
|
|
+ this.list[index].checked = false;
|
|
|
+ this.$forceUpdate();
|
|
|
+ } catch (error) {
|
|
|
+ console.error('Error:', error);
|
|
|
}
|
|
|
- this.$forceUpdate();
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
-.basic {
|
|
|
- height: calc(100vh - 130px);
|
|
|
- padding-bottom: 30px;
|
|
|
+.quicl-review {
|
|
|
overflow: auto;
|
|
|
- position: relative;
|
|
|
- ::v-deep .el-card__body {
|
|
|
- background-color: #f7f7f7;
|
|
|
+ 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 {
|
|
|
- width: 100%;
|
|
|
- margin-top: 20px;
|
|
|
- .search-btns {
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- }
|
|
|
+
|
|
|
+.search-btns {
|
|
|
+ margin-left: 50px;
|
|
|
+ width: 150px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
}
|
|
|
-.content {
|
|
|
- margin-top: 20px;
|
|
|
- .head {
|
|
|
- .clear {
|
|
|
- cursor: pointer;
|
|
|
- }
|
|
|
- .btn {
|
|
|
- margin: 0 20px;
|
|
|
- }
|
|
|
- }
|
|
|
- .list {
|
|
|
- margin-top: 20px;
|
|
|
- padding: 0 20px;
|
|
|
|
|
|
- .item {
|
|
|
- position: absolute;
|
|
|
- width: 45%;
|
|
|
- min-height: 50px;
|
|
|
- box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
|
|
- ::v-deep .el-card__body {
|
|
|
- background-color: #fff;
|
|
|
- }
|
|
|
+.card-list {
|
|
|
+ overflow: auto;
|
|
|
+ min-height: 200px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ .cards {
|
|
|
+ box-sizing: border-box;
|
|
|
+ width: 100%;
|
|
|
+ padding: 10px;
|
|
|
+ }
|
|
|
|
|
|
- .task-type-name {
|
|
|
- font-size: 16px;
|
|
|
- color: #333;
|
|
|
- font-weight: 600;
|
|
|
- margin-bottom: 5px;
|
|
|
- }
|
|
|
- .info {
|
|
|
- display: flex;
|
|
|
- font-size: 12px;
|
|
|
- color: #7f7f7f;
|
|
|
- margin-bottom: 5px;
|
|
|
+ .card {
|
|
|
+ box-sizing: border-box;
|
|
|
+ border-radius: 4px;
|
|
|
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.2);
|
|
|
+ border: 1px solid #ebeef5;
|
|
|
+ background-color: #fff;
|
|
|
+ color: #303133;
|
|
|
+ transition: 0.3s;
|
|
|
+ min-height: 300px;
|
|
|
+ width: 48%;
|
|
|
+ // min-width: 500px;
|
|
|
+ margin-bottom: 10px;
|
|
|
+ padding: 10px;
|
|
|
|
|
|
- p {
|
|
|
- flex: 1;
|
|
|
- margin-right: 30px;
|
|
|
- }
|
|
|
- }
|
|
|
- .detail {
|
|
|
- font-size: 14px;
|
|
|
- font-weight: 500;
|
|
|
- color: #333333;
|
|
|
- border-bottom: 1px solid #d7d6d5;
|
|
|
- line-height: 30px;
|
|
|
- margin-bottom: 5px;
|
|
|
- }
|
|
|
- .field-box {
|
|
|
- padding: 0 10px 5px;
|
|
|
- overflow: hidden;
|
|
|
- .title-value {
|
|
|
- //width: 50%;
|
|
|
- float: left;
|
|
|
- }
|
|
|
- .desc-value {
|
|
|
- float: left;
|
|
|
- }
|
|
|
- .upload-field {
|
|
|
- .img-box {
|
|
|
- padding-top: 5px;
|
|
|
- display: flex;
|
|
|
- }
|
|
|
- .file-box {
|
|
|
- .file-item {
|
|
|
- padding: 2px 8px;
|
|
|
- cursor: pointer;
|
|
|
- &:hover {
|
|
|
- background-color: #f5f7fa;
|
|
|
- color: #2d8cf0;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- .img-box-content {
|
|
|
- padding-top: 15px;
|
|
|
- position: relative;
|
|
|
- .type {
|
|
|
- font-size: 12px;
|
|
|
- position: absolute;
|
|
|
- top: 0;
|
|
|
- }
|
|
|
- }
|
|
|
- .img-item {
|
|
|
- width: 100px;
|
|
|
- height: 100px;
|
|
|
- margin-right: 5px;
|
|
|
- }
|
|
|
- .longtext-box {
|
|
|
- .textarea-box {
|
|
|
- margin-top: 5px !important;
|
|
|
- width: 100%;
|
|
|
- padding: 3px;
|
|
|
- }
|
|
|
- }
|
|
|
- .divline {
|
|
|
- width: 100%;
|
|
|
- height: 5px;
|
|
|
- background-color: #e9e9e9;
|
|
|
- margin-bottom: 5px;
|
|
|
- }
|
|
|
- .img-iten {
|
|
|
- height: 60px;
|
|
|
- margin-right: 5px;
|
|
|
- width: 50px;
|
|
|
- cursor: pointer;
|
|
|
- }
|
|
|
- }
|
|
|
- .visit-list {
|
|
|
- .visit-title {
|
|
|
- color: #2689ff;
|
|
|
- padding-bottom: 5px;
|
|
|
- }
|
|
|
- .detail-info {
|
|
|
- ul {
|
|
|
- list-style: none;
|
|
|
- li {
|
|
|
- span {
|
|
|
- min-width: 80px;
|
|
|
- }
|
|
|
- display: flex;
|
|
|
- margin-bottom: 5px;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- .btns {
|
|
|
- padding: 0 20px;
|
|
|
- padding-top: 5px;
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- .btn {
|
|
|
- width: 48%;
|
|
|
+ .reason {
|
|
|
+ padding: 0 10px 5px;
|
|
|
+ .reason-list {
|
|
|
+ margin-bottom: 6px;
|
|
|
+ .text {
|
|
|
+ margin: 5px 0;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #e93d3d;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ .task-type-info {
|
|
|
+ font-size: 16px;
|
|
|
+ color: #333;
|
|
|
+ font-weight: 600;
|
|
|
+ margin-bottom: 5px;
|
|
|
+ }
|
|
|
+ .info {
|
|
|
+ display: flex;
|
|
|
+ font-size: 12px;
|
|
|
+ color: #7f7f7f;
|
|
|
+ margin-bottom: 5px;
|
|
|
+
|
|
|
+ p {
|
|
|
+ flex: 1;
|
|
|
+ margin-right: 30px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .detail {
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 500;
|
|
|
+ color: #333333;
|
|
|
+ border-bottom: 2px solid #d7d6d5;
|
|
|
+ line-height: 30px;
|
|
|
+ margin: 5px 0;
|
|
|
+ }
|
|
|
}
|
|
|
-.reason {
|
|
|
+
|
|
|
+.field-box {
|
|
|
padding: 0 10px 5px;
|
|
|
- .reason-list {
|
|
|
- margin-bottom: 6px;
|
|
|
- .text {
|
|
|
- margin: 5px 0;
|
|
|
- font-size: 14px;
|
|
|
- color: #e93d3d;
|
|
|
+ overflow: hidden;
|
|
|
+ .title-value {
|
|
|
+ //width: 50%;
|
|
|
+ float: left;
|
|
|
+ }
|
|
|
+ .desc-value {
|
|
|
+ float: left;
|
|
|
+ }
|
|
|
+ .upload-field {
|
|
|
+ .img-box {
|
|
|
+ padding-top: 5px;
|
|
|
+ display: flex;
|
|
|
+ }
|
|
|
+ .file-box {
|
|
|
+ .file-item {
|
|
|
+ padding: 2px 8px;
|
|
|
+ cursor: pointer;
|
|
|
+ &:hover {
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ color: #2d8cf0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .img-box-content {
|
|
|
+ padding-top: 15px;
|
|
|
+ position: relative;
|
|
|
+ .type {
|
|
|
+ font-size: 12px;
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
}
|
|
|
}
|
|
|
+ .img-item {
|
|
|
+ width: 100px;
|
|
|
+ height: 100px;
|
|
|
+ margin-right: 5px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .divline {
|
|
|
+ width: 100%;
|
|
|
+ height: 5px;
|
|
|
+ background-color: #e9e9e9;
|
|
|
+ margin-bottom: 5px;
|
|
|
+ }
|
|
|
+ .img-iten {
|
|
|
+ height: 60px;
|
|
|
+ margin-right: 5px;
|
|
|
+ width: 50px;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.longtext-box {
|
|
|
+ .textarea-box {
|
|
|
+ margin-top: 5px !important;
|
|
|
+ width: 100%;
|
|
|
+ padding: 3px;
|
|
|
+ }
|
|
|
}
|
|
|
-.empty {
|
|
|
- margin-top: 10px;
|
|
|
+
|
|
|
+.no-data {
|
|
|
+ margin: 0 auto;
|
|
|
}
|
|
|
-.form {
|
|
|
- margin-top: 10px;
|
|
|
+
|
|
|
+.btns {
|
|
|
+ padding: 0 20px;
|
|
|
+ padding-top: 5px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ .btn {
|
|
|
+ width: 48%;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
.all-btn {
|
|
|
- margin-right: 10px;
|
|
|
+ margin-right: 18px;
|
|
|
+}
|
|
|
+
|
|
|
+.card-all-review {
|
|
|
+ width: 350px;
|
|
|
+}
|
|
|
+
|
|
|
+.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>
|