mirror of
http://112.124.100.131/GFRS/ebiz-h5.git
synced 2025-12-15 01:16:45 +08:00
Merge branch 'feature/GFRS-2065【1125】惠桂保数据导入' into dev
# Conflicts: # src/assets/js/utils/request.js # src/router/ebiz/index.js
This commit is contained in:
19
src/api/ebiz/hgb/index.js
Normal file
19
src/api/ebiz/hgb/index.js
Normal file
@@ -0,0 +1,19 @@
|
||||
import request from '@/assets/js/utils/request'
|
||||
import getUrl from '@/assets/js/utils/get-url'
|
||||
|
||||
// 惠桂保数据查询
|
||||
export function selectHgb(data) {
|
||||
return request({
|
||||
url: getUrl('/sale/order/selectHgb', 1),
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function selectHgbDetail(data) {
|
||||
return request({
|
||||
url: getUrl('/sale/order/getHgbDetail', 1),
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
@@ -6,7 +6,6 @@ import MD5 from 'js-md5'
|
||||
import CacheUtils from '@/assets/js/utils/cacheUtils'
|
||||
import BusinessCommon from '@/assets/js/business-common'
|
||||
|
||||
|
||||
let proposal = [
|
||||
'/proposal/proposal/list',
|
||||
'/proposal/proposal/toInsurance',
|
||||
@@ -97,6 +96,9 @@ let preserve = [
|
||||
// 个险业绩排行优化
|
||||
let performanceRanking = ['/data/performance/getComList', '/data/performance/getComPerformance']
|
||||
|
||||
// 惠桂保
|
||||
let hgb = ['/sale/order/selectHgb', '/sale/order/getHgbDetail']
|
||||
|
||||
let whiteList = [
|
||||
'/customer/agent/getCustomersList',
|
||||
...proposal,
|
||||
@@ -108,7 +110,8 @@ let whiteList = [
|
||||
...preserve,
|
||||
...productStore,
|
||||
...renewalManage,
|
||||
...performanceRanking
|
||||
...performanceRanking,
|
||||
...hgb
|
||||
]
|
||||
|
||||
// 创建axios实例
|
||||
@@ -118,90 +121,96 @@ const service = axios.create({
|
||||
|
||||
// request拦截器
|
||||
service.interceptors.request.use(
|
||||
async config => {
|
||||
let relativePath = config.url && config.url.split(configApp.API_VERSION)[1]
|
||||
if (whiteList.includes(relativePath)) {
|
||||
Toast.loading({
|
||||
duration: 0, // 持续展示 toast
|
||||
forbidClick: true, // 禁用背景点击
|
||||
loadingType: 'spinner',
|
||||
message: '加载中……'
|
||||
})
|
||||
}
|
||||
/**
|
||||
* 请求拦截处理(待添加 判断走统一网关处理)
|
||||
*/
|
||||
if(config.url && /api\/$/.test(config.url.split(configApp.API_VERSION)[0]) && configApp.API_VERSION == 'v2'){
|
||||
if(!config.data || config.data == null){
|
||||
config.data = {}
|
||||
}
|
||||
if(!!config.data && config.data != null){
|
||||
let encrypt = AESTools.AESEncrypt(JSON.stringify(config.data),configApp.REQ_PWD)
|
||||
config.data = {"data": encrypt }
|
||||
}
|
||||
}
|
||||
|
||||
// token 不存在初始化处理
|
||||
let token = CacheUtils.getLocItem('token');
|
||||
if (!token){
|
||||
// 设备类型
|
||||
const target = BusinessCommon.device()
|
||||
// 安卓or苹果
|
||||
if (target.isAndroid || target.isIphone) {
|
||||
// eslint-disable-next-line no-undef
|
||||
const res = await EWebBridge.webCallAppInJs('getToken')
|
||||
CacheUtils.setLocItem('token', JSON.parse(res).token)
|
||||
}
|
||||
}
|
||||
|
||||
config.headers['token'] = CacheUtils.getLocItem('token')
|
||||
// 添加请时间戳
|
||||
let timeStr = new Date().getTime() + '';
|
||||
config.headers['timeStr'] = timeStr;
|
||||
config.headers['signature'] = MD5(timeStr + CacheUtils.getLocItem('token'));
|
||||
return config
|
||||
},
|
||||
error => {
|
||||
// Do something with request error
|
||||
Promise.reject(error)
|
||||
async config => {
|
||||
let relativePath = config.url && config.url.split(configApp.API_VERSION)[1]
|
||||
if (whiteList.includes(relativePath)) {
|
||||
Toast.loading({
|
||||
duration: 0, // 持续展示 toast
|
||||
forbidClick: true, // 禁用背景点击
|
||||
loadingType: 'spinner',
|
||||
message: '加载中……'
|
||||
})
|
||||
}
|
||||
/**
|
||||
* 请求拦截处理(待添加 判断走统一网关处理)
|
||||
*/
|
||||
if (config.url && /api\/$/.test(config.url.split(configApp.API_VERSION)[0]) && configApp.API_VERSION == 'v2') {
|
||||
if (!config.data || config.data == null) {
|
||||
config.data = {}
|
||||
}
|
||||
if (!!config.data && config.data != null) {
|
||||
let encrypt = AESTools.AESEncrypt(JSON.stringify(config.data), configApp.REQ_PWD)
|
||||
config.data = { data: encrypt }
|
||||
}
|
||||
}
|
||||
|
||||
// token 不存在初始化处理
|
||||
let token = CacheUtils.getLocItem('token')
|
||||
if (!token) {
|
||||
// 设备类型
|
||||
const target = BusinessCommon.device()
|
||||
// 安卓or苹果
|
||||
if (target.isAndroid || target.isIphone) {
|
||||
// eslint-disable-next-line no-undef
|
||||
const res = await EWebBridge.webCallAppInJs('getToken')
|
||||
CacheUtils.setLocItem('token', JSON.parse(res).token)
|
||||
}
|
||||
}
|
||||
|
||||
config.headers['token'] = CacheUtils.getLocItem('token')
|
||||
// 添加请时间戳
|
||||
let timeStr = new Date().getTime() + ''
|
||||
config.headers['timeStr'] = timeStr
|
||||
config.headers['signature'] = MD5(timeStr + CacheUtils.getLocItem('token'))
|
||||
return config
|
||||
},
|
||||
error => {
|
||||
// Do something with request error
|
||||
Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
// respone拦截器
|
||||
service.interceptors.response.use(
|
||||
response => {
|
||||
let res = response.data
|
||||
if( configApp.API_VERSION == 'v2' && response.config.url && response.headers['content-type'].match(/application\/json/) && /api\/$/.test(response.config.url.split(configApp.API_VERSION)[0])){
|
||||
if(res.response){// 正常情況返回必有response 节点
|
||||
res = JSON.parse(AESTools.AESDecrypt(res.response,configApp.REQ_PWD))
|
||||
}
|
||||
response => {
|
||||
let res = response.data
|
||||
if (
|
||||
configApp.API_VERSION == 'v2' &&
|
||||
response.config.url &&
|
||||
response.headers['content-type'].match(/application\/json/) &&
|
||||
/api\/$/.test(response.config.url.split(configApp.API_VERSION)[0])
|
||||
) {
|
||||
if (res.response) {
|
||||
// 正常情況返回必有response 节点
|
||||
res = JSON.parse(AESTools.AESDecrypt(res.response, configApp.REQ_PWD))
|
||||
}
|
||||
Toast.clear()
|
||||
if (res.code != 0) {
|
||||
if (res.code == 10001 || res.code == 10002) {
|
||||
Dialog.confirm({
|
||||
confirmButtonText: '重新登录',
|
||||
message: '你已被登出,可以取消继续留在该页面,或者重新登录'
|
||||
}).then(() => {
|
||||
//eslint-disable-next-line
|
||||
EWebBridge.webCallAppInJs('bridge', {
|
||||
flag: 'login'
|
||||
})
|
||||
})
|
||||
} else {
|
||||
//Toast.fail(res.msg)
|
||||
}
|
||||
return Promise.reject(res)
|
||||
} else {
|
||||
return res.content
|
||||
}
|
||||
},
|
||||
error => {
|
||||
Toast.clear()
|
||||
console.log('err' + error) // for debug
|
||||
//Toast.fail(error.message)
|
||||
return Promise.reject(error)
|
||||
}
|
||||
Toast.clear()
|
||||
if (res.code != 0) {
|
||||
if (res.code == 10001 || res.code == 10002) {
|
||||
Dialog.confirm({
|
||||
confirmButtonText: '重新登录',
|
||||
message: '你已被登出,可以取消继续留在该页面,或者重新登录'
|
||||
}).then(() => {
|
||||
//eslint-disable-next-line
|
||||
EWebBridge.webCallAppInJs('bridge', {
|
||||
flag: 'login'
|
||||
})
|
||||
})
|
||||
} else {
|
||||
//Toast.fail(res.msg)
|
||||
}
|
||||
return Promise.reject(res)
|
||||
} else {
|
||||
return res.content
|
||||
}
|
||||
},
|
||||
error => {
|
||||
Toast.clear()
|
||||
console.log('err' + error) // for debug
|
||||
//Toast.fail(error.message)
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
export default service
|
||||
|
||||
22
src/router/ebiz/hgb.js
Normal file
22
src/router/ebiz/hgb.js
Normal file
@@ -0,0 +1,22 @@
|
||||
// 惠桂保路由信息
|
||||
const HgbIndex = () => import('@/views/ebiz/hgb')
|
||||
const Detail = () => import('@/views/ebiz/hgb/Detail')
|
||||
export default [
|
||||
{
|
||||
name: 'HgbIndex',
|
||||
path: '/hgb/index',
|
||||
component: HgbIndex,
|
||||
meta: {
|
||||
title: '惠桂保客户清单'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'HgbDetail',
|
||||
path: '/hgb/orderDetail/:prtNo',
|
||||
component: Detail,
|
||||
props: true,
|
||||
meta: {
|
||||
title: '保单详情'
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -27,6 +27,7 @@ import attendance from './attendance'
|
||||
|
||||
// 开门红业绩
|
||||
import goodStart from './goodStart'
|
||||
import hgb from './hgb'
|
||||
|
||||
export default [
|
||||
...proposal,
|
||||
@@ -53,5 +54,6 @@ export default [
|
||||
...performance,
|
||||
...renewalManage,
|
||||
...question,
|
||||
...goodStart
|
||||
...goodStart,
|
||||
...hgb
|
||||
] //根据需要进行删减
|
||||
|
||||
81
src/views/ebiz/hgb/Detail.vue
Normal file
81
src/views/ebiz/hgb/Detail.vue
Normal file
@@ -0,0 +1,81 @@
|
||||
<template>
|
||||
<div class="hgb-detail bg-white mt10 p20">
|
||||
<van-cell :title="row.rowName" :value="blankFilter(row.key)" v-for="(row, i) in rowInfos" :key="i" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { selectHgbDetail } from '@/api/ebiz/hgb'
|
||||
export default {
|
||||
props: {
|
||||
prtNo: {
|
||||
type: String
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
rowInfos: [
|
||||
{ rowName: '保单号', key: 'orderNumber' },
|
||||
{ rowName: '投保人姓名', key: 'applicantName' },
|
||||
{ rowName: '投保人电话', key: 'applicantPhone' },
|
||||
{ rowName: '被保人姓名', key: 'insuredName' },
|
||||
{ rowName: '被保人电话', key: 'insuredPhone' },
|
||||
{ rowName: '被保人性别', key: 'insuredGender' },
|
||||
{ rowName: '被保人出生日期', key: 'insuredBirthday' },
|
||||
{ rowName: '生效日', key: 'effectiveDate' },
|
||||
{ rowName: '到期日', key: 'expireDate' }
|
||||
],
|
||||
orderNumber: '',
|
||||
applicantName: '',
|
||||
applicantPhone: '',
|
||||
insuredName: '',
|
||||
insuredPhone: '',
|
||||
insuredGender: '',
|
||||
insuredBirthday: '',
|
||||
effectiveDate: '',
|
||||
expireDate: ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getData()
|
||||
},
|
||||
methods: {
|
||||
async getData() {
|
||||
const res = await selectHgbDetail({ policyNo: this.prtNo })
|
||||
if (res.result === '0') {
|
||||
if (res.content && res.content.data) {
|
||||
let appntDTO = res.content.data.appntDTO
|
||||
if (appntDTO) {
|
||||
this.applicantName = appntDTO.name
|
||||
this.applicantPhone = appntDTO.mobile
|
||||
}
|
||||
let insuredDTO = res.content.data.insuredDTOs[0]
|
||||
if (insuredDTO) {
|
||||
this.insuredName = insuredDTO.name
|
||||
this.insuredPhone = insuredDTO.mobile
|
||||
this.insuredGender = insuredDTO.sex === '0' ? '男' : insuredDTO.sex === '1' ? '女' : '-'
|
||||
this.insuredBirthday = insuredDTO.birthday
|
||||
}
|
||||
let orderInfoDTO = res.content.data.orderInfoDTO
|
||||
if (orderInfoDTO) {
|
||||
this.orderNumber = orderInfoDTO.prtNo
|
||||
this.effectiveDate = orderInfoDTO.cvaliDate
|
||||
this.expireDate = orderInfoDTO.expiryDate
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.$toast(res.resultMessage)
|
||||
}
|
||||
},
|
||||
blankFilter(val) {
|
||||
return this[val] ? this[val] : '-'
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
::v-deep .van-cell::after {
|
||||
border: none;
|
||||
}
|
||||
</style>
|
||||
261
src/views/ebiz/hgb/index.vue
Normal file
261
src/views/ebiz/hgb/index.vue
Normal file
@@ -0,0 +1,261 @@
|
||||
<template>
|
||||
<div class="hgb bg-white pb60">
|
||||
<p class="title p15">惠桂保销售量</p>
|
||||
<div class="order-count">
|
||||
<div class="available-count">
|
||||
<p class="count-num active">{{ cvilNum }}</p>
|
||||
<p class="count-text active">生效单量</p>
|
||||
</div>
|
||||
<div class="unavailable-count">
|
||||
<p class="count-num inactive">{{ uncvilNum }}</p>
|
||||
<p class="count-text inactive">失效单量</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="title p15 search">
|
||||
<span>惠桂保客户明细</span>
|
||||
<van-icon name="search" @click="idSidebarShow = true" />
|
||||
</p>
|
||||
<div class="table-container">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th>
|
||||
<th>生效日</th>
|
||||
<th>投保人</th>
|
||||
<th>分单号</th>
|
||||
<th>到期日</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<template v-if="tableData.length">
|
||||
<tr v-for="(data, i) in tableData" :key="i" @click="toDetail(data)">
|
||||
<td>{{ i + 1 }}</td>
|
||||
<td v-for="(key, j) in keys" :key="j">
|
||||
{{ data[key] }}
|
||||
</td>
|
||||
</tr>
|
||||
</template>
|
||||
<tr v-else>
|
||||
<td colspan="5">暂无数据</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- 分页 -->
|
||||
<div class="pagination bg-white" v-if="tableData.length">
|
||||
<van-pagination v-model="currentPage" :total-items="totalItems" :items-per-page="10" @change="onPageChanged" />
|
||||
</div>
|
||||
|
||||
<!-- 弹出层 -->
|
||||
<van-popup
|
||||
@click.native.self="isSearchDateShow = false"
|
||||
v-model="idSidebarShow"
|
||||
position="left"
|
||||
:style="{ width: '70vw', height: '100%' }"
|
||||
@close="onSideBarClosed"
|
||||
>
|
||||
<p class="p15 fw600">查找</p>
|
||||
<van-field v-model="param.startDate" label="生效日" placeholder="请选择" readonly @click="isSearchDateShow = true" />
|
||||
<van-field v-model="param.prtName" maxlength="10" label="担保人" placeholder="请输入" />
|
||||
|
||||
<div class="btn-group">
|
||||
<van-button size="small" @click="idSidebarShow = false">取消</van-button>
|
||||
<van-button size="small" type="danger" @click="queryData">确定</van-button>
|
||||
</div>
|
||||
|
||||
<transition name="van-slide-up">
|
||||
<div class="search-date" v-show="isSearchDateShow">
|
||||
<van-datetime-picker v-model="currentDate" type="date" :max-date="maxDate" @confirm="onSearchDateConfirm" @cancel="isSearchDateShow = false" />
|
||||
</div>
|
||||
</transition>
|
||||
</van-popup>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { Popup, DatetimePicker, Field, Pagination } from 'vant'
|
||||
import { selectHgb } from '@/api/ebiz/hgb'
|
||||
import dateUtil from '@/assets/js/utils/date-utils'
|
||||
|
||||
export default {
|
||||
name: 'HgbIndex',
|
||||
components: {
|
||||
[Popup.name]: Popup,
|
||||
[DatetimePicker.name]: DatetimePicker,
|
||||
[Field.name]: Field,
|
||||
[Pagination.name]: Pagination
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
totalItems: 0,
|
||||
cvilNum: 0,
|
||||
uncvilNum: 0,
|
||||
maxDate: new Date(),
|
||||
currentDate: new Date(),
|
||||
idSidebarShow: false,
|
||||
isSearchDateShow: false,
|
||||
tableData: [],
|
||||
keys: ['startDate', 'prtName', 'prtNo', 'endDate'],
|
||||
form: {
|
||||
availableDate: '',
|
||||
applicant: ''
|
||||
},
|
||||
currentPage: 1,
|
||||
param: {
|
||||
prtName: '',
|
||||
startDate: '',
|
||||
pageInfo: {
|
||||
pageNum: 1,
|
||||
pageSize: 10
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getData()
|
||||
},
|
||||
methods: {
|
||||
onPageChanged(page) {
|
||||
this.currentPage = page
|
||||
this.param.pageInfo.pageNum = page
|
||||
this.getData()
|
||||
},
|
||||
queryData() {
|
||||
if (!this.param.startDate) {
|
||||
return this.$toast('请选择生效日')
|
||||
}
|
||||
if (!this.param.prtName.trim()) {
|
||||
return this.$toast('请输入担保人')
|
||||
}
|
||||
this.getData({ ...this.param })
|
||||
this.idSidebarShow = false
|
||||
},
|
||||
onSearchDateConfirm(date) {
|
||||
console.log(dateUtil.formatDate(date, 'yyyy-MM-dd'))
|
||||
this.param.startDate = dateUtil.formatDate(date, 'yyyy-MM-dd')
|
||||
this.isSearchDateShow = false
|
||||
},
|
||||
async getData(param) {
|
||||
const res = await selectHgb(param ? param : this.param)
|
||||
console.dir(res)
|
||||
if (res.result === '0') {
|
||||
this.cvilNum = res.content.cvilNum
|
||||
this.uncvilNum = res.content.uncvilNum
|
||||
this.totalItems = res.content.list.total
|
||||
this.tableData = res.content.list.list
|
||||
} else {
|
||||
this.$toast(res.resultMessage)
|
||||
}
|
||||
},
|
||||
toDetail(data) {
|
||||
console.log(data)
|
||||
this.$jump({
|
||||
flag: 'h5',
|
||||
extra: {
|
||||
url: location.origin + `/#/hgb/orderDetail/${data.prtNo}`
|
||||
},
|
||||
routerInfo: { path: `/hgb/orderDetail/${data.prtNo}` }
|
||||
})
|
||||
},
|
||||
onSideBarClosed() {
|
||||
this.param.startDate = ''
|
||||
this.param.prtName = ''
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.hgb {
|
||||
min-height: 100vh;
|
||||
.search {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
.search-date {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
.btn-group {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-evenly;
|
||||
position: absolute;
|
||||
bottom: 20px;
|
||||
}
|
||||
.order-count {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 70vw;
|
||||
margin: 0 auto;
|
||||
border: 1px solid #e4e4e4;
|
||||
border-radius: 15px;
|
||||
.available-count {
|
||||
border-right: 1px solid #e4e4e4;
|
||||
}
|
||||
.available-count,
|
||||
.unavailable-count {
|
||||
flex: 1;
|
||||
padding: 30px;
|
||||
}
|
||||
.count-num {
|
||||
font-size: 20px;
|
||||
font-weight: bolder;
|
||||
}
|
||||
.count-text {
|
||||
margin-top: 1em;
|
||||
font-size: 14px;
|
||||
font-weight: bolder;
|
||||
}
|
||||
.active {
|
||||
color: #ff0000;
|
||||
}
|
||||
.inactive {
|
||||
color: #949494;
|
||||
}
|
||||
}
|
||||
.table-container {
|
||||
padding: 2px;
|
||||
.table {
|
||||
font-size: 14px;
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
thead {
|
||||
background-color: #ff0033;
|
||||
color: #fff;
|
||||
border: 1px solid #ff0033;
|
||||
}
|
||||
th {
|
||||
font-weight: normal;
|
||||
padding: 10px 0;
|
||||
}
|
||||
td {
|
||||
text-align: center;
|
||||
padding: 10px 0;
|
||||
border: 1px solid #bcbcbc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.pagination {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .van-pagination__item {
|
||||
color: #ff0033;
|
||||
}
|
||||
|
||||
::v-deep .van-pagination__item--active {
|
||||
background-color: #ff0033;
|
||||
color: #fff;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user